UefiCpuPkg/PiSmmCpuDxeSmm: patch "gSmmCr3" with PatchInstructionX86()

Rename the variable to "gPatchSmmCr3" so that its association with
PatchInstructionX86() is clear from the declaration, change its type to
X86_ASSEMBLY_PATCH_LABEL, and patch it with PatchInstructionX86(). This
lets us remove the binary (DB) encoding of some instructions in
"SmmInit.nasm".

Cc: Eric Dong <eric.dong@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=866
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Laszlo Ersek 2018-02-02 01:48:56 +01:00
parent 00c5eede48
commit 6b0841c166
4 changed files with 8 additions and 8 deletions

View File

@ -22,7 +22,7 @@ extern ASM_PFX(SmmInitHandler)
extern ASM_PFX(mRebasedFlag) extern ASM_PFX(mRebasedFlag)
extern ASM_PFX(mSmmRelocationOriginalAddress) extern ASM_PFX(mSmmRelocationOriginalAddress)
global ASM_PFX(gSmmCr3) global ASM_PFX(gPatchSmmCr3)
global ASM_PFX(gSmmCr4) global ASM_PFX(gSmmCr4)
global ASM_PFX(gSmmCr0) global ASM_PFX(gSmmCr0)
global ASM_PFX(gSmmJmpAddr) global ASM_PFX(gSmmJmpAddr)
@ -49,8 +49,8 @@ ASM_PFX(SmmStartup):
mov ebx, edx ; rdmsr will change edx. keep it in ebx. mov ebx, edx ; rdmsr will change edx. keep it in ebx.
and ebx, BIT20 ; extract NX capability bit and ebx, BIT20 ; extract NX capability bit
shr ebx, 9 ; shift bit to IA32_EFER.NXE[BIT11] position shr ebx, 9 ; shift bit to IA32_EFER.NXE[BIT11] position
DB 0x66, 0xb8 ; mov eax, imm32 mov eax, strict dword 0 ; source operand will be patched
ASM_PFX(gSmmCr3): DD 0 ASM_PFX(gPatchSmmCr3):
mov cr3, eax mov cr3, eax
o32 lgdt [cs:ebp + (ASM_PFX(gcSmiInitGdtr) - ASM_PFX(SmmStartup))] o32 lgdt [cs:ebp + (ASM_PFX(gcSmiInitGdtr) - ASM_PFX(SmmStartup))]
DB 0x66, 0xb8 ; mov eax, imm32 DB 0x66, 0xb8 ; mov eax, imm32

View File

@ -406,7 +406,7 @@ SmmRelocateBases (
// Patch ASM code template with current CR0, CR3, and CR4 values // Patch ASM code template with current CR0, CR3, and CR4 values
// //
gSmmCr0 = (UINT32)AsmReadCr0 (); gSmmCr0 = (UINT32)AsmReadCr0 ();
gSmmCr3 = (UINT32)AsmReadCr3 (); PatchInstructionX86 (gPatchSmmCr3, AsmReadCr3 (), 4);
gSmmCr4 = (UINT32)AsmReadCr4 (); gSmmCr4 = (UINT32)AsmReadCr4 ();
// //

View File

@ -309,7 +309,7 @@ extern IA32_FAR_ADDRESS gSmmJmpAddr;
extern CONST UINT8 gcSmmInitTemplate[]; extern CONST UINT8 gcSmmInitTemplate[];
extern CONST UINT16 gcSmmInitSize; extern CONST UINT16 gcSmmInitSize;
extern UINT32 gSmmCr0; extern UINT32 gSmmCr0;
extern UINT32 gSmmCr3; X86_ASSEMBLY_PATCH_LABEL gPatchSmmCr3;
extern UINT32 gSmmCr4; extern UINT32 gSmmCr4;
extern UINTN gSmmInitStack; extern UINTN gSmmInitStack;

View File

@ -22,7 +22,7 @@ extern ASM_PFX(SmmInitHandler)
extern ASM_PFX(mRebasedFlag) extern ASM_PFX(mRebasedFlag)
extern ASM_PFX(mSmmRelocationOriginalAddress) extern ASM_PFX(mSmmRelocationOriginalAddress)
global ASM_PFX(gSmmCr3) global ASM_PFX(gPatchSmmCr3)
global ASM_PFX(gSmmCr4) global ASM_PFX(gSmmCr4)
global ASM_PFX(gSmmCr0) global ASM_PFX(gSmmCr0)
global ASM_PFX(gSmmJmpAddr) global ASM_PFX(gSmmJmpAddr)
@ -47,8 +47,8 @@ ASM_PFX(SmmStartup):
mov eax, 0x80000001 ; read capability mov eax, 0x80000001 ; read capability
cpuid cpuid
mov ebx, edx ; rdmsr will change edx. keep it in ebx. mov ebx, edx ; rdmsr will change edx. keep it in ebx.
DB 0x66, 0xb8 ; mov eax, imm32 mov eax, strict dword 0 ; source operand will be patched
ASM_PFX(gSmmCr3): DD 0 ASM_PFX(gPatchSmmCr3):
mov cr3, eax mov cr3, eax
o32 lgdt [cs:ebp + (ASM_PFX(gcSmiInitGdtr) - ASM_PFX(SmmStartup))] o32 lgdt [cs:ebp + (ASM_PFX(gcSmiInitGdtr) - ASM_PFX(SmmStartup))]
DB 0x66, 0xb8 ; mov eax, imm32 DB 0x66, 0xb8 ; mov eax, imm32