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
1 changed files with 121 additions and 95 deletions

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 TempTop Top of old temporary memory
@param Offset Offset of new memory to old temporary memory.
@ -48,66 +48,140 @@ InitializePpiServices (
**/
VOID
ConvertSinglePpiPointer (
IN PEI_PPI_LIST_POINTERS *PpiPointer,
ConvertPointer (
IN OUT VOID **Pointer,
IN UINTN TempBottom,
IN UINTN TempTop,
IN UINTN Offset,
IN BOOLEAN OffsetPositive
)
{
if (((UINTN)PpiPointer->Raw < TempTop) &&
((UINTN)PpiPointer->Raw >= TempBottom)) {
//
// Convert the pointer to the PPI descriptor from the old TempRam
// to the relocated physical memory.
//
if (((UINTN) *Pointer < TempTop) &&
((UINTN) *Pointer >= TempBottom)) {
if (OffsetPositive) {
PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + Offset);
*Pointer = (VOID *) ((UINTN) *Pointer + Offset);
} else {
PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw - 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);
}
*Pointer = (VOID *) ((UINTN) *Pointer - 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
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 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
@ -117,62 +191,14 @@ ConvertPpiPointers (
)
{
UINT8 Index;
UINT8 IndexHole;
for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) {
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 (
&PrivateData->PpiData.PpiListPtrs[Index],
(UINTN)SecCoreData->PeiTemporaryRamBase,
(UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize,
PrivateData->HeapOffset,
PrivateData->HeapOffsetPositive
SecCoreData,
PrivateData,
&PrivateData->PpiData.PpiListPtrs[Index]
);
//
// 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
);
}
}
}
}