From 126bd8bebf24e0269696f22a282a4b0340d9923b Mon Sep 17 00:00:00 2001 From: Jon Nettleton Date: Fri, 12 Mar 2021 06:52:56 +0100 Subject: [PATCH] MdeModulePkg/Variable/VariableRuntimeDxe: Add Bool PcdDriverConvertsFvbFuncPointers VariableRuntimeDxe is unconditionally converting the pointers to the Fvb protocol functions even if the platform drivers are already converting the pointers themselves. This leads to a double pointer conversion and can cause unexpected runtime behaviour depending on the memory layout of the platform. Since we don't want to break legacy and out of tree platforms we add a Bool flag that defaults to the existing behaviour but allows platforms to only use the pointer conversion being done in their driver implementation that produces the FVB Protocol. Signed-off-by: Jon Nettleton --- MdeModulePkg/MdeModulePkg.dec | 6 ++++++ .../Universal/Variable/RuntimeDxe/VariableDxe.c | 16 +++++++++------- .../Variable/RuntimeDxe/VariableRuntimeDxe.inf | 1 + 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 1483955110..07b84b1837 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1130,6 +1130,12 @@ # @Prompt Reclaim variable space at EndOfDxe. gEfiMdeModulePkgTokenSpaceGuid.PcdReclaimVariableSpaceAtEndOfDxe|FALSE|BOOLEAN|0x30000008 + ## Driver converts FVB function pointers.

+ # The value is FALSE as default to retain the current behaviour and retain compatibility with out of tree platorms.
+ # If the value is set to TRUE, variable driver does not convert the FVB function pointers.
+ # @Prompt Platform driver converts FVB pointers. + gEfiMdeModulePkgTokenSpaceGuid.PcdDriverConvertsFvbFuncPointers|FALSE|BOOLEAN|0x3000000b + ## The size of volatile buffer. This buffer is used to store VOLATILE attribute variables. # @Prompt Variable storage size. gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x10000|UINT32|0x30000005 diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c index 0fca0bb2a9..ede2a66682 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c @@ -247,13 +247,15 @@ VariableClassAddressChangeEvent ( UINTN Index; if (mVariableModuleGlobal->FvbInstance != NULL) { - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetBlockSize); - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetPhysicalAddress); - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetAttributes); - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->SetAttributes); - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->Read); - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->Write); - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->EraseBlocks); + if (!PcdGetBool (PcdDriverConvertsFvbFuncPointers)) { + EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetBlockSize); + EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetPhysicalAddress); + EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetAttributes); + EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->SetAttributes); + EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->Read); + EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->Write); + EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->EraseBlocks); + } EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance); } EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->PlatformLangCodes); diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf index c9434df631..f3373f8137 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf @@ -137,6 +137,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxUserNvVariableSpaceSize ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdBoottimeReservedNvVariableSpaceSize ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdReclaimVariableSpaceAtEndOfDxe ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdDriverConvertsFvbFuncPointers ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved ## SOMETIMES_CONSUMES -- 2.27.0