From: Yao, Jiewen Date: Fri, 27 Nov 2015 13:48:12 +0000 (+0000) Subject: UefiCpuPkg/PiSmmCpu: Update function call for 2 new APIs. X-Git-Tag: edk2-stable201903~8481 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=21c1719318056691a3e5901c6e28e5ba2b70afe2 UefiCpuPkg/PiSmmCpu: Update function call for 2 new APIs. All page table allocation will use AllocatePageTableMemory(). Add SmmCpuFeaturesCompleteSmmReadyToLock() to PerformRemainingTasks() and PerformPreTasks(). Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: "Yao, Jiewen" Reviewed-by: "Kinney, Michael D" Cc: "Fan, Jeff" Cc: "Kinney, Michael D" Cc: "Laszlo Ersek" git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18981 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 83f5bf962d..06ffc6dd86 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -770,7 +770,7 @@ Gen4GPageTable ( // // Allocate the page table // - PageTable = AllocatePages (ExtraPages + 5 + PagesNeeded); + PageTable = AllocatePageTableMemory (ExtraPages + 5 + PagesNeeded); ASSERT (PageTable != NULL); PageTable = (VOID *)((UINTN)PageTable + EFI_PAGES_TO_SIZE (ExtraPages)); @@ -872,7 +872,7 @@ SetCacheability ( // // Allocate a page from SMRAM // - NewPageTableAddress = AllocatePages (1); + NewPageTableAddress = AllocatePageTableMemory (1); ASSERT (NewPageTableAddress != NULL); NewPageTable = (UINT64 *)NewPageTableAddress; 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))); @@ -1415,6 +1415,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; } } diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h index 66d85d80e1..f2a91655a3 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h @@ -718,4 +718,25 @@ VOID DumpModuleInfoByIp ( IN UINTN CallerIpAddress ); + +/** + 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 + ); + #endif diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c index 8ddde9acb5..ff4e28ec58 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c @@ -552,7 +552,7 @@ InitPaging ( // ASSERT (Address == (*Pte & PHYSICAL_ADDRESS_MASK)); - Pt = AllocatePages (1); + Pt = AllocatePageTableMemory (1); ASSERT (Pt != NULL); // Split it