]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Support HII VOID* dynamic/dynamicEx type PCD.
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 11 Feb 2010 08:19:29 +0000 (08:19 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 11 Feb 2010 08:19:29 +0000 (08:19 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9990 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/PCD/Dxe/Service.c
MdeModulePkg/Universal/PCD/Pei/Service.c

index 59038fb45213562935bd6cce5b2fd396e49d0ebc..fc6f6b4414f82667a03f0ea46a1e6c37b762eb17 100644 (file)
@@ -122,6 +122,7 @@ GetWorker (
       RetPtr = (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
       break;\r
       \r
+    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
     case PCD_TYPE_HII:\r
       if (IsPeiDb) {\r
         GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);\r
@@ -130,34 +131,56 @@ GetWorker (
       }\r
                               \r
       VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
-      \r
       Guid = GuidTable + VariableHead->GuidTableIndex;\r
       Name = (UINT16*)(StringTable + VariableHead->StringIndex);\r
-      VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
-\r
-      Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
-      if (Status == EFI_SUCCESS) {\r
-        if (GetSize == 0) {\r
-          //\r
-          // It is a pointer type. So get the MaxSize reserved for\r
-          // this PCD entry.\r
-          //\r
-          GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
+      \r
+      if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
+           //\r
+               // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of \r
+               // string array in string table.\r
+               //\r
+        StringTableIdx = *(UINT16*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);   \r
+        VaraiableDefaultBuffer = (VOID *) (StringTable + StringTableIdx);     \r
+        Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+        if (Status == EFI_SUCCESS) {\r
+          if (GetSize == 0) {\r
+            //\r
+            // It is a pointer type. So get the MaxSize reserved for\r
+            // this PCD entry.\r
+            //\r
+            GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
+          }\r
+          CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
+          FreePool (Data);\r
         }\r
-        CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
-        FreePool (Data);\r
+        RetPtr = (VOID *) VaraiableDefaultBuffer;                \r
+      } else {\r
+        VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
+  \r
+        Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+        if (Status == EFI_SUCCESS) {\r
+          if (GetSize == 0) {\r
+            //\r
+            // It is a pointer type. So get the MaxSize reserved for\r
+            // this PCD entry.\r
+            //\r
+            GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
+          }\r
+          CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
+          FreePool (Data);\r
+        }\r
+        //\r
+        // If the operation is successful, we copy the data\r
+        // to the default value buffer in the PCD Database.\r
+        // So that we can free the Data allocated in GetHiiVariable.\r
+        //\r
+        //\r
+        // If the operation is not successful, \r
+        // Return 1) either the default value specified by Platform Integrator \r
+        //        2) Or the value Set by a PCD set operation.\r
+        //\r
+        RetPtr = (VOID *) VaraiableDefaultBuffer;\r
       }\r
-      //\r
-      // If the operation is successful, we copy the data\r
-      // to the default value buffer in the PCD Database.\r
-      // So that we can free the Data allocated in GetHiiVariable.\r
-      //\r
-      //\r
-      // If the operation is not successful, \r
-      // Return 1) either the default value specified by Platform Integrator \r
-      //        2) Or the value Set by a PCD set operation.\r
-      //\r
-      RetPtr = (VOID *) VaraiableDefaultBuffer;\r
       break;\r
 \r
     case PCD_TYPE_STRING:\r
@@ -788,6 +811,7 @@ SetWorker (
       }\r
       break;\r
 \r
+    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
     case PCD_TYPE_HII:\r
       if (PtrType) {\r
         if (!SetPtrTypeSize (TmpTokenNumber, Size)) {\r
@@ -807,13 +831,20 @@ SetWorker (
       Guid = GuidTable + VariableHead->GuidTableIndex;\r
       Name = (UINT16*) (StringTable + VariableHead->StringIndex);\r
       VariableOffset = VariableHead->Offset;\r
-\r
       Status = SetHiiVariable (Guid, Name, Data, *Size, VariableOffset);\r
-\r
+      \r
       if (EFI_NOT_FOUND == Status) {\r
-        CopyMem (PcdDb + VariableHead->DefaultValueOffset, Data, *Size);\r
+        if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING))  {\r
+          CopyMem (\r
+            StringTable + *(UINT16 *)(PcdDb + VariableHead->DefaultValueOffset),\r
+            Data,\r
+            *Size\r
+            );\r
+        } else {\r
+          CopyMem (PcdDb + VariableHead->DefaultValueOffset, Data, *Size);\r
+        } \r
         Status = EFI_SUCCESS;\r
-      } \r
+      }\r
       break;\r
       \r
     case PCD_TYPE_DATA:\r
index ab3059c7356ad3fbe72db401f4331118aaf07e7f..66e72f75e78c44b22ded2274b8ac55c664bb7f5e 100644 (file)
@@ -412,6 +412,7 @@ SetWorker (
   switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
     case PCD_TYPE_HII:\r
+    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
     {\r
       ASSERT (FALSE);\r
       return EFI_INVALID_PARAMETER;\r
@@ -624,6 +625,7 @@ GetWorker (
       return (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
     }\r
       \r
+    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
     case PCD_TYPE_HII:\r
     {\r
       VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
@@ -639,7 +641,11 @@ GetWorker (
         //\r
         // Return the default value specified by Platform Integrator \r
         //\r
-        return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset);\r
+        if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
+          return (VOID*)&StringTable[*(UINT16*)((UINT8*)PeiPcdDb + VariableHead->DefaultValueOffset)];\r
+        } else {\r
+          return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset);\r
+        }\r
       }\r
     }\r
 \r