From c65c1e1e1428a1a7c41a3b89a84383aa15624c7a Mon Sep 17 00:00:00 2001 From: qwang12 Date: Tue, 10 Oct 2006 02:21:51 +0000 Subject: [PATCH] This patch is to make sure at least VARIABLE_RECLAIM_THRESHOLD (1024) bytes of spaces must be available in NV variable region. This conservative approach is make sure OS loader will have space to save important data. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1697 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/Variable/RuntimeDxe/Variable.c | 17 +++++++++++++++++ .../Universal/Variable/RuntimeDxe/Variable.h | 1 + 2 files changed, 18 insertions(+) diff --git a/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c b/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c index a9505d903c..d575417fe9 100644 --- a/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c +++ b/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c @@ -1388,6 +1388,23 @@ Returns: mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) NextVariable - (UINTN) CurrPtr; + // + // Check if the free area is blow a threshold + // + if ((((VARIABLE_STORE_HEADER *)((UINTN) CurrPtr))->Size - mVariableModuleGlobal->NonVolatileLastVariableOffset) < VARIABLE_RECLAIM_THRESHOLD) { + Status = Reclaim ( + mVariableModuleGlobal->VariableBase[Physical].NonVolatileVariableBase, + &mVariableModuleGlobal->NonVolatileLastVariableOffset, + FALSE + ); + } + + if (EFI_ERROR (Status)) { + gBS->FreePool (mVariableModuleGlobal); + gBS->FreePool (VolatileVariableStore); + return Status; + } + // // Check if the free area is really free. // diff --git a/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.h b/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.h index 55423a25b9..014df50c3d 100644 --- a/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.h +++ b/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.h @@ -35,6 +35,7 @@ Abstract: #define ALIGNMENT 1 #endif +#define VARIABLE_RECLAIM_THRESHOLD (1024) #define VARIABLE_STORE_SIZE (64 * 1024) #define SCRATCH_SIZE (4 * 1024) -- 2.39.2