mirror of
https://github.com/chipsec/chipsec
synced 2026-06-08 13:31:00 +00:00
a9dfc1b050
2. Decompression of images in SPI flash parsing is only supported in Windows. 3. UEFI - Support for IA32 and i586 (Quark) 4. Added capability to use modules from an arbitrary path with the -I / --import command line option 5. Module functionality encapsulated in class inheriting BaseModule 6. Fixed loading platform specific configuration 7. Fixed issue with modules which run on multiple logical CPUs hanging on Bay Trail (Windows/Linux). The issue still exist when running from UEFI shell 8. Added template for a module - module_template.py 9. Added options to flush log files 10. Added ability to define custom platforms Driver changes: 1. Windows - Added IOCTL_ALLOC_PHYSMEM to allocate physical memory buffer 2. Linux - Fix wrpci defect
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
|