mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg PiSmmCpuDxeSmm: Update Ia32/MpFuncs.nasm
Use 16bit assembly code to replace hard code db. In V2: Add 0x67 prefix to far jump When we enter protected mode, with the far jump still in big real mode, the JMP instruction not only needs the 0x66 prefix (for 32-bit operand size), but also the 0x67 prefix (for 32-bit address size). Use the a32 nasm modifier to enforce this. This bug breaks S3 resume in the Ia32 + SMM_REQUIRE build of OVMF. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Liming Gao <liming.gao@intel.com> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
parent
6997711e7f
commit
55c6d5467e
|
@ -42,49 +42,44 @@ extern ASM_PFX(InitializeFloatingPointUnits)
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
|
;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
|
||||||
|
|
||||||
|
BITS 16
|
||||||
global ASM_PFX(RendezvousFunnelProc)
|
global ASM_PFX(RendezvousFunnelProc)
|
||||||
ASM_PFX(RendezvousFunnelProc):
|
ASM_PFX(RendezvousFunnelProc):
|
||||||
RendezvousFunnelProcStart:
|
RendezvousFunnelProcStart:
|
||||||
|
|
||||||
; At this point CS = 0x(vv00) and ip= 0x0.
|
; At this point CS = 0x(vv00) and ip= 0x0.
|
||||||
|
|
||||||
db 0x8c, 0xc8 ; mov ax, cs
|
mov ax, cs
|
||||||
db 0x8e, 0xd8 ; mov ds, ax
|
mov ds, ax
|
||||||
db 0x8e, 0xc0 ; mov es, ax
|
mov es, ax
|
||||||
db 0x8e, 0xd0 ; mov ss, ax
|
mov ss, ax
|
||||||
db 0x33, 0xc0 ; xor ax, ax
|
xor ax, ax
|
||||||
db 0x8e, 0xe0 ; mov fs, ax
|
mov fs, ax
|
||||||
db 0x8e, 0xe8 ; mov gs, ax
|
mov gs, ax
|
||||||
|
|
||||||
flat32Start:
|
flat32Start:
|
||||||
|
|
||||||
db 0xBE
|
mov si, BufferStart
|
||||||
dw BufferStart ; mov si, BufferStart
|
mov edx,dword [si] ; EDX is keeping the start address of wakeup buffer
|
||||||
db 0x66, 0x8B, 0x14 ; mov edx,dword ptr [si] ; EDX is keeping the start address of wakeup buffer
|
|
||||||
|
|
||||||
db 0xBE
|
mov si, GdtrProfile
|
||||||
dw GdtrProfile ; mov si, GdtrProfile
|
o32 lgdt [cs:si]
|
||||||
db 0x66 ; db 66h
|
|
||||||
db 0x2E, 0xF, 0x1, 0x14 ; lgdt fword ptr cs:[si]
|
|
||||||
|
|
||||||
db 0xBE
|
mov si, IdtrProfile
|
||||||
dw IdtrProfile ; mov si, IdtrProfile
|
o32 lidt [cs:si]
|
||||||
db 0x66 ; db 66h
|
|
||||||
db 0x2E, 0xF, 0x1, 0x1C ; lidt fword ptr cs:[si]
|
|
||||||
|
|
||||||
db 0x33, 0xC0 ; xor ax, ax
|
xor ax, ax
|
||||||
db 0x8E, 0xD8 ; mov ds, ax
|
mov ds, ax
|
||||||
|
|
||||||
db 0xF, 0x20, 0xC0 ; mov eax, cr0 ; Get control register 0
|
mov eax, cr0 ; Get control register 0
|
||||||
db 0x66, 0x83, 0xC8, 0x1 ; or eax, 000000001h ; Set PE bit (bit #0)
|
or eax, 0x000000001 ; Set PE bit (bit #0)
|
||||||
db 0xF, 0x22, 0xC0 ; mov cr0, eax
|
mov cr0, eax
|
||||||
|
|
||||||
FLAT32_JUMP:
|
FLAT32_JUMP:
|
||||||
|
|
||||||
db 0x66, 0x67, 0xEA ; far jump
|
a32 jmp dword 0x20:0x0
|
||||||
dd 0x0 ; 32-bit offset
|
|
||||||
dw 0x20 ; 16-bit selector
|
|
||||||
|
|
||||||
|
BITS 32
|
||||||
PMODE_ENTRY: ; protected mode entry point
|
PMODE_ENTRY: ; protected mode entry point
|
||||||
|
|
||||||
mov ax, 0x8
|
mov ax, 0x8
|
||||||
|
|
Loading…
Reference in New Issue