**/\r
\r
#include <Uefi.h>\r
+#include <Pi/PiMultiPhase.h>\r
#include <Chipset/AArch64.h>\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/CacheMaintenanceLib.h>\r
// use an ordinary break before make. Otherwise, we will need to\r
// temporarily disable the MMU.\r
DisableMmu = FALSE;\r
- if ((((RegionStart ^ (UINTN)ArmReplaceLiveTranslationEntry) & ~BlockMask) == 0) ||\r
+ if ((((RegionStart ^ (UINTN)mReplaceLiveEntryFunc) & ~BlockMask) == 0) ||\r
(((RegionStart ^ (UINTN)Entry) & ~BlockMask) == 0))\r
{\r
DisableMmu = TRUE;\r
DEBUG ((DEBUG_WARN, "%a: splitting block entry with MMU disabled\n", __FUNCTION__));\r
}\r
\r
- ArmReplaceLiveTranslationEntry (Entry, Value, RegionStart, DisableMmu);\r
+ mReplaceLiveEntryFunc (Entry, Value, RegionStart, DisableMmu);\r
}\r
}\r
\r
)\r
{\r
extern UINT32 ArmReplaceLiveTranslationEntrySize;\r
+ VOID *Hob;\r
\r
- //\r
- // The ArmReplaceLiveTranslationEntry () helper function may be invoked\r
- // with the MMU off so we have to ensure that it gets cleaned to the PoC\r
- //\r
- WriteBackDataCacheRange (\r
- (VOID *)(UINTN)ArmReplaceLiveTranslationEntry,\r
- ArmReplaceLiveTranslationEntrySize\r
- );\r
+ Hob = GetFirstGuidHob (&gArmMmuReplaceLiveTranslationEntryFuncGuid);\r
+ if (Hob != NULL) {\r
+ mReplaceLiveEntryFunc = *(VOID **)GET_GUID_HOB_DATA (Hob);\r
+ } else {\r
+ //\r
+ // The ArmReplaceLiveTranslationEntry () helper function may be invoked\r
+ // with the MMU off so we have to ensure that it gets cleaned to the PoC\r
+ //\r
+ WriteBackDataCacheRange (\r
+ (VOID *)(UINTN)ArmReplaceLiveTranslationEntry,\r
+ ArmReplaceLiveTranslationEntrySize\r
+ );\r
+ }\r
\r
return RETURN_SUCCESS;\r
}\r