There might be page table set SMM data region be XD. So we have to enable XD before enable paging. Or #PF might be generated.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: "Yao, Jiewen" <[email protected]> Cc: "Fan, Jeff" <[email protected]> Cc: "Kinney, Michael D" <[email protected]> --- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S | 18 ++++++++++++++++++ UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm | 18 ++++++++++++++++++ UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 7 ------- UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S | 20 +++++++++++++++++++- UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm | 20 +++++++++++++++++++- 5 files changed, 74 insertions(+), 9 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S index fbaa072..7e1787c 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S @@ -122,6 +122,24 @@ L11: orl $BIT10, %eax L12: # as cr4.PGE is not set here, refresh cr3 movl %eax, %cr4 # in PreModifyMtrrs() to flush TLB. + +# +# Need to test for XD support +# + movl $0x80000000, %eax + cpuid + cmpl $0x80000000, %eax + jbe L13 + movl $0x80000001, %eax + cpuid + testl $BIT20, %edx + jz L13 + movl $0xc0000080, %ecx + rdmsr + orb $8,%ah # enable NXE + wrmsr +L13: + movl %cr0, %ebx orl $0x080000000, %ebx # enable paging movl %ebx, %cr0 diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm index 8a12927..e6af344 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm @@ -128,6 +128,24 @@ gSmiCr3 DD ? or eax, BIT10 @@: ; as cr4.PGE is not set here, refresh cr3 mov cr4, eax ; in PreModifyMtrrs() to flush TLB. + +; +; Need to test for XD support +; + mov eax, 080000000h + cpuid + cmp eax, 080000000h + jbe @f + mov eax, 080000001h + cpuid + test edx, BIT20 + jz @f + mov ecx, 0c0000080h + rdmsr + or ah, 8 ; enable NXE + wrmsr +@@: + mov ebx, cr0 or ebx, 080000000h ; enable paging mov cr0, ebx diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 031a5fe..26c9a0f 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -1075,13 +1075,6 @@ SmiRendezvous ( InitializeSpinLock (&mSmmMpSyncData->CpuData[CpuIndex].Busy); } - // - // Try to enable NX - // - if (mXdSupported) { - ActivateXd (); - } - if (FeaturePcdGet (PcdCpuSmmProfileEnable)) { ActivateSmmProfile (CpuIndex); } diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S index b488b74..1d40819 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S @@ -139,9 +139,27 @@ ASM_PFX(gSmiCr3): .space 4 call Base # push return address for retf later Base: addl $(LongMode - Base), (%rsp) # offset for far retf, seg is the 1st arg + +# +# Need to test for XD support +# + movl $0x80000000, %eax + cpuid + cmpl $0x80000000, %eax + jbe NxeDone + movl $0x80000001, %eax + cpuid + testl $BIT20, %edx + jz NxeDone + movl $0xc0000080, %ecx + rdmsr + orb $8,%ah # enable NXE + wrmsr +NxeDone: + movl $0xc0000080, %ecx rdmsr - orb $1,%ah + orb $1,%ah # enable LME wrmsr movq %cr0, %rbx btsl $31, %ebx diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm index 4f5c03c..6e1d3f1 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm @@ -135,9 +135,27 @@ gSmiCr3 DD ? call Base ; push return address for retf later Base: add dword ptr [rsp], @LongMode - Base; offset for far retf, seg is the 1st arg + +; +; Need to test for XD support +; + mov eax, 080000000h + cpuid + cmp eax, 080000000h + jbe @f + mov eax, 080000001h + cpuid + test edx, BIT20 + jz @f + mov ecx, 0c0000080h + rdmsr + or ah, 8 ; enable NXE + wrmsr +@@: + mov ecx, 0c0000080h rdmsr - or ah, 1 + or ah, 1 ; enable LME wrmsr mov rbx, cr0 bts ebx, 31 -- 1.9.5.msysgit.0 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

