On 10/05/18 18:49, Kinney, Michael D wrote:
> Reviewed-by: Michael D Kinney <[email protected]>

Great, thank you :)

Patch pushed as commit d20ae95a13e8.

Thanks!
Laszlo

>> -----Original Message-----
>> From: edk2-devel [mailto:edk2-devel-
>> [email protected]] On Behalf Of
>> [email protected]
>> Sent: Tuesday, October 2, 2018 5:17 AM
>> To: [email protected]
>> Cc: Justen, Jordan L <[email protected]>;
>> Anthony Perard <[email protected]>; Laszlo Ersek
>> <[email protected]>
>> Subject: [edk2] [PATCH v3 1/1] OvmfPkg/PlatformPei:
>> clear CPU caches
>>
>> From: Marc-AndrĂ© Lureau <[email protected]>
>>
>> This is for conformance with the TCG "Platform Reset
>> Attack Mitigation
>> Specification". Because clearing the CPU caches at boot
>> doesn't impact
>> performance significantly, do it unconditionally, for
>> simplicity's
>> sake.
>>
>> Flush the cache on all logical processors, thanks to
>> EFI_PEI_MP_SERVICES_PPI and CacheMaintenanceLib.
>>
>> Cc: Jordan Justen <[email protected]>
>> Cc: Laszlo Ersek <[email protected]>
>> Cc: Ard Biesheuvel <[email protected]>
>> Cc: Anthony Perard <[email protected]>
>> Cc: Julien Grall <[email protected]>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Marc-André Lureau
>> <[email protected]>
>> Message-Id: <20181002120730.13013-1-
>> [email protected]>
>> ---
>>
>> v3:
>>   - update top comment with notes about TCG spec
>>   - sort headers inclusion
>>
>>  OvmfPkg/PlatformPei/PlatformPei.inf |   2 +
>>  OvmfPkg/PlatformPei/Platform.h      |   5 +
>>  OvmfPkg/PlatformPei/ClearCache.c    | 117
>> ++++++++++++++++++++
>>  OvmfPkg/PlatformPei/Platform.c      |   1 +
>>  4 files changed, 125 insertions(+)
>>
>> diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf
>> b/OvmfPkg/PlatformPei/PlatformPei.inf
>> index 9c5ad9961c4a..5c8dd0fe6d72 100644
>> --- a/OvmfPkg/PlatformPei/PlatformPei.inf
>> +++ b/OvmfPkg/PlatformPei/PlatformPei.inf
>> @@ -30,6 +30,7 @@
>>
>>  [Sources]
>>    AmdSev.c
>> +  ClearCache.c
>>    Cmos.c
>>    Cmos.h
>>    FeatureControl.c
>> @@ -54,6 +55,7 @@
>>
>>  [LibraryClasses]
>>    BaseLib
>> +  CacheMaintenanceLib
>>    DebugLib
>>    HobLib
>>    IoLib
>> diff --git a/OvmfPkg/PlatformPei/Platform.h
>> b/OvmfPkg/PlatformPei/Platform.h
>> index f942e61bb4f9..b12a5c1f5f78 100644
>> --- a/OvmfPkg/PlatformPei/Platform.h
>> +++ b/OvmfPkg/PlatformPei/Platform.h
>> @@ -83,6 +83,11 @@ InstallFeatureControlCallback (
>>    VOID
>>    );
>>
>> +VOID
>> +InstallClearCacheCallback (
>> +  VOID
>> +  );
>> +
>>  EFI_STATUS
>>  InitializeXen (
>>    VOID
>> diff --git a/OvmfPkg/PlatformPei/ClearCache.c
>> b/OvmfPkg/PlatformPei/ClearCache.c
>> new file mode 100644
>> index 000000000000..7d15fd925c3c
>> --- /dev/null
>> +++ b/OvmfPkg/PlatformPei/ClearCache.c
>> @@ -0,0 +1,117 @@
>> +/**@file
>> +  Install a callback to clear cache on all processors.
>> +  This is for conformance with the TCG "Platform Reset
>> Attack Mitigation
>> +  Specification". Because clearing the CPU caches at
>> boot doesn't impact
>> +  performance significantly, do it unconditionally, for
>> simplicity's
>> +  sake.
>> +
>> +  Copyright (C) 2018, Red Hat, Inc.
>> +
>> +  This program and the accompanying materials are
>> licensed and made available
>> +  under the terms and conditions of the BSD License
>> which accompanies this
>> +  distribution.  The full text of the license may be
>> found at
>> +  http://opensource.org/licenses/bsd-license.php
>> +
>> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON
>> AN "AS IS" BASIS, WITHOUT
>> +  WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>> EXPRESS OR IMPLIED.
>> +**/
>> +
>> +#include <Library/CacheMaintenanceLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/PeiServicesLib.h>
>> +#include <Ppi/MpServices.h>
>> +
>> +#include "Platform.h"
>> +
>> +/**
>> +  Invalidate data & instruction caches.
>> +  All APs execute this function in parallel. The BSP
>> executes the function
>> +  separately.
>> +
>> +  @param[in,out] WorkSpace  Pointer to the input/output
>> argument workspace
>> +                            shared by all processors.
>> +**/
>> +STATIC
>> +VOID
>> +EFIAPI
>> +ClearCache (
>> +  IN OUT VOID *WorkSpace
>> +  )
>> +{
>> +  WriteBackInvalidateDataCache ();
>> +  InvalidateInstructionCache ();
>> +}
>> +
>> +/**
>> +  Notification function called when
>> EFI_PEI_MP_SERVICES_PPI becomes available.
>> +
>> +  @param[in] PeiServices      Indirect reference to the
>> PEI Services Table.
>> +  @param[in] NotifyDescriptor Address of the
>> notification descriptor data
>> +                              structure.
>> +  @param[in] Ppi              Address of the PPI that
>> was installed.
>> +
>> +  @return  Status of the notification. The status code
>> returned from this
>> +           function is ignored.
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +ClearCacheOnMpServicesAvailable (
>> +  IN EFI_PEI_SERVICES           **PeiServices,
>> +  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
>> +  IN VOID                       *Ppi
>> +  )
>> +{
>> +  EFI_PEI_MP_SERVICES_PPI *MpServices;
>> +  EFI_STATUS              Status;
>> +
>> +  DEBUG ((DEBUG_INFO, "%a: %a\n", gEfiCallerBaseName,
>> __FUNCTION__));
>> +
>> +  //
>> +  // Clear cache on all the APs in parallel.
>> +  //
>> +  MpServices = Ppi;
>> +  Status = MpServices->StartupAllAPs (
>> +                         (CONST EFI_PEI_SERVICES
>> **)PeiServices,
>> +                         MpServices,
>> +                         ClearCache,          //
>> Procedure
>> +                         FALSE,               //
>> SingleThread
>> +                         0,                   //
>> TimeoutInMicroSeconds: inf.
>> +                         NULL                 //
>> ProcedureArgument
>> +                         );
>> +  if (EFI_ERROR (Status) && Status != EFI_NOT_STARTED)
>> {
>> +    DEBUG ((DEBUG_ERROR, "%a: StartupAllAps(): %r\n",
>> __FUNCTION__, Status));
>> +    return Status;
>> +  }
>> +
>> +  //
>> +  // Now clear cache on the BSP too.
>> +  //
>> +  ClearCache (NULL);
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +//
>> +// Notification object for registering the callback,
>> for when
>> +// EFI_PEI_MP_SERVICES_PPI becomes available.
>> +//
>> +STATIC CONST EFI_PEI_NOTIFY_DESCRIPTOR
>> mMpServicesNotify = {
>> +  EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | // Flags
>> +  EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
>> +  &gEfiPeiMpServicesPpiGuid,               // Guid
>> +  ClearCacheOnMpServicesAvailable          // Notify
>> +};
>> +
>> +VOID
>> +InstallClearCacheCallback (
>> +  VOID
>> +  )
>> +{
>> +  EFI_STATUS           Status;
>> +
>> +  Status = PeiServicesNotifyPpi (&mMpServicesNotify);
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "%a: failed to set up MP
>> Services callback: %r\n",
>> +      __FUNCTION__, Status));
>> +  }
>> +}
>> diff --git a/OvmfPkg/PlatformPei/Platform.c
>> b/OvmfPkg/PlatformPei/Platform.c
>> index 5a78668126b4..22139a64cbf4 100644
>> --- a/OvmfPkg/PlatformPei/Platform.c
>> +++ b/OvmfPkg/PlatformPei/Platform.c
>> @@ -672,6 +672,7 @@ InitializePlatform (
>>      NoexecDxeInitialization ();
>>    }
>>
>> +  InstallClearCacheCallback ();
>>    AmdSevInitialize ();
>>    MiscInitialization ();
>>    InstallFeatureControlCallback ();
>> --
>> 2.19.0.271.gfe8321ec05
>>
>> _______________________________________________
>> edk2-devel mailing list
>> [email protected]
>> https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to