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:
Ivan Baravy 2020-03-02 21:48:09 +00:00
parent cbceb320e8
commit de8ecf4c59

View File

@ -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