Convert the capsule image address installed in Configuration table to virtual address.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4300 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
lgao4 2007-11-16 10:26:51 +00:00
parent d12f75fee2
commit 10e2e070c9
3 changed files with 44 additions and 0 deletions

View File

@ -274,6 +274,12 @@ Returns:
EFI_RUNTIME_IMAGE_ENTRY *RuntimeImage;
LIST_ENTRY *Link;
EFI_PHYSICAL_ADDRESS VirtImageBase;
UINTN Index;
UINTN Index1;
UINTN Index2;
UINTN Index3;
EFI_CAPSULE_TABLE *CapsuleTable;
EFI_CAPSULE_INFO_TABLE *CapsuleInfoTable;
//
// Can only switch to virtual addresses once the memory map is locked down,
@ -369,6 +375,41 @@ Returns:
// BugBug: PI requires System Configuration Tables Conversion.
// Currently, we do not implement it.
//
for (Index = 0; Index < gST->NumberOfTableEntries; Index++) {
//
// CapsuleInfoGuid in ConfigTable refers to an array of CapsuleGuid, it is information
// from which you can tell which vendorGuids in ConfigTable are related to CapsuleTable.
// Each CapsuleTable points to a array of capsules across a system reset. Then convert
// the array contents to make these capsules visiable in Runtime.
//
//
// Firstly, Get CapsulInfoGuid in ConfigTable, it points to CapsuleInfoTable, which
// gather all the installed capsules' guids.
//
if (CompareGuid (&gEfiCapsuleInfoGuid, &(gST->ConfigurationTable[Index].VendorGuid))) {
CapsuleInfoTable = gST->ConfigurationTable[Index].VendorTable;
//
// For each known CapsuleGuid in CapsuleInfoTable, loop the whole ConfigTable to
// find out this guid related to CapsuleTable.
//
for (Index1 = 0; Index1 < CapsuleInfoTable->CapsuleGuidNumber; Index1++) {
for (Index2 = 0; Index2 < gST->NumberOfTableEntries; Index2++) {
//
// Find out certain CapsuleTable, go through its contents array, and convert them.
//
if (CompareGuid (&CapsuleInfoTable->CapsuleGuidPtr[Index1], &(gST->ConfigurationTable[Index2].VendorGuid))) {
CapsuleTable = gST->ConfigurationTable[Index2].VendorTable;
for (Index3 = 0; Index3 < CapsuleTable->CapsuleArrayNumber; Index3++) {
RuntimeDriverConvertInternalPointer ((VOID **) &CapsuleTable->CapsulePtr[Index3]);
}
RuntimeDriverConvertInternalPointer ((VOID **) &(gST->ConfigurationTable[Index2].VendorTable));
}
}
}
break;
}
}
//
// Convert the runtime fields of the EFI System Table and recompute the CRC-32

View File

@ -25,6 +25,7 @@ Abstract:
#define _RUNTIME_H_
#include <PiDxe.h>
#include <Guid/CapsuleInfo.h>
#include <Protocol/LoadedImage.h>
#include <Protocol/Runtime.h>
#include <Library/BaseLib.h>

View File

@ -38,6 +38,7 @@
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
PeCoffLib
@ -51,6 +52,7 @@
BaseLib
[Guids]
gEfiCapsuleInfoGuid
[Protocols]
gEfiRuntimeArchProtocolGuid # PROTOCOL ALWAYS_PRODUCED