]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg PiSmmCpuDxeSmm: Update X64/MpFuncs.nasm
authorLiming Gao <liming.gao@intel.com>
Tue, 14 Jun 2016 08:35:08 +0000 (16:35 +0800)
committerLiming Gao <liming.gao@intel.com>
Tue, 28 Jun 2016 01:52:16 +0000 (09:52 +0800)
Use 16bit and 32bit assembly code to replace hard code db.

In V2: add 0x67 prefixes to far jumps

Without the a32 modifier under FLAT32_JUMP, and the a16 modifier under
LONG_JUMP, nasm doesn't generate the 0x67 prefixes, and the far jumps
don't work. (For the former, KVM returns an emulation failure. For the
latter, KVM performs a triple fault (guest reboot).) By forcing the 0x67
prefixes we end up with the same machine code as the one open-coded in
"MpFuncs.asm".

This bug breaks S3 resume in the Ia32X64 + 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>
UefiCpuPkg/PiSmmCpuDxeSmm/X64/MpFuncs.nasm

index a10f1ff85902bf7d08dcacfd1b449a7ec6050dee..702233d6e49d14b1ab074d66ea7512915eb25f35 100644 (file)
@@ -45,86 +45,78 @@ extern ASM_PFX(InitializeFloatingPointUnits)
 DEFAULT REL\r
 SECTION .text\r
 \r
+BITS 16\r
 global ASM_PFX(RendezvousFunnelProc)\r
 ASM_PFX(RendezvousFunnelProc):\r
 RendezvousFunnelProcStart:\r
 \r
 ; At this point CS = 0x(vv00) and ip= 0x0.\r
 \r
-        db 0x8c,  0xc8                 ; mov        ax,  cs\r
-        db 0x8e,  0xd8                 ; mov        ds,  ax\r
-        db 0x8e,  0xc0                 ; mov        es,  ax\r
-        db 0x8e,  0xd0                 ; mov        ss,  ax\r
-        db 0x33,  0xc0                 ; xor        ax,  ax\r
-        db 0x8e,  0xe0                 ; mov        fs,  ax\r
-        db 0x8e,  0xe8                 ; mov        gs,  ax\r
+        mov        ax,  cs\r
+        mov        ds,  ax\r
+        mov        es,  ax\r
+        mov        ss,  ax\r
+        xor        ax,  ax\r
+        mov        fs,  ax\r
+        mov        gs,  ax\r
 \r
 flat32Start:\r
 \r
-        db 0xBE\r
-        dw BufferStartLocation        ; mov        si, BufferStartLocation\r
-        db 0x66,  0x8B, 0x14             ; mov        edx,dword ptr [si]          ; EDX is keeping the start address of wakeup buffer\r
+        mov        si, BufferStartLocation\r
+        mov        edx,dword [si]          ; EDX is keeping the start address of wakeup buffer\r
 \r
-        db 0xBE\r
-        dw Cr3OffsetLocation          ; mov        si, Cr3Location\r
-        db 0x66,  0x8B, 0xC             ; mov        ecx,dword ptr [si]          ; ECX is keeping the value of CR3\r
+        mov        si, Cr3OffsetLocation\r
+        mov        ecx,dword [si]          ; ECX is keeping the value of CR3\r
 \r
-        db 0xBE\r
-        dw GdtrLocation               ; mov        si, GdtrProfile\r
-        db 0x66                        ; db         66h\r
-        db 0x2E,  0xF, 0x1, 0x14        ; lgdt       fword ptr cs:[si]\r
+        mov        si, GdtrLocation\r
+o32     lgdt       [cs:si]\r
 \r
-        db 0xBE\r
-        dw IdtrLocation               ; mov        si, IdtrProfile\r
-        db 0x66                        ; db         66h\r
-        db 0x2E,  0xF, 0x1, 0x1C        ; lidt       fword ptr cs:[si]\r
+        mov        si, IdtrLocation\r
+o32     lidt       [cs:si]\r
 \r
-        db 0x33,  0xC0                 ; xor        ax,  ax\r
-        db 0x8E,  0xD8                 ; mov        ds,  ax\r
+        xor        ax,  ax\r
+        mov        ds,  ax\r
 \r
-        db 0xF,  0x20, 0xC0            ; mov        eax, cr0                    ; Get control register 0\r
-        db 0x66,  0x83, 0xC8, 0x1       ; or         eax, 000000001h             ; Set PE bit (bit #0)\r
-        db 0xF,  0x22, 0xC0            ; mov        cr0, eax\r
+        mov        eax, cr0                    ; Get control register 0\r
+        or         eax, 0x000000001            ; Set PE bit (bit #0)\r
+        mov        cr0, eax\r
 \r
 FLAT32_JUMP:\r
 \r
-        db 0x66,  0x67, 0xEA            ; far jump\r
-        dd 0x0                         ; 32-bit offset\r
-        dw 0x20                        ; 16-bit selector\r
+a32     jmp   dword 0x20:0x0\r
 \r
+BITS 32\r
 PMODE_ENTRY:                         ; protected mode entry point\r
 \r
-        db 0x66,  0xB8, 0x18,  0x0      ; mov        ax,  18h\r
-        db 0x66,  0x8E,  0xD8           ; mov        ds,  ax\r
-        db 0x66,  0x8E,  0xC0           ; mov        es,  ax\r
-        db 0x66,  0x8E,  0xE0           ; mov        fs,  ax\r
-        db 0x66,  0x8E,  0xE8           ; mov        gs,  ax\r
-        db 0x66,  0x8E,  0xD0           ; mov        ss,  ax                     ; Flat mode setup.\r
+        mov        ax,  0x18\r
+o16     mov        ds,  ax\r
+o16     mov        es,  ax\r
+o16     mov        fs,  ax\r
+o16     mov        gs,  ax\r
+o16     mov        ss,  ax                     ; Flat mode setup.\r
 \r
-        db 0xF,  0x20,  0xE0           ; mov        eax, cr4\r
-        db 0xF,  0xBA, 0xE8, 0x5      ; bts        eax, 5\r
-        db 0xF,  0x22,  0xE0           ; mov        cr4, eax\r
+        mov        eax, cr4\r
+        bts        eax, 5\r
+        mov        cr4, eax\r
 \r
-        db 0xF,  0x22,  0xD9           ; mov        cr3, ecx\r
+        mov        cr3, ecx\r
 \r
-        db 0x8B,  0xF2                 ; mov        esi, edx                    ; Save wakeup buffer address\r
+        mov        esi, edx                    ; Save wakeup buffer address\r
 \r
-        db 0xB9\r
-        dd 0xC0000080                 ; mov        ecx, 0c0000080h             ; EFER MSR number.\r
-        db 0xF,  0x32                  ; rdmsr                                  ; Read EFER.\r
-        db 0xF,  0xBA, 0xE8, 0x8      ; bts        eax, 8                      ; Set LME=1.\r
-        db 0xF,  0x30                  ; wrmsr                                  ; Write EFER.\r
+        mov        ecx, 0xc0000080             ; EFER MSR number.\r
+        rdmsr                                  ; Read EFER.\r
+        bts        eax, 8                      ; Set LME=1.\r
+        wrmsr                                  ; Write EFER.\r
 \r
-        db 0xF,  0x20,  0xC0           ; mov        eax, cr0                    ; Read CR0.\r
-        db 0xF,  0xBA, 0xE8, 0x1F      ; bts        eax, 31                     ; Set PG=1.\r
-        db 0xF,  0x22,  0xC0           ; mov        cr0, eax                    ; Write CR0.\r
+        mov        eax, cr0                    ; Read CR0.\r
+        bts        eax, 31                     ; Set PG=1.\r
+        mov        cr0, eax                    ; Write CR0.\r
 \r
 LONG_JUMP:\r
 \r
-        db 0x67,  0xEA                 ; far jump\r
-        dd 0x0                         ; 32-bit offset\r
-        dw 0x38                        ; 16-bit selector\r
+a16     jmp   dword 0x38:0x0\r
 \r
+BITS 64\r
 LongModeStart:\r
 \r
         mov         ax,  0x30\r