]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/Pei/Variable.c
Patch to remove STATIC modifier. This is on longer recommended by EFI Framework codin...
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / Pei / Variable.c
index 7385af71572e24d68c16045aaa31cdf3cf618ad2..18e252f97312fdcd027b353e2abb01183af94ae7 100644 (file)
@@ -1,6 +1,9 @@
-/*++\r
+/** @file\r
+\r
+  Implement ReadOnly Variable Services required by PEIM and install\r
+  PI ReadOnly Varaiable2 PPI. These services operates the non volatile storage space.\r
 \r
-Copyright (c) 2006 - 2007 Intel Corporation. <BR>\r
+Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -10,13 +13,7 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 Module Name:\r
 \r
-  Variable.c\r
-\r
-Abstract:\r
-\r
-  Framework PEIM to provide the Variable functionality\r
-\r
---*/\r
+**/\r
 \r
 \r
 #include "Variable.h"\r
@@ -24,12 +21,12 @@ Abstract:
 //\r
 // Module globals\r
 //\r
-static EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariablePpi = {\r
+EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariablePpi = {\r
   PeiGetVariable,\r
   PeiGetNextVariableName\r
 };\r
 \r
-static EFI_PEI_PPI_DESCRIPTOR     mPpiListVariable = {\r
+EFI_PEI_PPI_DESCRIPTOR     mPpiListVariable = {\r
   (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
   &gEfiPeiReadOnlyVariable2PpiGuid,\r
   &mVariablePpi\r
@@ -68,30 +65,58 @@ Returns:
 \r
 }\r
 \r
-STATIC\r
 VARIABLE_HEADER *\r
-GetNextVariablePtr (\r
-  IN VARIABLE_HEADER  *Variable\r
+GetStartPointer (\r
+  IN VARIABLE_STORE_HEADER       *VarStoreHeader\r
   )\r
 /*++\r
 \r
 Routine Description:\r
 \r
-  This code checks if variable header is valid or not.\r
+  This code gets the pointer to the first variable memory pointer byte\r
 \r
 Arguments:\r
-  Variable       Pointer to the Variable Header.\r
+\r
+  VarStoreHeader        Pointer to the Variable Store Header.\r
 \r
 Returns:\r
-  TRUE            Variable header is valid.\r
-  FALSE           Variable header is not valid.\r
+\r
+  VARIABLE_HEADER*      Pointer to last unavailable Variable Header\r
+\r
+--*/\r
+{\r
+  //\r
+  // The end of variable store\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN (VarStoreHeader + 1);\r
+}\r
+\r
+VARIABLE_HEADER *\r
+GetEndPointer (\r
+  IN VARIABLE_STORE_HEADER       *VarStoreHeader\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the last variable memory pointer byte\r
+\r
+Arguments:\r
+\r
+  VarStoreHeader        Pointer to the Variable Store Header.\r
+\r
+Returns:\r
+\r
+  VARIABLE_HEADER*      Pointer to last unavailable Variable Header\r
 \r
 --*/\r
 {\r
-  return (VARIABLE_HEADER *) ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + Variable->DataSize + GET_PAD_SIZE (Variable->DataSize));\r
+  //\r
+  // The end of variable store\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VarStoreHeader + VarStoreHeader->Size);\r
 }\r
 \r
-STATIC\r
 BOOLEAN\r
 EFIAPI\r
 IsValidVariableHeader (\r
@@ -112,17 +137,166 @@ Returns:
 \r
 --*/\r
 {\r
-  if (Variable == NULL ||\r
-      Variable->StartId != VARIABLE_DATA ||\r
-      (sizeof (VARIABLE_HEADER) + Variable->DataSize + Variable->NameSize) > MAX_VARIABLE_SIZE\r
-      ) {\r
+  if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
     return FALSE;\r
   }\r
 \r
   return TRUE;\r
 }\r
 \r
-STATIC\r
+\r
+UINTN\r
+NameSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the size of name of variable.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINTN               Size of variable in bytes\r
+\r
+--*/\r
+{\r
+  if (Variable->State    == (UINT8) (-1) ||\r
+      Variable->DataSize == (UINT32) -1 ||\r
+      Variable->NameSize == (UINT32) -1 ||\r
+      Variable->Attributes == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return (UINTN) Variable->NameSize;\r
+}\r
+\r
+UINTN\r
+DataSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the size of name of variable.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINTN               Size of variable in bytes\r
+\r
+--*/\r
+{\r
+  if (Variable->State    == (UINT8)  -1 ||\r
+      Variable->DataSize == (UINT32) -1 ||\r
+      Variable->NameSize == (UINT32) -1 ||\r
+      Variable->Attributes == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return (UINTN) Variable->DataSize;\r
+}\r
+\r
+CHAR16 *\r
+GetVariableNamePtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the variable name.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  CHAR16*              Pointer to Variable Name\r
+\r
+--*/\r
+{\r
+\r
+  return (CHAR16 *) (Variable + 1);\r
+}\r
+\r
+\r
+UINT8 *\r
+GetVariableDataPtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the variable data.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINT8*              Pointer to Variable Data\r
+\r
+--*/\r
+{\r
+  UINTN Value;\r
+  \r
+  //\r
+  // Be careful about pad size for alignment\r
+  //\r
+  Value =  (UINTN) GetVariableNamePtr (Variable);\r
+  Value += NameSizeOfVariable (Variable);\r
+  Value += GET_PAD_SIZE (NameSizeOfVariable (Variable));\r
+\r
+  return (UINT8 *) Value;\r
+}\r
+\r
+VARIABLE_HEADER *\r
+GetNextVariablePtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the next variable header.\r
+\r
+Arguments:\r
+\r
+  Variable              Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  VARIABLE_HEADER*      Pointer to next variable header.\r
+\r
+--*/\r
+{\r
+  UINTN Value;\r
+\r
+  if (!IsValidVariableHeader (Variable)) {\r
+    return NULL;\r
+  }\r
+\r
+  Value =  (UINTN) GetVariableDataPtr (Variable);\r
+  Value += DataSizeOfVariable (Variable);\r
+  Value += GET_PAD_SIZE (DataSizeOfVariable (Variable));\r
+\r
+  //\r
+  // Be careful about pad size for alignment\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN (Value);\r
+}\r
+\r
+\r
 VARIABLE_STORE_STATUS\r
 EFIAPI\r
 GetVariableStoreStatus (\r
@@ -166,7 +340,6 @@ Returns:
   }\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 CompareWithValidVariable (\r
   IN  VARIABLE_HEADER               *Variable,\r
@@ -195,6 +368,8 @@ Returns:
 \r
 --*/\r
 {\r
+  VOID  *Point;\r
+\r
   if (VariableName[0] == 0) {\r
     PtrTrack->CurrPtr = Variable;\r
     return EFI_SUCCESS;\r
@@ -209,7 +384,9 @@ Returns:
         (((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&\r
         (((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])\r
         ) {\r
-      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), Variable->NameSize)) {\r
+      ASSERT (NameSizeOfVariable (Variable) != 0);\r
+      Point = (VOID *) GetVariableNamePtr (Variable);\r
+      if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {\r
         PtrTrack->CurrPtr = Variable;\r
         return EFI_SUCCESS;\r
       }\r
@@ -219,11 +396,10 @@ Returns:
   return EFI_NOT_FOUND;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 FindVariable (\r
-  IN EFI_PEI_SERVICES         **PeiServices,\r
+  IN CONST EFI_PEI_SERVICES   **PeiServices,\r
   IN CONST  CHAR16            *VariableName,\r
   IN CONST  EFI_GUID          *VendorGuid,\r
   OUT VARIABLE_POINTER_TRACK  *PtrTrack\r
@@ -314,8 +490,8 @@ Returns:
       //\r
       // Find the variable by walk through non-volatile variable store\r
       //\r
-      IndexTable->StartPtr  = (VARIABLE_HEADER *) (VariableStoreHeader + 1);\r
-      IndexTable->EndPtr    = (VARIABLE_HEADER *) ((UINTN) VariableStoreHeader + VariableStoreHeader->Size);\r
+      IndexTable->StartPtr  = GetStartPointer (VariableStoreHeader);\r
+      IndexTable->EndPtr    = GetEndPointer (VariableStoreHeader);\r
 \r
       //\r
       // Start Pointers for the variable.\r
@@ -402,10 +578,10 @@ Returns:
   VARIABLE_POINTER_TRACK  Variable;\r
   UINTN                   VarDataSize;\r
   EFI_STATUS              Status;\r
-  EFI_PEI_SERVICES        **PeiServices;\r
+  CONST EFI_PEI_SERVICES  **PeiServices;\r
 \r
   PeiServices = GetPeiServicesTablePointer ();\r
-  if (VariableName == NULL || VariableGuid == NULL) {\r
+  if (VariableName == NULL || VariableGuid == NULL || DataSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   //\r
@@ -418,9 +594,16 @@ Returns:
   //\r
   // Get data size\r
   //\r
-  VarDataSize = Variable.CurrPtr->DataSize;\r
+  VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
   if (*DataSize >= VarDataSize) {\r
-    (*PeiServices)->CopyMem (Data, GET_VARIABLE_DATA_PTR (Variable.CurrPtr), VarDataSize);\r
+    //\r
+    // PO-TKW: Address one checking in this place\r
+    //\r
+    if (Data == NULL) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
+    (*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
 \r
     if (Attributes != NULL) {\r
       *Attributes = Variable.CurrPtr->Attributes;\r
@@ -472,10 +655,10 @@ Returns:
   VARIABLE_POINTER_TRACK  Variable;\r
   UINTN                   VarNameSize;\r
   EFI_STATUS              Status;\r
-  EFI_PEI_SERVICES        **PeiServices;\r
+  CONST EFI_PEI_SERVICES  **PeiServices;\r
 \r
   PeiServices = GetPeiServicesTablePointer ();\r
-  if (VariableName == NULL) {\r
+  if (VariableName == NULL || VariableGuid == NULL || VariableNameSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -494,9 +677,11 @@ Returns:
   while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {\r
     if (IsValidVariableHeader (Variable.CurrPtr)) {\r
       if (Variable.CurrPtr->State == VAR_ADDED) {\r
-        VarNameSize = (UINTN) Variable.CurrPtr->NameSize;\r
+        ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
+\r
+        VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
         if (VarNameSize <= *VariableNameSize) {\r
-          (*PeiServices)->CopyMem (VariableName, GET_VARIABLE_NAME_PTR (Variable.CurrPtr), VarNameSize);\r
+          (*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
 \r
           (*PeiServices)->CopyMem (VariableGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));\r
 \r