mirror of https://github.com/acidanthera/audk.git
MdeModulePkg PeiCore: Not assume PpiDescriptor and Ppi in same range
Current code assumes PpiDescriptor and Ppi are in same range (heap/stack/hole). This patch removes the assumption. Descriptor needs to be converted first. It is also handled by this patch. Cc: Liming Gao <liming.gao@intel.com> Cc: Qing Huang <qing.huang@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
parent
fdd3e77a42
commit
e9f4a2a934
|
@ -38,9 +38,9 @@ InitializePpiServices (
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
Migrate Single PPI Pointer from the temporary memory to PEI installed memory.
|
Migrate Pointer from the temporary memory to PEI installed memory.
|
||||||
|
|
||||||
@param PpiPointer Pointer to Ppi
|
@param Pointer Pointer to the Pointer needs to be converted.
|
||||||
@param TempBottom Base of old temporary memory
|
@param TempBottom Base of old temporary memory
|
||||||
@param TempTop Top of old temporary memory
|
@param TempTop Top of old temporary memory
|
||||||
@param Offset Offset of new memory to old temporary memory.
|
@param Offset Offset of new memory to old temporary memory.
|
||||||
|
@ -48,57 +48,131 @@ InitializePpiServices (
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
ConvertSinglePpiPointer (
|
ConvertPointer (
|
||||||
IN PEI_PPI_LIST_POINTERS *PpiPointer,
|
IN OUT VOID **Pointer,
|
||||||
IN UINTN TempBottom,
|
IN UINTN TempBottom,
|
||||||
IN UINTN TempTop,
|
IN UINTN TempTop,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN BOOLEAN OffsetPositive
|
IN BOOLEAN OffsetPositive
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (((UINTN)PpiPointer->Raw < TempTop) &&
|
if (((UINTN) *Pointer < TempTop) &&
|
||||||
((UINTN)PpiPointer->Raw >= TempBottom)) {
|
((UINTN) *Pointer >= TempBottom)) {
|
||||||
|
if (OffsetPositive) {
|
||||||
|
*Pointer = (VOID *) ((UINTN) *Pointer + Offset);
|
||||||
|
} else {
|
||||||
|
*Pointer = (VOID *) ((UINTN) *Pointer - Offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
Migrate Pointer in ranges of the temporary memory to PEI installed memory.
|
||||||
|
|
||||||
|
@param SecCoreData Points to a data structure containing SEC to PEI handoff data, such as the size
|
||||||
|
and location of temporary RAM, the stack location and the BFV location.
|
||||||
|
@param PrivateData Pointer to PeiCore's private data structure.
|
||||||
|
@param Pointer Pointer to the Pointer needs to be converted.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
ConvertPointerInRanges (
|
||||||
|
IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,
|
||||||
|
IN PEI_CORE_INSTANCE *PrivateData,
|
||||||
|
IN OUT VOID **Pointer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINT8 IndexHole;
|
||||||
|
|
||||||
|
if (PrivateData->MemoryPages.Size != 0) {
|
||||||
//
|
//
|
||||||
// Convert the pointer to the PPI descriptor from the old TempRam
|
// Convert PPI pointer in old memory pages
|
||||||
|
// It needs to be done before Convert PPI pointer in old Heap
|
||||||
|
//
|
||||||
|
ConvertPointer (
|
||||||
|
Pointer,
|
||||||
|
(UINTN)PrivateData->MemoryPages.Base,
|
||||||
|
(UINTN)PrivateData->MemoryPages.Base + PrivateData->MemoryPages.Size,
|
||||||
|
PrivateData->MemoryPages.Offset,
|
||||||
|
PrivateData->MemoryPages.OffsetPositive
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert PPI pointer in old Heap
|
||||||
|
//
|
||||||
|
ConvertPointer (
|
||||||
|
Pointer,
|
||||||
|
(UINTN)SecCoreData->PeiTemporaryRamBase,
|
||||||
|
(UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize,
|
||||||
|
PrivateData->HeapOffset,
|
||||||
|
PrivateData->HeapOffsetPositive
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert PPI pointer in old Stack
|
||||||
|
//
|
||||||
|
ConvertPointer (
|
||||||
|
Pointer,
|
||||||
|
(UINTN)SecCoreData->StackBase,
|
||||||
|
(UINTN)SecCoreData->StackBase + SecCoreData->StackSize,
|
||||||
|
PrivateData->StackOffset,
|
||||||
|
PrivateData->StackOffsetPositive
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert PPI pointer in old TempRam Hole
|
||||||
|
//
|
||||||
|
for (IndexHole = 0; IndexHole < HOLE_MAX_NUMBER; IndexHole ++) {
|
||||||
|
if (PrivateData->HoleData[IndexHole].Size == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConvertPointer (
|
||||||
|
Pointer,
|
||||||
|
(UINTN)PrivateData->HoleData[IndexHole].Base,
|
||||||
|
(UINTN)PrivateData->HoleData[IndexHole].Base + PrivateData->HoleData[IndexHole].Size,
|
||||||
|
PrivateData->HoleData[IndexHole].Offset,
|
||||||
|
PrivateData->HoleData[IndexHole].OffsetPositive
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
Migrate Single PPI Pointer from the temporary memory to PEI installed memory.
|
||||||
|
|
||||||
|
@param SecCoreData Points to a data structure containing SEC to PEI handoff data, such as the size
|
||||||
|
and location of temporary RAM, the stack location and the BFV location.
|
||||||
|
@param PrivateData Pointer to PeiCore's private data structure.
|
||||||
|
@param PpiPointer Pointer to Ppi
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
ConvertSinglePpiPointer (
|
||||||
|
IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,
|
||||||
|
IN PEI_CORE_INSTANCE *PrivateData,
|
||||||
|
IN PEI_PPI_LIST_POINTERS *PpiPointer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// 1. Convert the pointer to the PPI descriptor from the old TempRam
|
||||||
// to the relocated physical memory.
|
// to the relocated physical memory.
|
||||||
|
// It (for the pointer to the PPI descriptor) needs to be done before 2 (for
|
||||||
|
// the pointer to the GUID) and 3 (for the pointer to the PPI interface structure).
|
||||||
//
|
//
|
||||||
if (OffsetPositive) {
|
ConvertPointerInRanges (SecCoreData, PrivateData, &PpiPointer->Raw);
|
||||||
PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + Offset);
|
|
||||||
} else {
|
|
||||||
PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw - Offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Only when the PEIM descriptor is in the old TempRam should it be necessary
|
// 2. Convert the pointer to the GUID in the PPI or NOTIFY descriptor
|
||||||
// to try to convert the pointers in the PEIM descriptor
|
|
||||||
//
|
|
||||||
|
|
||||||
if (((UINTN)PpiPointer->Ppi->Guid < TempTop) &&
|
|
||||||
((UINTN)PpiPointer->Ppi->Guid >= TempBottom)) {
|
|
||||||
//
|
|
||||||
// Convert the pointer to the GUID in the PPI or NOTIFY descriptor
|
|
||||||
// from the old TempRam to the relocated physical memory.
|
// from the old TempRam to the relocated physical memory.
|
||||||
//
|
//
|
||||||
if (OffsetPositive) {
|
ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **) &PpiPointer->Ppi->Guid);
|
||||||
PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid + Offset);
|
|
||||||
} else {
|
|
||||||
PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid - Offset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Convert the pointer to the PPI interface structure in the PPI descriptor
|
// 3. Convert the pointer to the PPI interface structure in the PPI descriptor
|
||||||
// from the old TempRam to the relocated physical memory.
|
// from the old TempRam to the relocated physical memory.
|
||||||
//
|
//
|
||||||
if ((UINTN)PpiPointer->Ppi->Ppi < TempTop &&
|
ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **) &PpiPointer->Ppi->Ppi);
|
||||||
(UINTN)PpiPointer->Ppi->Ppi >= TempBottom) {
|
|
||||||
if (OffsetPositive) {
|
|
||||||
PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi + Offset);
|
|
||||||
} else {
|
|
||||||
PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi - Offset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,63 +191,15 @@ ConvertPpiPointers (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT8 Index;
|
UINT8 Index;
|
||||||
UINT8 IndexHole;
|
|
||||||
|
|
||||||
for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) {
|
for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) {
|
||||||
if (Index < PrivateData->PpiData.PpiListEnd || Index > PrivateData->PpiData.NotifyListEnd) {
|
if (Index < PrivateData->PpiData.PpiListEnd || Index > PrivateData->PpiData.NotifyListEnd) {
|
||||||
if (PrivateData->MemoryPages.Size != 0) {
|
|
||||||
//
|
|
||||||
// Convert PPI pointer in old memory pages
|
|
||||||
// It needs to be done before Convert PPI pointer in old Heap
|
|
||||||
//
|
|
||||||
ConvertSinglePpiPointer (
|
ConvertSinglePpiPointer (
|
||||||
&PrivateData->PpiData.PpiListPtrs[Index],
|
SecCoreData,
|
||||||
(UINTN)PrivateData->MemoryPages.Base,
|
PrivateData,
|
||||||
(UINTN)PrivateData->MemoryPages.Base + PrivateData->MemoryPages.Size,
|
&PrivateData->PpiData.PpiListPtrs[Index]
|
||||||
PrivateData->MemoryPages.Offset,
|
|
||||||
PrivateData->MemoryPages.OffsetPositive
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Convert PPI pointer in old Heap
|
|
||||||
//
|
|
||||||
ConvertSinglePpiPointer (
|
|
||||||
&PrivateData->PpiData.PpiListPtrs[Index],
|
|
||||||
(UINTN)SecCoreData->PeiTemporaryRamBase,
|
|
||||||
(UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize,
|
|
||||||
PrivateData->HeapOffset,
|
|
||||||
PrivateData->HeapOffsetPositive
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Convert PPI pointer in old Stack
|
|
||||||
//
|
|
||||||
ConvertSinglePpiPointer (
|
|
||||||
&PrivateData->PpiData.PpiListPtrs[Index],
|
|
||||||
(UINTN)SecCoreData->StackBase,
|
|
||||||
(UINTN)SecCoreData->StackBase + SecCoreData->StackSize,
|
|
||||||
PrivateData->StackOffset,
|
|
||||||
PrivateData->StackOffsetPositive
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Convert PPI pointer in old TempRam Hole
|
|
||||||
//
|
|
||||||
for (IndexHole = 0; IndexHole < HOLE_MAX_NUMBER; IndexHole ++) {
|
|
||||||
if (PrivateData->HoleData[IndexHole].Size == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConvertSinglePpiPointer (
|
|
||||||
&PrivateData->PpiData.PpiListPtrs[Index],
|
|
||||||
(UINTN)PrivateData->HoleData[IndexHole].Base,
|
|
||||||
(UINTN)PrivateData->HoleData[IndexHole].Base + PrivateData->HoleData[IndexHole].Size,
|
|
||||||
PrivateData->HoleData[IndexHole].Offset,
|
|
||||||
PrivateData->HoleData[IndexHole].OffsetPositive
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue