Hi Mike, I agree to remove the GetVariable. But why for ExitBootServices? If we remove that, the services would be disabled at both boot phase and runtime phase.
Thanks, Zhichao > -----Original Message----- > From: Kinney, Michael D > Sent: Saturday, July 20, 2019 12:09 AM > To: devel@edk2.groups.io; Gao, Zhichao <zhichao....@intel.com>; Kinney, > Michael D <michael.d.kin...@intel.com> > Cc: Wang, Jian J <jian.j.w...@intel.com>; Wu, Hao A <hao.a...@intel.com>; > Ni, Ray <ray...@intel.com>; Zeng, Star <star.z...@intel.com>; Gao, Liming > <liming....@intel.com>; Sean Brogan <sean.bro...@microsoft.com>; Michael > Turner <michael.tur...@microsoft.com>; Bret Barkelew > <bret.barke...@microsoft.com>; Laszlo Ersek <ler...@redhat.com> > Subject: RE: [edk2-devel] [PATCH V2 4/4] MdeModulePkg/CapsuleRuntimeDxe: > Implement RuntimeServicesSupported > > Zhichao, > > The GetVariable and ExitBootServices events should be removed from this > patch. I recommend RT drivers that produce RT services consume the new PCD > to determine if the services return EFI_UNSUPPORTED or not after > ExitBootServices(). This keeps RT Driver as simple as possible and removes > the > need for the UEFI Variable to be in a known state earlier in the boot and > removes the need for RT Drivers to setup extra notification events. > > The new UEFI Variable is intended to be used by OS Loaders and OS Kernels > that call ExitBootServices() and need to know if specific RT services are > available or not after ExitBootServices(). > > Thanks, > > Mike > > > -----Original Message----- > > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of > > Gao, Zhichao > > Sent: Friday, July 19, 2019 1:09 AM > > To: devel@edk2.groups.io > > Cc: Wang, Jian J <jian.j.w...@intel.com>; Wu, Hao A > > <hao.a...@intel.com>; Ni, Ray <ray...@intel.com>; Zeng, Star > > <star.z...@intel.com>; Gao, Liming <liming....@intel.com>; Sean Brogan > > <sean.bro...@microsoft.com>; Michael Turner > > <michael.tur...@microsoft.com>; Bret Barkelew > > <bret.barke...@microsoft.com>; Laszlo Ersek <ler...@redhat.com> > > Subject: [edk2-devel] [PATCH V2 4/4] > > MdeModulePkg/CapsuleRuntimeDxe: Implement RuntimeServicesSupported > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1907 > > > > Control the capsule services supported at runtime base on the variable > > L"RuntimeServicesSupported". > > It would update a global variable > > mRuntimeServicesSupported at ExitBootServices event. > > > > Cc: Jian J Wang <jian.j.w...@intel.com> > > Cc: Hao A Wu <hao.a...@intel.com> > > Cc: Ray Ni <ray...@intel.com> > > Cc: Star Zeng <star.z...@intel.com> > > Cc: Liming gao <liming....@intel.com> > > Cc: Sean Brogan <sean.bro...@microsoft.com> > > Cc: Michael Turner <michael.tur...@microsoft.com> > > Cc: Bret Barkelew <bret.barke...@microsoft.com> > > Cc: Laszlo Ersek <ler...@redhat.com> > > Signed-off-by: Zhichao Gao <zhichao....@intel.com> > > --- > > .../CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf | 2 + > > .../CapsuleRuntimeDxe/CapsuleService.c | 68 > > +++++++++++++++++++ > > 2 files changed, 70 insertions(+) > > > > diff --git > > a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntim > > eDxe.inf > > b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntim > > eDxe.inf > > index 9da450722b..15d498863a 100644 > > --- > > a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntim > > eDxe.inf > > +++ > > b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntim > > eDxe.inf > > @@ -72,6 +72,8 @@ > > ## SOMETIMES_PRODUCES ## > > Variable:L"CapsuleLongModeBuffer" # The long mode buffer used by IA32 > > Capsule PEIM to call X64 CapsuleCoalesce code to handle >4GB capsule > > blocks > > gEfiCapsuleVendorGuid > > gEfiFmpCapsuleGuid ## > > SOMETIMES_CONSUMES ## GUID # FMP capsule GUID > > + gEfiGlobalVariableGuid ## > > CONSUMES ## Variable > > L"RuntimeServicesSupported" > > + gEfiEventExitBootServicesGuid ## > > CONSUMES > > > > [Protocols] > > gEfiCapsuleArchProtocolGuid ## > > PRODUCES > > diff --git > > a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleServic > > e.c > > b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleServic > > e.c > > index 77b8f00062..e4e700764b 100644 > > --- > > a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleServic > > e.c > > +++ > > b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleServic > > e.c > > @@ -24,6 +24,13 @@ UINTN mTimes = 0; > > UINT32 mMaxSizePopulateCapsule = 0; > > UINT32 mMaxSizeNonPopulateCapsule = 0; > > > > +// > > +// Runtime Services Supported Flag > > +// Initialize it to 0x3FFF to indicate it is all > > supported before > > +runtime // > > +static UINT16 mRuntimeServicesSupported = 0x3FFF; > > + > > + > > /** > > Passes capsules to the firmware with both virtual and physical > > mapping. Depending on the intended > > consumption, the firmware may process the capsule immediately. If > > the payload should persist @@ -71,6 > > +78,10 @@ UpdateCapsule ( > > CHAR16 CapsuleVarName[30]; > > CHAR16 *TempVarName; > > > > + if (!(mRuntimeServicesSupported | > > EFI_RT_SUPPORTED_UPDATE_CAPSULE)) { > > + return EFI_UNSUPPORTED; > > + } > > + > > // > > // Check if platform support Capsule In RAM or not. > > // Platform could choose to drop > > CapsulePei/CapsuleX64 and do not support Capsule In RAM. > > @@ -259,6 +270,10 @@ QueryCapsuleCapabilities ( > > EFI_CAPSULE_HEADER *CapsuleHeader; > > BOOLEAN NeedReset; > > > > + if (!(mRuntimeServicesSupported | > > EFI_RT_SUPPORTED_QUERY_CAPSULE_CAPABILITIES)) { > > + return EFI_UNSUPPORTED; > > + } > > + > > // > > // Capsule Count can't be less than one. > > // > > @@ -343,6 +358,48 @@ QueryCapsuleCapabilities ( > > return EFI_SUCCESS; > > } > > > > +/** > > + ExitBootServices Event to update the > > mRuntimeServicesSupported to > > + affect the runtime services. > > + > > + @param[in] Event Event whose notification > > function is being invoked > > + @param[in] Context Pointer to the notification > > function's context > > +**/ > > +static > > +VOID > > +EFIAPI > > +UpdateRuntimeServicesSupported ( > > + IN EFI_EVENT Event, > > + IN VOID *Context > > + ) > > +{ > > + EFI_STATUS Status; > > + UINT16 RuntimeServicesSupported; > > + UINT32 Attributes; > > + UINTN DataSize; > > + > > + Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | > > + EFI_VARIABLE_RUNTIME_ACCESS; DataSize = sizeof > > (UINT16); Status = > > + gRT->GetVariable ( > > + L"RuntimeServicesSupported", > > + &gEfiGlobalVariableGuid, > > + &Attributes, > > + &DataSize, > > + &RuntimeServicesSupported > > + ); > > + > > + if (!EFI_ERROR (Status)) { > > + mRuntimeServicesSupported = > > RuntimeServicesSupported; > > + } else if (Status == EFI_NOT_FOUND) { > > + mRuntimeServicesSupported = 0x3FFF; > > + } else { > > + // > > + // Should never arrive here. > > + // > > + ASSERT_EFI_ERROR (Status); > > + } > > +} > > + > > > > /** > > > > @@ -362,6 +419,7 @@ CapsuleServiceInitialize ( > > ) > > { > > EFI_STATUS Status; > > + EFI_EVENT Event; > > > > mMaxSizePopulateCapsule = > > PcdGet32(PcdMaxSizePopulateCapsule); > > mMaxSizeNonPopulateCapsule = > > PcdGet32(PcdMaxSizeNonPopulateCapsule); > > @@ -381,6 +439,16 @@ CapsuleServiceInitialize ( > > gRT->UpdateCapsule = > > UpdateCapsule; > > gRT->QueryCapsuleCapabilities = > > QueryCapsuleCapabilities; > > > > + Status = gBS->CreateEventEx( > > + EVT_NOTIFY_SIGNAL, > > + TPL_NOTIFY, > > + UpdateRuntimeServicesSupported, > > + NULL, > > + &gEfiEventExitBootServicesGuid, > > + &Event > > + ); > > + ASSERT_EFI_ERROR (Status); > > + > > // > > // Install the Capsule Architectural Protocol on a new handle > > // to signify the capsule runtime services are ready. > > -- > > 2.21.0.windows.1 > > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#44081): https://edk2.groups.io/g/devel/message/44081 Mute This Topic: https://groups.io/mt/32524672/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-