У меня такой вариант (через ACPI):
Код:
;----------------------------------------------------------------
; Reboots computer
;----------------------------------------------------------------
RebootFunc:
; Old school:
; mov al, 0xFE
; out 0x64, al
;
; New school:
RESET_REG = 116 ; 12 bytes
RESET_VAL = 128 ; 1 byte
struc ResetRegStruc A
{
virtual at A
.SpaceID db 0
.BitWidth db 0
.BitOffset db 0
.AccessWidth db 0
.Address dq 0
end virtual
}
ResetReg ResetRegStruc rdi
cli
mov rdi, [FADTAddr] ; FADT from ACPI
xor rax, rax
mov al, [rdi+RESET_VAL] ; Load Reset Value
add rdi, RESET_REG
mov rdx, [ResetReg.Address]
mov cl, [ResetReg.SpaceID]
cmp cl, 0 ; Memory space
jnz @f
mov [rdx], al
@@:
cmp cl, 1 ; IO space
jnz @f
out dx, al
@@: ; PCI CFG Space
cmp cl, 2
jnz @f
mov r14b, al ; Value
mov ebx, edx
shr ebx, 24 ; Dev (ddddd)
and bl, 1Fh
shl bl, 3
mov eax, edx
shr eax, 16
and al, 7 ; Func (fff)
or bl, al ; dddddfff
shl bx, 8 ; move to bh
xor ax, ax ; Byte count and bus
mov bl, dl ; Addr
call PCIRegWrite
@@:
jmp $