On Fri, 21 Feb 2020 at 16:54, Laszlo Ersek <ler...@redhat.com> wrote: > > On 02/21/20 12:07, Ard Biesheuvel wrote: > > Cache maintenance operations by set/way are only intended to be used > > in the context of on/offlining a core, while it has been taken out of > > the coherency domain. Any use intended to ensure that the contents of > > the cache have made it to main memory is unreliable, since cacheline > > migration and non-architected system caches may cause these contents > > to linger elsewhere, without being visible in main memory once the > > MMU and caches are disabled. > > > > In KVM on Linux, there are horrid hacks in place to ensure that such > > set/way operations are trapped, and replaced with a single by-VA > > clean/invalidate of the entire guest VA space once the MMU state > > changes, which can be costly, and is unnecessary if we manage the > > caches a bit more carefully, and perform maintenance by virtual > > address only. > > > > So let's get rid of the call to ArmInvalidateDataCache () in the > > PrePeiCore startup code, and instead, invalidate the temporary RAM > > region by virtual address, which is the only memory region we will > > be touching with the caches and MMU both disabled and enabled. > > (This will lead to data corruption if data written with the MMU off > > is shadowed by clean, stale cachelines that stick around when the > > MMU is enabled again.) > > > > Signed-off-by: Ard Biesheuvel <ard.biesheu...@arm.com> > > --- > > Tested on bare metal (SynQuacer 32-bit) and KVM (mach-virt 64-bit) > > > > ArmPlatformPkg/PrePeiCore/PrePeiCore.c | 6 ++++-- > > ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf | 1 + > > ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf | 1 + > > 3 files changed, 6 insertions(+), 2 deletions(-) > > > > diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCore.c > > b/ArmPlatformPkg/PrePeiCore/PrePeiCore.c > > index 4911f67577a2..a7a61fe9ddb5 100644 > > --- a/ArmPlatformPkg/PrePeiCore/PrePeiCore.c > > +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCore.c > > @@ -8,6 +8,7 @@ > > **/ > > > > #include <Library/BaseLib.h> > > +#include <Library/CacheMaintenanceLib.h> > > #include <Library/DebugAgentLib.h> > > #include <Library/ArmLib.h> > > > > @@ -59,13 +60,14 @@ CEntryPoint ( > > { > > // Data Cache enabled on Primary core when MMU is enabled. > > ArmDisableDataCache (); > > - // Invalidate Data cache > > - ArmInvalidateDataCache (); > > // Invalidate instruction cache > > ArmInvalidateInstructionCache (); > > // Enable Instruction Caches on all cores. > > ArmEnableInstructionCache (); > > > > + InvalidateDataCacheRange ((VOID *)(UINTN)PcdGet64 (PcdCPUCoresStackBase), > > + PcdGet32 (PcdCPUCorePrimaryStackSize)); > > + > > // > > // Note: Doesn't have to Enable CPU interface in non-secure world, > > // as Non-secure interface is already enabled in Secure world. > > diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf > > b/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf > > index f2ac45d171bc..9d90d46dcfc5 100644 > > --- a/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf > > +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf > > @@ -44,6 +44,7 @@ [Packages] > > [LibraryClasses] > > ArmLib > > ArmPlatformLib > > + CacheMaintenanceLib > > BaseLib > > DebugLib > > DebugAgentLib > > diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf > > b/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf > > index 84c319c3679b..0749a6d575cf 100644 > > --- a/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf > > +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf > > @@ -44,6 +44,7 @@ [Packages] > > [LibraryClasses] > > ArmLib > > ArmPlatformLib > > + CacheMaintenanceLib > > BaseLib > > DebugLib > > DebugAgentLib > > > > Acked-by: Laszlo Ersek <ler...@redhat.com> >
Pushed as 6c9a3d4233d78a04db5f25aeed254396740f4cae Thanks all -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55425): https://edk2.groups.io/g/devel/message/55425 Mute This Topic: https://groups.io/mt/71448598/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-