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:
Liming Gao 2016-06-14 16:26:46 +08:00
parent 6997711e7f
commit 55c6d5467e
1 changed files with 21 additions and 26 deletions

View File

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