Date   

[PATCH v2 7/8] OvmfPkg: Add VariableFlashInfoLib

Michael Kubacki
 

From: Michael Kubacki <michael.kubacki@...>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479

Adds an instance of VariableFlashInfoLib to the platform build as
it is a new library class introduced in MdeModulePkg.

Cc: Anthony Perard <anthony.perard@...>
Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: Gerd Hoffmann <kraxel@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Julien Grall <julien@...>
Cc: Min Xu <min.m.xu@...>
Cc: Peter Grehan <grehan@...>
Cc: Rebecca Cran <rebecca@...>
Cc: Sebastien Boeuf <sebastien.boeuf@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Signed-off-by: Michael Kubacki <michael.kubacki@...>
---
OvmfPkg/AmdSev/AmdSevX64.dsc | 1 +
OvmfPkg/Bhyve/BhyveX64.dsc | 1 +
OvmfPkg/CloudHv/CloudHvX64.dsc | 1 +
OvmfPkg/IntelTdx/IntelTdxX64.dsc | 1 +
OvmfPkg/Microvm/MicrovmX64.dsc | 1 +
OvmfPkg/OvmfPkgIa32.dsc | 1 +
OvmfPkg/OvmfPkgIa32X64.dsc | 1 +
OvmfPkg/OvmfPkgX64.dsc | 1 +
OvmfPkg/OvmfXen.dsc | 1 +
9 files changed, 9 insertions(+)

diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc
index fcdc3efab204..3868c577fe39 100644
--- a/OvmfPkg/AmdSev/AmdSevX64.dsc
+++ b/OvmfPkg/AmdSev/AmdSevX64.dsc
@@ -195,6 +195,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
!if $(BUILD_SHELL) =3D=3D TRUE
ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
diff --git a/OvmfPkg/Bhyve/BhyveX64.dsc b/OvmfPkg/Bhyve/BhyveX64.dsc
index e1b6b8e15f36..3df49e54de8a 100644
--- a/OvmfPkg/Bhyve/BhyveX64.dsc
+++ b/OvmfPkg/Bhyve/BhyveX64.dsc
@@ -206,6 +206,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
#
# Network libraries
diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.=
dsc
index 20f3bc340807..19b84275eba3 100644
--- a/OvmfPkg/CloudHv/CloudHvX64.dsc
+++ b/OvmfPkg/CloudHv/CloudHvX64.dsc
@@ -216,6 +216,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
=20
#
diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.dsc b/OvmfPkg/IntelTdx/IntelTdx=
X64.dsc
index 245155d41b30..f21a33ed6ba3 100644
--- a/OvmfPkg/IntelTdx/IntelTdxX64.dsc
+++ b/OvmfPkg/IntelTdx/IntelTdxX64.dsc
@@ -184,6 +184,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.=
inf
diff --git a/OvmfPkg/Microvm/MicrovmX64.dsc b/OvmfPkg/Microvm/MicrovmX64.=
dsc
index 59580ccd4691..d8603f016a0c 100644
--- a/OvmfPkg/Microvm/MicrovmX64.dsc
+++ b/OvmfPkg/Microvm/MicrovmX64.dsc
@@ -206,6 +206,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
=20
#
diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
index e4218b01f0fc..c689d4707046 100644
--- a/OvmfPkg/OvmfPkgIa32.dsc
+++ b/OvmfPkg/OvmfPkgIa32.dsc
@@ -213,6 +213,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
=20
#
diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
index a80cdaacb8bc..44c75639aa5d 100644
--- a/OvmfPkg/OvmfPkgIa32X64.dsc
+++ b/OvmfPkg/OvmfPkgIa32X64.dsc
@@ -217,6 +217,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
=20
#
diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
index fb2899f8a1be..60e7e3724a6b 100644
--- a/OvmfPkg/OvmfPkgX64.dsc
+++ b/OvmfPkg/OvmfPkgX64.dsc
@@ -225,6 +225,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
=20
#
diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc
index 7bd594c6e263..01d832323585 100644
--- a/OvmfPkg/OvmfXen.dsc
+++ b/OvmfPkg/OvmfXen.dsc
@@ -195,6 +195,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
=20
#
--=20
2.28.0.windows.1


[PATCH v2 6/8] EmulatorPkg: Add VariableFlashInfoLib

Michael Kubacki
 

From: Michael Kubacki <michael.kubacki@...>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479

Adds an instance of VariableFlashInfoLib to the platform build as
it is a new library class introduced in MdeModulePkg.

Cc: Andrew Fish <afish@...>
Cc: Ray Ni <ray.ni@...>
Cc: Abner Chang <abner.chang@...>
Cc: Nickle Wang <nickle.wang@...>
Signed-off-by: Michael Kubacki <michael.kubacki@...>
---
EmulatorPkg/EmulatorPkg.dsc | 1 +
1 file changed, 1 insertion(+)

diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc
index 554c13ddb500..4cf886b9eac7 100644
--- a/EmulatorPkg/EmulatorPkg.dsc
+++ b/EmulatorPkg/EmulatorPkg.dsc
@@ -122,6 +122,7 @@ [LibraryClasses]
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLibRuntimeDxe.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
SortLib|MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf
ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
--=20
2.28.0.windows.1


[PATCH v2 5/8] ArmVirtPkg/ArmVirt.dsc.inc: Add VariableFlashInfoLib

Michael Kubacki
 

From: Michael Kubacki <michael.kubacki@...>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479

Adds an instance of VariableFlashInfoLib to the platform build as
it is a new library class introduced in MdeModulePkg.

Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Leif Lindholm <quic_llindhol@...>
Cc: Sami Mujawar <sami.mujawar@...>
Cc: Gerd Hoffmann <kraxel@...>
Cc: Julien Grall <julien@...>
Signed-off-by: Michael Kubacki <michael.kubacki@...>
---
ArmVirtPkg/ArmVirt.dsc.inc | 1 +
1 file changed, 1 insertion(+)

diff --git a/ArmVirtPkg/ArmVirt.dsc.inc b/ArmVirtPkg/ArmVirt.dsc.inc
index ba711deac025..988c1eb75529 100644
--- a/ArmVirtPkg/ArmVirt.dsc.inc
+++ b/ArmVirtPkg/ArmVirt.dsc.inc
@@ -177,6 +177,7 @@ [LibraryClasses.common]
AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableL=
ibNull.inf
!endif
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolic=
yLib.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootMan=
agerLib.inf
--=20
2.28.0.windows.1


[PATCH v2 4/8] MdeModulePkg/FaultTolerantWrite: Consume Variable Flash Info

Michael Kubacki
 

From: Michael Kubacki <michael.kubacki@...>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479

Adds support to the UEFI variable fault tolerant write (FTW) drivers
to receive FTW base and size information dynamically via the Variable
Flash Information library.

Cc: Jian J Wang <jian.j.wang@...>
Cc: Hao A Wu <hao.a.wu@...>
Cc: Liming Gao <gaoliming@...>
Signed-off-by: Michael Kubacki <michael.kubacki@...>
---
MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c =
| 41 +++++++++++++-------
MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c =
| 7 +++-
MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c =
| 28 ++++++++-----
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h =
| 7 +++-
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf =
| 10 +----
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf =
| 10 +----
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandalon=
eMm.inf | 10 +----
MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf =
| 10 +----
8 files changed, 63 insertions(+), 60 deletions(-)

diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c b/Mde=
ModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c
index 661e1487673b..f1335870e797 100644
--- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c
+++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c
@@ -987,22 +987,43 @@ InitFtwDevice (
OUT EFI_FTW_DEVICE **FtwData
)
{
- EFI_FTW_DEVICE *FtwDevice;
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS WorkSpaceAddress;
+ UINT64 Size;
+ UINTN FtwWorkingSize;
+ EFI_FTW_DEVICE *FtwDevice;
+
+ FtwWorkingSize =3D 0;
+
+ Status =3D GetVariableFlashFtwWorkingInfo (&WorkSpaceAddress, &Size);
+ ASSERT_EFI_ERROR (Status);
+
+ Status =3D SafeUint64ToUintn (Size, &FtwWorkingSize);
+ // This driver currently assumes the size will be UINTN so assert the =
value is safe for now.
+ ASSERT_EFI_ERROR (Status);
=20
//
// Allocate private data of this driver,
// Including the FtwWorkSpace[FTW_WORK_SPACE_SIZE].
//
- FtwDevice =3D AllocateZeroPool (sizeof (EFI_FTW_DEVICE) + PcdGet32 (Pc=
dFlashNvStorageFtwWorkingSize));
+ FtwDevice =3D AllocateZeroPool (sizeof (EFI_FTW_DEVICE) + FtwWorkingSi=
ze);
if (FtwDevice =3D=3D NULL) {
return EFI_OUT_OF_RESOURCES;
}
=20
+ FtwDevice->WorkSpaceAddress =3D WorkSpaceAddress;
+ FtwDevice->WorkSpaceLength =3D FtwWorkingSize;
+
+ Status =3D GetVariableFlashFtwSpareInfo (&FtwDevice->SpareAreaAddress,=
&Size);
+ ASSERT_EFI_ERROR (Status);
+
+ Status =3D SafeUint64ToUintn (Size, &FtwDevice->SpareAreaLength);
+ // This driver currently assumes the size will be UINTN so assert the =
value is safe for now.
+ ASSERT_EFI_ERROR (Status);
+
//
// Initialize other parameters, and set WorkSpace as FTW_ERASED_BYTE.
//
- FtwDevice->WorkSpaceLength =3D (UINTN)PcdGet32 (PcdFlashNvStorageFtwWo=
rkingSize);
- FtwDevice->SpareAreaLength =3D (UINTN)PcdGet32 (PcdFlashNvStorageFtwSp=
areSize);
if ((FtwDevice->WorkSpaceLength =3D=3D 0) || (FtwDevice->SpareAreaLeng=
th =3D=3D 0)) {
DEBUG ((DEBUG_ERROR, "Ftw: Workspace or Spare block does not exist!\=
n"));
FreePool (FtwDevice);
@@ -1015,16 +1036,6 @@ InitFtwDevice (
FtwDevice->FtwWorkSpaceLba =3D (EFI_LBA)(-1);
FtwDevice->FtwSpareLba =3D (EFI_LBA)(-1);
=20
- FtwDevice->WorkSpaceAddress =3D (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFla=
shNvStorageFtwWorkingBase64);
- if (FtwDevice->WorkSpaceAddress =3D=3D 0) {
- FtwDevice->WorkSpaceAddress =3D (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdF=
lashNvStorageFtwWorkingBase);
- }
-
- FtwDevice->SpareAreaAddress =3D (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFla=
shNvStorageFtwSpareBase64);
- if (FtwDevice->SpareAreaAddress =3D=3D 0) {
- FtwDevice->SpareAreaAddress =3D (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdF=
lashNvStorageFtwSpareBase);
- }
-
*FtwData =3D FtwDevice;
return EFI_SUCCESS;
}
@@ -1277,7 +1288,7 @@ InitFtwProtocol (
FtwDevice->FtwLastWriteHeader =3D NULL;
FtwDevice->FtwLastWriteRecord =3D NULL;
=20
- InitializeLocalWorkSpaceHeader ();
+ InitializeLocalWorkSpaceHeader (FtwDevice->WorkSpaceLength);
=20
//
// Refresh the working space data from working block
diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBl=
ock.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c
index 61e7a92ccea1..fd563643eb63 100644
--- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c
+++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c
@@ -16,10 +16,13 @@ EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER mWorkingBloc=
kHeader =3D { ZERO_GUID, 0, 0
=20
Since Signature and WriteQueueSize have been known, Crc can be calcula=
ted out,
then the work space header will be fixed.
+
+ @param[in] WorkSpaceLength Length in bytes of the FTW workspace a=
rea.
+
**/
VOID
InitializeLocalWorkSpaceHeader (
- VOID
+ IN UINTN WorkSpaceLength
)
{
//
@@ -46,7 +49,7 @@ InitializeLocalWorkSpaceHeader (
&gEdkiiWorkingBlockSignatureGuid,
sizeof (EFI_GUID)
);
- mWorkingBlockHeader.WriteQueueSize =3D PcdGet32 (PcdFlashNvStorageFtwW=
orkingSize) - sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER);
+ mWorkingBlockHeader.WriteQueueSize =3D WorkSpaceLength - sizeof (EFI_F=
AULT_TOLERANT_WORKING_BLOCK_HEADER);
=20
//
// Crc is calculated with all the fields except Crc and STATE, so leav=
e them as FTW_ERASED_BYTE.
diff --git a/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWr=
itePei.c b/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWrit=
ePei.c
index 15543f12ed29..8c152dcbad98 100644
--- a/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.=
c
+++ b/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.=
c
@@ -16,6 +16,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/HobLib.h>
+#include <Library/SafeIntLib.h>
+#include <Library/VariableFlashInfoLib.h>
=20
EFI_PEI_PPI_DESCRIPTOR mPpiListVariable =3D {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
@@ -212,25 +214,31 @@ PeimFaultTolerantWriteInitialize (
EFI_PHYSICAL_ADDRESS SpareAreaAddress;
UINTN SpareAreaLength;
EFI_PHYSICAL_ADDRESS WorkSpaceInSpareArea;
+ UINT64 Size;
FAULT_TOLERANT_WRITE_LAST_WRITE_DATA FtwLastWrite;
=20
FtwWorkingBlockHeader =3D NULL;
FtwLastWriteHeader =3D NULL;
FtwLastWriteRecord =3D NULL;
=20
- WorkSpaceAddress =3D (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFlashNvStorage=
FtwWorkingBase64);
- if (WorkSpaceAddress =3D=3D 0) {
- WorkSpaceAddress =3D (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFlashNvStora=
geFtwWorkingBase);
- }
+ SpareAreaAddress =3D 0;
+ SpareAreaLength =3D 0;
+ WorkSpaceAddress =3D 0;
+ WorkSpaceLength =3D 0;
=20
- WorkSpaceLength =3D (UINTN)PcdGet32 (PcdFlashNvStorageFtwWorkingSize);
+ Status =3D GetVariableFlashFtwWorkingInfo (&WorkSpaceAddress, &Size);
+ ASSERT_EFI_ERROR (Status);
=20
- SpareAreaAddress =3D (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFlashNvStorage=
FtwSpareBase64);
- if (SpareAreaAddress =3D=3D 0) {
- SpareAreaAddress =3D (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFlashNvStora=
geFtwSpareBase);
- }
+ Status =3D SafeUint64ToUintn (Size, &WorkSpaceLength);
+ // This driver currently assumes the size will be UINTN so assert the =
value is safe for now.
+ ASSERT_EFI_ERROR (Status);
=20
- SpareAreaLength =3D (UINTN)PcdGet32 (PcdFlashNvStorageFtwSpareSize);
+ Status =3D GetVariableFlashFtwSpareInfo (&SpareAreaAddress, &Size);
+ ASSERT_EFI_ERROR (Status);
+
+ Status =3D SafeUint64ToUintn (Size, &SpareAreaLength);
+ // This driver currently assumes the size will be UINTN so assert the =
value is safe for now.
+ ASSERT_EFI_ERROR (Status);
=20
//
// The address of FTW working base and spare base must not be 0.
diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWr=
ite.h b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h
index c14e47b5c7b2..5b84d062c294 100644
--- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h
+++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h
@@ -26,6 +26,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/ReportStatusCodeLib.h>
+#include <Library/SafeIntLib.h>
+#include <Library/VariableFlashInfoLib.h>
=20
//
// Flash erase polarity is 1
@@ -708,10 +710,13 @@ InitFtwProtocol (
=20
Since Signature and WriteQueueSize have been known, Crc can be calcula=
ted out,
then the work space header will be fixed.
+
+ @param[in] WorkSpaceLength Length in bytes of the FTW workspace a=
rea.
+
**/
VOID
InitializeLocalWorkSpaceHeader (
- VOID
+ IN UINTN WorkSpaceLength
);
=20
/**
diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWr=
iteDxe.inf b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWr=
iteDxe.inf
index 96165614d178..d524e1849a2e 100644
--- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.=
inf
+++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.=
inf
@@ -46,6 +46,8 @@ [LibraryClasses]
UefiLib
PcdLib
ReportStatusCodeLib
+ SafeIntLib
+ VariableFlashInfoLib
=20
[Guids]
#
@@ -65,14 +67,6 @@ [Protocols]
[FeaturePcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## CONSUMES
=20
-[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize ## C=
ONSUMES
-
#
# gBS->CalculateCrc32() is consumed in EntryPoint.
# PI spec said: When the DXE Foundation is notified that the EFI_RUNTIME=
_ARCH_PROTOCOL
diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWr=
iteSmm.inf b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWr=
iteSmm.inf
index 8cc6028470d8..8a4b9ad24657 100644
--- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.=
inf
+++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.=
inf
@@ -52,6 +52,8 @@ [LibraryClasses]
ReportStatusCodeLib
SmmMemLib
BaseLib
+ SafeIntLib
+ VariableFlashInfoLib
=20
[Guids]
#
@@ -74,14 +76,6 @@ [Protocols]
[FeaturePcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## CONSUMES
=20
-[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize ## C=
ONSUMES
-
#
# gBS->CalculateCrc32() is consumed in EntryPoint.
# PI spec said: When the DXE Foundation is notified that the EFI_RUNTIME=
_ARCH_PROTOCOL
diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWr=
iteStandaloneMm.inf b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultT=
olerantWriteStandaloneMm.inf
index d0fab7d9414f..0ac6edf771ab 100644
--- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStan=
daloneMm.inf
+++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStan=
daloneMm.inf
@@ -50,7 +50,9 @@ [LibraryClasses]
MmServicesTableLib
PcdLib
ReportStatusCodeLib
+ SafeIntLib
StandaloneMmDriverEntryPoint
+ VariableFlashInfoLib
=20
[Guids]
#
@@ -73,13 +75,5 @@ [Protocols]
[FeaturePcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## CONSUMES
=20
-[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize ## C=
ONSUMES
-
[Depex]
TRUE
diff --git a/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWr=
itePei.inf b/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWr=
itePei.inf
index f90892ad4493..230138272c3a 100644
--- a/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.=
inf
+++ b/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.=
inf
@@ -39,6 +39,8 @@ [LibraryClasses]
HobLib
BaseMemoryLib
PcdLib
+ SafeIntLib
+ VariableFlashInfoLib
=20
[Guids]
## SOMETIMES_PRODUCES ## HOB
@@ -47,14 +49,6 @@ [Guids]
gEdkiiWorkingBlockSignatureGuid ## SOMETIMES_CONSUMES =
## GUID
gEfiSystemNvDataFvGuid ## SOMETIMES_CONSUMES =
## GUID
=20
-[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize ## C=
ONSUMES
-
[Depex]
TRUE
=20
--=20
2.28.0.windows.1


[PATCH v2 3/8] MdeModulePkg/Variable: Consume Variable Flash Info

Michael Kubacki
 

From: Michael Kubacki <michael.kubacki@...>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479

Updates VariableRuntimeDxe, VariableSmm, and VariableStandaloneMm
to acquire variable flash information from the Variable Flash
Information library.

Cc: Jian J Wang <jian.j.wang@...>
Cc: Hao A Wu <hao.a.wu@...>
Cc: Liming Gao <gaoliming@...>
Signed-off-by: Michael Kubacki <michael.kubacki@...>
---
MdeModulePkg/Universal/Variable/Pei/Variable.c | 14=
+++++++++-----
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c | 16=
++++++++++++----
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.c | 14=
++++++++++----
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c | 17=
+++++++++++++----
MdeModulePkg/Universal/Variable/Pei/Variable.h | 2=
++
MdeModulePkg/Universal/Variable/Pei/VariablePei.inf | 5=
++---
MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h | 7=
++-----
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf | 5=
++---
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf | 5=
++---
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf | 5=
++---
10 files changed, 56 insertions(+), 34 deletions(-)

diff --git a/MdeModulePkg/Universal/Variable/Pei/Variable.c b/MdeModulePk=
g/Universal/Variable/Pei/Variable.c
index b36dd0de67b2..26a4c73b45a5 100644
--- a/MdeModulePkg/Universal/Variable/Pei/Variable.c
+++ b/MdeModulePkg/Universal/Variable/Pei/Variable.c
@@ -567,11 +567,13 @@ GetVariableStore (
OUT VARIABLE_STORE_INFO *StoreInfo
)
{
+ EFI_STATUS Status;
EFI_HOB_GUID_TYPE *GuidHob;
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
VARIABLE_STORE_HEADER *VariableStoreHeader;
EFI_PHYSICAL_ADDRESS NvStorageBase;
UINT32 NvStorageSize;
+ UINT64 NvStorageSize64;
FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *FtwLastWriteData;
UINT32 BackUpOffset;
=20
@@ -591,11 +593,13 @@ GetVariableStore (
// Emulated non-volatile variable mode is not enabled.
//
=20
- NvStorageSize =3D PcdGet32 (PcdFlashNvStorageVariableSize);
- NvStorageBase =3D (EFI_PHYSICAL_ADDRESS)(PcdGet64 (PcdFlashNvSto=
rageVariableBase64) !=3D 0 ?
- PcdGet64 (PcdFlashNvStora=
geVariableBase64) :
- PcdGet32 (PcdFlashNvStora=
geVariableBase)
- );
+ Status =3D GetVariableFlashNvStorageInfo (&NvStorageBase, &NvSto=
rageSize64);
+ ASSERT_EFI_ERROR (Status);
+
+ Status =3D SafeUint64ToUint32 (NvStorageSize64, &NvStorageSize);
+ // This driver currently assumes the size will be UINT32 so asse=
rt the value is safe for now.
+ ASSERT_EFI_ERROR (Status);
+
ASSERT (NvStorageBase !=3D 0);
=20
//
diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c b/M=
deModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
index 03fec3048dc4..d5c409c914d1 100644
--- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
+++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
@@ -423,6 +423,8 @@ FtwNotificationEvent (
EFI_PHYSICAL_ADDRESS VariableStoreBase;
UINT64 VariableStoreLength;
UINTN FtwMaxBlockSize;
+ UINT32 NvStorageVariableSize;
+ UINT64 NvStorageVariableSize64;
=20
//
// Ensure FTW protocol is installed.
@@ -432,14 +434,20 @@ FtwNotificationEvent (
return;
}
=20
+ Status =3D GetVariableFlashNvStorageInfo (&NvStorageVariableBase, &NvS=
torageVariableSize64);
+ ASSERT_EFI_ERROR (Status);
+
+ Status =3D SafeUint64ToUint32 (NvStorageVariableSize64, &NvStorageVari=
ableSize);
+ // This driver currently assumes the size will be UINT32 so assert the=
value is safe for now.
+ ASSERT_EFI_ERROR (Status);
+
+ VariableStoreBase =3D NvStorageVariableBase + mNvFvHeaderCache->Header=
Length;
+
Status =3D FtwProtocol->GetMaxBlockSize (FtwProtocol, &FtwMaxBlockSize=
);
if (!EFI_ERROR (Status)) {
- ASSERT (PcdGet32 (PcdFlashNvStorageVariableSize) <=3D FtwMaxBlockSiz=
e);
+ ASSERT (NvStorageVariableSize <=3D FtwMaxBlockSize);
}
=20
- NvStorageVariableBase =3D NV_STORAGE_VARIABLE_BASE;
- VariableStoreBase =3D NvStorageVariableBase + mNvFvHeaderCache->He=
aderLength;
-
//
// Let NonVolatileVariableBase point to flash variable store base dire=
ctly after FTW ready.
//
diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolati=
le.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.c
index 5e9d40b67ac2..9e2d8fe0fe0c 100644
--- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.c
+++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.c
@@ -142,6 +142,7 @@ InitRealNonVolatileVariableStore (
EFI_PHYSICAL_ADDRESS NvStorageBase;
UINT8 *NvStorageData;
UINT32 NvStorageSize;
+ UINT64 NvStorageSize64;
FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *FtwLastWriteData;
UINT32 BackUpOffset;
UINT32 BackUpSize;
@@ -153,19 +154,24 @@ InitRealNonVolatileVariableStore (
=20
mVariableModuleGlobal->FvbInstance =3D NULL;
=20
+ Status =3D GetVariableFlashNvStorageInfo (&NvStorageBase, &NvStorageSi=
ze64);
+ ASSERT_EFI_ERROR (Status);
+
+ Status =3D SafeUint64ToUint32 (NvStorageSize64, &NvStorageSize);
+ // This driver currently assumes the size will be UINT32 so assert the=
value is safe for now.
+ ASSERT_EFI_ERROR (Status);
+
+ ASSERT (NvStorageBase !=3D 0);
+
//
// Allocate runtime memory used for a memory copy of the FLASH region.
// Keep the memory and the FLASH in sync as updates occur.
//
- NvStorageSize =3D PcdGet32 (PcdFlashNvStorageVariableSize);
NvStorageData =3D AllocateRuntimeZeroPool (NvStorageSize);
if (NvStorageData =3D=3D NULL) {
return EFI_OUT_OF_RESOURCES;
}
=20
- NvStorageBase =3D NV_STORAGE_VARIABLE_BASE;
- ASSERT (NvStorageBase !=3D 0);
-
//
// Copy NV storage data to the memory buffer.
//
diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c b/M=
deModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c
index 517cae7b00f8..5253c328dcd9 100644
--- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c
+++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c
@@ -1084,6 +1084,8 @@ SmmFtwNotificationEvent (
EFI_SMM_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol;
EFI_PHYSICAL_ADDRESS NvStorageVariableBase;
UINTN FtwMaxBlockSize;
+ UINT32 NvStorageVariableSize;
+ UINT64 NvStorageVariableSize64;
=20
if (mVariableModuleGlobal->FvbInstance !=3D NULL) {
return EFI_SUCCESS;
@@ -1097,14 +1099,21 @@ SmmFtwNotificationEvent (
return Status;
}
=20
+ Status =3D GetVariableFlashNvStorageInfo (&NvStorageVariableBase, &NvS=
torageVariableSize64);
+ ASSERT_EFI_ERROR (Status);
+
+ Status =3D SafeUint64ToUint32 (NvStorageVariableSize64, &NvStorageVari=
ableSize);
+ // This driver currently assumes the size will be UINT32 so assert the=
value is safe for now.
+ ASSERT_EFI_ERROR (Status);
+
+ ASSERT (NvStorageVariableBase !=3D 0);
+ VariableStoreBase =3D NvStorageVariableBase + mNvFvHeaderCache->Header=
Length;
+
Status =3D FtwProtocol->GetMaxBlockSize (FtwProtocol, &FtwMaxBlockSize=
);
if (!EFI_ERROR (Status)) {
- ASSERT (PcdGet32 (PcdFlashNvStorageVariableSize) <=3D FtwMaxBlockSiz=
e);
+ ASSERT (NvStorageVariableSize <=3D FtwMaxBlockSize);
}
=20
- NvStorageVariableBase =3D NV_STORAGE_VARIABLE_BASE;
- VariableStoreBase =3D NvStorageVariableBase + mNvFvHeaderCache->He=
aderLength;
-
//
// Let NonVolatileVariableBase point to flash variable store base dire=
ctly after FTW ready.
//
diff --git a/MdeModulePkg/Universal/Variable/Pei/Variable.h b/MdeModulePk=
g/Universal/Variable/Pei/Variable.h
index 7f9ad5bfc357..51effbf79987 100644
--- a/MdeModulePkg/Universal/Variable/Pei/Variable.h
+++ b/MdeModulePkg/Universal/Variable/Pei/Variable.h
@@ -20,6 +20,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/BaseMemoryLib.h>
#include <Library/PeiServicesTablePointerLib.h>
#include <Library/PeiServicesLib.h>
+#include <Library/SafeIntLib.h>
+#include <Library/VariableFlashInfoLib.h>
=20
#include <Guid/VariableFormat.h>
#include <Guid/VariableIndexTable.h>
diff --git a/MdeModulePkg/Universal/Variable/Pei/VariablePei.inf b/MdeMod=
ulePkg/Universal/Variable/Pei/VariablePei.inf
index 7cbdd2385e8f..7264a24bdf71 100644
--- a/MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
+++ b/MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
@@ -39,6 +39,8 @@ [LibraryClasses]
DebugLib
PeiServicesTablePointerLib
PeiServicesLib
+ SafeIntLib
+ VariableFlashInfoLib
=20
[Guids]
## CONSUMES ## GUID # Variable store header
@@ -59,9 +61,6 @@ [Ppis]
gEfiPeiReadOnlyVariable2PpiGuid ## PRODUCES
=20
[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize ## C=
ONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable ## S=
OMETIMES_CONSUMES
=20
[Depex]
diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h b/MdeM=
odulePkg/Universal/Variable/RuntimeDxe/Variable.h
index 31e408976a35..a668abb82b15 100644
--- a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h
+++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h
@@ -31,6 +31,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/AuthVariableLib.h>
#include <Library/VarCheckLib.h>
+#include <Library/VariableFlashInfoLib.h>
+#include <Library/SafeIntLib.h>
#include <Guid/GlobalVariable.h>
#include <Guid/EventGroup.h>
#include <Guid/VariableFormat.h>
@@ -40,11 +42,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
=20
#include "PrivilegePolymorphic.h"
=20
-#define NV_STORAGE_VARIABLE_BASE (EFI_PHYSICAL_ADDRESS)\
- (PcdGet64 (PcdFlashNvStorageVariableB=
ase64) !=3D 0 ? \
- PcdGet64 (PcdFlashNvStorageVariableB=
ase64) : \
- PcdGet32 (PcdFlashNvStorageVariableB=
ase))
-
#define EFI_VARIABLE_ATTRIBUTES_MASK (EFI_VARIABLE_NON_VOLATILE |\
EFI_VARIABLE_BOOTSERVICE_ACCESS | =
\
EFI_VARIABLE_RUNTIME_ACCESS | \
diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDx=
e.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
index c9434df631ee..3858adf6739d 100644
--- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
+++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
@@ -71,8 +71,10 @@ [LibraryClasses]
TpmMeasurementLib
AuthVariableLib
VarCheckLib
+ VariableFlashInfoLib
VariablePolicyLib
VariablePolicyHelperLib
+ SafeIntLib
=20
[Protocols]
gEfiFirmwareVolumeBlockProtocolGuid ## CONSUMES
@@ -125,9 +127,6 @@ [Guids]
gEfiImageSecurityDatabaseGuid
=20
[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize ## C=
ONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase ## S=
OMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 ## C=
ONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize ## C=
ONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize ## C=
ONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize ## C=
ONSUMES
diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf b=
/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
index eaa97a01c6e5..8c552b87e080 100644
--- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
+++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
@@ -80,8 +80,10 @@ [LibraryClasses]
AuthVariableLib
VarCheckLib
UefiBootServicesTableLib
+ VariableFlashInfoLib
VariablePolicyLib
VariablePolicyHelperLib
+ SafeIntLib
=20
[Protocols]
gEfiSmmFirmwareVolumeBlockProtocolGuid ## CONSUMES
@@ -127,9 +129,6 @@ [Guids]
gEdkiiVarErrorFlagGuid
=20
[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize ## =
CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase ## =
SOMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 ## =
CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize ## =
CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize ## =
CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize ## =
CONSUMES
diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandalon=
eMm.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm=
.inf
index d8c4f77e7f1f..f09bed40cf51 100644
--- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf
+++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf
@@ -73,9 +73,11 @@ [LibraryClasses]
HobLib
MemoryAllocationLib
MmServicesTableLib
+ SafeIntLib
StandaloneMmDriverEntryPoint
SynchronizationLib
VarCheckLib
+ VariableFlashInfoLib
VariablePolicyLib
VariablePolicyHelperLib
=20
@@ -120,9 +122,6 @@ [Guids]
gEdkiiVarErrorFlagGuid
=20
[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase ## =
SOMETIMES_CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 ## =
CONSUMES
- gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize ## =
CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize ## =
CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize ## =
CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize ## =
CONSUMES
--=20
2.28.0.windows.1


[PATCH v2 2/8] MdeModulePkg/VariableFlashInfoLib: Add initial library

Michael Kubacki
 

From: Michael Kubacki <michael.kubacki@...>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479

Adds a new library class VariableFlashInfoLib that abstracts access
to variable flash information. The instance provided first attempts
to retrieve information from the Variable Flash Info HOB. If that
HOB is not present, it falls back to the PCDs defined in
MdeModulePkg.

This fall back behavior provides backward compatibility for platforms
that only provide PCDs but also allows platforms that need to
dynamically provide the information using the Variable Flash Info HOB
to do so at runtime.

Cc: Jian J Wang <jian.j.wang@...>
Cc: Hao A Wu <hao.a.wu@...>
Cc: Liming Gao <gaoliming@...>
Signed-off-by: Michael Kubacki <michael.kubacki@...>
---
MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.c=
| 178 ++++++++++++++++++++
MdeModulePkg/Include/Library/VariableFlashInfoLib.h =
| 68 ++++++++
MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.i=
nf | 48 ++++++
MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.u=
ni | 12 ++
MdeModulePkg/MdeModulePkg.dec =
| 4 +
MdeModulePkg/MdeModulePkg.dsc =
| 2 +
6 files changed, 312 insertions(+)

diff --git a/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFl=
ashInfoLib.c b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariable=
FlashInfoLib.c
new file mode 100644
index 000000000000..8e3c6e75c957
--- /dev/null
+++ b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfo=
Lib.c
@@ -0,0 +1,178 @@
+/** @file
+ Variable Flash Information Library
+
+ Copyright (c) Microsoft Corporation<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Uefi.h>
+#include <Pi/PiMultiPhase.h>
+#include <Guid/VariableFlashInfo.h>
+#include <Library/DebugLib.h>
+#include <Library/HobLib.h>
+#include <Library/VariableFlashInfoLib.h>
+
+/**
+ Get the HOB that contains variable flash information.
+
+ @param[out] VariableFlashInfo Pointer to a pointer to set to the var=
iable flash information structure.
+
+ @retval EFI_SUCCESS Variable flash information was found s=
uccessfully.
+ @retval EFI_INVALID_PARAMETER The VariableFlashInfo pointer given is=
NULL.
+ @retval EFI_NOT_FOUND Variable flash information could not b=
e found.
+
+**/
+EFI_STATUS
+GetVariableFlashInfoFromHob (
+ OUT VARIABLE_FLASH_INFO **VariableFlashInfo
+ )
+{
+ EFI_HOB_GUID_TYPE *GuidHob;
+
+ if (VariableFlashInfo =3D=3D NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ GuidHob =3D GetFirstGuidHob (&gVariableFlashInfoHobGuid);
+ if (GuidHob =3D=3D NULL) {
+ return EFI_NOT_FOUND;
+ }
+
+ *VariableFlashInfo =3D GET_GUID_HOB_DATA (GuidHob);
+
+ //
+ // Assert if more than one variable flash information HOB is present.
+ //
+ DEBUG_CODE (
+ if ((GetNextGuidHob (&gVariableFlashInfoHobGuid, GET_NEXT_HOB (GuidH=
ob)) !=3D NULL)) {
+ DEBUG ((DEBUG_ERROR, "ERROR: Found two variable flash information HO=
Bs\n"));
+ ASSERT (FALSE);
+ }
+
+ );
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Get the base address and size for the NV storage area used for UEFI va=
riable storage.
+
+ @param[out] BaseAddress The NV storage base address.
+ @param[out] Length The NV storage length in bytes.
+
+ @retval EFI_SUCCESS NV storage information was found succe=
ssfully.
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+GetVariableFlashNvStorageInfo (
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
+ OUT UINT64 *Length
+ )
+{
+ EFI_STATUS Status;
+ VARIABLE_FLASH_INFO *VariableFlashInfo;
+
+ if ((BaseAddress =3D=3D NULL) || (Length =3D=3D NULL)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status =3D GetVariableFlashInfoFromHob (&VariableFlashInfo);
+ if (!EFI_ERROR (Status)) {
+ *BaseAddress =3D VariableFlashInfo->NvStorageBaseAddress;
+ *Length =3D VariableFlashInfo->NvStorageLength;
+ } else {
+ *BaseAddress =3D (EFI_PHYSICAL_ADDRESS)(PcdGet64 (PcdFlashNvStorageV=
ariableBase64) !=3D 0 ?
+ PcdGet64 (PcdFlashNvStorageVar=
iableBase64) :
+ PcdGet32 (PcdFlashNvStorageVar=
iableBase)
+ );
+ *Length =3D (UINT64)PcdGet32 (PcdFlashNvStorageVariableSize);
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Get the base address and size for the fault tolerant write (FTW) spare
+ area used for UEFI variable storage.
+
+ @param[out] BaseAddress The FTW spare base address.
+ @param[out] Length The FTW spare length in bytes.
+
+ @retval EFI_SUCCESS FTW spare information was found succes=
sfully.
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.
+ @retval EFI_NOT_FOUND FTW spare information could not be fou=
nd.
+
+**/
+EFI_STATUS
+EFIAPI
+GetVariableFlashFtwSpareInfo (
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
+ OUT UINT64 *Length
+ )
+{
+ EFI_STATUS Status;
+ VARIABLE_FLASH_INFO *VariableFlashInfo;
+
+ if ((BaseAddress =3D=3D NULL) || (Length =3D=3D NULL)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status =3D GetVariableFlashInfoFromHob (&VariableFlashInfo);
+ if (!EFI_ERROR (Status)) {
+ *BaseAddress =3D VariableFlashInfo->FtwSpareBaseAddress;
+ *Length =3D VariableFlashInfo->FtwSpareLength;
+ } else {
+ *BaseAddress =3D (EFI_PHYSICAL_ADDRESS)(PcdGet64 (PcdFlashNvStorageF=
twSpareBase64) !=3D 0 ?
+ PcdGet64 (PcdFlashNvStorageFtw=
SpareBase64) :
+ PcdGet32 (PcdFlashNvStorageFtw=
SpareBase)
+ );
+ *Length =3D (UINT64)PcdGet32 (PcdFlashNvStorageFtwSpareSize);
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Get the base address and size for the fault tolerant write (FTW) worki=
ng
+ area used for UEFI variable storage.
+
+ @param[out] BaseAddress The FTW working area base address.
+ @param[out] Length The FTW working area length in bytes.
+
+ @retval EFI_SUCCESS FTW working information was found succ=
essfully.
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.
+ @retval EFI_NOT_FOUND FTW working information could not be f=
ound.
+
+**/
+EFI_STATUS
+EFIAPI
+GetVariableFlashFtwWorkingInfo (
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
+ OUT UINT64 *Length
+ )
+{
+ EFI_STATUS Status;
+ VARIABLE_FLASH_INFO *VariableFlashInfo;
+
+ if ((BaseAddress =3D=3D NULL) || (Length =3D=3D NULL)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status =3D GetVariableFlashInfoFromHob (&VariableFlashInfo);
+ if (!EFI_ERROR (Status)) {
+ *BaseAddress =3D VariableFlashInfo->FtwWorkingBaseAddress;
+ *Length =3D VariableFlashInfo->FtwWorkingLength;
+ } else {
+ *BaseAddress =3D (EFI_PHYSICAL_ADDRESS)(PcdGet64 (PcdFlashNvStorageF=
twWorkingBase64) !=3D 0 ?
+ PcdGet64 (PcdFlashNvStorageFtw=
WorkingBase64) :
+ PcdGet32 (PcdFlashNvStorageFtw=
WorkingBase)
+ );
+ *Length =3D (UINT64)PcdGet32 (PcdFlashNvStorageFtwWorkingSize);
+ }
+
+ return EFI_SUCCESS;
+}
diff --git a/MdeModulePkg/Include/Library/VariableFlashInfoLib.h b/MdeMod=
ulePkg/Include/Library/VariableFlashInfoLib.h
new file mode 100644
index 000000000000..1367be9376ea
--- /dev/null
+++ b/MdeModulePkg/Include/Library/VariableFlashInfoLib.h
@@ -0,0 +1,68 @@
+/** @file
+ Variable Flash Information Library
+
+Copyright (c) Microsoft Corporation<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef VARIABLE_FLASH_INFO_LIB_H_
+#define VARIABLE_FLASH_INFO_LIB_H_
+
+/**
+ Get the base address and size for the NV storage area used for UEFI va=
riable storage.
+
+ @param[out] BaseAddress The NV storage base address.
+ @param[out] Length The NV storage length in bytes.
+
+ @retval EFI_SUCCESS NV storage information was found succe=
ssfully.
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.
+ @retval EFI_NOT_FOUND NV storage information could not be fo=
und.
+
+**/
+EFI_STATUS
+EFIAPI
+GetVariableFlashNvStorageInfo (
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
+ OUT UINT64 *Length
+ );
+
+/**
+ Get the base address and size for the fault tolerant write (FTW) spare
+ area used for UEFI variable storage.
+
+ @param[out] BaseAddress The FTW spare base address.
+ @param[out] Length The FTW spare length in bytes.
+
+ @retval EFI_SUCCESS FTW spare information was found succes=
sfully.
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.
+ @retval EFI_NOT_FOUND FTW spare information could not be fou=
nd.
+
+**/
+EFI_STATUS
+EFIAPI
+GetVariableFlashFtwSpareInfo (
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
+ OUT UINT64 *Length
+ );
+
+/**
+ Get the base address and size for the fault tolerant write (FTW) worki=
ng
+ area used for UEFI variable storage.
+
+ @param[out] BaseAddress The FTW working area base address.
+ @param[out] Length The FTW working area length in bytes.
+
+ @retval EFI_SUCCESS FTW working information was found succ=
essfully.
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.
+ @retval EFI_NOT_FOUND FTW working information could not be f=
ound.
+
+**/
+EFI_STATUS
+EFIAPI
+GetVariableFlashFtwWorkingInfo (
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
+ OUT UINT64 *Length
+ );
+
+#endif
diff --git a/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFl=
ashInfoLib.inf b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariab=
leFlashInfoLib.inf
new file mode 100644
index 000000000000..70175e75f9b1
--- /dev/null
+++ b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfo=
Lib.inf
@@ -0,0 +1,48 @@
+## @file
+# Variable Flash Information Library
+#
+# Provides services to access UEFI variable flash information.
+#
+# Copyright (c) Microsoft Corporation<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION =3D 0x00010005
+ BASE_NAME =3D BaseVariableFlashInfoLib
+ MODULE_UNI_FILE =3D BaseVariableFlashInfoLib.uni
+ FILE_GUID =3D DEC426C9-C92E-4BAD-8E93-3F61C261118B
+ MODULE_TYPE =3D BASE
+ VERSION_STRING =3D 1.0
+ LIBRARY_CLASS =3D VariableFlashInfoLib
+
+#
+# The following information is for reference only and not required by th=
e build tools.
+#
+# VALID_ARCHITECTURES =3D ANY
+#
+
+[Sources]
+ BaseVariableFlashInfoLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+ DebugLib
+ HobLib
+
+[Guids]
+ gVariableFlashInfoHobGuid ## CONSUMES ## HOB
+
+[Pcd]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase ## S=
OMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 ## S=
OMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize ## S=
OMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase ## S=
OMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 ## S=
OMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize ## S=
OMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase ## S=
OMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 ## S=
OMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize ## S=
OMETIMES_CONSUMES
diff --git a/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFl=
ashInfoLib.uni b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariab=
leFlashInfoLib.uni
new file mode 100644
index 000000000000..9a5348fa02a0
--- /dev/null
+++ b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfo=
Lib.uni
@@ -0,0 +1,12 @@
+// /** @file
+// Variable Flash Information Library
+//
+// Copyright (c) Microsoft Corporation<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+// **/
+
+#string STR_MODULE_ABSTRACT #language en-US "UEFI variable flash inf=
ormation library"
+
+#string STR_MODULE_DESCRIPTION #language en-US "Provides services to ac=
cess UEFI variable flash information."
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.de=
c
index 4e82f5836096..2bcb9f9453af 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -154,6 +154,10 @@ [LibraryClasses]
#
VariablePolicyHelperLib|Include/Library/VariablePolicyHelperLib.h
=20
+ ## @libraryclass Provides services to access UEFI variable flash inf=
ormation.
+ #
+ VariableFlashInfoLib|Include/Library/VariableFlashInfoLib.h
+
[Guids]
## MdeModule package token space guid
# Include/Guid/MdeModulePkgTokenSpace.h
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.ds=
c
index b1d83461865e..90a0a7ec4a7c 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -103,6 +103,7 @@ [LibraryClasses]
DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLib=
Graphics/DisplayUpdateProgressLibGraphics.inf
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/V=
ariablePolicyHelperLib.inf
MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLi=
bNull.inf
+ VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Bas=
eVariableFlashInfoLib.inf
=20
[LibraryClasses.EBC.PEIM]
IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf
@@ -440,6 +441,7 @@ [Components]
MdeModulePkg/Library/FmpAuthenticationLibNull/FmpAuthenticationLibNull=
.inf
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
+ MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib=
.inf
=20
[Components.IA32, Components.X64, Components.AARCH64]
MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
--=20
2.28.0.windows.1


[PATCH v2 1/8] MdeModulePkg: Add Variable Flash Info HOB

Michael Kubacki
 

From: Michael Kubacki <michael.kubacki@...>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479

Adds a new GUID that is used to identify a HOB that passes variable
flash information to UEFI variable drivers in HOB consumption phases
such as DXE, Traditional MM, and Standalone MM.

This information was previously passed directly with PCDs such
as EfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase
and gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize.

However, the Standalone MM variable driver instance does not have
direct access to the PCD database. Therefore, this HOB will first
be considered as the source for variable flash information and
if platforms do not produce the HOB, reading the information from
the PCDs directly will be a backup to provide backward
compatibility.

Cc: Jian J Wang <jian.j.wang@...>
Cc: Hao A Wu <hao.a.wu@...>
Cc: Liming Gao <gaoliming@...>
Signed-off-by: Michael Kubacki <michael.kubacki@...>
---
MdeModulePkg/Include/Guid/VariableFlashInfo.h | 39 ++++++++++++++++++++
MdeModulePkg/MdeModulePkg.dec | 4 ++
2 files changed, 43 insertions(+)

diff --git a/MdeModulePkg/Include/Guid/VariableFlashInfo.h b/MdeModulePkg=
/Include/Guid/VariableFlashInfo.h
new file mode 100644
index 000000000000..e526e362aab9
--- /dev/null
+++ b/MdeModulePkg/Include/Guid/VariableFlashInfo.h
@@ -0,0 +1,39 @@
+/** @file
+ This file defines the GUID and data structure used to pass information=
about
+ a variable store mapped on flash (i.e. a MMIO firmware volume) to the =
DXE and MM environment.
+
+ Copyright (c) Microsoft Corporation.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef VARIABLE_FLASH_INFO_H_
+#define VARIABLE_FLASH_INFO_H_
+
+#define VARIABLE_FLASH_INFO_HOB_GUID \
+ { 0x5d11c653, 0x8154, 0x4ac3, { 0xa8, 0xc2, 0xfb, 0xa2, 0x89, 0x20, 0x=
fc, 0x90 }}
+
+#define VARIABLE_FLASH_INFO_HOB_VERSION 1
+
+extern EFI_GUID gVariableFlashInfoHobGuid;
+
+#pragma pack (push, 1)
+
+///
+/// This structure can be used to describe UEFI variable
+/// flash information.
+///
+typedef struct {
+ UINT32 Version;
+ EFI_PHYSICAL_ADDRESS NvStorageBaseAddress;
+ UINT64 NvStorageLength;
+ EFI_PHYSICAL_ADDRESS FtwSpareBaseAddress;
+ UINT64 FtwSpareLength;
+ EFI_PHYSICAL_ADDRESS FtwWorkingBaseAddress;
+ UINT64 FtwWorkingLength;
+} VARIABLE_FLASH_INFO;
+
+#pragma pack (pop)
+
+#endif
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.de=
c
index cf79292ec877..4e82f5836096 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -226,6 +226,10 @@ [Guids]
# Include/Guid/SmmVariableCommon.h
gSmmVariableWriteGuid =3D { 0x93ba1826, 0xdffb, 0x45dd, { 0x82, 0xa7,=
0xe7, 0xdc, 0xaa, 0x3b, 0xbd, 0xf3 }}
=20
+ ## Guid of the variable flash information HOB.
+ # Include/Guid/VariableFlashInfo.h
+ gVariableFlashInfoHobGuid =3D { 0x5d11c653, 0x8154, 0x4ac3, { 0xa8, 0x=
c2, 0xfb, 0xa2, 0x89, 0x20, 0xfc, 0x90 }}
+
## Performance protocol guid that also acts as the performance HOB gui=
d and performance variable GUID
# Include/Guid/Performance.h
gPerformanceProtocolGuid =3D { 0x76B6BDFA, 0x2ACD, 0x4462, { 0x9=
E, 0x3F, 0xCB, 0x58, 0xC9, 0x69, 0xD9, 0x37 } }
--=20
2.28.0.windows.1


[PATCH v2 0/8] Add Variable Flash Info HOB

Michael Kubacki
 

From: Michael Kubacki <michael.kubacki@...>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479

The UEFI variable drivers such as VariableRuntimeDxe, VariableSmm,
VariableStandaloneMm, etc. (and their dependent protocol/library
stack), typically acquire UEFI variable store flash information
with PCDs declared in MdeModulePkg.

For example:
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize

These PCDs work as-is in the StandaloneMm driver if they are not
dynamic such as Dynamic or DynamicEx because PCD services are not
readily available in the Standalone MM environment. Platforms that
use Standalone MM today, must define these PCDs as FixedAtBuild in
their platform build. However, the PCDs do allow platforms to treat
the PCDs as Dynamic/DynamicEx and being able to support that is
currently a gap for Standalone MM.

This patch series introduces a HOB that can be produced by the
platform to provide the same information. The HOB list is
available to Standalone MM.

The PCD declarations are left as-is in MdeModulePkg for backward
compatibility. This means unless a platform wants to use the HOB,
their code will continue to work with no change (they do not need
to produce the HOB). Only if the HOB is found, is its value used
instead of the PCDs.

Due to the large number of consumers of this information, access
to the base address and size values is abstracted in a new library
class (as requested in the v1 series) called VariableFlashInfoLib.

The API of VariableFlashInfoLib does not bind the underlying data
structure to the information returned to library users to allow
flexibility in the library implementation in the future.

V2 changes:
1. Abstracted flash info data access with VariableFlashInfoLib.
2. Updated package builds in the repo that build the variable and
FTW drivers to include VariableFlashInfoLib.
3. Removed a redundant variable assignment in VariableSmm.c.
4. Updated comments in FtwMisc.c and FaultTolerantWritePei.c to
indicate driver assumption is UINTN (not UINT32)
5. Added a version field to the VARIABLE_FLASH_INFO structure.

Cc: Abner Chang <abner.chang@...>
Cc: Andrew Fish <afish@...>
Cc: Anthony Perard <anthony.perard@...>
Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Benjamin You <benjamin.you@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: Gerd Hoffmann <kraxel@...>
Cc: Guo Dong <guo.dong@...>
Cc: Hao A Wu <hao.a.wu@...>
Cc: James Bottomley <jejb@...>
Cc: Jian J Wang <jian.j.wang@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Julien Grall <julien@...>
Cc: Leif Lindholm <quic_llindhol@...>
Cc: Liming Gao <gaoliming@...>
Cc: Maurice Ma <maurice.ma@...>
Cc: Min Xu <min.m.xu@...>
Cc: Nickle Wang <nickle.wang@...>
Cc: Peter Grehan <grehan@...>
Cc: Ray Ni <ray.ni@...>
Cc: Rebecca Cran <rebecca@...>
Cc: Sami Mujawar <sami.mujawar@...>
Cc: Sean Rhodes <sean@...>
Cc: Sebastien Boeuf <sebastien.boeuf@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Signed-off-by: Michael Kubacki <michael.kubacki@...>

Michael Kubacki (8):
MdeModulePkg: Add Variable Flash Info HOB
MdeModulePkg/VariableFlashInfoLib: Add initial library
MdeModulePkg/Variable: Consume Variable Flash Info
MdeModulePkg/FaultTolerantWrite: Consume Variable Flash Info
ArmVirtPkg/ArmVirt.dsc.inc: Add VariableFlashInfoLib
EmulatorPkg: Add VariableFlashInfoLib
OvmfPkg: Add VariableFlashInfoLib
UefiPayloadPkg: Add VariableFlashInfoLib

MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.c=
| 178 ++++++++++++++++++++
MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c =
| 41 +++--
MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c =
| 7 +-
MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c =
| 28 +--
MdeModulePkg/Universal/Variable/Pei/Variable.c =
| 14 +-
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c =
| 16 +-
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.c =
| 14 +-
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c =
| 17 +-
ArmVirtPkg/ArmVirt.dsc.inc =
| 1 +
EmulatorPkg/EmulatorPkg.dsc =
| 1 +
MdeModulePkg/Include/Guid/VariableFlashInfo.h =
| 39 +++++
MdeModulePkg/Include/Library/VariableFlashInfoLib.h =
| 68 ++++++++
MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.i=
nf | 48 ++++++
MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.u=
ni | 12 ++
MdeModulePkg/MdeModulePkg.dec =
| 8 +
MdeModulePkg/MdeModulePkg.dsc =
| 2 +
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h =
| 7 +-
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf =
| 10 +-
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf =
| 10 +-
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandalon=
eMm.inf | 10 +-
MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf =
| 10 +-
MdeModulePkg/Universal/Variable/Pei/Variable.h =
| 2 +
MdeModulePkg/Universal/Variable/Pei/VariablePei.inf =
| 5 +-
MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h =
| 7 +-
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf =
| 5 +-
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf =
| 5 +-
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf =
| 5 +-
OvmfPkg/AmdSev/AmdSevX64.dsc =
| 1 +
OvmfPkg/Bhyve/BhyveX64.dsc =
| 1 +
OvmfPkg/CloudHv/CloudHvX64.dsc =
| 1 +
OvmfPkg/IntelTdx/IntelTdxX64.dsc =
| 1 +
OvmfPkg/Microvm/MicrovmX64.dsc =
| 1 +
OvmfPkg/OvmfPkgIa32.dsc =
| 1 +
OvmfPkg/OvmfPkgIa32X64.dsc =
| 1 +
OvmfPkg/OvmfPkgX64.dsc =
| 1 +
OvmfPkg/OvmfXen.dsc =
| 1 +
UefiPayloadPkg/UefiPayloadPkg.dsc =
| 1 +
37 files changed, 486 insertions(+), 94 deletions(-)
create mode 100644 MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVar=
iableFlashInfoLib.c
create mode 100644 MdeModulePkg/Include/Guid/VariableFlashInfo.h
create mode 100644 MdeModulePkg/Include/Library/VariableFlashInfoLib.h
create mode 100644 MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVar=
iableFlashInfoLib.inf
create mode 100644 MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVar=
iableFlashInfoLib.uni

--=20
2.28.0.windows.1


Re: [PATCH v2] OvmfPkg/BhyveBhfPkg: add support for QemuFwCfg

Pedro Falcato
 

Is this a laptop? Things may not work there because video output is done through the Intel GPU, even when using the Nvidia GPU, although I'm not sure.

On Fri, Apr 8, 2022 at 6:49 PM Mario Marietto <marietto2008@...> wrote:
im trying to test the patch on my pc,that has two graphic cards,the intel coffee lake and the nvidia. i tried to start the pc from the nvidia card and ive configured the xorg.conf file giving the proper bus id value. in addition ive loaded the kernel.ko file from the boot loader.conf i have removed the intel and the drm drivers used by the Intel graphic card. unfortunately my pc wont boot from the nvidia card. my mouse and keyboard freezes just before the desktop manager (xfce and kde5) starts.

Il gio 7 apr 2022, 18:46 Rebecca Cran <rebecca@...> ha scritto:
I've just looked at the patch and it looks good, though I haven't tested it.

So yes, please add:


Acked-by: Rebecca Cran <rebecca@...>


On 4/6/22 23:24, Corvin Köhne wrote:
> Hi Peter and Rebecca,
>
> thanks for your feedback. This patch is backward compatible. It checks
> if QemuFwCfg is available and if QemuFwCfg is missing it falls
> back to BhyveFwCtl.
>
> So, should I add Reviewed-by (or Acked-by?) Peter and Rebecca to the
> commit message?
>
>
> Thanks
> Corvin
>
> Beckhoff Automation GmbH & Co. KG | Managing Director: Dipl. Phys. Hans Beckhoff
> Registered office: Verl, Germany | Register court: Guetersloh HRA 7075
>
>
>



--
Pedro Falcato


Re: GSoC 2022: Add S3 resume support to MinPlatform

Benjamin Doron
 

Hi Nate,
Thanks! I've looked at the basics of I2C, but I've seen from the iGFX PRM that GMBUS implements some registers and error handling the NAKs differently, but I guess that I'll be dealing with that later.

Yeah, I was thinking that if we wanted debug up as soon as possible, then the iGFX BAR and P2SB GPIOs would have to be programmed, so that sounds about right. Synchronising with the FSP's config is probably important too, but I suppose you implemented that/we'll see?

For now, I have a proposal at https://docs.google.com/document/d/1CyyerMfPwvZxkBjfE_-H1OlkZPxH98uqpmb9tBAV_ps.

Best regards,
Benjamin


Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment

Michael D Kinney
 

Thanks JP.

That makes sense. Bypass all the OS specific services in UEFI environment and generate UUID using time and random number.

Reviewed-by: Michael D Kinney <michael.d.kinney@...>

Mike

-----Original Message-----
From: Jayaprakash, N <n.jayaprakash@...>
Sent: Friday, April 8, 2022 10:19 AM
To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@...>; Kinney, Michael D <michael.d.kinney@...>
Cc: Frinzell, Aaron <aaron.frinzell@...>
Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI
environment

+ Aaron

Regards,
JP

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Jayaprakash, N
Sent: 08 April 2022 22:12
To: Kinney, Michael D <michael.d.kinney@...>; devel@edk2.groups.io
Subject: Re: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI
environment

The UUID generation is done through the random number generation & time unix time stamp features available through the built-in
python modules 'random' and 'time' respectively.
The random number & time (unix time stamp or epoch) based method of generating the UUID is already there in uuid.py module,
with this patch request enabled this path to take effect for UEFI invocation of this module.

There are some OS specific ways to generate the UUID's such as by using the libuuid on Linux kind of OS, windll.rpcrt4 library
on windows.
These will not work for UEFI and hence added appropriate platform check to ensure that this path is not taken for UEFI
invocation.

Besides this there are MAC address based algorithms available in uuid.py module.
These algorism are based on reading MAC address through various OS supported methods such as ipconfig command processing,
NetBIOS calls on Windows, using netstat command in Linux, lanscan in Unix, from arp - address resolution protocol in Linux,
NetBSD and other flavours of Linux.
These are currently not enabled for UEFI invocation of the uuid module. This has been done through platform check added at
appropriate place in the uuid.py module code.

Regards,
JP
-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@...>
Sent: 08 April 2022 21:14
To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@...>; Kinney, Michael D <michael.d.kinney@...>
Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI
environment

How is a UUID generated in UEFI env? Is there a dependency on MAC address or random number generator?

Can you add a description of the technique to the BZ and the commit message?

Thanks,

Mike

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
Jayaprakash, N
Sent: Friday, April 8, 2022 4:52 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-libc Patch 1/1]
AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for
UEFI environment

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3899

This is commit contains the UEFI port of uuid.py module. Made
necessary changes required to uuid.py module to support UEFI environment.
Porting of this module to UEFI is required for open source tools such
as Chipsec to function properly.

Cc: Rebecca Cran <rebecca@...>
Cc: Michael D Kinney <michael.d.kinney@...>
Signed-off-by: Jayaprakash N <n.jayaprakash@...>
---
.../Python/Python-3.6.8/Lib/uuid.py | 94 ++++++++++---------
1 file changed, 50 insertions(+), 44 deletions(-)

diff --git a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
index db8b2ef..84ed0b8 100644
--- a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
+++ b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
@@ -471,57 +471,61 @@ def _netbios_getnode():
continue
return int.from_bytes(bytes, 'big')

+
# Thanks to Thomas Heller for ctypes and for his help with its use here.

# If ctypes is available, use it to find system routines for UUID generation.
# XXX This makes the module non-thread-safe!
_uuid_generate_time = _UuidCreate = None
-try:
- import ctypes, ctypes.util
- import sys
-
- # The uuid_generate_* routines are provided by libuuid on at least
- # Linux and FreeBSD, and provided by libc on Mac OS X.
- _libnames = ['uuid']
- if not sys.platform.startswith('win'):
- _libnames.append('c')
- for libname in _libnames:
- try:
- lib = ctypes.CDLL(ctypes.util.find_library(libname))
- except Exception:
- continue
- if hasattr(lib, 'uuid_generate_time'):
- _uuid_generate_time = lib.uuid_generate_time
- break
- del _libnames
-
- # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
- # in issue #8621 the function generates the same sequence of values
- # in the parent process and all children created using fork (unless
- # those children use exec as well).
- #
- # Assume that the uuid_generate functions are broken from 10.5 onward,
- # the test can be adjusted when a later version is fixed.
- if sys.platform == 'darwin':
- if int(os.uname().release.split('.')[0]) >= 9:
- _uuid_generate_time = None
-
- # On Windows prior to 2000, UuidCreate gives a UUID containing the
- # hardware address. On Windows 2000 and later, UuidCreate makes a
- # random UUID and UuidCreateSequential gives a UUID containing the
- # hardware address. These routines are provided by the RPC runtime.
- # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last
- # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
- # to bear any relationship to the MAC address of any network device
- # on the box.
+if os.name != 'edk2':
+ # This code is not meant to run on UEFI environment
try:
- lib = ctypes.windll.rpcrt4
+ import ctypes, ctypes.util
+ import sys
+
+ # The uuid_generate_* routines are provided by libuuid on at least
+ # Linux and FreeBSD, and provided by libc on Mac OS X.
+ _libnames = ['uuid']
+ if not sys.platform.startswith('win'):
+ _libnames.append('c')
+ for libname in _libnames:
+ try:
+ lib = ctypes.CDLL(ctypes.util.find_library(libname))
+ except Exception:
+ continue
+ if hasattr(lib, 'uuid_generate_time'):
+ _uuid_generate_time = lib.uuid_generate_time
+ break
+ del _libnames
+
+ # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
+ # in issue #8621 the function generates the same sequence of values
+ # in the parent process and all children created using fork (unless
+ # those children use exec as well).
+ #
+ # Assume that the uuid_generate functions are broken from 10.5 onward,
+ # the test can be adjusted when a later version is fixed.
+ if sys.platform == 'darwin':
+ if int(os.uname().release.split('.')[0]) >= 9:
+ _uuid_generate_time = None
+
+ # On Windows prior to 2000, UuidCreate gives a UUID containing the
+ # hardware address. On Windows 2000 and later, UuidCreate makes a
+ # random UUID and UuidCreateSequential gives a UUID containing the
+ # hardware address. These routines are provided by the RPC runtime.
+ # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last
+ # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
+ # to bear any relationship to the MAC address of any network device
+ # on the box.
+ try:
+ lib = ctypes.windll.rpcrt4
+ except:
+ lib = None
+ _UuidCreate = getattr(lib, 'UuidCreateSequential',
+ getattr(lib, 'UuidCreate', None))
except:
- lib = None
- _UuidCreate = getattr(lib, 'UuidCreateSequential',
- getattr(lib, 'UuidCreate', None))
-except:
- pass
+ pass
+

def _unixdll_getnode():
"""Get the hardware address on Unix using ctypes."""
@@ -563,6 +567,8 @@ def getnode():
import sys
if sys.platform == 'win32':
getters = _NODE_GETTERS_WIN32
+ elif sys.platform == 'uefi':
+ getters = []
else:
getters = _NODE_GETTERS_UNIX

--
2.32.0.windows.2








[edk2-non-osi] [PATCH V2] ElkhartlakeSiliconBinPkg: Update EHL microcode

kokweich <kok.wei.chan@...>
 

Updated "production" microcode version m0190661_00000016

Signed-off-by: kokweich <kok.wei.chan@...>
Cc: Nate DeSimone <nathaniel.l.desimone@...>
Cc: Sai Chaganty <rangasai.v.chaganty@...>
Cc: jinjhuli <jin.jhu.lim@...>
---
.../Microcode/IntelMicrocodeLicense.txt | 8 ++++----
.../Microcode/MicrocodeUpdates.inf | 4 ++--
.../Microcode/m0190661_00000015.mcb | Bin 20480 -> 0 bytes
.../Microcode/m0190661_00000016.mcb | Bin 0 -> 20480 bytes
4 files changed, 6 insertions(+), 6 deletions(-)
delete mode 100644 Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000015.mcb
create mode 100644 Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000016.mcb

diff --git a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/IntelMicrocodeLicense.txt b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/IntelMicrocodeLicense.txt
index 78536ba..cd2b6bc 100644
--- a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/IntelMicrocodeLicense.txt
+++ b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/IntelMicrocodeLicense.txt
@@ -1,7 +1,7 @@
-Copyright (c) 2018 - 2021 Intel Corporation.
-All rights reserved.
-
-Redistribution.
+Copyright (c) 2018 - 2022 Intel Corporation.
+All rights reserved.
+
+Redistribution.

Redistribution and use in binary form, without modification, are permitted,
provided that the following conditions are met:
diff --git a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/MicrocodeUpdates.inf b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/MicrocodeUpdates.inf
index f99f0a5..2c03f79 100644
--- a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/MicrocodeUpdates.inf
+++ b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/MicrocodeUpdates.inf
@@ -1,7 +1,7 @@
### @file
# Component information file for AcpiPlatform module
#
-# Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2019 - 2022, Intel Corporation. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
@@ -15,4 +15,4 @@
MODULE_TYPE = USER_DEFINED

[Sources]
- m0190661_00000015.mcb
+ m0190661_00000016.mcb
diff --git a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000015.mcb b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000015.mcb
deleted file mode 100644
index 06548466d37a06c1342c79f66f149d648dccf40e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 20480
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

diff --git a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000016.mcb b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000016.mcb
new file mode 100644
index 0000000000000000000000000000000000000000..3a8b78a3938fa17a65aed11e2878980cd6cf204e
GIT binary patch
literal 20480
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
byB4RnsqA!TKd5=^3m)~EvF?I2upS}~hGlw|

literal 0
HcmV?d00001

--
2.33.0.windows.1


[PATCH] MdeModulePkg/dec: update the PcdCpuStackGuard property

Chen, Gang C
 

Update the PcdCpuStackGuard from PcdsFixedAtBuild to PcdsDynamicEx.

Meanwhile, remove the duplicate check for PcdCpuStackGuard for
some limitation, which has been checked at the entry of
InitializeMpExceptionStackSwitchHandlers.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3897

Cc: Jian J Wang <jian.j.wang@...>
Cc: Liming Gao <gaoliming@...>
Cc: devel@edk2.groups.io
Cc: Eric Dong <eric.dong@...>
Cc: Ray Ni <ray.ni@...>

Signed-off-by: Gang Chen <gang.c.chen@...>
---
MdeModulePkg/MdeModulePkg.dec | 14 +++++++-------
.../CpuExceptionHandlerLib/PeiCpuException.c | 2 +-
2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 463e889e9a..72e7e2eced 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -1070,13 +1070,6 @@
# @Prompt The Heap Guard feature mask
gEfiMdeModulePkgTokenSpaceGuid.PcdHeapGuardPropertyMask|0x0|UINT8|0x30001054

- ## Indicates if UEFI Stack Guard will be enabled.
- # If enabled, stack overflow in UEFI can be caught, preventing chaotic consequences.<BR><BR>
- # TRUE - UEFI Stack Guard will be enabled.<BR>
- # FALSE - UEFI Stack Guard will be disabled.<BR>
- # @Prompt Enable UEFI Stack Guard.
- gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard|FALSE|BOOLEAN|0x30001055
-
[PcdsFixedAtBuild, PcdsPatchableInModule]
## Dynamic type PCD can be registered callback function for Pcd setting action.
# PcdMaxPeiPcdCallBackNumberPerPcdEntry indicates the maximum number of callback function
@@ -2079,6 +2072,13 @@
# @Prompt Enable PCIe Resizable BAR Capability support.
gEfiMdeModulePkgTokenSpaceGuid.PcdPcieResizableBarSupport|FALSE|BOOLEAN|0x10000024

+ ## Indicates if UEFI Stack Guard will be enabled.
+ # If enabled, stack overflow in UEFI can be caught, preventing chaotic consequences.<BR><BR>
+ # TRUE - UEFI Stack Guard will be enabled.<BR>
+ # FALSE - UEFI Stack Guard will be disabled.<BR>
+ # @Prompt Enable UEFI Stack Guard.
+ gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard|FALSE|BOOLEAN|0x00010025
+
[PcdsPatchableInModule]
## Specify memory size with page number for PEI code when
# Loading Module at Fixed Address feature is enabled.
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c
index 687fc4177f..bcd4175ffa 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c
@@ -254,7 +254,7 @@ InitializeCpuExceptionHandlersEx (
//
// Initializing stack switch is only necessary for Stack Guard functionality.
//
- if (PcdGetBool (PcdCpuStackGuard) && (InitData != NULL)) {
+ if (InitData != NULL) {
Status = ArchSetupExceptionStack (InitData);
}
}
--
2.35.1


Re: [PATCH v2] OvmfPkg/BhyveBhfPkg: add support for QemuFwCfg

Mario Marietto <marietto2008@...>
 

im trying to test the patch on my pc,that has two graphic cards,the intel coffee lake and the nvidia. i tried to start the pc from the nvidia card and ive configured the xorg.conf file giving the proper bus id value. in addition ive loaded the kernel.ko file from the boot loader.conf i have removed the intel and the drm drivers used by the Intel graphic card. unfortunately my pc wont boot from the nvidia card. my mouse and keyboard freezes just before the desktop manager (xfce and kde5) starts.


Il gio 7 apr 2022, 18:46 Rebecca Cran <rebecca@...> ha scritto:
I've just looked at the patch and it looks good, though I haven't tested it.

So yes, please add:


Acked-by: Rebecca Cran <rebecca@...>


On 4/6/22 23:24, Corvin Köhne wrote:
> Hi Peter and Rebecca,
>
> thanks for your feedback. This patch is backward compatible. It checks
> if QemuFwCfg is available and if QemuFwCfg is missing it falls
> back to BhyveFwCtl.
>
> So, should I add Reviewed-by (or Acked-by?) Peter and Rebecca to the
> commit message?
>
>
> Thanks
> Corvin
>
> Beckhoff Automation GmbH & Co. KG | Managing Director: Dipl. Phys. Hans Beckhoff
> Registered office: Verl, Germany | Register court: Guetersloh HRA 7075
>
>
>


Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment

Jayaprakash, N
 

+ Aaron

Regards,
JP

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Jayaprakash, N
Sent: 08 April 2022 22:12
To: Kinney, Michael D <michael.d.kinney@...>; devel@edk2.groups.io
Subject: Re: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment

The UUID generation is done through the random number generation & time unix time stamp features available through the built-in python modules 'random' and 'time' respectively.
The random number & time (unix time stamp or epoch) based method of generating the UUID is already there in uuid.py module, with this patch request enabled this path to take effect for UEFI invocation of this module.

There are some OS specific ways to generate the UUID's such as by using the libuuid on Linux kind of OS, windll.rpcrt4 library on windows.
These will not work for UEFI and hence added appropriate platform check to ensure that this path is not taken for UEFI invocation.

Besides this there are MAC address based algorithms available in uuid.py module.
These algorism are based on reading MAC address through various OS supported methods such as ipconfig command processing, NetBIOS calls on Windows, using netstat command in Linux, lanscan in Unix, from arp - address resolution protocol in Linux, NetBSD and other flavours of Linux.
These are currently not enabled for UEFI invocation of the uuid module. This has been done through platform check added at appropriate place in the uuid.py module code.

Regards,
JP
-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@...>
Sent: 08 April 2022 21:14
To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@...>; Kinney, Michael D <michael.d.kinney@...>
Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment

How is a UUID generated in UEFI env? Is there a dependency on MAC address or random number generator?

Can you add a description of the technique to the BZ and the commit message?

Thanks,

Mike

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
Jayaprakash, N
Sent: Friday, April 8, 2022 4:52 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-libc Patch 1/1]
AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for
UEFI environment

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3899

This is commit contains the UEFI port of uuid.py module. Made
necessary changes required to uuid.py module to support UEFI environment.
Porting of this module to UEFI is required for open source tools such
as Chipsec to function properly.

Cc: Rebecca Cran <rebecca@...>
Cc: Michael D Kinney <michael.d.kinney@...>
Signed-off-by: Jayaprakash N <n.jayaprakash@...>
---
.../Python/Python-3.6.8/Lib/uuid.py | 94 ++++++++++---------
1 file changed, 50 insertions(+), 44 deletions(-)

diff --git a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
index db8b2ef..84ed0b8 100644
--- a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
+++ b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
@@ -471,57 +471,61 @@ def _netbios_getnode():
continue
return int.from_bytes(bytes, 'big')

+
# Thanks to Thomas Heller for ctypes and for his help with its use here.

# If ctypes is available, use it to find system routines for UUID generation.
# XXX This makes the module non-thread-safe!
_uuid_generate_time = _UuidCreate = None
-try:
- import ctypes, ctypes.util
- import sys
-
- # The uuid_generate_* routines are provided by libuuid on at least
- # Linux and FreeBSD, and provided by libc on Mac OS X.
- _libnames = ['uuid']
- if not sys.platform.startswith('win'):
- _libnames.append('c')
- for libname in _libnames:
- try:
- lib = ctypes.CDLL(ctypes.util.find_library(libname))
- except Exception:
- continue
- if hasattr(lib, 'uuid_generate_time'):
- _uuid_generate_time = lib.uuid_generate_time
- break
- del _libnames
-
- # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
- # in issue #8621 the function generates the same sequence of values
- # in the parent process and all children created using fork (unless
- # those children use exec as well).
- #
- # Assume that the uuid_generate functions are broken from 10.5 onward,
- # the test can be adjusted when a later version is fixed.
- if sys.platform == 'darwin':
- if int(os.uname().release.split('.')[0]) >= 9:
- _uuid_generate_time = None
-
- # On Windows prior to 2000, UuidCreate gives a UUID containing the
- # hardware address. On Windows 2000 and later, UuidCreate makes a
- # random UUID and UuidCreateSequential gives a UUID containing the
- # hardware address. These routines are provided by the RPC runtime.
- # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last
- # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
- # to bear any relationship to the MAC address of any network device
- # on the box.
+if os.name != 'edk2':
+ # This code is not meant to run on UEFI environment
try:
- lib = ctypes.windll.rpcrt4
+ import ctypes, ctypes.util
+ import sys
+
+ # The uuid_generate_* routines are provided by libuuid on at least
+ # Linux and FreeBSD, and provided by libc on Mac OS X.
+ _libnames = ['uuid']
+ if not sys.platform.startswith('win'):
+ _libnames.append('c')
+ for libname in _libnames:
+ try:
+ lib = ctypes.CDLL(ctypes.util.find_library(libname))
+ except Exception:
+ continue
+ if hasattr(lib, 'uuid_generate_time'):
+ _uuid_generate_time = lib.uuid_generate_time
+ break
+ del _libnames
+
+ # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
+ # in issue #8621 the function generates the same sequence of values
+ # in the parent process and all children created using fork (unless
+ # those children use exec as well).
+ #
+ # Assume that the uuid_generate functions are broken from 10.5 onward,
+ # the test can be adjusted when a later version is fixed.
+ if sys.platform == 'darwin':
+ if int(os.uname().release.split('.')[0]) >= 9:
+ _uuid_generate_time = None
+
+ # On Windows prior to 2000, UuidCreate gives a UUID containing the
+ # hardware address. On Windows 2000 and later, UuidCreate makes a
+ # random UUID and UuidCreateSequential gives a UUID containing the
+ # hardware address. These routines are provided by the RPC runtime.
+ # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last
+ # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
+ # to bear any relationship to the MAC address of any network device
+ # on the box.
+ try:
+ lib = ctypes.windll.rpcrt4
+ except:
+ lib = None
+ _UuidCreate = getattr(lib, 'UuidCreateSequential',
+ getattr(lib, 'UuidCreate', None))
except:
- lib = None
- _UuidCreate = getattr(lib, 'UuidCreateSequential',
- getattr(lib, 'UuidCreate', None))
-except:
- pass
+ pass
+

def _unixdll_getnode():
"""Get the hardware address on Unix using ctypes."""
@@ -563,6 +567,8 @@ def getnode():
import sys
if sys.platform == 'win32':
getters = _NODE_GETTERS_WIN32
+ elif sys.platform == 'uefi':
+ getters = []
else:
getters = _NODE_GETTERS_UNIX

--
2.32.0.windows.2





Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment

Jayaprakash, N
 

The UUID generation is done through the random number generation & time unix time stamp features available through the built-in python modules 'random' and 'time' respectively.
The random number & time (unix time stamp or epoch) based method of generating the UUID is already there in uuid.py module, with this patch request enabled this path to take effect for UEFI invocation of this module.

There are some OS specific ways to generate the UUID's such as by using the libuuid on Linux kind of OS, windll.rpcrt4 library on windows.
These will not work for UEFI and hence added appropriate platform check to ensure that this path is not taken for UEFI invocation.

Besides this there are MAC address based algorithms available in uuid.py module.
These algorism are based on reading MAC address through various OS supported methods such as ipconfig command processing, NetBIOS calls on Windows,
using netstat command in Linux, lanscan in Unix, from arp - address resolution protocol in Linux, NetBSD and other flavours of Linux.
These are currently not enabled for UEFI invocation of the uuid module. This has been done through platform check added at appropriate place in the uuid.py module code.

Regards,
JP

-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@...>
Sent: 08 April 2022 21:14
To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@...>; Kinney, Michael D <michael.d.kinney@...>
Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment

How is a UUID generated in UEFI env? Is there a dependency on MAC address or random number generator?

Can you add a description of the technique to the BZ and the commit message?

Thanks,

Mike

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
Jayaprakash, N
Sent: Friday, April 8, 2022 4:52 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-libc Patch 1/1]
AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for
UEFI environment

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3899

This is commit contains the UEFI port of uuid.py module. Made
necessary changes required to uuid.py module to support UEFI environment.
Porting of this module to UEFI is required for open source tools such
as Chipsec to function properly.

Cc: Rebecca Cran <rebecca@...>
Cc: Michael D Kinney <michael.d.kinney@...>
Signed-off-by: Jayaprakash N <n.jayaprakash@...>
---
.../Python/Python-3.6.8/Lib/uuid.py | 94 ++++++++++---------
1 file changed, 50 insertions(+), 44 deletions(-)

diff --git a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
index db8b2ef..84ed0b8 100644
--- a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
+++ b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
@@ -471,57 +471,61 @@ def _netbios_getnode():
continue
return int.from_bytes(bytes, 'big')

+
# Thanks to Thomas Heller for ctypes and for his help with its use here.

# If ctypes is available, use it to find system routines for UUID generation.
# XXX This makes the module non-thread-safe!
_uuid_generate_time = _UuidCreate = None
-try:
- import ctypes, ctypes.util
- import sys
-
- # The uuid_generate_* routines are provided by libuuid on at least
- # Linux and FreeBSD, and provided by libc on Mac OS X.
- _libnames = ['uuid']
- if not sys.platform.startswith('win'):
- _libnames.append('c')
- for libname in _libnames:
- try:
- lib = ctypes.CDLL(ctypes.util.find_library(libname))
- except Exception:
- continue
- if hasattr(lib, 'uuid_generate_time'):
- _uuid_generate_time = lib.uuid_generate_time
- break
- del _libnames
-
- # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
- # in issue #8621 the function generates the same sequence of values
- # in the parent process and all children created using fork (unless
- # those children use exec as well).
- #
- # Assume that the uuid_generate functions are broken from 10.5 onward,
- # the test can be adjusted when a later version is fixed.
- if sys.platform == 'darwin':
- if int(os.uname().release.split('.')[0]) >= 9:
- _uuid_generate_time = None
-
- # On Windows prior to 2000, UuidCreate gives a UUID containing the
- # hardware address. On Windows 2000 and later, UuidCreate makes a
- # random UUID and UuidCreateSequential gives a UUID containing the
- # hardware address. These routines are provided by the RPC runtime.
- # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last
- # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
- # to bear any relationship to the MAC address of any network device
- # on the box.
+if os.name != 'edk2':
+ # This code is not meant to run on UEFI environment
try:
- lib = ctypes.windll.rpcrt4
+ import ctypes, ctypes.util
+ import sys
+
+ # The uuid_generate_* routines are provided by libuuid on at least
+ # Linux and FreeBSD, and provided by libc on Mac OS X.
+ _libnames = ['uuid']
+ if not sys.platform.startswith('win'):
+ _libnames.append('c')
+ for libname in _libnames:
+ try:
+ lib = ctypes.CDLL(ctypes.util.find_library(libname))
+ except Exception:
+ continue
+ if hasattr(lib, 'uuid_generate_time'):
+ _uuid_generate_time = lib.uuid_generate_time
+ break
+ del _libnames
+
+ # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
+ # in issue #8621 the function generates the same sequence of values
+ # in the parent process and all children created using fork (unless
+ # those children use exec as well).
+ #
+ # Assume that the uuid_generate functions are broken from 10.5 onward,
+ # the test can be adjusted when a later version is fixed.
+ if sys.platform == 'darwin':
+ if int(os.uname().release.split('.')[0]) >= 9:
+ _uuid_generate_time = None
+
+ # On Windows prior to 2000, UuidCreate gives a UUID containing the
+ # hardware address. On Windows 2000 and later, UuidCreate makes a
+ # random UUID and UuidCreateSequential gives a UUID containing the
+ # hardware address. These routines are provided by the RPC runtime.
+ # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last
+ # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
+ # to bear any relationship to the MAC address of any network device
+ # on the box.
+ try:
+ lib = ctypes.windll.rpcrt4
+ except:
+ lib = None
+ _UuidCreate = getattr(lib, 'UuidCreateSequential',
+ getattr(lib, 'UuidCreate', None))
except:
- lib = None
- _UuidCreate = getattr(lib, 'UuidCreateSequential',
- getattr(lib, 'UuidCreate', None))
-except:
- pass
+ pass
+

def _unixdll_getnode():
"""Get the hardware address on Unix using ctypes."""
@@ -563,6 +567,8 @@ def getnode():
import sys
if sys.platform == 'win32':
getters = _NODE_GETTERS_WIN32
+ elif sys.platform == 'uefi':
+ getters = []
else:
getters = _NODE_GETTERS_UNIX

--
2.32.0.windows.2





[PATCH] ShellPkg: Update smbiosview type 41 with SMBIOS 3.5 fields

Bo Chang Ke
 

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3900

update smbiosview type 41 related fileds.

Signed-off-by: Bo Chang Ke <bo-changx.ke@...>
Cc: Dandan Bi <dandan.bi@...>
Cc: Star Zeng <star.zeng@...>
---
.../SmbiosView/QueryTable.c | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)

diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c
index c4a6acb167..7ec6d2b5f1 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c
@@ -1766,6 +1766,30 @@ TABLE_ITEM OnboardDeviceTypesTable[] = {
0x0A,
L" Sas Controller"
},
+ {
+ 0x0B,
+ L" Wireless LAN"
+ },
+ {
+ 0x0C,
+ L" Bluetooth"
+ },
+ {
+ 0x0D,
+ L" WWAN"
+ },
+ {
+ 0x0E,
+ L" embedded Multi-Media Controller"
+ },
+ {
+ 0x0F,
+ L" NVMe Controller"
+ },
+ {
+ 0x10,
+ L" UFS Controller"
+ }
};

TABLE_ITEM SELTypesTable[] = {
--
2.32.0.windows.1


Re: [GSoC 2022] Introducing myself & seeking for project ideas

Théo Jehl
 

Hello Nate,
Thanks a lot for your answer ! I got myself a copy of "Beyond BIOS" to understand how UEFI works.

The project sound very interesting, so if I understand correctly, OVMF only implements some of the services needed for QEMU support, porting what's present to MinPlatform and then improving it with the required services will result in QemuOpenBoardPkg, is that right? So the goal is to allow MinPlatform testing inside QEMU instead of getting a specific board supported by MinPlatform? 
 
I'll use the upcoming months to get up to pace with UEFI with the ressources you gave me 😄 
Before starting to write my application I have a few questions, especially on the prerequisites, on the project page the only one listed is C knowledge, is anything else required or recommended ? In case I need to get up to pace with something specific :)

And thanks for welcoming me in the project ! 

Best regards,
Théo


Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment

Michael D Kinney
 

How is a UUID generated in UEFI env? Is there a dependency on MAC address or random number generator?

Can you add a description of the technique to the BZ and the commit message?

Thanks,

Mike

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Jayaprakash, N
Sent: Friday, April 8, 2022 4:52 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI
environment

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3899

This is commit contains the UEFI port of uuid.py module. Made necessary
changes required to uuid.py module to support UEFI environment.
Porting of this module to UEFI is required for open source tools such
as Chipsec to function properly.

Cc: Rebecca Cran <rebecca@...>
Cc: Michael D Kinney <michael.d.kinney@...>
Signed-off-by: Jayaprakash N <n.jayaprakash@...>
---
.../Python/Python-3.6.8/Lib/uuid.py | 94 ++++++++++---------
1 file changed, 50 insertions(+), 44 deletions(-)

diff --git a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
index db8b2ef..84ed0b8 100644
--- a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
+++ b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py
@@ -471,57 +471,61 @@ def _netbios_getnode():
continue
return int.from_bytes(bytes, 'big')

+
# Thanks to Thomas Heller for ctypes and for his help with its use here.

# If ctypes is available, use it to find system routines for UUID generation.
# XXX This makes the module non-thread-safe!
_uuid_generate_time = _UuidCreate = None
-try:
- import ctypes, ctypes.util
- import sys
-
- # The uuid_generate_* routines are provided by libuuid on at least
- # Linux and FreeBSD, and provided by libc on Mac OS X.
- _libnames = ['uuid']
- if not sys.platform.startswith('win'):
- _libnames.append('c')
- for libname in _libnames:
- try:
- lib = ctypes.CDLL(ctypes.util.find_library(libname))
- except Exception:
- continue
- if hasattr(lib, 'uuid_generate_time'):
- _uuid_generate_time = lib.uuid_generate_time
- break
- del _libnames
-
- # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
- # in issue #8621 the function generates the same sequence of values
- # in the parent process and all children created using fork (unless
- # those children use exec as well).
- #
- # Assume that the uuid_generate functions are broken from 10.5 onward,
- # the test can be adjusted when a later version is fixed.
- if sys.platform == 'darwin':
- if int(os.uname().release.split('.')[0]) >= 9:
- _uuid_generate_time = None
-
- # On Windows prior to 2000, UuidCreate gives a UUID containing the
- # hardware address. On Windows 2000 and later, UuidCreate makes a
- # random UUID and UuidCreateSequential gives a UUID containing the
- # hardware address. These routines are provided by the RPC runtime.
- # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last
- # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
- # to bear any relationship to the MAC address of any network device
- # on the box.
+if os.name != 'edk2':
+ # This code is not meant to run on UEFI environment
try:
- lib = ctypes.windll.rpcrt4
+ import ctypes, ctypes.util
+ import sys
+
+ # The uuid_generate_* routines are provided by libuuid on at least
+ # Linux and FreeBSD, and provided by libc on Mac OS X.
+ _libnames = ['uuid']
+ if not sys.platform.startswith('win'):
+ _libnames.append('c')
+ for libname in _libnames:
+ try:
+ lib = ctypes.CDLL(ctypes.util.find_library(libname))
+ except Exception:
+ continue
+ if hasattr(lib, 'uuid_generate_time'):
+ _uuid_generate_time = lib.uuid_generate_time
+ break
+ del _libnames
+
+ # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
+ # in issue #8621 the function generates the same sequence of values
+ # in the parent process and all children created using fork (unless
+ # those children use exec as well).
+ #
+ # Assume that the uuid_generate functions are broken from 10.5 onward,
+ # the test can be adjusted when a later version is fixed.
+ if sys.platform == 'darwin':
+ if int(os.uname().release.split('.')[0]) >= 9:
+ _uuid_generate_time = None
+
+ # On Windows prior to 2000, UuidCreate gives a UUID containing the
+ # hardware address. On Windows 2000 and later, UuidCreate makes a
+ # random UUID and UuidCreateSequential gives a UUID containing the
+ # hardware address. These routines are provided by the RPC runtime.
+ # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last
+ # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
+ # to bear any relationship to the MAC address of any network device
+ # on the box.
+ try:
+ lib = ctypes.windll.rpcrt4
+ except:
+ lib = None
+ _UuidCreate = getattr(lib, 'UuidCreateSequential',
+ getattr(lib, 'UuidCreate', None))
except:
- lib = None
- _UuidCreate = getattr(lib, 'UuidCreateSequential',
- getattr(lib, 'UuidCreate', None))
-except:
- pass
+ pass
+

def _unixdll_getnode():
"""Get the hardware address on Unix using ctypes."""
@@ -563,6 +567,8 @@ def getnode():
import sys
if sys.platform == 'win32':
getters = _NODE_GETTERS_WIN32
+ elif sys.platform == 'uefi':
+ getters = []
else:
getters = _NODE_GETTERS_UNIX

--
2.32.0.windows.2





Re: Applying for GSoC 2022: Add Rust Support to EDK II

 

Hi Nate

Thanks for the response.

For the std implementation, I do have some idea how to go about implementing it now. The most important thing I realized is that most of the std isn't actually std. For example, std::collection, Vector, Box, Rc, etc are all actually part of alloc and not std. The things that really are part of std include threads, i/o, etc.

I have taken a look at some other people's projects who have tried implementing libstd for other targets and it seems it is possible to write an implementation without libc. It's just very difficult since in most OS besides Linux, the syscall ABI is not stable enough and using libc is just easier and recommended.

As for my earlier patches, Jiewen told me that edkii-rust branch is no longer maintained and that they are now using a different uefi rust implementation for their work.

I did also find that it will be possible to make the std with stable Rust even though if internals use nightly, so that's cool. Some useful projects about writing libstd for new platform that I found are below:

Ayush Singh

On Fri, 8 Apr, 2022, 2:33 am Desimone, Nathaniel L, <nathaniel.l.desimone@...> wrote:
Hi Ayush,

Great to meet you and welcome to the TianoCore project! Great to hear you are interested! Apologize for the tardiness in my response. Implementing Rust support sounds like a wonderful project and one that would really help advance the state of the art for UEFI firmware development! I am looking for someone with Rust experience that can help mentor this project. My usage of Rust at time of writing has not advanced very far beyond "Hello World." While I can give a great deal of knowledge and background on UEFI and EDK II, my ability to recommend how that be applied to a Rust binding is limited. However, I do know enough to suspect the vast majority of the work will be figuring out how to integrate the vast array of libraries that EDK II provides into a coherent and clean Rust binding. The one aspect of this project that I think will be interesting is figuring out is what to do about std:: in Rust. From what I have seen of the functionality there more or less assumes the existence of a libc implementation for the platform, which is not necessarily true for DXE and is absolutely not true for PEI. I would be interested in hearing your thought on how to handle that elegantly.

I'm sorry that your patches haven't gotten much attention thus far. Once I find mentor(s) for the Rust project I'll make sure they pick those up and take a look at the work you have done thus far.

Hope this helps and welcome to the project!

With Best Regards,
Nate

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ayush Singh
Sent: Monday, April 4, 2022 10:18 AM
To: devel@edk2.groups.io
Cc: Bret.Barkelew@...; Desimone, Nathaniel L <nathaniel.l.desimone@...>; mhaeuser@...
Subject: [edk2-devel] Applying for GSoC 2022: Add Rust Support to EDK II

Hello everyone, I am a 2nd-year University Student from India. I am interested in applying for adding Rust support to EDK2. I have already introduced myself to the mailing list earlier
(https://edk2.groups.io/g/devel/message/87637) and have even submitted some patches for the edkii-rust branch in edk2-staging (which were not merged since that branch seems to be abandoned now).
- https://edk2.groups.io/g/devel/message/87753
- https://edk2.groups.io/g/devel/message/87754
- https://edk2.groups.io/g/devel/message/87755
- https://edk2.groups.io/g/devel/message/87756

Anyway, since no mentor has been listed for this project, I was wondering who should I discuss the proposal with? Normally, I think one is supposed to discuss the proposal details with a mentor in form of a google doc or something before submitting an application. So should I directly start by submitting a proposal through the GSoC application portal? Or is there someone I should contact first?

Ayush Singh





3861 - 3880 of 92426