]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/PCD/Dxe/Service.c
If variable does not exist for a HII PCD, a new NV variable need to be created.
[mirror_edk2.git] / MdeModulePkg / Universal / PCD / Dxe / Service.c
index 71e92399f42642a1749633f42f1b20c329dd088b..bfc17e734c5b49272a82b881f7df9dd32453ee26 100644 (file)
@@ -106,8 +106,13 @@ GetWorker (
   }\r
 \r
   PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);\r
-  StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :\r
-                          mPcdDatabase->DxeDb.Init.StringTable;\r
+                                    \r
+  if (IsPeiDb) {\r
+    StringTable = (UINT16 *) (&mPcdDatabase->PeiDb.Init.StringTable[0]);\r
+  } else {\r
+    StringTable = (UINT16 *) (&mPcdDatabase->DxeDb.Init.StringTable[0]);\r
+  }\r
+                                      \r
   \r
   Offset     = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
   \r
@@ -118,13 +123,16 @@ GetWorker (
       break;\r
       \r
     case PCD_TYPE_HII:\r
-      GuidTable   = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :\r
-                              mPcdDatabase->DxeDb.Init.GuidTable;\r
+      if (IsPeiDb) {\r
+        GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);\r
+      } else {\r
+        GuidTable = (EFI_GUID *) (&mPcdDatabase->DxeDb.Init.GuidTable[0]);\r
+      }\r
                               \r
       VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
       \r
-      Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
-      Name = &(StringTable[VariableHead->StringIndex]);\r
+      Guid = GuidTable + VariableHead->GuidTableIndex;\r
+      Name = StringTable + VariableHead->StringIndex;\r
       VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
 \r
       Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
@@ -154,7 +162,7 @@ GetWorker (
 \r
     case PCD_TYPE_STRING:\r
       StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
-      RetPtr = (VOID *) &StringTable[StringTableIdx];\r
+      RetPtr = (VOID *) (StringTable + StringTableIdx);\r
       break;\r
 \r
     case PCD_TYPE_DATA:\r
@@ -761,8 +769,12 @@ SetWorker (
 \r
   PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);\r
 \r
-  StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :\r
-                          mPcdDatabase->DxeDb.Init.StringTable;\r
+  if (IsPeiDb) {\r
+    StringTable = (UINT16 *) (&mPcdDatabase->PeiDb.Init.StringTable[0]);\r
+  } else {\r
+    StringTable = (UINT16 *) (&mPcdDatabase->DxeDb.Init.StringTable[0]);\r
+  }\r
+\r
   \r
   InternalData = PcdDb + Offset;\r
 \r
@@ -774,7 +786,7 @@ SetWorker (
     \r
     case PCD_TYPE_STRING:\r
       if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
-        CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, *Size);\r
+        CopyMem (StringTable + *((UINT16 *)InternalData), Data, *Size);\r
         Status = EFI_SUCCESS;\r
       } else {\r
         Status = EFI_INVALID_PARAMETER;\r
@@ -789,13 +801,16 @@ SetWorker (
         }\r
       }\r
       \r
-      GuidTable   = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :\r
-                              mPcdDatabase->DxeDb.Init.GuidTable;\r
+      if (IsPeiDb) {\r
+        GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);\r
+      } else {\r
+        GuidTable = (EFI_GUID *) (&mPcdDatabase->DxeDb.Init.GuidTable[0]);\r
+      }\r
                               \r
       VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
       \r
-      Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
-      Name = &(StringTable[VariableHead->StringIndex]);\r
+      Guid = GuidTable + VariableHead->GuidTableIndex;\r
+      Name = StringTable + VariableHead->StringIndex;\r
       VariableOffset = VariableHead->Offset;\r
 \r
       Status = SetHiiVariable (Guid, Name, Data, *Size, VariableOffset);\r
@@ -963,6 +978,9 @@ SetHiiVariable (
 \r
   Size = 0;\r
 \r
+  //\r
+  // Try to get original variable size information.\r
+  //\r
   Status = gRT->GetVariable (\r
     (UINT16 *)VariableName,\r
     VariableGuid,\r
@@ -972,7 +990,10 @@ SetHiiVariable (
     );\r
 \r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
-\r
+    //\r
+    // Patch new PCD's value to offset in given HII variable.\r
+    //\r
+    \r
     Buffer = AllocatePool (Size);\r
 \r
     ASSERT (Buffer != NULL);\r
@@ -1000,12 +1021,33 @@ SetHiiVariable (
     FreePool (Buffer);\r
     return Status;\r
 \r
-  } \r
+  } else if (Status == EFI_NOT_FOUND) {\r
+    //\r
+    // If variable does not exist, a new variable need to be created.\r
+    //\r
+    \r
+    Size = Offset + DataSize;\r
+    \r
+    Buffer = AllocateZeroPool (Size);\r
+    ASSERT (Buffer != NULL);\r
+    \r
+    CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize);\r
+    \r
+    Status = gRT->SetVariable (\r
+              VariableName,\r
+              VariableGuid,\r
+              EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+              Size,\r
+              Buffer\r
+              );\r
+\r
+    FreePool (Buffer);\r
+    return Status;    \r
+  }\r
   \r
   //\r
-  // If we drop to here, we don't have a Variable entry in\r
-  // the variable service yet. So, we will save the data\r
-  // in the PCD Database's volatile area.\r
+  // If we drop to here, the value is failed to be written in to variable area\r
+  // So, we will save the data in the PCD Database's volatile area.\r
   //\r
   return Status;\r
 }\r
@@ -1113,33 +1155,36 @@ GetSkuIdArray (
   \r
 }\r
 \r
-\r
 /**\r
-  Get index of PCD entry in size table.\r
-\r
+  Wrapper function of getting index of PCD entry in size table.\r
+  \r
   @param LocalTokenNumberTableIdx Index of this PCD in local token number table.\r
-  @param LocalTokenNumberTable    Pointer to local token number table in PCD database.\r
   @param IsPeiDb                  If TRUE, the pcd entry is initialized in PEI phase,\r
                                   If FALSE, the pcd entry is initialized in DXE phase.\r
 \r
   @return index of PCD entry in size table.\r
-\r
 **/\r
 UINTN\r
-GetSizeTableIndexA (\r
-  IN UINTN        LocalTokenNumberTableIdx,\r
-  IN UINT32       *LocalTokenNumberTable,\r
-  IN BOOLEAN      IsPeiDb\r
+GetSizeTableIndex (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  IN    BOOLEAN           IsPeiDb\r
   )\r
 {\r
-  UINTN       Index;\r
-  UINTN       SizeTableIdx;\r
-  UINTN       LocalTokenNumber;\r
-  SKU_ID      *SkuIdTable;\r
+  UINT32 *LocalTokenNumberTable;\r
+  UINTN  LocalTokenNumber;\r
+  UINTN  Index;\r
+  UINTN  SizeTableIdx;\r
+  SKU_ID *SkuIdTable;\r
   \r
+  if (IsPeiDb) {\r
+    LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
+  } else {\r
+    LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+  }\r
+\r
   SizeTableIdx = 0;\r
 \r
-  for (Index=0; Index<LocalTokenNumberTableIdx; Index++) {\r
+  for (Index = 0; Index < LocalTokenNumberTableIdx; Index ++) {\r
     LocalTokenNumber = LocalTokenNumberTable[Index];\r
 \r
     if ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER) {\r
@@ -1176,36 +1221,7 @@ GetSizeTableIndexA (
 \r
   }\r
 \r
-  return SizeTableIdx;\r
-}\r
-\r
-\r
-\r
-/**\r
-  Wrapper function of getting index of PCD entry in size table.\r
-  \r
-  @param LocalTokenNumberTableIdx Index of this PCD in local token number table.\r
-  @param IsPeiDb                  If TRUE, the pcd entry is initialized in PEI phase,\r
-                                  If FALSE, the pcd entry is initialized in DXE phase.\r
-\r
-  @return index of PCD entry in size table.\r
-**/\r
-UINTN\r
-GetSizeTableIndex (\r
-  IN    UINTN             LocalTokenNumberTableIdx,\r
-  IN    BOOLEAN           IsPeiDb\r
-  )\r
-{\r
-  UINT32 *LocalTokenNumberTable;\r
-  \r
-  if (IsPeiDb) {\r
-    LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
-  } else {\r
-    LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
-  }\r
-  return GetSizeTableIndexA (LocalTokenNumberTableIdx, \r
-                             LocalTokenNumberTable,\r
-                             IsPeiDb);\r
+  return SizeTableIdx;  \r
 }\r
 \r
 /**\r