From: "Kinney, Michael D" <michael.d.kinney@intel.com>
To: Laszlo Ersek <lersek@redhat.com>, Leo Duran <leo.duran@amd.com>,
"edk2-devel@ml01.01.org" <edk2-devel@ml01.01.org>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "Tian, Feng" <feng.tian@intel.com>,
Brijesh Singh <brijesh.singh@amd.com>,
"Zeng, Star" <star.zeng@intel.com>
Subject: Re: [PATCH] MdeModulePkg: Add EFI_GCD_MEMORY_SPACE_NOTIFY_PROTOCOL
Date: Thu, 13 Apr 2017 00:58:30 +0000 [thread overview]
Message-ID: <E92EE9817A31E24EB0585FDF735412F57D168F3D@ORSMSX113.amr.corp.intel.com> (raw)
In-Reply-To: <fd9dac5a-ffa7-747b-499a-74a8d3b9ea4c@redhat.com>
Hi Laszlo and Leo,
If you look at the CpuSetMemoryAttributes() function in
UefiCpuPkg/CpuDxe/CpuDxe.c, you will see it now calls
AssignMemoryPageAttributes() at the end. This function
is implemented in UefiCpuPkg/CpuDxe/CpuPageTable.c and it
updates page table attributes based on the request.
This looks like a very similar action to update PTEs.
What MMIO areas are we discussing here? MMIO ranges
associated with PCI BARs allocated through PCI Bus Driver
and PCI Host Bridge driver?
Mike
> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Wednesday, April 12, 2017 1:33 PM
> To: Kinney, Michael D <michael.d.kinney@intel.com>; Leo Duran
> <leo.duran@amd.com>; edk2-devel@ml01.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; Brijesh Singh <brijesh.singh@amd.com>;
> Zeng, Star <star.zeng@intel.com>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add
> EFI_GCD_MEMORY_SPACE_NOTIFY_PROTOCOL
>
> Mike,
>
> On 04/12/17 21:39, Kinney, Michael D wrote:
> > Hi Leo,
> >
> > DXE Main is supposed to use Arch Protocols for platform specific behavior.
> >
> > In this case, can the CPU Arch Protocol SetMemoryAttributes() function
> > be used to customize behavior?
> >
> > In other modules that add/remove/modify MMIO, gDS->SetMemorySpaceAttributes()
> > Is called to set memory space attributed such as cachability. Can the
> > module that is adding/removing memory regions from GCD also call
> > gDS-> SetMemorySpaceAttributes() so a CPU specific module can perform
> > extra actions?
>
> The goal is to clear the "C" bit in the PTEs (--> disable encryption in
> SEV guests) for all MMIO areas in the GCD memory space map, when they
> are added, and to re-set the "C" bit when the area is removed (or the
> area's GCD type is changed to something non-MMIO).
>
> This behavior should cover all possible gDS->AddMemorySpace() calls (for
> the MMIO type), regardless of what driver calls gDS->AddMemorySpace().
> In other words, drivers that add MMIO space should remain unaware of SEV
> / the "C" bit in PTEs. Otherwise we'd have to enable SEV detection and
> "C" bit massaging in every affected driver individually (even future
> ones, possibly pulled in from under MdeModulePkg or UefiCpuPkg).
> Cacheability and similar attributes for memory ranges are quite
> universal on all architectures, and it is okay to expect all drivers to
> manage those attributes manually (whenever that's necessary), but (a)
> SEV / memory encryption is not that universal, and (b) clearing "C" for
> MMIO ranges affects all drivers alike, so it would be good to generalize
> it at a low level.
>
> What would be the best general location or API to hook the "C" bit
> manipulation into MMIO GCD memory space addition / removal?
>
> Thank you,
> Laszlo
>
>
> >
> > Thanks,
> >
> > Mike
> >
> >
> >
> >> -----Original Message-----
> >> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Leo
> Duran
> >> Sent: Wednesday, April 12, 2017 11:57 AM
> >> To: edk2-devel@ml01.01.org
> >> Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>; Leo
> Duran
> >> <leo.duran@amd.com>; Brijesh Singh <brijesh.singh@amd.com>; Zeng, Star
> >> <star.zeng@intel.com>
> >> Subject: [edk2] [PATCH] MdeModulePkg: Add EFI_GCD_MEMORY_SPACE_NOTIFY_PROTOCOL
> >>
> >> GCD consumes the protocol to issue a Notify() on Add/Remove operations.
> >>
> >> The intended use-case is to allow OvmfPkg take actions on behalf of an
> >> SEV-enabled guest.
> >>
> >> The new protocol is simply added to the list of optional protocols handled
> >> by DxeMain, and as such leverages the existing DxeProtocolNotify framework.
> >>
> >> Cc: Feng Tian <feng.tian@intel.com>
> >> Cc: Star Zeng <star.zeng@intel.com>
> >> Cc: Laszlo Ersek <lersek@redhat.com>
> >> Cc: Brijesh Singh <brijesh.singh@amd.com>
> >> Contributed-under: TianoCore Contribution Agreement 1.0
> >> Signed-off-by: Leo Duran <leo.duran@amd.com>
> >> ---
> >> MdeModulePkg/Core/Dxe/DxeMain.h | 10 +++-
> >> MdeModulePkg/Core/Dxe/DxeMain.inf | 4 ++
> >> MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c | 7 +++
> >> MdeModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c | 9 ++-
> >> MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 8 +++
> >> .../Include/Protocol/GcdMemorySpaceNotify.h | 65
> ++++++++++++++++++++++
> >> MdeModulePkg/MdeModulePkg.dec | 3 +
> >> 7 files changed, 100 insertions(+), 6 deletions(-)
> >> create mode 100644 MdeModulePkg/Include/Protocol/GcdMemorySpaceNotify.h
> >>
> >> diff --git a/MdeModulePkg/Core/Dxe/DxeMain.h b/MdeModulePkg/Core/Dxe/DxeMain.h
> >> index 1a0babb..8a037ff 100644
> >> --- a/MdeModulePkg/Core/Dxe/DxeMain.h
> >> +++ b/MdeModulePkg/Core/Dxe/DxeMain.h
> >> @@ -3,6 +3,8 @@
> >> internal structure and functions used by DxeCore module.
> >>
> >> Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
> >> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> >> +
> >> 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
> >> @@ -17,7 +19,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >> EXPRESS OR IMPLIED.
> >> #define _DXE_MAIN_H_
> >>
> >>
> >> -
> >> #include <PiDxe.h>
> >>
> >> #include <Protocol/LoadedImage.h>
> >> @@ -53,6 +54,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >> EXPRESS OR IMPLIED.
> >> #include <Protocol/TcgService.h>
> >> #include <Protocol/HiiPackageList.h>
> >> #include <Protocol/SmmBase2.h>
> >> +#include <Protocol/GcdMemorySpaceNotify.h>
> >> +
> >> #include <Guid/MemoryTypeInformation.h>
> >> #include <Guid/FirmwareFileSystem2.h>
> >> #include <Guid/FirmwareFileSystem3.h>
> >> @@ -296,12 +299,13 @@ extern EFI_RUNTIME_ARCH_PROTOCOL
> >> gRuntimeTemplate;
> >>
> >> extern EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE
> >> gLoadModuleAtFixAddressConfigurationTable;
> >> extern BOOLEAN
> >> gLoadFixedAddressCodeMemoryReady;
> >> +
> >> +extern EFI_GCD_MEMORY_SPACE_NOTIFY_PROTOCOL *gGcdMemorySpaceNotify;
> >> +
> >> //
> >> // Service Initialization Functions
> >> //
> >>
> >> -
> >> -
> >> /**
> >> Called to initialize the pool.
> >>
> >> diff --git a/MdeModulePkg/Core/Dxe/DxeMain.inf
> >> b/MdeModulePkg/Core/Dxe/DxeMain.inf
> >> index 30d5984..888a16f 100644
> >> --- a/MdeModulePkg/Core/Dxe/DxeMain.inf
> >> +++ b/MdeModulePkg/Core/Dxe/DxeMain.inf
> >> @@ -4,6 +4,8 @@
> >> # It provides an implementation of DXE Core that is compliant with DXE CIS.
> >> #
> >> # Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
> >> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> >> +#
> >> # 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
> >> @@ -162,6 +164,8 @@
> >> gEfiSmmBase2ProtocolGuid ## SOMETIMES_CONSUMES
> >> gEfiBlockIoProtocolGuid ## SOMETIMES_CONSUMES
> >>
> >> + gEfiGcdMemorySpaceNotifyProtocolGuid ## CONSUMES
> >> +
> >> # Arch Protocols
> >> gEfiBdsArchProtocolGuid ## CONSUMES
> >> gEfiCpuArchProtocolGuid ## CONSUMES
> >> diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
> >> b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
> >> index 91e94a7..46b68da 100644
> >> --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
> >> +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
> >> @@ -2,6 +2,8 @@
> >> DXE Core Main Entry Point
> >>
> >> Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
> >> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> >> +
> >> 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
> >> @@ -42,6 +44,11 @@ EFI_GUID *gDxeCoreFileName;
> >> EFI_LOADED_IMAGE_PROTOCOL *gDxeCoreLoadedImage;
> >>
> >> //
> >> +// DXE Core global for GCD notification protocol
> >> +//
> >> +EFI_GCD_MEMORY_SPACE_NOTIFY_PROTOCOL *gGcdMemorySpaceNotify = NULL;
> >> +
> >> +//
> >> // DXE Core Module Variables
> >> //
> >> EFI_BOOT_SERVICES mBootServices = {
> >> diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c
> >> b/MdeModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c
> >> index ea7c610..2314e34 100644
> >> --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c
> >> +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c
> >> @@ -4,6 +4,8 @@
> >> events that represent the Architectural Protocols.
> >>
> >> Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
> >> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> >> +
> >> 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
> >> @@ -45,9 +47,10 @@ EFI_CORE_PROTOCOL_NOTIFY_ENTRY mArchProtocols[] = {
> >> // Optional protocols that the DXE Core will use if they are present
> >> //
> >> EFI_CORE_PROTOCOL_NOTIFY_ENTRY mOptionalProtocols[] = {
> >> - { &gEfiSecurity2ArchProtocolGuid, (VOID **)&gSecurity2, NULL,
> NULL,
> >> FALSE },
> >> - { &gEfiSmmBase2ProtocolGuid, (VOID **)&gSmmBase2, NULL,
> NULL,
> >> FALSE },
> >> - { NULL, (VOID **)NULL, NULL,
> NULL,
> >> FALSE }
> >> + { &gEfiSecurity2ArchProtocolGuid, (VOID **)&gSecurity2,
> >> NULL, NULL, FALSE },
> >> + { &gEfiSmmBase2ProtocolGuid, (VOID **)&gSmmBase2,
> >> NULL, NULL, FALSE },
> >> + { &gEfiGcdMemorySpaceNotifyProtocolGuid, (VOID **)&gGcdMemorySpaceNotify,
> >> NULL, NULL, FALSE },
> >> + { NULL, (VOID **)NULL,
> >> NULL, NULL, FALSE }
> >> };
> >>
> >> //
> >> diff --git a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c
> >> index a06f8bb..223fcd8 100644
> >> --- a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c
> >> +++ b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c
> >> @@ -4,6 +4,8 @@
> >> are accessible to the CPU that is executing the DXE core.
> >>
> >> Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
> >> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> >> +
> >> 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
> >> @@ -896,6 +898,9 @@ CoreConvertSpace (
> >> } else {
> >> Entry->Capabilities = Capabilities | EFI_MEMORY_RUNTIME;
> >> }
> >> + if (gGcdMemorySpaceNotify) {
> >> + gGcdMemorySpaceNotify->MemorySpaceAddNotify (GcdMemoryType,
> BaseAddress,
> >> Length, Entry->Capabilities);
> >> + }
> >> break;
> >> case GCD_ADD_IO_OPERATION:
> >> Entry->GcdIoType = GcdIoType;
> >> @@ -914,6 +919,9 @@ CoreConvertSpace (
> >> case GCD_REMOVE_MEMORY_OPERATION:
> >> Entry->GcdMemoryType = EfiGcdMemoryTypeNonExistent;
> >> Entry->Capabilities = 0;
> >> + if (gGcdMemorySpaceNotify) {
> >> + gGcdMemorySpaceNotify->MemorySpaceRemoveNotify (BaseAddress, Length);
> >> + }
> >> break;
> >> case GCD_REMOVE_IO_OPERATION:
> >> Entry->GcdIoType = EfiGcdIoTypeNonExistent;
> >> diff --git a/MdeModulePkg/Include/Protocol/GcdMemorySpaceNotify.h
> >> b/MdeModulePkg/Include/Protocol/GcdMemorySpaceNotify.h
> >> new file mode 100644
> >> index 0000000..9174957
> >> --- /dev/null
> >> +++ b/MdeModulePkg/Include/Protocol/GcdMemorySpaceNotify.h
> >> @@ -0,0 +1,65 @@
> >> +/** @file
> >> + This file declares the GcdMemorySpaceNotify Protocol.
> >> +
> >> + This Protocol is consumed by GCD to issue notications during ADD/REMOVE
> >> operations.
> >> +
> >> + Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
> >> +
> >> + 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.
> >> +
> >> +**/
> >> +
> >> +#ifndef __EFI_GCD_MEMORY_SPACE_NOTIFY_H__
> >> +#define __EFI_GCD_MEMORY_SPACE_NOTIFY_H__
> >> +
> >> +#define EFI_GCD_MEMORY_SPACE_NOTIFY_GUID \
> >> + { \
> >> + 0xc842db69, 0x610e, 0x401a, {0x90, 0xd0, 0x88, 0x41, 0xf1, 0xdc, 0x53,
> 0x79
> >> } \
> >> + }
> >> +
> >> +/**
> >> + Notify on: Add a segment of memory to GCD map.
> >> +
> >> + @param GcdMemoryType Memory type of the segment.
> >> + @param BaseAddress Base address of the segment.
> >> + @param Length Length of the segment.
> >> + @param Capabilities Alterable attributes of the segment.
> >> +
> >> +**/
> >> +typedef
> >> +VOID
> >> +(EFIAPI *GCD_ADD_MEMORY_NOTIFY) (
> >> + IN EFI_GCD_MEMORY_TYPE GcdMemoryType,
> >> + IN EFI_PHYSICAL_ADDRESS BaseAddress,
> >> + IN UINT64 Length,
> >> + IN UINT64 Capabilities
> >> +);
> >> +
> >> +/**
> >> + Notify on: Remove a segment of memory to GCD map.
> >> +
> >> + @param BaseAddress Base address of the segment.
> >> + @param Length Length of the segment.
> >> +
> >> +**/
> >> +typedef
> >> +VOID
> >> +(EFIAPI *GCD_REMOVE_MEMORY_NOTIFY) (
> >> + IN EFI_PHYSICAL_ADDRESS BaseAddress,
> >> + IN UINT64 Length
> >> +);
> >> +
> >> +typedef struct {
> >> + GCD_ADD_MEMORY_NOTIFY MemorySpaceAddNotify;
> >> + GCD_REMOVE_MEMORY_NOTIFY MemorySpaceRemoveNotify;
> >> +} EFI_GCD_MEMORY_SPACE_NOTIFY_PROTOCOL;
> >> +
> >> +extern EFI_GUID gEfiGcdMemorySpaceNotifyProtocolGuid;
> >> +
> >> +#endif
> >> diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
> >> index ca09cbc..95f9311 100644
> >> --- a/MdeModulePkg/MdeModulePkg.dec
> >> +++ b/MdeModulePkg/MdeModulePkg.dec
> >> @@ -546,6 +546,9 @@
> >> ## Include/Protocol/NonDiscoverableDevice.h
> >> gEdkiiNonDiscoverableDeviceProtocolGuid = { 0x0d51905b, 0xb77e, 0x452a,
> {0xa2,
> >> 0xc0, 0xec, 0xa0, 0xcc, 0x8d, 0x51, 0x4a } }
> >>
> >> + ## Include/Protocol/GcdMemorySpaceNotify.h
> >> + gEfiGcdMemorySpaceNotifyProtocolGuid = { 0xc842db69, 0x610e, 0x401a,
> {0x90,
> >> 0xd0, 0x88, 0x41, 0xf1, 0xdc, 0x53, 0x79 } }
> >> +
> >> #
> >> # [Error.gEfiMdeModulePkgTokenSpaceGuid]
> >> # 0x80000001 | Invalid value provided.
> >> --
> >> 2.7.4
> >>
> >> _______________________________________________
> >> edk2-devel mailing list
> >> edk2-devel@lists.01.org
> >> https://lists.01.org/mailman/listinfo/edk2-devel
next prev parent reply other threads:[~2017-04-13 0:58 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-12 18:56 [PATCH] MdeModulePkg: Add EFI_GCD_MEMORY_SPACE_NOTIFY_PROTOCOL Leo Duran
2017-04-12 18:56 ` Leo Duran
2017-04-12 19:39 ` Kinney, Michael D
2017-04-12 20:32 ` Laszlo Ersek
2017-04-13 0:58 ` Kinney, Michael D [this message]
2017-04-13 2:13 ` Zeng, Star
2017-04-13 2:35 ` Duran, Leo
2017-04-13 2:40 ` Yao, Jiewen
2017-04-13 2:44 ` Duran, Leo
2017-04-13 3:05 ` Yao, Jiewen
2017-04-14 14:10 ` Duran, Leo
2017-04-13 2:27 ` Duran, Leo
2017-04-12 20:34 ` Duran, Leo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E92EE9817A31E24EB0585FDF735412F57D168F3D@ORSMSX113.amr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox