mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg\CpuSmm: Save & restore CR2 on-demand paging in SMM
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1593 For every SMI occurrence, save and restore CR2 register only when SMM on-demand paging support is enabled in 64 bit operation mode. This is not a bug but to have better improvement of code. Patch5 is updated with separate functions for Save and Restore of CR2 based on review feedback. Patch6 - Removed Global Cr2 instead used function parameter. Patch7 - Removed checking Cr2 with 0 as per feedback. Patch8 and 9 - Aligned with EDK2 Coding style. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Vanguput Narendra K <narendra.k.vanguput@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Yao Jiewen <jiewen.yao@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
parent
e4ff6349bf
commit
37f9fea5b8
|
@ -316,3 +316,29 @@ SetPageTableAttributes (
|
||||||
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function returns with no action for 32 bit.
|
||||||
|
|
||||||
|
@param[out] *Cr2 Pointer to variable to hold CR2 register value.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
SaveCr2 (
|
||||||
|
OUT UINTN *Cr2
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function returns with no action for 32 bit.
|
||||||
|
|
||||||
|
@param[in] Cr2 Value to write into CR2 register.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
RestoreCr2 (
|
||||||
|
IN UINTN Cr2
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
|
@ -1112,9 +1112,11 @@ SmiRendezvous (
|
||||||
ASSERT(CpuIndex < mMaxNumberOfCpus);
|
ASSERT(CpuIndex < mMaxNumberOfCpus);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Save Cr2 because Page Fault exception in SMM may override its value
|
// Save Cr2 because Page Fault exception in SMM may override its value,
|
||||||
|
// when using on-demand paging for above 4G memory.
|
||||||
//
|
//
|
||||||
Cr2 = AsmReadCr2 ();
|
Cr2 = 0;
|
||||||
|
SaveCr2 (&Cr2);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Perform CPU specific entry hooks
|
// Perform CPU specific entry hooks
|
||||||
|
@ -1253,10 +1255,11 @@ SmiRendezvous (
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
SmmCpuFeaturesRendezvousExit (CpuIndex);
|
SmmCpuFeaturesRendezvousExit (CpuIndex);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Restore Cr2
|
// Restore Cr2
|
||||||
//
|
//
|
||||||
AsmWriteCr2 (Cr2);
|
RestoreCr2 (Cr2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1243,4 +1243,26 @@ EFIAPI
|
||||||
PiSmmCpuSmiEntryFixupAddress (
|
PiSmmCpuSmiEntryFixupAddress (
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function reads CR2 register when on-demand paging is enabled
|
||||||
|
for 64 bit and no action for 32 bit.
|
||||||
|
|
||||||
|
@param[out] *Cr2 Pointer to variable to hold CR2 register value.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
SaveCr2 (
|
||||||
|
OUT UINTN *Cr2
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function writes into CR2 register when on-demand paging is enabled
|
||||||
|
for 64 bit and no action for 32 bit.
|
||||||
|
|
||||||
|
@param[in] Cr2 Value to write into CR2 register.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
RestoreCr2 (
|
||||||
|
IN UINTN Cr2
|
||||||
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1053,3 +1053,33 @@ SetPageTableAttributes (
|
||||||
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function reads CR2 register when on-demand paging is enabled.
|
||||||
|
|
||||||
|
@param[out] *Cr2 Pointer to variable to hold CR2 register value.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
SaveCr2 (
|
||||||
|
OUT UINTN *Cr2
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!mCpuSmmStaticPageTable) {
|
||||||
|
*Cr2 = AsmReadCr2 ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function restores CR2 register when on-demand paging is enabled.
|
||||||
|
|
||||||
|
@param[in] Cr2 Value to write into CR2 register.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
RestoreCr2 (
|
||||||
|
IN UINTN Cr2
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!mCpuSmmStaticPageTable) {
|
||||||
|
AsmWriteCr2 (Cr2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue