Thanks for the response.

1) Why we need "enable UEFI variable write before permanent memory is 
available"?

2) If the implementation is not ready, I do have concern to add it so early in 
EDKII.
If I don’t have a big picture, I am not sure how to review the completeness.

Can we put it to EDKII-staging (https://github.com/tianocore/edk2-staging) for 
a moment?
I don’t see the need to add the interface now for work-in-progress feature, 
since there is no consumer and no producer.

Another reason is that I happen to know other feature (in EDKII stage) is 
impacting variable driver.
https://github.com/tianocore/edk2-staging/tree/ProtectedVariable/libs

Please do consider that as well - how to write a protected variable in PEI 
phase.

Thank you
Yao Jiewen

> -----Original Message-----
> From: Desimone, Nathaniel L <nathaniel.l.desim...@intel.com>
> Sent: Saturday, June 11, 2022 5:49 AM
> To: Yao, Jiewen <jiewen....@intel.com>; devel@edk2.groups.io;
> michael.kuba...@outlook.com
> Cc: Wang, Jian J <jian.j.w...@intel.com>; Gao, Liming
> <gaolim...@byosoft.com.cn>; Kinney, Michael D
> <michael.d.kin...@intel.com>; Oram, Isaac W <isaac.w.o...@intel.com>;
> Chiu, Chasel <chasel.c...@intel.com>; Cheng, Gao <gao.ch...@intel.com>;
> Zhang, Di <di.zh...@intel.com>; Bu, Daocheng <daocheng...@intel.com>;
> Kubacki, Michael <michael.kuba...@microsoft.com>
> Subject: RE: [edk2-devel] [PATCH V1 1/1] MdeModulePkg: Add Definition of
> EDKII_PEI_VARIABLE_PPI
> 
> Hi Jiewen,
> 
> Thanks for the feedback, per your questions:
> 
> 1. The primary use case for this is to enable UEFI variable writes before
> permanent memory is available.
> 2. The implementation is a work in progress. We will provide it shortly. As 
> this
> will be a rather large patch set, I would like to get this piece in place 
> beforehand
> so that the reviewers can focus on the implementation separate from the API
> definition.
> 3. No impact to secure boot. We are not going to support writing to
> authenticated variables in PEI. As mentioned in the comments, if a PEIM wishes
> to update any of the authenticated variables it must use the existing HOB
> mechanism to have a later DXE phase perform the update.
> 4. With regard to atomicity, we have a complete implementation of the fault
> tolerant write services operational in Pre-Memory PEI.
> 5. Good point on the S3 resume, we will need to add an SMI to have the 
> variable
> services re-initialize the mNvVariableCache.
> 
> Hope that helps,
> Nate
> 
> -----Original Message-----
> From: Yao, Jiewen <jiewen....@intel.com>
> Sent: Friday, June 10, 2022 9:56 AM
> To: devel@edk2.groups.io; michael.kuba...@outlook.com; Desimone,
> Nathaniel L <nathaniel.l.desim...@intel.com>
> Cc: Wang, Jian J <jian.j.w...@intel.com>; Gao, Liming
> <gaolim...@byosoft.com.cn>; Kinney, Michael D
> <michael.d.kin...@intel.com>; Oram, Isaac W <isaac.w.o...@intel.com>;
> Chiu, Chasel <chasel.c...@intel.com>; Cheng, Gao <gao.ch...@intel.com>;
> Zhang, Di <di.zh...@intel.com>; Bu, Daocheng <daocheng...@intel.com>;
> Kubacki, Michael <michael.kuba...@microsoft.com>
> Subject: RE: [edk2-devel] [PATCH V1 1/1] MdeModulePkg: Add Definition of
> EDKII_PEI_VARIABLE_PPI
> 
> Hi
> 
> I am curious why we need this interface. Why we need write variable capability
> in PEI phase?
> 
> Where is the implementation of this? I prefer to see an implementation
> submitted together with header file.
> For example, what is the impact to secure boot related feature, how to write
> auth variable in PEI, how PEI write variable cowork with SMM version in S3
> resume phase, how to support variable atomicity, etc.
> 
> Thank you
> Yao Jiewen
> 
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Michael
> > Kubacki
> > Sent: Friday, June 10, 2022 10:00 AM
> > To: devel@edk2.groups.io; Desimone, Nathaniel L
> > <nathaniel.l.desim...@intel.com>
> > Cc: Wang, Jian J <jian.j.w...@intel.com>; Gao, Liming
> > <gaolim...@byosoft.com.cn>; Kinney, Michael D
> > <michael.d.kin...@intel.com>; Oram, Isaac W <isaac.w.o...@intel.com>;
> > Chiu, Chasel <chasel.c...@intel.com>; Cheng, Gao
> > <gao.ch...@intel.com>; Zhang, Di <di.zh...@intel.com>; Bu, Daocheng
> > <daocheng...@intel.com>; Kubacki, Michael
> > <michael.kuba...@microsoft.com>
> > Subject: Re: [edk2-devel] [PATCH V1 1/1] MdeModulePkg: Add Definition
> > of EDKII_PEI_VARIABLE_PPI
> >
> > Is this change just adding the interface to Tianocore or is there
> > additional implementation planned as well?
> >
> > ---
> >
> > I thought we were following this convention now:
> >
> > "#ifndef __PEI_VARIABLE_PPI_H_" -> "#ifndef PEI_VARIABLE_PPI_H_"
> >
> > Some other comments are inline.
> >
> > Regards,
> > Michael
> >
> > On 6/9/2022 9:17 PM, Nate DeSimone wrote:
> > > Adds definition of EDKII_PEI_VARIABLE_PPI, a pre-cursor to enabling
> > > variable writes in the PEI environment.
> > >
> > > Cc: Jian J Wang <jian.j.w...@intel.com>
> > > Cc: Liming Gao <gaolim...@byosoft.com.cn>
> > > Cc: Michael D Kinney <michael.d.kin...@intel.com>
> > > Cc: Isaac Oram <isaac.w.o...@intel.com>
> > > Cc: Chasel Chiu <chasel.c...@intel.com>
> > > Cc: Gao Cheng <gao.ch...@intel.com>
> > > Cc: Di Zhang <di.zh...@intel.com>
> > > Cc: Daocheng Bu <daocheng...@intel.com>
> > > Cc: Michael Kubacki <michael.kuba...@microsoft.com>
> > > Signed-off-by: Nate DeSimone <nathaniel.l.desim...@intel.com>
> > > ---
> > >   MdeModulePkg/Include/Ppi/Variable.h | 189
> > ++++++++++++++++++++++++++++
> > >   MdeModulePkg/MdeModulePkg.dec       |   3 +
> > >   2 files changed, 192 insertions(+)
> > >   create mode 100644 MdeModulePkg/Include/Ppi/Variable.h
> > >
> > > diff --git a/MdeModulePkg/Include/Ppi/Variable.h
> > b/MdeModulePkg/Include/Ppi/Variable.h
> > > new file mode 100644
> > > index 0000000000..97dc7ceefa
> > > --- /dev/null
> > > +++ b/MdeModulePkg/Include/Ppi/Variable.h
> > > @@ -0,0 +1,189 @@
> > > +/** @file
> > > +  EDKII PEI Variable Protocol provides an implementation of
> > > +variables
> >
> > [MK] Was "EDKII PEI Variable PPI" intended?
> >
> > > +  intended for use as a means to store data in the PEI environment.
> > > +
> > > +  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
> > > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > > +
> > > +**/
> > > +
> > > +#ifndef __PEI_VARIABLE_PPI_H_
> > > +#define __PEI_VARIABLE_PPI_H_
> > > +
> > > +#define EDKII_PEI_VARIABLE_PPI_GUID \
> > > +  { \
> > > +    0xe7b2cd04, 0x4b14, 0x44c2, { 0xb7, 0x48, 0xce, 0xaf, 0x2b,
> > > +0x66, 0x4a,
> > 0xb0 } \
> > > +  }
> > > +
> > > +typedef struct _EDKII_PEI_VARIABLE_PPI EDKII_PEI_VARIABLE_PPI;
> > > +
> > > +/**
> > > +  This service retrieves a variable's value using its name and GUID.
> > > +
> > > +  Read the specified variable from the UEFI variable store. If the
> > > + Data  buffer is too small to hold the contents of the variable,
> > > + the error EFI_BUFFER_TOO_SMALL is returned and DataSize is set to
> > > + the  required buffer size to obtain the data.
> > > +
> > > +  @param[in]        This              A pointer to this instance of the
> > EDKII_PEI_VARIABLE_PPI.
> > > +  @param[in]        VariableName      A pointer to a null-terminated 
> > > string that
> > is the variable's name.
> > > +  @param[in]        VariableGuid      A pointer to an EFI_GUID that is 
> > > the
> > variable's GUID. The combination of
> > > +                                      VariableGuid and VariableName must 
> > > be unique.
> > > +  @param[out]       Attributes        If non-NULL, on return, points to 
> > > the
> > variable's attributes.
> > > +  @param[in, out]   DataSize          On entry, points to the size in 
> > > bytes of the
> > Data buffer.
> > > +                                      On return, points to the size of 
> > > the data returned in
> Data.
> > > +  @param[out]       Data              Points to the buffer which will 
> > > hold the
> > returned variable value.
> > > +                                      May be NULL with a zero
> > > + DataSize in order to determine
> > the size of the
> > > +                                      buffer needed.
> > > +
> > > +  @retval EFI_SUCCESS                 The variable was read successfully.
> > > +  @retval EFI_NOT_FOUND               The variable was not found.
> > > +  @retval EFI_BUFFER_TOO_SMALL        The DataSize is too small for the
> > resulting data.
> > > +                                      DataSize is updated with the size 
> > > required for
> > > +                                      the specified variable.
> > > +  @retval EFI_INVALID_PARAMETER       VariableName, VariableGuid,
> > DataSize or Data is NULL.
> > > +  @retval EFI_DEVICE_ERROR            The variable could not be retrieved
> > because of a device error.
> > > +
> > > +**/
> > > +typedef
> > > +EFI_STATUS
> > > +(EFIAPI *EDKII_PEI_GET_VARIABLE)(
> > > +  IN CONST  EDKII_PEI_VARIABLE_PPI    *This,
> > > +  IN CONST  CHAR16                    *VariableName,
> > > +  IN CONST  EFI_GUID                  *VariableGuid,
> > > +  OUT       UINT32                    *Attributes,
> >
> > [MK] Based on the description, Attributes should be marked "OPTIONAL".
> >
> > > +  IN OUT    UINTN                     *DataSize,
> > > +  OUT       VOID                      *Data OPTIONAL
> > > +  );
> > > +
> > > +/**
> > > +  Return the next variable name and GUID.
> > > +
> > > +  This function is called multiple times to retrieve the
> > > + VariableName  and VariableGuid of all variables currently available in 
> > > the
> system.
> > > +  On each call, the previous results are passed into the interface,
> > > + and, on return, the interface returns the data for the next
> > > + interface. When the entire variable list has been returned,
> > > + EFI_NOT_FOUND is returned.
> > > +
> >
> > [MK] I know other descriptions don't usually have it but it would be
> > nice to describe the initial calling values expected.
> >
> > > +  @param[in]        This              A pointer to this instance of the
> > EDKII_PEI_VARIABLE_PPI.
> > > +  @param[in, out]   VariableNameSize  On entry, points to the size of the
> > buffer pointed to by VariableName.
> > > +                                      On return, the size of the 
> > > variable name buffer.
> > > +  @param[in, out]   VariableName      On entry, a pointer to a null-
> terminated
> > string that is the variable's name.
> > > +                                      On return, points to the next
> > > + variable's null-terminated
> > name string.
> > > +  @param[in, out]   VariableGuid      On entry, a pointer to an EFI_GUID 
> > > that
> is
> > the variable's GUID.
> > > +                                      On return, a pointer to the next 
> > > variable's GUID.
> > > +
> > > +  @retval EFI_SUCCESS                 The variable was read successfully.
> > > +  @retval EFI_NOT_FOUND               The variable could not be found.
> > > +  @retval EFI_BUFFER_TOO_SMALL        The VariableNameSize is too small
> for
> > the resulting
> > > +                                      data. VariableNameSize is updated 
> > > with the size
> > > +                                      required for the specified 
> > > variable.
> > > +  @retval EFI_INVALID_PARAMETER       VariableName, VariableGuid or
> > > +                                      VariableNameSize is NULL.
> > > +  @retval EFI_DEVICE_ERROR            The variable could not be retrieved
> > because of a device error.
> > > +
> > > +**/
> > > +typedef
> > > +EFI_STATUS
> > > +(EFIAPI *EDKII_PEI_GET_NEXT_VARIABLE_NAME)(
> > > +  IN CONST  EDKII_PEI_VARIABLE_PPI    *This,
> > > +  IN OUT    UINTN                     *VariableNameSize,
> > > +  IN OUT    CHAR16                    *VariableName,
> > > +  IN OUT    EFI_GUID                  *VariableGuid
> > > +  );
> > > +
> > > +/**
> > > +  Sets the value of a variable.
> > > +
> > > +  @param[in]        This              A pointer to this instance of the
> > EDKII_PEI_VARIABLE_PPI.
> > > +  @param[in]        VariableName      A Null-terminated string that is 
> > > the name
> > of the vendor's variable.
> > > +                                      Each VariableName is unique for 
> > > each VendorGuid.
> > VariableName must
> > > +                                      contain 1 or more characters.
> > > + If VariableName is an
> > empty string,
> > > +                                      then EFI_INVALID_PARAMETER is 
> > > returned.
> > > +  @param[in]        VendorGuid        A unique identifier for the vendor.
> > > +  @param[in]        Attributes        Attributes bitmask to set for the 
> > > variable.
> > > +  @param[in]        DataSize          The size in bytes of the Data 
> > > buffer. Unless
> > the EFI_VARIABLE_APPEND_WRITE
> > > +                                      attribute is set, a size of
> > > + zero causes the variable to be
> > deleted. When the
> > > +                                      EFI_VARIABLE_APPEND_WRITE
> > > + attribute is set, then a
> > SetVariable() call with a
> > > +                                      DataSize of zero will not
> > > + cause any change to the
> > variable value.
> > > +  @param[in]        Data              The contents for the variable.
> > > +
> > > +  @retval EFI_SUCCESS                 The firmware has successfully 
> > > stored the
> > variable and its data as
> > > +                                      defined by the Attributes.
> > > +  @retval EFI_INVALID_PARAMETER       An invalid combination of attribute
> > bits, name, and GUID was supplied, or the
> > > +                                      DataSize exceeds the maximum 
> > > allowed.
> > > +  @retval EFI_INVALID_PARAMETER       VariableName is an empty string.
> > > +  @retval EFI_OUT_OF_RESOURCES        Not enough storage is available to
> > hold the variable and its data.
> > > +  @retval EFI_DEVICE_ERROR            The variable could not be 
> > > retrieved due
> > to a hardware error.
> > > +  @retval EFI_WRITE_PROTECTED         The variable in question is 
> > > read-only.
> > > +  @retval EFI_WRITE_PROTECTED         The variable in question cannot be
> > deleted.
> > > +  @retval EFI_SECURITY_VIOLATION      The variable could not be written
> due
> > to EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS,
> > > +                                      or
> > EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS, or
> > > +
> > > + EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS
> > being set. Writing to authenticated
> > > +                                      variables is not supported in the 
> > > PEI environment.
> > Updates to authenticated
> > > +                                      variables can be requested
> > > + during PEI via the
> > EFI_AUTHENTICATED_VARIABLE_HOB, but
> > > +                                      these updates won't be
> > > + written to non-volatile storage
> > until later in DXE. See
> > > +
> > > + MdeModulePkg/Include/Guid/VariableFormat.h for
> > more details on
> > > +                                      EFI_AUTHENTICATED_VARIABLE_HOB.
> >
> > [MK] I didn't see "EFI_AUTHENTICATED_VARIABLE_HOB" mentioned in
> > VariableFormat.h.
> >
> > [MK] It seems that if a contract for producing and then consuming this
> > HOB is going to be defined between the HOB producer and consumer
> > phase, it should be described in something like the PI Spec.
> >
> > > +  @retval EFI_NOT_FOUND               The variable trying to be updated 
> > > or
> > deleted was not found.
> > > +
> > > +**/
> > > +typedef
> > > +EFI_STATUS
> > > +(EFIAPI *EDKII_PEI_SET_VARIABLE)(
> > > +  IN CONST  EDKII_PEI_VARIABLE_PPI    *This,
> > > +  IN        CHAR16                    *VariableName,
> > > +  IN        EFI_GUID                  *VendorGuid,
> > > +  IN        UINT32                    Attributes,
> > > +  IN        UINTN                     DataSize,
> > > +  IN        VOID                      *Data
> > > +  );
> > > +
> > > +/**
> > > +  Returns information about the UEFI variables.
> > > +
> > > +  @param[in]        This                          A pointer to this 
> > > instance of the
> > EDKII_PEI_VARIABLE_PPI.
> > > +  @param[in]        Attributes                    Attributes bitmask to 
> > > specify the type
> > of variables on
> > > +                                                  which to return 
> > > information.
> > > +  @param[out]       MaximumVariableStorageSize    On output the maximum
> > size of the storage space
> > > +                                                  available for the EFI 
> > > variables associated with
> the
> > > +                                                  attributes specified.
> > > +  @param[out]       RemainingVariableStorageSize  Returns the remaining
> size
> > of the storage space
> > > +                                                  available for the EFI 
> > > variables associated with
> the
> > > +                                                  attributes specified.
> > > +  @param[out]       MaximumVariableSize           Returns the maximum 
> > > size of
> > the individual EFI
> > > +                                                  variables associated 
> > > with the attributes
> specified.
> > > +
> > > +  @retval EFI_SUCCESS                             Valid answer returned.
> > > +  @retval EFI_INVALID_PARAMETER                   An invalid combination 
> > > of
> > attribute bits was supplied
> > > +  @retval EFI_UNSUPPORTED                         The attribute is not 
> > > supported
> on
> > this platform, and the
> > > +                                                  
> > > MaximumVariableStorageSize,
> > > +
> > > + RemainingVariableStorageSize,
> > MaximumVariableSize
> > > +                                                  are undefined.
> > > +
> > > +**/
> > > +typedef
> > > +EFI_STATUS
> > > +(EFIAPI *EDKII_PEI_QUERY_VARIABLE_INFO)(
> > > +  IN CONST  EDKII_PEI_VARIABLE_PPI    *This,
> > > +  IN        UINT32                    Attributes,
> > > +  OUT       UINT64                    *MaximumVariableStorageSize,
> > > +  OUT       UINT64                    *RemainingVariableStorageSize,
> > > +  OUT       UINT64                    *MaximumVariableSize
> > > +  );
> > > +
> > > +///
> > > +/// PEI Variable Protocol is intended for use as a means
> >
> > [MK] Was "PEI Variable PPI" intended?
> >
> > > +/// to store data in the PEI environment.
> > > +///
> > > +struct _EDKII_PEI_VARIABLE_PPI {
> > > +  EDKII_PEI_GET_VARIABLE            GetVariable;
> > > +  EDKII_PEI_GET_NEXT_VARIABLE_NAME  GetNextVariableName;
> > > +  EDKII_PEI_SET_VARIABLE            SetVariable;
> > > +  EDKII_PEI_QUERY_VARIABLE_INFO     QueryVariableInfo;
> > > +};
> > > +
> > > +extern EFI_GUID  gEdkiiPeiVariablePpiGuid;
> > > +
> > > +#endif
> > > diff --git a/MdeModulePkg/MdeModulePkg.dec
> > b/MdeModulePkg/MdeModulePkg.dec
> > > index 2bcb9f9453..4f4c48b81f 100644
> > > --- a/MdeModulePkg/MdeModulePkg.dec
> > > +++ b/MdeModulePkg/MdeModulePkg.dec
> > > @@ -513,6 +513,9 @@
> > >     gEdkiiPeiCapsuleOnDiskPpiGuid             = { 0x71a9ea61, 0x5a35, 
> > > 0x4a5d,
> > { 0xac, 0xef, 0x9c, 0xf8, 0x6d, 0x6d, 0x67, 0xe0 } }
> > >     gEdkiiPeiBootInCapsuleOnDiskModePpiGuid   = { 0xb08a11e4, 0xe2b7,
> > 0x4b75, { 0xb5, 0x15, 0xaf, 0x61, 0x6, 0x68, 0xbf, 0xd1  } }
> > >
> > > +  ## Include/Ppi/Variable.h
> > > +  gEdkiiPeiVariablePpiGuid                  = { 0xe7b2cd04, 0x4b14, 
> > > 0x44c2, { 0xb7,
> > 0x48, 0xce, 0xaf, 0x2b, 0x66, 0x4a, 0xb0 } }
> > > +
> > >   [Protocols]
> > >     ## Load File protocol provides capability to load and unload EFI
> > > image into
> > memory and execute it.
> > >     #  Include/Protocol/LoadPe32Image.h
> >
> >
> > 
> >



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#90454): https://edk2.groups.io/g/devel/message/90454
Mute This Topic: https://groups.io/mt/91659908/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to