/kernel/trunk/acpi/acpi.inc |
---|
0,0 → 1,298 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision$ |
; ACPI Generic Address Structure |
struct GAS |
ASID db ? ; address space id |
BitWidth db ? |
BitOffset db ? |
AccessSize db ? |
Address DQ ? |
ends |
ASID.SYSTEM_MEMORY = 0 |
ASID.SYSTEM_IO = 1 |
ASID.PCI_CONFIG = 2 |
ASID.PCI_EC = 3 |
ASID.PCI_SMBUS = 4 |
ACCESS_SIZE.UNDEFINED = 0 |
ACCESS_SIZE.BYTE = 1 |
ACCESS_SIZE.WORD = 2 |
ACCESS_SIZE.DWORD = 3 |
ACCESS_SIZE.QWORD = 4 |
struct ACPI_RSDP |
Signature DQ ? |
Checksum db ? |
OEMID rb 6 |
Revision db ? |
RsdtAddress dd ? |
; for Revision >= 2 |
Length dd ? |
XsdtAddress DQ ? |
ExtChecksum db ? |
Reserved rb 3 |
ends |
struct ACPI_TABLE ; DESCRIPTION_HEADER |
Signature dd ? |
Length dd ? |
Revision db ? |
Checksum db ? |
OEMID rb 6 |
OEMTableID rb 8 |
OEMRevision rb 4 |
CreatorID rb 4 |
CreatorRevision rb 4 |
ends |
struct ACPI_RSDT ACPI_TABLE |
Entry rd (0x1000-sizeof.ACPI_TABLE)/4 |
ends |
struct ACPI_HPET ACPI_TABLE |
ID dd ? |
Base GAS |
SeqNumber db ? |
MainCounterMinimum dw ? |
PageProtectionOEM db ? |
ends |
struct ACPI_MADT ACPI_TABLE |
Local_IC_Addr dd ? |
Flags dd ? |
IntController rb 0x1000-sizeof.ACPI_TABLE-ACPI_MADT.IntController |
ends |
struct ACPI_FADT ACPI_TABLE |
FirmwareCtrl dd ? |
DSDT dd ? |
db ? |
PreferredPMProfile db ? |
SCI_INT dw ? |
SMI_CMD dd ? |
ACPI_ENABLE db ? |
ACPI_DISABLE db ? |
S4BIOS_REQ db ? |
PSTATE_CNT db ? |
PM1a_EVT_BLK dd ? |
PM1b_EVT_BLK dd ? |
PM1a_CNT_BLK dd ? |
PM1b_CNT_BLK dd ? |
PM2_CNT_BLK dd ? |
PM_TMR_BLK dd ? |
GPE0_BLK dd ? |
GPE1_BLK dd ? |
PM1_EVT_LEN db ? |
PM1_CNT_LEN db ? |
PM2_CNT_LEN db ? |
PM_TMR_LEN db ? |
GPE0_BLK_LEN db ? |
GPE1_BLK_LEN db ? |
GPE1_BASE db ? |
CST_CNT db ? |
P_LVL2_LAT dw ? |
P_LVL3_LAT dw ? |
FLUSH_SIZE dw ? |
FLUSH_STRIDE dw ? |
DUTY_OFFSET db ? |
DUTY_WIDTH db ? |
DAY_ALRM db ? |
MON_ALRM db ? |
CENTURY db ? |
IAPC_BOOT_ARCH dw ? |
db ? |
Flags dd ? |
RESET_REG GAS |
RESET_VALUE db ? |
ARM_BOOT_ARCH dw ? |
FADT_Minor_Version db ? |
X_FIRMWARE_CTRL DQ ? |
X_DSDT DQ ? |
X_PM1a_EVT_BLK GAS |
X_PM1b_EVT_BLK GAS |
X_PM1a_CNT_BLK GAS |
X_PM1b_CNT_BLK GAS |
X_PM2_CNT_BLK GAS |
X_PM_TMR_BLK GAS |
X_GPE0_BLK GAS |
X_GPE1_BLK GAS |
SLEEP_CONTROL_REG GAS |
SLEEP_STATUS_REG GAS |
HypervisorVendorID rb 8 |
ends |
MAX_SSDTS = 32 |
iglobal |
align 4 |
acpi_lapic_base dd 0xfee00000 ; default local apic base |
endg |
uglobal |
align 4 |
acpi_dev_data rd 1 |
acpi_dev_size rd 1 |
acpi_rsdp_base rd 1 |
acpi_rsdt_base rd 1 |
acpi_rsdt_size rd 1 |
acpi_fadt_base rd 1 |
acpi_fadt_size rd 1 |
acpi_ssdt_base rd MAX_SSDTS |
acpi_ssdt_size rd MAX_SSDTS |
acpi_ssdt_cnt rd 1 |
acpi_madt_base rd 1 |
acpi_madt_size rd 1 |
acpi_ioapic_base rd MAX_IOAPICS |
acpi_hpet_base rd 1 |
acpi_hpet_size rd 1 |
cpu_count rd 1 |
smpt rd 16 |
endg |
align 4 |
acpi_get_root_ptr: |
mov eax, [acpi_rsdp_base] |
ret |
align 4 |
rsdt_find: ;ecx= rsdt edx= SIG |
push ebx |
push esi |
lea ebx, [ecx+ACPI_RSDT.Entry] |
mov esi, [ecx+ACPI_RSDT.Length] |
add esi, ecx |
align 4 |
.next: |
mov eax, [ebx] |
cmp [eax], edx |
je .done |
add ebx, 4 |
cmp ebx, esi |
jb .next |
xor eax, eax |
pop esi |
pop ebx |
ret |
.done: |
mov eax, [ebx] |
pop esi |
pop ebx |
ret |
align 4 |
check_acpi: |
cmp [acpi_rsdp_base], 0 |
jz .done |
stdcall map_io_mem, [acpi_rsdp_base], sizeof.ACPI_RSDP, \ |
PG_GLOBAL+PAT_WB+PG_READ |
mov [acpi_rsdp_base], eax |
.rsdp_done: |
cmp [acpi_rsdt_base], 0 |
jz .rsdt_done |
stdcall map_io_mem, [acpi_rsdt_base], [acpi_rsdt_size], \ |
PG_GLOBAL+PAT_WB+PG_READ |
mov [acpi_rsdt_base], eax |
.rsdt_done: |
cmp [acpi_fadt_base], 0 |
jz .fadt_done |
stdcall map_io_mem, [acpi_fadt_base], [acpi_fadt_size], \ |
PG_GLOBAL+PAT_WB+PG_READ |
mov [acpi_fadt_base], eax |
.fadt_done: |
cmp [acpi_hpet_base], 0 |
jz .hpet_done |
stdcall map_io_mem, [acpi_hpet_base], [acpi_hpet_size], \ |
PG_GLOBAL+PAT_WB+PG_READ |
mov [acpi_hpet_base], eax |
mov eax, [eax+ACPI_HPET.Base.Address.lo] |
mov [hpet_base], eax |
.hpet_done: |
cmp [acpi_madt_base], 0 |
jz .madt_done |
stdcall map_io_mem, [acpi_madt_base], [acpi_madt_size], \ |
PG_GLOBAL+PAT_WB+PG_READ |
mov [acpi_madt_base], eax |
mov ecx, [eax+ACPI_MADT.Local_IC_Addr] |
mov [acpi_lapic_base], ecx |
mov edi, smpt |
mov ebx, [ecx+APIC_ID] |
shr ebx, 24 ; read APIC ID |
mov [edi], ebx ; bootstrap always first |
inc [cpu_count] |
add edi, 4 |
mov [ioapic_cnt], 0 |
lea edx, [eax+ACPI_MADT.IntController] |
mov ecx, [eax+ACPI_MADT.Length] |
add ecx, eax |
.check: |
mov eax, [edx] |
cmp al, 0 |
je .lapic |
cmp al, 1 |
je .io_apic |
jmp .next |
.lapic: |
shr eax, 24 ; get APIC ID |
cmp eax, ebx ; skip self |
je .next |
test [edx+4], byte 1 ; is enabled ? |
jz .next |
cmp [cpu_count], 16 |
jae .next |
stosd ; store APIC ID |
inc [cpu_count] |
jmp .next |
.io_apic: |
mov eax, [ioapic_cnt] |
push dword[edx+4] |
pop [acpi_ioapic_base+eax*4] |
push dword[edx+8] |
pop [ioapic_gsi_base+eax*4] |
inc [ioapic_cnt] |
jmp .next |
.next: |
mov eax, [edx] |
movzx eax, ah |
add edx, eax |
cmp edx, ecx |
jb .check |
.madt_done: |
xor ecx, ecx |
.next_ssdt: |
cmp ecx, [acpi_ssdt_cnt] |
jz .ssdt_done |
push ecx |
stdcall map_io_mem, [acpi_ssdt_base+ecx*4], [acpi_ssdt_size+ecx*4], \ |
PG_GLOBAL+PAT_WB+PG_READ |
pop ecx |
mov [acpi_ssdt_base+ecx*4], eax |
inc ecx |
jmp .next_ssdt |
.ssdt_done: |
.done: |
ret |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/kernel/trunk/boot/shutdown.inc |
---|
13,33 → 13,12 |
$Revision$ |
; ACPI Generic Address Structure |
struct GAS |
asid db ? ; address space id |
bit_width db ? |
bit_offset db ? |
access_size db ? |
address DQ ? |
ends |
ASID.SYSTEM_MEMORY = 0 |
ASID.SYSTEM_IO = 1 |
ASID.PCI_CONFIG = 2 |
ASID.PCI_EC = 3 |
ASID.PCI_SMBUS = 4 |
ACCESS_SIZE.UNDEFINED = 0 |
ACCESS_SIZE.BYTE = 1 |
ACCESS_SIZE.WORD = 2 |
ACCESS_SIZE.DWORD = 3 |
ACCESS_SIZE.QWORD = 4 |
align 4 |
system_shutdown: ; shut down the system |
cmp byte [BOOT.shutdown_type], SYSTEM_SHUTDOWN |
cmp [BOOT.shutdown_type], SYSTEM_SHUTDOWN |
jb @F |
cmp byte [BOOT.shutdown_type], SYSTEM_RESTART |
cmp [BOOT.shutdown_type], SYSTEM_RESTART |
jbe .valid |
@@: |
ret |
83,7 → 62,7 |
cli |
call IRQ_mask_all |
mov eax, dword[BOOT.shutdown_type] |
movzx eax, [BOOT.shutdown_type] |
cmp al, SYSTEM_RESTART |
jne @F |
98,34 → 77,24 |
mov ecx, (restart_code_end - restart_code_start)/4 |
rep movsd |
call create_trampoline_pgmap |
mov cr3, eax |
jmp @F |
org $-OS_BASE |
@@: |
cmp [BOOT.shutdown_type], SYSTEM_SHUTDOWN |
jne not_power_off |
;disable paging |
mov eax, cr0 |
and eax, 0x7FFFFFFF |
mov cr0, eax |
mov eax, cr3 |
mov cr3, eax |
cmp byte [BOOT_LO.shutdown_type], SYSTEM_SHUTDOWN |
jne no_acpi_power_off |
; system_power_off |
mov ebx, [acpi_fadt_base-OS_BASE] |
cmp dword [ebx], 'FACP' |
jne no_acpi_power_off |
mov esi, [acpi_dsdt_base-OS_BASE] |
cmp dword [esi], 'DSDT' |
jne no_acpi_power_off |
mov eax, [esi+4] ; DSDT length |
mov ebx, [acpi_fadt_base] |
test ebx, ebx |
jz no_acpi |
cmp [ebx+ACPI_TABLE.Signature], 'FACP' |
jne no_acpi |
mov esi, [acpi_ssdt_base] ; first SSDT is DSDT |
test esi, esi |
jz no_acpi |
cmp [esi+ACPI_TABLE.Signature], 'DSDT' |
jne no_acpi |
mov eax, [esi+ACPI_TABLE.Length] |
sub eax, 36+4 |
jbe no_acpi_power_off |
jbe no_acpi |
add esi, 36 |
.scan_dsdt: |
cmp dword [esi], '_S5_' |
143,7 → 112,7 |
cmp byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx |
jz @f |
cmp byte [esi], 0xA |
jnz no_acpi_power_off |
jnz no_acpi |
inc esi |
mov cl, [esi] |
@@: |
153,7 → 122,7 |
cmp byte [esi], 0 |
jz @f |
cmp byte [esi], 0xA |
jnz no_acpi_power_off |
jnz no_acpi |
inc esi |
mov ch, [esi] |
@@: |
162,14 → 131,14 |
inc esi |
dec eax |
jnz .scan_dsdt |
jmp no_acpi_power_off |
jmp no_acpi |
do_acpi_power_off: |
mov edx, [ebx+48] |
mov edx, [ebx+ACPI_FADT.SMI_CMD] |
test edx, edx |
jz .nosmi |
mov al, [ebx+52] |
mov al, [ebx+ACPI_FADT.ACPI_ENABLE] |
out dx, al |
mov edx, [ebx+64] |
mov edx, [ebx+ACPI_FADT.PM1a_CNT_BLK] |
@@: |
in ax, dx |
test al, 1 |
178,12 → 147,12 |
and cx, 0x0707 |
shl cx, 2 |
or cx, 0x2020 |
mov edx, [ebx+64] |
mov edx, [ebx+ACPI_FADT.PM1a_CNT_BLK] |
in ax, dx |
and ax, 203h |
or ah, cl |
out dx, ax |
mov edx, [ebx+68] |
mov edx, [ebx+ACPI_FADT.PM1b_CNT_BLK] |
test edx, edx |
jz @f |
in ax, dx |
191,33 → 160,65 |
or ah, ch |
out dx, ax |
@@: |
jmp $ |
jmp no_acpi |
no_acpi_power_off: |
cmp byte[BOOT_LO.shutdown_type], SYSTEM_REBOOT |
jnz no_acpi_reboot |
not_power_off: |
cmp [BOOT.shutdown_type], SYSTEM_REBOOT |
jnz not_reboot |
; try to reboot via ACPI fixed features |
mov ebx, [acpi_fadt_base-OS_BASE] |
cmp dword[ebx], 'FACP' |
jne no_acpi_power_off |
test dword[ebx+0x70], 1 SHL 10 ; RESET_REG_SUP |
jz no_acpi_reboot |
cmp [ebx+0x74+GAS.asid], ASID.SYSTEM_IO |
jnz no_acpi_reboot |
cmp [ebx+0x74+GAS.bit_width], 8 |
jnz no_acpi_reboot |
cmp [ebx+0x74+GAS.bit_offset], 0 |
jnz no_acpi_reboot |
cmp [ebx+0x74+GAS.access_size], ACCESS_SIZE.BYTE |
ja no_acpi_reboot |
cmp [ebx+0x74+GAS.address.hi], 0 |
jnz no_acpi_reboot |
mov edx, [ebx+0x74+GAS.address.lo] |
movzx eax, byte[ebx+0x80] |
mov ebx, [acpi_fadt_base] |
test ebx, ebx |
jz no_acpi |
cmp [ebx+ACPI_TABLE.Signature], 'FACP' |
jne no_acpi |
cmp [ebx+ACPI_FADT.Length], ACPI_FADT.RESET_VALUE |
jbe no_acpi |
test [ebx+ACPI_FADT.Flags], 1 SHL 10 ; reset_reg_supported |
jz no_acpi |
cmp [ebx+ACPI_FADT.RESET_REG.ASID], ASID.SYSTEM_IO |
jnz no_acpi |
cmp [ebx+ACPI_FADT.RESET_REG.BitWidth], 8 |
jnz no_acpi |
cmp [ebx+ACPI_FADT.RESET_REG.BitOffset], 0 |
jnz no_acpi |
cmp [ebx+ACPI_FADT.RESET_REG.AccessSize], ACCESS_SIZE.BYTE |
ja no_acpi |
cmp [ebx+ACPI_FADT.RESET_REG.Address.hi], 0 |
jnz no_acpi |
; 'enable' ACPI |
mov edx, [ebx+ACPI_FADT.SMI_CMD] |
test edx, edx |
jz .nosmi |
mov al, [ebx+ACPI_FADT.ACPI_ENABLE] |
out dx, al |
jmp $ |
; unreachable |
no_acpi_reboot: |
mov edx, [ebx+ACPI_FADT.PM1a_CNT_BLK] |
@@: |
in ax, dx |
test al, 1 |
jz @b |
.nosmi: |
mov edx, [ebx+ACPI_FADT.RESET_REG.Address.lo] |
movzx eax, [ebx+ACPI_FADT.RESET_VALUE] |
out dx, al |
jmp no_acpi |
not_reboot: |
no_acpi: |
call create_trampoline_pgmap |
mov cr3, eax |
jmp @F |
org $-OS_BASE |
@@: |
;disable paging |
mov eax, cr0 |
and eax, 0x7FFFFFFF |
mov cr0, eax |
mov eax, cr3 |
mov cr3, eax |
jmp 0x50000 |
align 4 |
224,7 → 225,7 |
restart_code_start: |
org 0x50000 |
cmp byte [BOOT_LO.shutdown_type], SYSTEM_RESTART |
cmp [BOOT_LO.shutdown_type], SYSTEM_RESTART |
jne @F |
mov esi, _CLEAN_ZONE-OS_BASE |
/kernel/trunk/const.inc |
---|
248,7 → 248,6 |
MEM_AMOUNT = OS_BASE + 0x000FE8C |
SYS_SHUTDOWN = OS_BASE + 0x000FF00 |
TASK_ACTIVATE = OS_BASE + 0x000FF01 |
TMP_STACK_TOP = 0x007CC00 |
278,7 → 277,7 |
new_app_base = 0; |
twdw = 0x2000 ; CURRENT_TASK - window_data |
twdw = CURRENT_TASK - window_data |
std_application_base_address = new_app_base |
RING0_STACK_SIZE = 0x2000 |
/kernel/trunk/core/apic.inc |
---|
561,8 → 561,3 |
mov edx, 10000000 |
mul edx |
ret |
align 4 |
acpi_get_root_ptr: |
mov eax, [acpi_rsdp] |
ret |
/kernel/trunk/core/hpet.inc |
---|
0,0 → 1,74 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision$ |
HPET_ID = 0x0000 |
HPET_PERIOD = 0x0004 |
HPET_CFG_ENABLE = 0x0001 |
HPET_CFG = 0x0010 |
HPET_COUNTER = 0x00f0 |
HPET_T0_CFG = 0x0100 |
HPET_TN_LEVEL = 0x0002 |
HPET_TN_ENABLE = 0x0004 |
HPET_TN_FSB = 0x4000 |
uglobal |
hpet_base rd 1 |
hpet_period rd 1 |
hpet_timers rd 1 |
hpet_tsc_start rd 2 |
endg |
align 4 |
init_hpet: |
mov ebx, [hpet_base] |
test ebx, ebx |
jz .done |
mov eax, [ebx] |
and ah, 0x1F |
inc ah |
movzx eax, ah |
mov [hpet_timers], eax |
mov ecx, eax |
mov eax, [ebx+HPET_PERIOD] |
xor edx, edx |
shld edx, eax, 10 |
shl eax, 10 |
mov esi, 1000000 |
div esi |
mov [hpet_period], eax |
mov esi, [ebx+HPET_CFG] |
and esi, not HPET_CFG_ENABLE |
mov [ebx+HPET_CFG], esi ;stop main counter |
lea edx, [ebx+HPET_T0_CFG] |
@@: |
jcxz @F |
mov eax, [edx] |
and eax, not (HPET_TN_ENABLE+HPET_TN_LEVEL+HPET_TN_FSB) |
mov [edx], eax |
add edx, 0x20 |
dec ecx |
jmp @B |
@@: |
mov [ebx+HPET_COUNTER], ecx ;reset main counter |
mov [ebx+HPET_COUNTER+4], ecx |
or esi, HPET_CFG_ENABLE |
mov [ebx+HPET_CFG], esi ;and start again |
.done: |
rdtsc |
mov [hpet_tsc_start], eax |
mov [hpet_tsc_start+4], edx |
ret |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/kernel/trunk/init.inc |
---|
410,43 → 410,66 |
ret |
endp |
iglobal |
align 4 |
acpi_lapic_base dd 0xfee00000 ; default local apic base |
endg |
uglobal |
align 4 |
acpi_rsdp rd 1 |
acpi_rsdt rd 1 |
acpi_madt rd 1 |
acpi_dev_data rd 1 |
acpi_dev_size rd 1 |
acpi_rsdt_base rd 1 |
acpi_fadt_base rd 1 |
acpi_dsdt_base rd 1 |
acpi_dsdt_size rd 1 |
acpi_madt_base rd 1 |
acpi_ioapic_base rd MAX_IOAPICS |
acpi_hpet_base rd 1 |
hpet_base rd 1 |
hpet_period rd 1 |
hpet_timers rd 1 |
hpet_tsc_start rd 2 |
cpu_count rd 1 |
smpt rd 16 |
endg |
ACPI_HI_RSDP_WINDOW_START = 0x000E0000 |
ACPI_HI_RSDP_WINDOW_END = 0x00100000 |
ACPI_RSDP_CHECKSUM_LENGTH = 20 |
ACPI_HPET_SIGN = 'HPET' |
ACPI_MADT_SIGN = 'APIC' |
ACPI_FADT_SIGN = 'FACP' |
proc acpi_locate_tables uses ebx esi edi |
mov ebx, [ebx+ACPI_RSDP.RsdtAddress] |
mov [acpi_rsdt_base-OS_BASE], ebx |
mov eax, [ebx+ACPI_RSDT.Length] |
mov [acpi_rsdt_size-OS_BASE], eax |
mov esi, [acpi_rsdt_base-OS_BASE] |
mov ecx, [esi+ACPI_RSDT.Length] |
lea edi, [esi+ecx] |
add esi, sizeof.ACPI_TABLE |
movi ecx, 1 |
.next_table: |
cmp esi, edi |
jae .done |
lodsd |
cmp [eax+ACPI_TABLE.Signature], 'SSDT' ; skip DSDT if present |
jz .ssdt ; read it from FADT |
cmp [eax+ACPI_TABLE.Signature], 'FACP' ; this is FADT |
jz .fadt |
cmp [eax+ACPI_TABLE.Signature], 'APIC' ; this is MADT |
jz .madt |
cmp [eax+ACPI_TABLE.Signature], 'HPET' |
jz .hpet |
jmp .next_table |
.ssdt: |
mov [acpi_ssdt_base+ecx*4-OS_BASE], eax |
mov eax, [eax+ACPI_TABLE.Length] |
mov [acpi_ssdt_size+ecx*4-OS_BASE], eax |
inc ecx |
jmp .next_table |
.fadt: |
mov [acpi_fadt_base-OS_BASE], eax |
cmp [eax+ACPI_FADT.DSDT], 0 |
jz @f |
mov edx, [eax+ACPI_FADT.DSDT] |
mov [acpi_ssdt_base-OS_BASE], edx |
mov edx, [edx+ACPI_TABLE.Length] |
mov [acpi_ssdt_size-OS_BASE], edx |
@@: |
mov eax, [eax+ACPI_TABLE.Length] |
mov [acpi_fadt_size-OS_BASE], eax |
jmp .next_table |
.madt: |
mov [acpi_madt_base-OS_BASE], eax |
mov eax, [eax+ACPI_TABLE.Length] |
mov [acpi_madt_size-OS_BASE], eax |
jmp .next_table |
.hpet: |
mov [acpi_hpet_base-OS_BASE], eax |
mov eax, [eax+ACPI_TABLE.Length] |
mov [acpi_hpet_size-OS_BASE], eax |
jmp .next_table |
.done: |
mov [acpi_ssdt_cnt-OS_BASE], ecx |
ret |
endp |
acpi_locate: |
push ebx |
474,7 → 497,11 |
call .check |
end if |
.done: |
mov eax, ebx |
mov [acpi_rsdp_base-OS_BASE], ebx |
test ebx, ebx |
jz @f |
call acpi_locate_tables |
@@: |
pop edi |
pop ebx |
ret |
502,185 → 529,3 |
jb .check |
xor ebx, ebx |
ret |
align 4 |
rsdt_find: ;ecx= rsdt edx= SIG |
push ebx |
push esi |
lea ebx, [ecx+36] |
mov esi, [ecx+4] |
add esi, ecx |
align 4 |
.next: |
mov eax, [ebx] |
cmp [eax], edx |
je .done |
add ebx, 4 |
cmp ebx, esi |
jb .next |
xor eax, eax |
pop esi |
pop ebx |
ret |
.done: |
mov eax, [ebx] |
pop esi |
pop ebx |
ret |
align 4 |
check_acpi: |
call acpi_locate |
test eax, eax |
jz .done |
mov [acpi_rsdp-OS_BASE], eax |
mov ecx, [eax+16] |
mov edx, ACPI_FADT_SIGN |
mov [acpi_rsdt_base-OS_BASE], ecx |
call rsdt_find |
mov [acpi_fadt_base-OS_BASE], eax |
test eax, eax |
jz @f |
mov eax, [eax+40] |
mov [acpi_dsdt_base-OS_BASE], eax |
mov eax, [eax+4] |
mov [acpi_dsdt_size-OS_BASE], eax |
@@: |
mov edx, ACPI_HPET_SIGN |
mov ecx, [acpi_rsdt_base-OS_BASE] |
call rsdt_find |
test eax, eax |
jz @F |
mov [acpi_hpet_base-OS_BASE], eax |
mov eax, [eax+44] |
mov [hpet_base-OS_BASE], eax |
@@: |
mov edx, ACPI_MADT_SIGN |
mov ecx, [acpi_rsdt_base-OS_BASE] |
call rsdt_find |
test eax, eax |
jz .done |
mov [acpi_madt_base-OS_BASE], eax |
mov ecx, [eax+36] |
mov [acpi_lapic_base-OS_BASE], ecx |
mov edi, smpt-OS_BASE |
mov ebx, [ecx+0x20] |
shr ebx, 24 ; read APIC ID |
mov [edi], ebx ; bootstrap always first |
inc [cpu_count-OS_BASE] |
add edi, 4 |
mov [ioapic_cnt-OS_BASE], 0 |
lea edx, [eax+44] |
mov ecx, [eax+4] |
add ecx, eax |
.check: |
mov eax, [edx] |
cmp al, 0 |
je .lapic |
cmp al, 1 |
je .io_apic |
jmp .next |
.lapic: |
shr eax, 24 ; get APIC ID |
cmp eax, ebx ; skip self |
je .next |
test [edx+4], byte 1 ; is enabled ? |
jz .next |
cmp [cpu_count-OS_BASE], 16 |
jae .next |
stosd ; store APIC ID |
inc [cpu_count-OS_BASE] |
.next: |
mov eax, [edx] |
movzx eax, ah |
add edx, eax |
cmp edx, ecx |
jb .check |
.done: |
ret |
.io_apic: |
mov eax, [ioapic_cnt-OS_BASE] |
push dword[edx+4] |
pop [acpi_ioapic_base-OS_BASE+eax*4] |
push dword[edx+8] |
pop [ioapic_gsi_base-OS_BASE+eax*4] |
inc [ioapic_cnt-OS_BASE] |
jmp .next |
HPET_PERIOD = 0x0004 |
HPET_CFG_ENABLE = 0x0001 |
HPET_CFG = 0x0010 |
HPET_COUNTER = 0x00f0 |
HPET_T0_CFG = 0x0100 |
HPET_TN_LEVEL = 0x0002 |
HPET_TN_ENABLE = 0x0004 |
HPET_TN_FSB = 0x4000 |
align 4 |
init_hpet: |
mov ebx, [hpet_base-OS_BASE] |
test ebx, ebx |
jz .done |
mov eax, [ebx] |
and ah, 0x1F |
inc ah |
movzx eax, ah |
mov [hpet_timers-OS_BASE], eax |
mov ecx, eax |
mov eax, [ebx+HPET_PERIOD] |
xor edx, edx |
shld edx, eax, 10 |
shl eax, 10 |
mov esi, 1000000 |
div esi |
mov [hpet_period-OS_BASE], eax |
mov esi, [ebx+HPET_CFG] |
and esi, not HPET_CFG_ENABLE |
mov [ebx+HPET_CFG], esi ;stop main counter |
lea edx, [ebx+HPET_T0_CFG] |
@@: |
jcxz @F |
mov eax, [edx] |
and eax, not (HPET_TN_ENABLE+HPET_TN_LEVEL+HPET_TN_FSB) |
mov [edx], eax |
add edx, 0x20 |
dec ecx |
jmp @B |
@@: |
mov [ebx+HPET_COUNTER], ecx ;reset main counter |
mov [ebx+HPET_COUNTER+4], ecx |
or esi, HPET_CFG_ENABLE |
mov [ebx+HPET_CFG], esi ;and start again |
.done: |
rdtsc |
mov [hpet_tsc_start-OS_BASE], eax |
mov [hpet_tsc_start+4-OS_BASE], edx |
ret |
/kernel/trunk/kernel.asm |
---|
210,8 → 210,7 |
call test_cpu |
bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc |
call check_acpi |
call init_hpet |
call acpi_locate |
call init_BIOS32 |
; MEMORY MODEL |
call mem_test |
552,6 → 551,8 |
@@: |
mov [clipboard_main_list], eax |
call check_acpi |
mov eax, [hpet_base] |
test eax, eax |
jz @F |
558,8 → 559,9 |
mov eax, [hpet_base] |
stdcall map_io_mem, [hpet_base], 1024, PG_GLOBAL+PAT_UC+PG_SWR |
mov [hpet_base], eax |
mov eax, [eax] |
mov eax, [eax+HPET_ID] |
DEBUGF 1, "K : HPET caps %x\n", eax |
call init_hpet |
@@: |
; SET UP OS TASK |
892,7 → 894,7 |
mov ebx, [hpet_base] |
test ebx, ebx |
jz @F |
mov ebx, [ebx+0xF0] |
mov ebx, [ebx+HPET_COUNTER] |
rdtsc |
mov ecx, 1000 |
/kernel/trunk/kernel32.inc |
---|
24,10 → 24,13 |
include "core/v86.inc" ; 16-bit mode machine |
include "core/irq.inc" ; interrupt handling functions |
include "core/apic.inc" |
include "core/hpet.inc" |
include "core/timers.inc" |
include "core/clipboard.inc" |
include "core/slab.inc" |
include "acpi/acpi.inc" |
include "posix/posix.inc" |
include "boot/shutdown.inc" ; kernel shutdown |