# Include/Guid/ArmMpCoreInfo.h\r
gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }\r
\r
+ gArmMmuReplaceLiveTranslationEntryFuncGuid = { 0xa8b50ff3, 0x08ec, 0x4dd3, {0xbf, 0x04, 0x28, 0xbf, 0x71, 0x75, 0xc7, 0x4a} }\r
+\r
[Protocols.common]\r
## Arm System Control and Management Interface(SCMI) Base protocol\r
## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h\r
**/\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
#include <Library/ArmMmuLib.h>\r
#include <Library/CacheMaintenanceLib.h>\r
#include <Library/DebugLib.h>\r
+#include <Library/HobLib.h>\r
\r
EFI_STATUS\r
EFIAPI\r
)\r
{\r
extern UINT32 ArmReplaceLiveTranslationEntrySize;\r
+ VOID *ArmReplaceLiveTranslationEntryFunc;\r
+ VOID *Hob;\r
\r
EFI_FV_FILE_INFO FileInfo;\r
EFI_STATUS Status;\r
(UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize))\r
{\r
DEBUG ((DEBUG_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM\n"));\r
+\r
+ //\r
+ // Expose the XIP version of the ArmReplaceLiveTranslationEntry() routine\r
+ // via a HOB so we can fall back to it later when we need to split block\r
+ // mappings in a way that adheres to break-before-make requirements.\r
+ //\r
+ ArmReplaceLiveTranslationEntryFunc = ArmReplaceLiveTranslationEntry;\r
+\r
+ Hob = BuildGuidDataHob (\r
+ &gArmMmuReplaceLiveTranslationEntryFuncGuid,\r
+ &ArmReplaceLiveTranslationEntryFunc,\r
+ sizeof ArmReplaceLiveTranslationEntryFunc\r
+ );\r
+ ASSERT (Hob != NULL);\r
} else {\r
DEBUG ((DEBUG_INFO, "ArmMmuLib: performing cache maintenance on shadowed PEIM\n"));\r
//\r
[LibraryClasses]\r
ArmLib\r
CacheMaintenanceLib\r
+ HobLib\r
MemoryAllocationLib\r
\r
+[Guids]\r
+ gArmMmuReplaceLiveTranslationEntryFuncGuid\r
+\r
[Pcd.ARM]\r
gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride\r
[LibraryClasses]\r
ArmLib\r
CacheMaintenanceLib\r
+ HobLib\r
MemoryAllocationLib\r
+\r
+[Guids]\r
+ gArmMmuReplaceLiveTranslationEntryFuncGuid\r