mirror of
https://github.com/chipsec/chipsec
synced 2026-06-08 13:31:00 +00:00
396 lines
10 KiB
NASM
396 lines
10 KiB
NASM
TITLE cpu.asm: Assembly code for the i386 resources
|
|
|
|
PUBLIC WritePortDword
|
|
PUBLIC WritePortWord
|
|
PUBLIC WritePortByte
|
|
PUBLIC ReadPortDword
|
|
PUBLIC ReadPortWord
|
|
PUBLIC ReadPortByte
|
|
PUBLIC WriteHighCMOSByte
|
|
PUBLIC WriteLowCMOSByte
|
|
PUBLIC SendAPMSMI
|
|
PUBLIC WritePCIByte
|
|
PUBLIC WritePCIWord
|
|
PUBLIC WritePCIDword
|
|
PUBLIC ReadPCIByte
|
|
PUBLIC ReadPCIWord
|
|
PUBLIC ReadPCIDword
|
|
PUBLIC _rdmsr
|
|
PUBLIC _wrmsr
|
|
|
|
|
|
.586p
|
|
.model flat,C
|
|
.code
|
|
|
|
;------------------------------------------------------------------------------
|
|
; void _store_idtr(
|
|
; unsigned char *address // rcx
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
_store_idtr PROC
|
|
mov ecx, dword ptr [esp+4]
|
|
sidt dword ptr [ecx]
|
|
ret
|
|
_store_idtr ENDP
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
; void _load_idtr(
|
|
; unsigned char *address // rcx
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
_load_idtr PROC
|
|
mov ecx, dword ptr [esp+4]
|
|
lidt fword ptr [ecx]
|
|
ret
|
|
_load_idtr ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; void _store_gdtr(
|
|
; unsigned char *address // rcx
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
_store_gdtr PROC
|
|
mov ecx, dword ptr [esp+4]
|
|
sgdt dword ptr [ecx]
|
|
ret
|
|
_store_gdtr ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; void _store_ldtr(
|
|
; unsigned char *address // rcx
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
_store_ldtr PROC
|
|
mov ecx, dword ptr [esp+4]
|
|
sldt word ptr [ecx]
|
|
ret
|
|
_store_ldtr ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; void __stdcall _rdmsr(
|
|
; IN UINT32 msr,
|
|
; OUT UINT32* msrlo,
|
|
; OUT UINT32* msrhi
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
_rdmsr PROC
|
|
mov ecx, dword ptr [esp + 4] ; msr
|
|
|
|
rdmsr
|
|
|
|
mov ecx, dword ptr [esp + 8]
|
|
mov dword ptr [ecx], eax ; msrlo
|
|
mov ecx, dword ptr [esp + 12]
|
|
mov dword ptr [ecx], edx ; msrhi
|
|
|
|
ret
|
|
_rdmsr ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID __stdcall _wrmsr(
|
|
; IN UINT32 msr,
|
|
; IN UINT32 msrlo,
|
|
; IN UINT32 msrhi
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
_wrmsr PROC
|
|
mov ecx, dword ptr [esp + 4] ; msr
|
|
mov eax, dword ptr [esp + 8] ; msrlo
|
|
mov edx, dword ptr [esp + 12] ; msrhi
|
|
|
|
wrmsr
|
|
|
|
ret
|
|
_wrmsr ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
;UINT32 _eflags()
|
|
;------------------------------------------------------------------------------
|
|
eflags PROC
|
|
pushfd
|
|
pop eax
|
|
ret
|
|
eflags ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; WritePortDword (
|
|
; IN UINT32 out_value
|
|
; IN UINT16 port_num
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
WritePortDword PROC
|
|
mov eax, dword ptr [esp + 4] ; out_value
|
|
mov edx, dword ptr [esp + 8] ; port_num
|
|
out dx, eax
|
|
|
|
ret
|
|
WritePortDword ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; WritePortWord (
|
|
; IN UINT16 out_value
|
|
; IN UINT16 port_num
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
WritePortWord PROC
|
|
mov eax, dword ptr [esp + 4] ; out_value
|
|
mov edx, dword ptr [esp + 8] ; port_num
|
|
out dx, ax
|
|
|
|
ret
|
|
WritePortWord ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; WritePortByte (
|
|
; IN UINT8 out_value
|
|
; IN UINT16 port_num
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
WritePortByte PROC
|
|
mov eax, dword ptr [esp + 4] ; out_value
|
|
mov edx, dword ptr [esp + 8] ; port_num
|
|
out dx, al
|
|
|
|
ret
|
|
WritePortByte ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; UINT32
|
|
; ReadPortDword (
|
|
; IN UINT16 port_num
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
ReadPortDword PROC
|
|
xor eax, eax
|
|
mov edx, dword ptr [esp + 4] ; port_num
|
|
in eax, dx
|
|
|
|
ret
|
|
ReadPortDword ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; UINT16
|
|
; ReadPortWord (
|
|
; IN UINT16 port_num
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
ReadPortWord PROC
|
|
xor eax, eax
|
|
mov edx, dword ptr [esp + 4] ; port_num
|
|
in ax, dx
|
|
|
|
ret
|
|
ReadPortWord ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; UINT8
|
|
; ReadPortByte (
|
|
; IN UINT16 port_num
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
ReadPortByte PROC
|
|
xor eax, eax
|
|
mov edx, dword ptr [esp + 4] ; port_num
|
|
in al, dx
|
|
|
|
ret
|
|
ReadPortByte ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; WriteHighCMOSByte (
|
|
; IN UINT8 cmos_off
|
|
; IN UINT8 val
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
WriteHighCMOSByte PROC
|
|
mov eax, dword ptr [esp + 4] ; cmos_off
|
|
out 72h, al
|
|
mov eax, dword ptr [esp + 8] ; val
|
|
out 73h, al
|
|
|
|
ret
|
|
WriteHighCMOSByte ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; WriteLowCMOSByte (
|
|
; IN UINT8 cmos_off
|
|
; IN UINT8 val
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
WriteLowCMOSByte PROC
|
|
mov eax, dword ptr [esp + 4] ; cmos_off
|
|
or al, 80h
|
|
out 70h, al
|
|
mov eax, dword ptr [esp + 8] ; val
|
|
out 71h, al
|
|
|
|
ret
|
|
WriteLowCMOSByte ENDP
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; SendAPMSMI (
|
|
; IN UINT32 apm_port_value
|
|
; IN UINT64 rax_value // NOT USED???
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
SendAPMSMI PROC
|
|
mov eax, dword ptr [esp + 4] ; apm_port_value
|
|
mov dx, 0B2h
|
|
out dx, eax
|
|
|
|
ret
|
|
SendAPMSMI ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; WritePCIByte (
|
|
; IN UINT32 pci_reg
|
|
; IN UINT16 cfg_data_port
|
|
; IN UINT8 byte_value
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
WritePCIByte PROC
|
|
mov eax, dword ptr [esp + 4] ; pci_reg
|
|
mov dx, 0CF8h
|
|
out dx, eax
|
|
|
|
mov eax, dword ptr [esp + 12] ; word_value
|
|
mov edx, dword ptr [esp + 8] ; cfg_data_port
|
|
out dx, al
|
|
|
|
ret
|
|
WritePCIByte ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; WritePCIWord (
|
|
; IN UINT32 pci_reg
|
|
; IN UINT16 cfg_data_port
|
|
; IN UINT16 word_value
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
WritePCIWord PROC
|
|
mov eax, dword ptr [esp + 4] ; pci_reg
|
|
mov dx, 0CF8h
|
|
out dx, eax
|
|
|
|
mov eax, dword ptr [esp + 12] ; word_value
|
|
mov edx, dword ptr [esp + 8] ; cfg_data_port
|
|
out dx, ax
|
|
|
|
ret
|
|
WritePCIWord ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; WritePCIDword (
|
|
; IN UINT32 pci_reg
|
|
; IN UINT16 cfg_data_port // rdx
|
|
; IN UINT32 dword_value // r8
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
WritePCIDword PROC
|
|
|
|
mov eax, dword ptr [esp + 4] ; pci_reg
|
|
mov dx, 0CF8h
|
|
out dx, eax
|
|
|
|
mov eax, dword ptr [esp + 12] ; dword_value
|
|
mov edx, dword ptr [esp + 8] ; cfg_data_port
|
|
out dx, eax
|
|
|
|
ret
|
|
WritePCIDword ENDP
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
; unsigned char
|
|
; ReadPCIByte (
|
|
; unsigned int pci_reg // rcx
|
|
; unsigned short cfg_data_port // rdx
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
ReadPCIByte PROC
|
|
cli
|
|
mov eax, dword ptr [esp + 4] ; pci_reg
|
|
mov dx, 0CF8h
|
|
out dx, eax
|
|
|
|
xor eax, eax
|
|
mov edx, dword ptr [esp + 8] ; cfg_data_port
|
|
in al, dx
|
|
sti
|
|
|
|
ret
|
|
ReadPCIByte ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; unsigned short
|
|
; ReadPCIWord (
|
|
; unsigned int pci_reg // rcx
|
|
; unsigned short cfg_data_port // rdx
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
ReadPCIWord PROC
|
|
cli
|
|
mov eax, dword ptr [esp + 4] ; pci_reg
|
|
mov dx, 0CF8h
|
|
out dx, eax
|
|
|
|
xor eax, eax
|
|
mov edx, dword ptr [esp + 8] ; cfg_data_port
|
|
in ax, dx
|
|
sti
|
|
|
|
ret
|
|
ReadPCIWord ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; unsigned int
|
|
; ReadPCIDword (
|
|
; unsigned int pci_reg // rcx
|
|
; unsigned short cfg_data_port // rdx
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
ReadPCIDword PROC
|
|
cli
|
|
mov eax, dword ptr [esp + 4] ; pci_reg
|
|
mov dx, 0CF8h
|
|
out dx, eax
|
|
|
|
xor eax, eax
|
|
mov edx, dword ptr [esp + 8] ; cfg_data_port
|
|
in eax, dx
|
|
sti
|
|
|
|
ret
|
|
ReadPCIDword ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; void
|
|
; _swsmi (
|
|
; unsigned int smi_code_data // rcx
|
|
; IN UINT32 rax_value // rdx
|
|
; IN UINT32 rbx_value // r8
|
|
; IN UINT32 rcx_value // r9
|
|
; IN UINT32 rdx_value // r10
|
|
; IN UINT32 rsi_value // r11
|
|
; IN UINT32 rdi_value // r12
|
|
; )
|
|
;------------------------------------------------------------------------------
|
|
_swsmi PROC
|
|
xor eax, eax
|
|
ret
|
|
_swsmi ENDP
|
|
|
|
END
|