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:
Star Zeng
2018-06-28 15:24:37 +08:00
parent fdd3e77a42
commit e9f4a2a934

View File

@ -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,66 +48,140 @@ 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)) {
//
// Convert the pointer to the PPI descriptor from the old TempRam
// to the relocated physical memory.
//
if (OffsetPositive) { if (OffsetPositive) {
PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + Offset); *Pointer = (VOID *) ((UINTN) *Pointer + Offset);
} else { } else {
PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw - Offset); *Pointer = (VOID *) ((UINTN) *Pointer - Offset);
}
//
// Only when the PEIM descriptor is in the old TempRam should it be necessary
// 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.
//
if (OffsetPositive) {
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
// from the old TempRam to the relocated physical memory.
//
if ((UINTN)PpiPointer->Ppi->Ppi < TempTop &&
(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);
}
} }
} }
} }
/** /**
Migrate PPI Pointers from the temporary memory to PEI installed memory. 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 @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. and location of temporary RAM, the stack location and the BFV location.
@param PrivateData Pointer to PeiCore's private data structure. @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 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.
// 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).
//
ConvertPointerInRanges (SecCoreData, PrivateData, &PpiPointer->Raw);
//
// 2. Convert the pointer to the GUID in the PPI or NOTIFY descriptor
// from the old TempRam to the relocated physical memory.
//
ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **) &PpiPointer->Ppi->Guid);
//
// 3. Convert the pointer to the PPI interface structure in the PPI descriptor
// from the old TempRam to the relocated physical memory.
//
ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **) &PpiPointer->Ppi->Ppi);
}
/**
Migrate PPI Pointers 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.
**/ **/
VOID VOID
@ -117,62 +191,14 @@ 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 (
&PrivateData->PpiData.PpiListPtrs[Index],
(UINTN)PrivateData->MemoryPages.Base,
(UINTN)PrivateData->MemoryPages.Base + PrivateData->MemoryPages.Size,
PrivateData->MemoryPages.Offset,
PrivateData->MemoryPages.OffsetPositive
);
}
//
// Convert PPI pointer in old Heap
//
ConvertSinglePpiPointer ( ConvertSinglePpiPointer (
&PrivateData->PpiData.PpiListPtrs[Index], SecCoreData,
(UINTN)SecCoreData->PeiTemporaryRamBase, PrivateData,
(UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize, &PrivateData->PpiData.PpiListPtrs[Index]
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
);
}
} }
} }
} }