forked from KolibriOS/kolibrios
kernel: Implement reboot via fixed Reset register in FADT table if available.
The code expects the register is in system_io space. Other options are not implemented but it works on my computer (c). git-svn-id: svn://kolibrios.org@7734 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
cbceb320e8
commit
de8ecf4c59
@ -13,6 +13,27 @@
|
|||||||
|
|
||||||
$Revision$
|
$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
|
align 4
|
||||||
system_shutdown: ; shut down the system
|
system_shutdown: ; shut down the system
|
||||||
|
|
||||||
@ -173,6 +194,30 @@ do_acpi_power_off:
|
|||||||
jmp $
|
jmp $
|
||||||
|
|
||||||
no_acpi_power_off:
|
no_acpi_power_off:
|
||||||
|
cmp byte[BOOT_LO.shutdown_type], SYSTEM_REBOOT
|
||||||
|
jnz no_acpi_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]
|
||||||
|
out dx, al
|
||||||
|
jmp $
|
||||||
|
; unreachable
|
||||||
|
no_acpi_reboot:
|
||||||
jmp 0x50000
|
jmp 0x50000
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
|
Loading…
Reference in New Issue
Block a user