Reviewed-By: Olivier Martin <olivier.mar...@arm.com>

-----Original Message-----
From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
Sent: 08 April 2015 08:11
To: edk2-devel@lists.sourceforge.net; ler...@redhat.com; Olivier Martin
Cc: roy.fr...@linaro.org; leif.lindh...@linaro.org; Ard Biesheuvel
Subject: [PATCH v3 5/5] ArmVirtualizationPkg: Xen: shuffle init order to deal 
with incoherency

In order to prevent memory corruption issues caused by the fact that, under 
virtualization, the guest is incoherent with the hypervisor's view of memory 
until it enables its caches and MMU, this patch reshuffles the init sequence so 
that the Xen shared memory regions are not touched before the caches and MMU 
are enabled.

In addition, the loaded image itself is invalidated by virtual address, to 
ensure that any runtime changes (such as the applied relocations) will not 
suddenly become invisible once we turn the caches on.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
---
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf | 
 1 +
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.c                            | 
20 ++++++++++++++------
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git 
a/ArmPlatformPkg/ArmVirtualizationPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf 
b/ArmPlatformPkg/ArmVirtualizationPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf
index 86cf870b79ac..16023382a679 100755
--- 
a/ArmPlatformPkg/ArmVirtualizationPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/PrePi/ArmVirtPrePiUniCoreReloc
+++ atable.inf
@@ -55,6 +55,7 @@
   PrePiHobListPointerLib
   PlatformPeiLib
   MemoryInitPeiLib
+  CacheMaintenanceLib

 [Ppis]
   gArmMpCoreInfoPpiGuid
diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.c 
b/ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.c
index 0772805890f2..f9ad37427217 100755
--- a/ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.c
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.c
@@ -20,6 +20,7 @@
 #include <Library/PrePiHobListPointerLib.h>
 #include <Library/TimerLib.h>
 #include <Library/PerformanceLib.h>
+#include <Library/CacheMaintenanceLib.h>

 #include <Ppi/GuidedSectionExtraction.h>  #include <Ppi/ArmMpCoreInfo.h> @@ 
-102,12 +103,6 @@ PrePiMain (
   // Initialize the architecture specific bits
   ArchInitialize ();

-  // Initialize the Serial Port
-  SerialPortInitialize ();
-  CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"UEFI firmware (version %s 
built at %a on %a)\n\r",
-    (CHAR16*)PcdGetPtr(PcdFirmwareVersionString), __TIME__, __DATE__);
-  SerialPortWrite ((UINT8 *) Buffer, CharCount);
-
   // Declare the PI/UEFI memory region
   HobList = HobConstructor (
     (VOID*)UefiMemoryBase,
@@ -117,10 +112,23 @@ PrePiMain (
     );
   PrePeiSetHobList (HobList);

+  //
+  // Ensure that the loaded image is invalidated in the caches, so that
+ any  // modifications we made with the caches and MMU off (such as the
+ applied  // relocations) don't become invisible once we turn them on.
+  //
+  InvalidateDataCacheRange((VOID *)(UINTN)PcdGet64 (PcdFdBaseAddress),
+ PcdGet32 (PcdFdSize));
+
   // Initialize MMU and Memory HOBs (Resource Descriptor HOBs)
   Status = MemoryPeim (UefiMemoryBase, FixedPcdGet32 
(PcdSystemMemoryUefiRegionSize));
   ASSERT_EFI_ERROR (Status);

+  // Initialize the Serial Port
+  SerialPortInitialize ();
+  CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"UEFI firmware (version %s 
built at %a on %a)\n\r",
+    (CHAR16*)PcdGetPtr(PcdFirmwareVersionString), __TIME__, __DATE__);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+
   // Create the Stacks HOB (reserve the memory for all stacks)
   StacksSize = PcdGet32 (PcdCPUCorePrimaryStackSize);
   BuildStackHob (StacksBase, StacksSize);
--
1.8.3.2


-- IMPORTANT NOTICE: The contents of this email and any attachments are 
confidential and may also be privileged. If you are not the intended recipient, 
please notify the sender immediately and do not disclose the contents to any 
other person, use it for any purpose, or store or copy the information in any 
medium.  Thank you.

ARM Limited, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ, Registered 
in England & Wales, Company No:  2557590
ARM Holdings plc, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ, 
Registered in England & Wales, Company No:  2548782


------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to