summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c
diff options
context:
space:
mode:
authorYao, Jiewen <jiewen.yao@intel.com>2015-11-26 04:12:53 +0000
committerjyao1 <jyao1@Edk2>2015-11-26 04:12:53 +0000
commit9daa916dd1efe6443f9a66dfa882f3185d33ad28 (patch)
tree15935f7bbecc29bff5d91698f7802054fa4fd34a /UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c
parentae82a30bee2c8a4630389699391ce02a63e9a464 (diff)
downloadedk2-9daa916dd1efe6443f9a66dfa882f3185d33ad28.tar.gz
edk2-9daa916dd1efe6443f9a66dfa882f3185d33ad28.tar.bz2
edk2-9daa916dd1efe6443f9a66dfa882f3185d33ad28.zip
Add 2 APIs in SmmCpuFeaturesLib.
Add NULL func for 2 new APIs in SmmCpuFeaturesLib. SmmCpuFeaturesCompleteSmmReadyToLock() is a hook point to allow CPU specific code to do more registers setting after the gEfiSmmReadyToLockProtocolGuid notification is completely processed. Add SmmCpuFeaturesCompleteSmmReadyToLock() to PerformRemainingTasks() and PerformPreTasks(). SmmCpuFeaturesAllocatePageTableMemory() is an API to allow CPU to allocate a specific region for storing page tables. All page table allocation will use AllocatePageTableMemory(). Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: "Yao, Jiewen" <jiewen.yao@intel.com> Reviewed-by: "Kinney, Michael D" <michael.d.kinney@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18958 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c')
-rw-r--r--UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c
index 670a5cf663..fb4655128f 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c
@@ -970,9 +970,9 @@ PiCpuSmmEntry (
//
BufferPages = EFI_SIZE_TO_PAGES (SIZE_32KB + TileSize * (mMaxNumberOfCpus - 1));
if ((FamilyId == 4) || (FamilyId == 5)) {
- Buffer = AllocateAlignedCodePages (BufferPages, SIZE_32KB);
+ Buffer = AllocateAlignedPages (BufferPages, SIZE_32KB);
} else {
- Buffer = AllocateAlignedCodePages (BufferPages, SIZE_4KB);
+ Buffer = AllocateAlignedPages (BufferPages, SIZE_4KB);
}
ASSERT (Buffer != NULL);
DEBUG ((EFI_D_INFO, "SMRAM SaveState Buffer (0x%08x, 0x%08x)\n", Buffer, EFI_PAGES_TO_SIZE(BufferPages)));
@@ -1416,6 +1416,35 @@ ConfigSmmCodeAccessCheck (
}
/**
+ This API provides a way to allocate memory for page table.
+
+ This API can be called more once to allocate memory for page tables.
+
+ Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL
+ is returned. If there is not enough memory remaining to satisfy the request, then NULL is
+ returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+
+**/
+VOID *
+AllocatePageTableMemory (
+ IN UINTN Pages
+ )
+{
+ VOID *Buffer;
+
+ Buffer = SmmCpuFeaturesAllocatePageTableMemory (Pages);
+ if (Buffer != NULL) {
+ return Buffer;
+ }
+ return AllocatePages (Pages);
+}
+
+/**
Perform the remaining tasks.
**/
@@ -1440,6 +1469,8 @@ PerformRemainingTasks (
//
ConfigSmmCodeAccessCheck ();
+ SmmCpuFeaturesCompleteSmmReadyToLock ();
+
//
// Clean SMM ready to lock flag
//
@@ -1465,6 +1496,8 @@ PerformPreTasks (
//
ConfigSmmCodeAccessCheck ();
+ SmmCpuFeaturesCompleteSmmReadyToLock ();
+
mRestoreSmmConfigurationInS3 = FALSE;
}
}