]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/PiSmmCpuDxeSmm: eliminate conditional jump in IA32 SmmStartup()
authorLaszlo Ersek <lersek@redhat.com>
Tue, 30 Jan 2018 14:34:08 +0000 (15:34 +0100)
committerLaszlo Ersek <lersek@redhat.com>
Wed, 31 Jan 2018 11:38:26 +0000 (12:38 +0100)
SMM emulation under both KVM and QEMU (TCG) crashes the guest when the
"jz" branch, added in commit d4d87596c11d ("UefiCpuPkg/PiSmmCpuDxeSmm:
Enable NXE if it's supported", 2018-01-18), is taken.

Rework the propagation of CPUID.80000001H:EDX.NX [bit 20] to IA32_EFER.NXE
[bit 11] so that no code is executed conditionally.

Cc: Eric Dong <eric.dong@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Ref: http://mid.mail-archive.com/d6fff558-6c4f-9ca6-74a7-e7cd9d007276@redhat.com
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
[lersek@redhat.com: XD -> NX code comment updates from Ray]
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
[lersek@redhat.com: mark QEMU/TCG as well in the commit message]

UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm

index 9231aa5b3deda5fefdbcd4f3c772a0e60bd98633..d64fcd48d03ed8820c4a0eab069c58ec35d5b7e4 100644 (file)
@@ -47,6 +47,8 @@ ASM_PFX(SmmStartup):
     mov     eax, 0x80000001             ; read capability\r
     cpuid\r
     mov     ebx, edx                    ; rdmsr will change edx. keep it in ebx.\r
+    and     ebx, BIT20                  ; extract NX capability bit\r
+    shr     ebx, 9                      ; shift bit to IA32_EFER.NXE[BIT11] position\r
     DB      0x66, 0xb8                  ; mov eax, imm32\r
 ASM_PFX(gSmmCr3): DD 0\r
     mov     cr3, eax\r
@@ -56,11 +58,8 @@ ASM_PFX(gSmmCr4): DD 0
     mov     cr4, eax\r
     mov     ecx, 0xc0000080             ; IA32_EFER MSR\r
     rdmsr\r
-    test    ebx, BIT20                  ; check NXE capability\r
-    jz      .1\r
-    or      ah, BIT3                    ; set NXE bit\r
+    or      eax, ebx                    ; set NXE bit if NX is available\r
     wrmsr\r
-.1:\r
     DB      0x66, 0xb8                  ; mov eax, imm32\r
 ASM_PFX(gSmmCr0): DD 0\r
     mov     di, PROTECT_MODE_DS\r