diff options
Diffstat (limited to 'ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c')
-rw-r--r-- | ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c index caace2c17c..5f50a605a3 100644 --- a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c +++ b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c @@ -12,6 +12,7 @@ #include <Library/ArmMmuLib.h>
#include <Library/CacheMaintenanceLib.h>
#include <Library/DebugLib.h>
+#include <Library/HobLib.h>
EFI_STATUS
EFIAPI
@@ -21,6 +22,8 @@ ArmMmuPeiLibConstructor ( )
{
extern UINT32 ArmReplaceLiveTranslationEntrySize;
+ VOID *ArmReplaceLiveTranslationEntryFunc;
+ VOID *Hob;
EFI_FV_FILE_INFO FileInfo;
EFI_STATUS Status;
@@ -42,6 +45,20 @@ ArmMmuPeiLibConstructor ( (UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize))
{
DEBUG ((DEBUG_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM\n"));
+
+ //
+ // Expose the XIP version of the ArmReplaceLiveTranslationEntry() routine
+ // via a HOB so we can fall back to it later when we need to split block
+ // mappings in a way that adheres to break-before-make requirements.
+ //
+ ArmReplaceLiveTranslationEntryFunc = ArmReplaceLiveTranslationEntry;
+
+ Hob = BuildGuidDataHob (
+ &gArmMmuReplaceLiveTranslationEntryFuncGuid,
+ &ArmReplaceLiveTranslationEntryFunc,
+ sizeof ArmReplaceLiveTranslationEntryFunc
+ );
+ ASSERT (Hob != NULL);
} else {
DEBUG ((DEBUG_INFO, "ArmMmuLib: performing cache maintenance on shadowed PEIM\n"));
//
|