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 (#90431): https://edk2.groups.io/g/devel/message/90431
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]
-=-=-=-=-=-=-=-=-=-=-=-