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" <jiewen.yao@intel.com>
Reviewed-by: "Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "Fan, Jeff" <jeff.fan@intel.com>
Cc: "Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "Laszlo Ersek" <lersek@redhat.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18981 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Yao, Jiewen 2015-11-27 13:48:12 +00:00 committed by lersek
parent b095a5403b
commit 21c1719318
4 changed files with 59 additions and 5 deletions

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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

View File

@ -552,7 +552,7 @@ InitPaging (
//
ASSERT (Address == (*Pte & PHYSICAL_ADDRESS_MASK));
Pt = AllocatePages (1);
Pt = AllocatePageTableMemory (1);
ASSERT (Pt != NULL);
// Split it