From: "Desimone, Nathaniel L" <nathaniel.l.desimone@intel.com>
To: "Vanguput, Narendra K" <narendra.k.vanguput@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Yao, Jiewen" <jiewen.yao@intel.com>,
"Dong, Eric" <eric.dong@intel.com>,
Laszlo Ersek <lersek@redhat.com>
Subject: Re: [PATCH v8] UefiCpuPkg\CpuSmm: Save & restore CR2 on-demand paging in SMM
Date: Fri, 29 Mar 2019 21:22:49 +0000 [thread overview]
Message-ID: <02A34F284D1DA44BB705E61F7180EF0AAE9ADBB2@ORSMSX114.amr.corp.intel.com> (raw)
In-Reply-To: <20190329154456.4304-1-narendra.k.vanguput@intel.com>
1. Why would you do this for 64 bit but not 32 bit?
2. Why don't you add the if statement to MpService.c instead of spreading it to PageTbl.c?
3. What is the reason for this anyway? Adding the conditional is probably more execution time than just reading CR2 always.
Thanks,
Nate
-----Original Message-----
From: edk2-devel <edk2-devel-bounces@lists.01.org> On Behalf Of nkvangup
Sent: Friday, March 29, 2019 8:45 AM
To: edk2-devel@lists.01.org
Cc: Yao, Jiewen <jiewen.yao@intel.com>; Dong, Eric <eric.dong@intel.com>; Laszlo Ersek <lersek@redhat.com>
Subject: [edk2] [PATCH v8] 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
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Vanguput Narendra K <mailto:narendra.k.vanguput@intel.com>
Cc: Eric Dong <mailto:eric.dong@intel.com>
Cc: Ray Ni <mailto:ray.ni@intel.com>
Cc: Laszlo Ersek <mailto:lersek@redhat.com>
Cc: Yao Jiewen <mailto:jiewen.yao@intel.com>
---
UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c | 26 ++++++++++++++++++++++++++
UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 9 ++++++---
UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 22 ++++++++++++++++++++++
UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c | 30 ++++++++++++++++++++++++++++++
4 files changed, 84 insertions(+), 3 deletions(-)
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c
index b734a1ea8c..d3f62ed806 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c
@@ -316,3 +316,29 @@ SetPageTableAttributes (
return ;
}
+
+/**
+ This function returns with no action for 32 bit.
+
+ @param[out] *Cr2 Pointer to variable to hold CR2 register value **/
+VOID
+SaveCr2 (
+ UINTN *Cr2
+ )
+{
+ return ;
+}
+
+/**
+ This function returns with no action for 32 bit.
+
+ @param[in] Cr2 Value to write into CR2 register **/ VOID
+RestoreCr2 (
+ UINTN Cr2
+ )
+{
+ return ;
+}
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
index 3b0b3b52ac..ce70f77709 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
@@ -1112,9 +1112,11 @@ SmiRendezvous (
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
@@ -1253,10 +1255,11 @@ SmiRendezvous (
Exit:
SmmCpuFeaturesRendezvousExit (CpuIndex);
+
//
// Restore Cr2
//
- AsmWriteCr2 (Cr2);
+ RestoreCr2 (Cr2);
}
/**
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
index 84efb22981..05e1b54ed2 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
@@ -1243,4 +1243,26 @@ EFIAPI
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 (
+ 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 (
+ UINTN Cr2
+ );
+
#endif
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c
index 2c77cb47a4..e60628c080 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c
@@ -1053,3 +1053,33 @@ SetPageTableAttributes (
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 (
+ 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 (
+ UINTN Cr2
+ )
+{
+ if (!mCpuSmmStaticPageTable) {
+ AsmWriteCr2 (Cr2);
+ }
+}
--
2.16.2.windows.1
_______________________________________________
edk2-devel mailing list
mailto:edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
next prev parent reply other threads:[~2019-03-29 21:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-29 15:44 [PATCH v8] UefiCpuPkg\CpuSmm: Save & restore CR2 on-demand paging in SMM nkvangup
2019-03-29 21:22 ` Desimone, Nathaniel L [this message]
2019-03-29 21:37 ` Andrew Fish
2019-04-01 6:46 ` Vanguput, Narendra K
2019-03-29 22:03 ` Ni, Ray
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=02A34F284D1DA44BB705E61F7180EF0AAE9ADBB2@ORSMSX114.amr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox