Topics

[edk2-platforms] [PATCH v5 0/4] Add Large Variable Libraries


Nate DeSimone
 

Changes from V4:
- Added LibraryClass interface definitions to
MinPlatformPkg.dec

Changes from V3:
- Added header guards
- Documented the possibility of returning EFI_UNSUPPORTED
- Added MM_CORE_STANDALONE to the StandaloneMm library
implementations
- Documented library constructor return status
- Moved LargeVariableReadLib and LargeVariableWriteLib into
a single BaseLargeVariableLib folder
- Added LargeVariableCommon.h for shared macro definitions
- Converted some debug macros from DEBUG_INFO to DEBUG_VERBOSE

Changes from V2:
- Added comment to LargeVariableLib INF and header files
describing the usage for drivers that cannot assume that
PcdMaxVariableSize has been set to a certain minimum value.

Changes from V1:
- Changed prefix from "Min" to "VarLib"
- Better comments
- Added more whitespace for readability
- Removed unused INF sections
- Better debug messages

This patch series introduces libaries that enable large data sets
to be stored using the UEFI Variable Services. At present, most
UEFI Variable Services implementations have a maximum variable
size of <=64KB. The exact value varies depending on platform.

These libaries enable a data set to use as much space as needed,
up to the remaining space in the UEFI Variable non-volatile storage.

To implement this, I have broken the problem down into two parts:

1. Phase angostic UEFI Variable access.
2. Storage of data across multiple UEFI Variables.

For the first part, I have created two new LibraryClasses:
VariableReadLib and VariableWriteLib. I have provided
implementation instances of VariableReadLib for PEI, DXE, and SMM.
For VariableWriteLib, I have provided implementation instances for
DXE and SMM. This enables code that accesses UEFI variables
to be written in a matter than is phase agnostic, so the same
code can be used in PEI, DXE, or SMM without modification.

The second part involves another two new LibaryClasses:
LargeVariableReadLib and LargeVariableWriteLib. Only one BASE
implementation is needed for both of these as the phase dependent
code was seperated out in the first piece. These libraries provide
logic to calculate the maximum size of an individual UEFI variable
and split the data into as many smaller pieces as needed to store
the entire data set in the UEFI Variable storage. They also provide
the ability to stitch the data back together when it is read.
Deleting the data will delete all variables used to store it.

Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>

Nate DeSimone (4):
MinPlatformPkg: Add VariableReadLib
MinPlatformPkg: Add VariableWriteLib
MinPlatformPkg: Add LargeVariableReadLib
MinPlatformPkg: Add LargeVariableWriteLib

.../Include/Dsc/CoreCommonLib.dsc | 6 +-
.../MinPlatformPkg/Include/Dsc/CoreDxeLib.dsc | 12 +-
.../MinPlatformPkg/Include/Dsc/CorePeiLib.dsc | 9 +-
.../Include/Library/LargeVariableReadLib.h | 61 +++
.../Include/Library/LargeVariableWriteLib.h | 69 +++
.../Include/Library/VariableReadLib.h | 94 ++++
.../Include/Library/VariableWriteLib.h | 138 ++++++
.../BaseLargeVariableReadLib.inf | 51 ++
.../BaseLargeVariableWriteLib.inf | 51 ++
.../LargeVariableCommon.h | 47 ++
.../LargeVariableReadLib.c | 176 +++++++
.../LargeVariableWriteLib.c | 450 ++++++++++++++++++
.../DxeRuntimeVariableReadLib.c | 117 +++++
.../DxeRuntimeVariableReadLib.inf | 41 ++
.../DxeRuntimeVariableWriteLib.c | 265 +++++++++++
.../DxeRuntimeVariableWriteLib.inf | 49 ++
.../PeiVariableReadLib/PeiVariableReadLib.c | 155 ++++++
.../PeiVariableReadLib/PeiVariableReadLib.inf | 42 ++
.../SmmVariableReadCommon.c | 116 +++++
.../StandaloneMmVariableReadLib.inf | 50 ++
.../StandaloneMmVariableReadLibConstructor.c | 51 ++
.../TraditionalMmVariableReadLib.inf | 49 ++
.../TraditionalMmVariableReadLibConstructor.c | 51 ++
.../SmmVariableWriteCommon.c | 171 +++++++
.../StandaloneMmVariableWriteLib.inf | 45 ++
.../StandaloneMmVariableWriteLibConstructor.c | 51 ++
.../TraditionalMmVariableWriteLib.inf | 44 ++
...TraditionalMmVariableWriteLibConstructor.c | 51 ++
.../Intel/MinPlatformPkg/MinPlatformPkg.dec | 5 +
.../Intel/MinPlatformPkg/MinPlatformPkg.dsc | 4 +-
30 files changed, 2511 insertions(+), 10 deletions(-)
create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/LargeVariableReadLib.h
create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/LargeVariableWriteLib.h
create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/VariableReadLib.h
create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVariableWriteLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableCommon.h
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableReadLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableWriteLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableReadLib/DxeRuntimeVariableReadLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableReadLib/DxeRuntimeVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRuntimeVariableWriteLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRuntimeVariableWriteLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/PeiVariableReadLib/PeiVariableReadLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/PeiVariableReadLib/PeiVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/SmmVariableReadCommon.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/StandaloneMmVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/StandaloneMmVariableReadLibConstructor.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/TraditionalMmVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/TraditionalMmVariableReadLibConstructor.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableWriteCommon.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVariableWriteLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVariableWriteLibConstructor.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVariableWriteLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVariableWriteLibConstructor.c

--
2.27.0.windows.1


Chiu, Chasel
 

Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>

-----Original Message-----
From: Nate DeSimone <nathaniel.l.desimone@intel.com>
Sent: Thursday, April 8, 2021 3:17 AM
To: devel@edk2.groups.io
Cc: Chiu, Chasel <chasel.chiu@intel.com>; Liming Gao
<gaoliming@byosoft.com.cn>; Dong, Eric <eric.dong@intel.com>; Michael
Kubacki <michael.kubacki@microsoft.com>; Oram, Isaac W
<isaac.w.oram@intel.com>
Subject: [edk2-platforms] [PATCH v5 0/4] Add Large Variable Libraries

Changes from V4:
- Added LibraryClass interface definitions to
MinPlatformPkg.dec

Changes from V3:
- Added header guards
- Documented the possibility of returning EFI_UNSUPPORTED
- Added MM_CORE_STANDALONE to the StandaloneMm library
implementations
- Documented library constructor return status
- Moved LargeVariableReadLib and LargeVariableWriteLib into
a single BaseLargeVariableLib folder
- Added LargeVariableCommon.h for shared macro definitions
- Converted some debug macros from DEBUG_INFO to DEBUG_VERBOSE

Changes from V2:
- Added comment to LargeVariableLib INF and header files
describing the usage for drivers that cannot assume that
PcdMaxVariableSize has been set to a certain minimum value.

Changes from V1:
- Changed prefix from "Min" to "VarLib"
- Better comments
- Added more whitespace for readability
- Removed unused INF sections
- Better debug messages

This patch series introduces libaries that enable large data sets to be stored
using the UEFI Variable Services. At present, most UEFI Variable Services
implementations have a maximum variable size of <=64KB. The exact value
varies depending on platform.

These libaries enable a data set to use as much space as needed, up to the
remaining space in the UEFI Variable non-volatile storage.

To implement this, I have broken the problem down into two parts:

1. Phase angostic UEFI Variable access.
2. Storage of data across multiple UEFI Variables.

For the first part, I have created two new LibraryClasses:
VariableReadLib and VariableWriteLib. I have provided implementation instances
of VariableReadLib for PEI, DXE, and SMM.
For VariableWriteLib, I have provided implementation instances for DXE and
SMM. This enables code that accesses UEFI variables to be written in a matter
than is phase agnostic, so the same code can be used in PEI, DXE, or SMM
without modification.

The second part involves another two new LibaryClasses:
LargeVariableReadLib and LargeVariableWriteLib. Only one BASE
implementation is needed for both of these as the phase dependent code was
seperated out in the first piece. These libraries provide logic to calculate the
maximum size of an individual UEFI variable and split the data into as many
smaller pieces as needed to store the entire data set in the UEFI Variable storage.
They also provide the ability to stitch the data back together when it is read.
Deleting the data will delete all variables used to store it.

Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>

Nate DeSimone (4):
MinPlatformPkg: Add VariableReadLib
MinPlatformPkg: Add VariableWriteLib
MinPlatformPkg: Add LargeVariableReadLib
MinPlatformPkg: Add LargeVariableWriteLib

.../Include/Dsc/CoreCommonLib.dsc | 6 +-
.../MinPlatformPkg/Include/Dsc/CoreDxeLib.dsc | 12 +-
.../MinPlatformPkg/Include/Dsc/CorePeiLib.dsc | 9 +-
.../Include/Library/LargeVariableReadLib.h | 61 +++
.../Include/Library/LargeVariableWriteLib.h | 69 +++
.../Include/Library/VariableReadLib.h | 94 ++++
.../Include/Library/VariableWriteLib.h | 138 ++++++
.../BaseLargeVariableReadLib.inf | 51 ++
.../BaseLargeVariableWriteLib.inf | 51 ++
.../LargeVariableCommon.h | 47 ++
.../LargeVariableReadLib.c | 176 +++++++
.../LargeVariableWriteLib.c | 450 ++++++++++++++++++
.../DxeRuntimeVariableReadLib.c | 117 +++++
.../DxeRuntimeVariableReadLib.inf | 41 ++
.../DxeRuntimeVariableWriteLib.c | 265 +++++++++++
.../DxeRuntimeVariableWriteLib.inf | 49 ++
.../PeiVariableReadLib/PeiVariableReadLib.c | 155 ++++++
.../PeiVariableReadLib/PeiVariableReadLib.inf | 42 ++
.../SmmVariableReadCommon.c | 116 +++++
.../StandaloneMmVariableReadLib.inf | 50 ++
.../StandaloneMmVariableReadLibConstructor.c | 51 ++
.../TraditionalMmVariableReadLib.inf | 49 ++
.../TraditionalMmVariableReadLibConstructor.c | 51 ++
.../SmmVariableWriteCommon.c | 171 +++++++
.../StandaloneMmVariableWriteLib.inf | 45 ++
.../StandaloneMmVariableWriteLibConstructor.c | 51 ++
.../TraditionalMmVariableWriteLib.inf | 44 ++
...TraditionalMmVariableWriteLibConstructor.c | 51 ++
.../Intel/MinPlatformPkg/MinPlatformPkg.dec | 5 +
.../Intel/MinPlatformPkg/MinPlatformPkg.dsc | 4 +-
30 files changed, 2511 insertions(+), 10 deletions(-) create mode 100644
Platform/Intel/MinPlatformPkg/Include/Library/LargeVariableReadLib.h
create mode 100644
Platform/Intel/MinPlatformPkg/Include/Library/LargeVariableWriteLib.h
create mode 100644
Platform/Intel/MinPlatformPkg/Include/Library/VariableReadLib.h
create mode 100644
Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVariabl
eReadLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVariabl
eWriteLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableCo
mmon.h
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableRea
dLib.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableWri
teLib.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableReadLib/DxeRuntim
eVariableReadLib.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableReadLib/DxeRuntim
eVariableReadLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRunti
meVariableWriteLib.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRunti
meVariableWriteLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/PeiVariableReadLib/PeiVariableReadLib.
c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/PeiVariableReadLib/PeiVariableReadLib.
inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/SmmVariableRead
Common.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/StandaloneMmVa
riableReadLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/StandaloneMmVa
riableReadLibConstructor.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/TraditionalMmVar
iableReadLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/TraditionalMmVar
iableReadLibConstructor.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableWrit
eCommon.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVa
riableWriteLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVa
riableWriteLibConstructor.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVa
riableWriteLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVa
riableWriteLibConstructor.c

--
2.27.0.windows.1


Oram, Isaac W
 

Series Reviewed-by: Isaac Oram <isaac.w.oram@intel.com>

-----Original Message-----
From: Chiu, Chasel <chasel.chiu@intel.com>
Sent: Wednesday, April 7, 2021 11:28 PM
To: Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>; devel@edk2.groups.io
Cc: Liming Gao <gaoliming@byosoft.com.cn>; Dong, Eric <eric.dong@intel.com>; Michael Kubacki <michael.kubacki@microsoft.com>; Oram, Isaac W <isaac.w.oram@intel.com>
Subject: RE: [edk2-platforms] [PATCH v5 0/4] Add Large Variable Libraries


Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>

-----Original Message-----
From: Nate DeSimone <nathaniel.l.desimone@intel.com>
Sent: Thursday, April 8, 2021 3:17 AM
To: devel@edk2.groups.io
Cc: Chiu, Chasel <chasel.chiu@intel.com>; Liming Gao
<gaoliming@byosoft.com.cn>; Dong, Eric <eric.dong@intel.com>; Michael
Kubacki <michael.kubacki@microsoft.com>; Oram, Isaac W
<isaac.w.oram@intel.com>
Subject: [edk2-platforms] [PATCH v5 0/4] Add Large Variable Libraries

Changes from V4:
- Added LibraryClass interface definitions to
MinPlatformPkg.dec

Changes from V3:
- Added header guards
- Documented the possibility of returning EFI_UNSUPPORTED
- Added MM_CORE_STANDALONE to the StandaloneMm library
implementations
- Documented library constructor return status
- Moved LargeVariableReadLib and LargeVariableWriteLib into
a single BaseLargeVariableLib folder
- Added LargeVariableCommon.h for shared macro definitions
- Converted some debug macros from DEBUG_INFO to DEBUG_VERBOSE

Changes from V2:
- Added comment to LargeVariableLib INF and header files
describing the usage for drivers that cannot assume that
PcdMaxVariableSize has been set to a certain minimum value.

Changes from V1:
- Changed prefix from "Min" to "VarLib"
- Better comments
- Added more whitespace for readability
- Removed unused INF sections
- Better debug messages

This patch series introduces libaries that enable large data sets to
be stored using the UEFI Variable Services. At present, most UEFI
Variable Services implementations have a maximum variable size of
<=64KB. The exact value varies depending on platform.

These libaries enable a data set to use as much space as needed, up to
the remaining space in the UEFI Variable non-volatile storage.

To implement this, I have broken the problem down into two parts:

1. Phase angostic UEFI Variable access.
2. Storage of data across multiple UEFI Variables.

For the first part, I have created two new LibraryClasses:
VariableReadLib and VariableWriteLib. I have provided implementation
instances of VariableReadLib for PEI, DXE, and SMM.
For VariableWriteLib, I have provided implementation instances for DXE
and SMM. This enables code that accesses UEFI variables to be written
in a matter than is phase agnostic, so the same code can be used in
PEI, DXE, or SMM without modification.

The second part involves another two new LibaryClasses:
LargeVariableReadLib and LargeVariableWriteLib. Only one BASE
implementation is needed for both of these as the phase dependent code
was seperated out in the first piece. These libraries provide logic to
calculate the maximum size of an individual UEFI variable and split
the data into as many smaller pieces as needed to store the entire data set in the UEFI Variable storage.
They also provide the ability to stitch the data back together when it is read.
Deleting the data will delete all variables used to store it.

Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>

Nate DeSimone (4):
MinPlatformPkg: Add VariableReadLib
MinPlatformPkg: Add VariableWriteLib
MinPlatformPkg: Add LargeVariableReadLib
MinPlatformPkg: Add LargeVariableWriteLib

.../Include/Dsc/CoreCommonLib.dsc | 6 +-
.../MinPlatformPkg/Include/Dsc/CoreDxeLib.dsc | 12 +-
.../MinPlatformPkg/Include/Dsc/CorePeiLib.dsc | 9 +-
.../Include/Library/LargeVariableReadLib.h | 61 +++
.../Include/Library/LargeVariableWriteLib.h | 69 +++
.../Include/Library/VariableReadLib.h | 94 ++++
.../Include/Library/VariableWriteLib.h | 138 ++++++
.../BaseLargeVariableReadLib.inf | 51 ++
.../BaseLargeVariableWriteLib.inf | 51 ++
.../LargeVariableCommon.h | 47 ++
.../LargeVariableReadLib.c | 176 +++++++
.../LargeVariableWriteLib.c | 450 ++++++++++++++++++
.../DxeRuntimeVariableReadLib.c | 117 +++++
.../DxeRuntimeVariableReadLib.inf | 41 ++
.../DxeRuntimeVariableWriteLib.c | 265 +++++++++++
.../DxeRuntimeVariableWriteLib.inf | 49 ++
.../PeiVariableReadLib/PeiVariableReadLib.c | 155 ++++++
.../PeiVariableReadLib/PeiVariableReadLib.inf | 42 ++
.../SmmVariableReadCommon.c | 116 +++++
.../StandaloneMmVariableReadLib.inf | 50 ++
.../StandaloneMmVariableReadLibConstructor.c | 51 ++
.../TraditionalMmVariableReadLib.inf | 49 ++
.../TraditionalMmVariableReadLibConstructor.c | 51 ++
.../SmmVariableWriteCommon.c | 171 +++++++
.../StandaloneMmVariableWriteLib.inf | 45 ++
.../StandaloneMmVariableWriteLibConstructor.c | 51 ++
.../TraditionalMmVariableWriteLib.inf | 44 ++
...TraditionalMmVariableWriteLibConstructor.c | 51 ++
.../Intel/MinPlatformPkg/MinPlatformPkg.dec | 5 +
.../Intel/MinPlatformPkg/MinPlatformPkg.dsc | 4 +-
30 files changed, 2511 insertions(+), 10 deletions(-) create mode
100644
Platform/Intel/MinPlatformPkg/Include/Library/LargeVariableReadLib.h
create mode 100644
Platform/Intel/MinPlatformPkg/Include/Library/LargeVariableWriteLib.h
create mode 100644
Platform/Intel/MinPlatformPkg/Include/Library/VariableReadLib.h
create mode 100644
Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVa
riabl
eReadLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVa
riabl
eWriteLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariab
leCo
mmon.h
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariab
leRea
dLib.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariab
leWri
teLib.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableReadLib/DxeRun
tim
eVariableReadLib.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableReadLib/DxeRun
tim
eVariableReadLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRu
nti
meVariableWriteLib.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRu
nti
meVariableWriteLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/PeiVariableReadLib/PeiVariableReadLib.
c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/PeiVariableReadLib/PeiVariableReadLib.
inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/SmmVariableRe
ad
Common.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/StandaloneMmV
a
riableReadLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/StandaloneMmV
a
riableReadLibConstructor.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/TraditionalMm
Var
iableReadLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/TraditionalMm
Var
iableReadLibConstructor.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableW
rit
eCommon.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMm
Va
riableWriteLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMm
Va
riableWriteLibConstructor.c
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalM
mVa
riableWriteLib.inf
create mode 100644
Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalM
mVa
riableWriteLibConstructor.c

--
2.27.0.windows.1


Nate DeSimone
 

The series has been pushed as 8c62040~..c1d10aa

Thanks,
Nate

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Nate DeSimone
Sent: Wednesday, April 7, 2021 12:17 PM
To: devel@edk2.groups.io
Cc: Chiu, Chasel <chasel.chiu@intel.com>; Liming Gao <gaoliming@byosoft.com.cn>; Dong, Eric <eric.dong@intel.com>; Michael Kubacki <michael.kubacki@microsoft.com>; Oram, Isaac W <isaac.w.oram@intel.com>
Subject: [edk2-devel] [edk2-platforms] [PATCH v5 0/4] Add Large Variable Libraries

Changes from V4:
- Added LibraryClass interface definitions to
MinPlatformPkg.dec

Changes from V3:
- Added header guards
- Documented the possibility of returning EFI_UNSUPPORTED
- Added MM_CORE_STANDALONE to the StandaloneMm library
implementations
- Documented library constructor return status
- Moved LargeVariableReadLib and LargeVariableWriteLib into
a single BaseLargeVariableLib folder
- Added LargeVariableCommon.h for shared macro definitions
- Converted some debug macros from DEBUG_INFO to DEBUG_VERBOSE

Changes from V2:
- Added comment to LargeVariableLib INF and header files
describing the usage for drivers that cannot assume that
PcdMaxVariableSize has been set to a certain minimum value.

Changes from V1:
- Changed prefix from "Min" to "VarLib"
- Better comments
- Added more whitespace for readability
- Removed unused INF sections
- Better debug messages

This patch series introduces libaries that enable large data sets to be stored using the UEFI Variable Services. At present, most UEFI Variable Services implementations have a maximum variable size of <=64KB. The exact value varies depending on platform.

These libaries enable a data set to use as much space as needed, up to the remaining space in the UEFI Variable non-volatile storage.

To implement this, I have broken the problem down into two parts:

1. Phase angostic UEFI Variable access.
2. Storage of data across multiple UEFI Variables.

For the first part, I have created two new LibraryClasses:
VariableReadLib and VariableWriteLib. I have provided implementation instances of VariableReadLib for PEI, DXE, and SMM.
For VariableWriteLib, I have provided implementation instances for DXE and SMM. This enables code that accesses UEFI variables to be written in a matter than is phase agnostic, so the same code can be used in PEI, DXE, or SMM without modification.

The second part involves another two new LibaryClasses:
LargeVariableReadLib and LargeVariableWriteLib. Only one BASE implementation is needed for both of these as the phase dependent code was seperated out in the first piece. These libraries provide logic to calculate the maximum size of an individual UEFI variable and split the data into as many smaller pieces as needed to store the entire data set in the UEFI Variable storage. They also provide the ability to stitch the data back together when it is read.
Deleting the data will delete all variables used to store it.

Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>

Nate DeSimone (4):
MinPlatformPkg: Add VariableReadLib
MinPlatformPkg: Add VariableWriteLib
MinPlatformPkg: Add LargeVariableReadLib
MinPlatformPkg: Add LargeVariableWriteLib

.../Include/Dsc/CoreCommonLib.dsc | 6 +-
.../MinPlatformPkg/Include/Dsc/CoreDxeLib.dsc | 12 +-
.../MinPlatformPkg/Include/Dsc/CorePeiLib.dsc | 9 +-
.../Include/Library/LargeVariableReadLib.h | 61 +++
.../Include/Library/LargeVariableWriteLib.h | 69 +++
.../Include/Library/VariableReadLib.h | 94 ++++
.../Include/Library/VariableWriteLib.h | 138 ++++++
.../BaseLargeVariableReadLib.inf | 51 ++
.../BaseLargeVariableWriteLib.inf | 51 ++
.../LargeVariableCommon.h | 47 ++
.../LargeVariableReadLib.c | 176 +++++++
.../LargeVariableWriteLib.c | 450 ++++++++++++++++++
.../DxeRuntimeVariableReadLib.c | 117 +++++
.../DxeRuntimeVariableReadLib.inf | 41 ++
.../DxeRuntimeVariableWriteLib.c | 265 +++++++++++
.../DxeRuntimeVariableWriteLib.inf | 49 ++
.../PeiVariableReadLib/PeiVariableReadLib.c | 155 ++++++
.../PeiVariableReadLib/PeiVariableReadLib.inf | 42 ++
.../SmmVariableReadCommon.c | 116 +++++
.../StandaloneMmVariableReadLib.inf | 50 ++
.../StandaloneMmVariableReadLibConstructor.c | 51 ++
.../TraditionalMmVariableReadLib.inf | 49 ++
.../TraditionalMmVariableReadLibConstructor.c | 51 ++
.../SmmVariableWriteCommon.c | 171 +++++++
.../StandaloneMmVariableWriteLib.inf | 45 ++
.../StandaloneMmVariableWriteLibConstructor.c | 51 ++
.../TraditionalMmVariableWriteLib.inf | 44 ++
...TraditionalMmVariableWriteLibConstructor.c | 51 ++
.../Intel/MinPlatformPkg/MinPlatformPkg.dec | 5 +
.../Intel/MinPlatformPkg/MinPlatformPkg.dsc | 4 +-
30 files changed, 2511 insertions(+), 10 deletions(-) create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/LargeVariableReadLib.h
create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/LargeVariableWriteLib.h
create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/VariableReadLib.h
create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVariableWriteLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableCommon.h
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableReadLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableWriteLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableReadLib/DxeRuntimeVariableReadLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableReadLib/DxeRuntimeVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRuntimeVariableWriteLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRuntimeVariableWriteLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/PeiVariableReadLib/PeiVariableReadLib.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/PeiVariableReadLib/PeiVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/SmmVariableReadCommon.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/StandaloneMmVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/StandaloneMmVariableReadLibConstructor.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/TraditionalMmVariableReadLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableReadLib/TraditionalMmVariableReadLibConstructor.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableWriteCommon.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVariableWriteLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVariableWriteLibConstructor.c
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVariableWriteLib.inf
create mode 100644 Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVariableWriteLibConstructor.c

--
2.27.0.windows.1