]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Make EDK Module Package pass Intel IPF compiler with /Ox switch.
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
index 6d90671852690becb94a2fab62c0fc6071fed955..daaba4b539615654c82be19f0a959ed28e081eb2 100644 (file)
@@ -101,7 +101,7 @@ PeiPcdSetSku (
 UINT8\r
 EFIAPI\r
 PeiPcdGet8 (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
@@ -112,7 +112,7 @@ PeiPcdGet8 (
 UINT16\r
 EFIAPI\r
 PeiPcdGet16 (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
@@ -123,7 +123,7 @@ PeiPcdGet16 (
 UINT32\r
 EFIAPI\r
 PeiPcdGet32 (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
@@ -134,7 +134,7 @@ PeiPcdGet32 (
 UINT64\r
 EFIAPI\r
 PeiPcdGet64 (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
@@ -145,7 +145,7 @@ PeiPcdGet64 (
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtr (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return GetWorker (TokenNumber, 0);\r
@@ -156,7 +156,7 @@ PeiPcdGetPtr (
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBool (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
@@ -167,13 +167,22 @@ PeiPcdGetBool (
 UINTN\r
 EFIAPI\r
 PeiPcdGetSize (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   PEI_PCD_DATABASE    *PeiPcdDb;\r
   UINTN               Size;\r
   UINTN               MaxSize;\r
 \r
+  //\r
+  // If DebugAssertEnabled is TRUE, we still need to provide the GET size\r
+  // function as GetWorker and SetWoker need this function to do ASSERT.\r
+  //\r
+  if ((!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled)) &&\r
+      (!DebugAssertEnabled ())) {\r
+    return 0;\r
+  }\r
+\r
   PeiPcdDb = GetPcdDatabase ();\r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -182,7 +191,10 @@ PeiPcdGetSize (
   //\r
   TokenNumber--;\r
 \r
-  ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+  // EBC compiler is very choosy. It may report warning about comparison\r
+  // between UINTN and 0 . So we add 1 in each size of the \r
+  // comparison.\r
+  ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
 \r
   Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
 \r
@@ -202,8 +214,8 @@ PeiPcdGetSize (
 UINT8\r
 EFIAPI\r
 PeiPcdGet8Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
@@ -214,8 +226,8 @@ PeiPcdGet8Ex (
 UINT16\r
 EFIAPI\r
 PeiPcdGet16Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
@@ -226,8 +238,8 @@ PeiPcdGet16Ex (
 UINT32\r
 EFIAPI\r
 PeiPcdGet32Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
@@ -238,8 +250,8 @@ PeiPcdGet32Ex (
 UINT64\r
 EFIAPI\r
 PeiPcdGet64Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
@@ -250,8 +262,8 @@ PeiPcdGet64Ex (
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtrEx (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return ExGetWorker (Guid, ExTokenNumber, 0);\r
@@ -262,8 +274,8 @@ PeiPcdGetPtrEx (
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBoolEx (\r
-  IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                             ExTokenNumber\r
+  IN CONST  EFI_GUID              *Guid,\r
+  IN UINTN                        ExTokenNumber\r
   )\r
 {\r
   return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
@@ -274,10 +286,14 @@ PeiPcdGetBoolEx (
 UINTN\r
 EFIAPI\r
 PeiPcdGetSizeEx (\r
-  IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                             ExTokenNumber\r
+  IN CONST  EFI_GUID              *Guid,\r
+  IN UINTN                        ExTokenNumber\r
   )\r
 {\r
+  if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) ||  !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) {\r
+    return 0;\r
+  }\r
+\r
   return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
 }\r
 \r
@@ -298,8 +314,8 @@ PeiPcdSet8 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet16 (\r
-  IN UINTN                          TokenNumber,\r
-  IN UINT16                         Value\r
+  IN UINTN                         TokenNumber,\r
+  IN UINT16                        Value\r
   )\r
 {\r
   return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
@@ -310,8 +326,8 @@ PeiPcdSet16 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet32 (\r
-  IN UINTN                          TokenNumber,\r
-  IN UINT32                         Value\r
+  IN UINTN                         TokenNumber,\r
+  IN UINT32                        Value\r
   )\r
 {\r
   return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
@@ -322,8 +338,8 @@ PeiPcdSet32 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet64 (\r
-  IN UINTN                          TokenNumber,\r
-  IN UINT64                         Value\r
+  IN UINTN                         TokenNumber,\r
+  IN UINT64                        Value\r
   )\r
 {\r
   return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
@@ -333,9 +349,9 @@ PeiPcdSet64 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtr (\r
-  IN      UINTN                         TokenNumber,\r
-  IN OUT  UINTN                         *SizeOfBuffer,\r
-  IN      VOID                          *Buffer\r
+  IN      UINTN                    TokenNumber,\r
+  IN OUT  UINTN                    *SizeOfBuffer,\r
+  IN      VOID                     *Buffer\r
   )\r
 {\r
   return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
@@ -346,8 +362,8 @@ PeiPcdSetPtr (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetBool (\r
-  IN UINTN                          TokenNumber,\r
-  IN BOOLEAN                        Value\r
+  IN UINTN                         TokenNumber,\r
+  IN BOOLEAN                       Value\r
   )\r
 {\r
   return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
@@ -358,9 +374,9 @@ PeiPcdSetBool (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet8Ex (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINT8                  Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINT8                        Value\r
   )\r
 {\r
   return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
@@ -371,9 +387,9 @@ PeiPcdSet8Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet16Ex (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINT16                 Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINT16                       Value\r
   )\r
 {\r
   return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
@@ -384,9 +400,9 @@ PeiPcdSet16Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet32Ex (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINT32                 Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINT32                       Value\r
   )\r
 {\r
   return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
@@ -397,9 +413,9 @@ PeiPcdSet32Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet64Ex (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINT64                 Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINT64                       Value\r
   )\r
 {\r
   return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
@@ -410,10 +426,10 @@ PeiPcdSet64Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtrEx (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINTN                  *SizeOfBuffer,\r
-  IN VOID                   *Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINTN                        *SizeOfBuffer,\r
+  IN VOID                         *Value\r
   )\r
 {\r
   return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
@@ -424,9 +440,9 @@ PeiPcdSetPtrEx (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetBoolEx (\r
-  IN CONST EFI_GUID       *Guid,\r
-  IN UINTN                ExTokenNumber,\r
-  IN BOOLEAN              Value\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber,\r
+  IN BOOLEAN                    Value\r
   )\r
 {\r
   return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
@@ -438,11 +454,15 @@ PeiPcdSetBoolEx (
 EFI_STATUS\r
 EFIAPI\r
 PeiRegisterCallBackOnSet (\r
-  IN  UINTN                       ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
+  IN  UINTN                       ExTokenNumber,\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
+  if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (CallBackFunction != NULL);\r
   \r
   return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
@@ -453,11 +473,15 @@ PeiRegisterCallBackOnSet (
 EFI_STATUS\r
 EFIAPI\r
 PcdUnRegisterCallBackOnSet (\r
-  IN  UINTN                       ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
+  IN  UINTN                       ExTokenNumber,\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
+  if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (CallBackFunction != NULL);\r
   \r
   return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
@@ -478,15 +502,25 @@ PeiPcdGetNextToken (
   DYNAMICEX_MAPPING   *ExMapTable;\r
   UINTN               i;\r
   BOOLEAN             Found;\r
-    \r
+  BOOLEAN             PeiExMapTableEmpty;\r
+\r
+  if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;\r
+\r
   if (Guid == NULL) {\r
+    if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
     (*TokenNumber)++;\r
     if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
       *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
     }\r
     return EFI_SUCCESS;\r
   } else {\r
-    if (PEI_EXMAP_TABLE_EMPTY) {\r
+    if (PeiExMapTableEmpty) {\r
       *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
       return EFI_SUCCESS;\r
     }\r
@@ -557,7 +591,7 @@ PeiPcdGetNextToken (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdGetNextTokenSpace (\r
-  IN OUT CONST EFI_GUID               **Guid\r
+  IN OUT CONST EFI_GUID          **Guid\r
   )\r
 {\r
   UINTN               GuidTableIdx;\r
@@ -566,10 +600,17 @@ PeiPcdGetNextTokenSpace (
   DYNAMICEX_MAPPING   *ExMapTable;\r
   UINTN               i;\r
   BOOLEAN             Found;\r
+  BOOLEAN             PeiExMapTableEmpty;\r
+\r
+  if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
 \r
   ASSERT (Guid != NULL);\r
 \r
-  if (PEI_EXMAP_TABLE_EMPTY) {\r
+  PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;\r
+\r
+  if (PeiExMapTableEmpty) {\r
     if (*Guid != NULL) {\r
       return EFI_NOT_FOUND;\r
     } else {\r
@@ -626,3 +667,130 @@ PeiPcdGetNextTokenSpace (
 \r
 }\r
 \r
+UINTN\r
+GetPtrTypeSize (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  OUT   UINTN             *MaxSize,\r
+  IN    PEI_PCD_DATABASE  *Database\r
+  )\r
+{\r
+  INTN        SizeTableIdx;\r
+  UINTN       LocalTokenNumber;\r
+  SKU_ID      *SkuIdTable;\r
+  SIZE_INFO   *SizeTable;\r
+  UINTN       i;\r
+\r
+  SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
+\r
+  LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
+  \r
+  SizeTable = Database->Init.SizeTable;\r
+\r
+  *MaxSize = SizeTable[SizeTableIdx];\r
+  //\r
+  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+  // PCD entry.\r
+  //\r
+  if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+      //\r
+      // We have only one entry for VPD enabled PCD entry:\r
+      // 1) MAX Size.\r
+      // We consider current size is equal to MAX size.\r
+      //\r
+      return *MaxSize;\r
+  } else {\r
+    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+      //\r
+      // We have only two entry for Non-Sku enabled PCD entry:\r
+      // 1) MAX SIZE\r
+      // 2) Current Size\r
+      //\r
+      return SizeTable[SizeTableIdx + 1];\r
+    } else {\r
+      //\r
+      // We have these entry for SKU enabled PCD entry\r
+      // 1) MAX SIZE\r
+      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+      //\r
+      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
+      for (i = 0; i < SkuIdTable[0]; i++) {\r
+        if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
+          return SizeTable[SizeTableIdx + 1 + i];\r
+        }\r
+      }\r
+      return SizeTable[SizeTableIdx + 1];\r
+    }\r
+  }\r
+}\r
+\r
+\r
+\r
+BOOLEAN\r
+SetPtrTypeSize (\r
+  IN          UINTN             LocalTokenNumberTableIdx,\r
+  IN    OUT   UINTN             *CurrentSize,\r
+  IN          PEI_PCD_DATABASE  *Database\r
+  )\r
+{\r
+  INTN        SizeTableIdx;\r
+  UINTN       LocalTokenNumber;\r
+  SKU_ID      *SkuIdTable;\r
+  SIZE_INFO   *SizeTable;\r
+  UINTN       i;\r
+  UINTN       MaxSize;\r
+  \r
+  SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
+\r
+  LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
+  \r
+  SizeTable = Database->Init.SizeTable;\r
+\r
+  MaxSize = SizeTable[SizeTableIdx];\r
+  //\r
+  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+  // PCD entry.\r
+  //\r
+  if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+      //\r
+      // We shouldn't come here as we don't support SET for VPD\r
+      //\r
+      ASSERT (FALSE);\r
+      return FALSE;\r
+  } else {\r
+    if ((*CurrentSize > MaxSize) ||\r
+      (*CurrentSize == MAX_ADDRESS)) {\r
+       *CurrentSize = MaxSize;\r
+       return FALSE;\r
+    } \r
+    \r
+    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+      //\r
+      // We have only two entry for Non-Sku enabled PCD entry:\r
+      // 1) MAX SIZE\r
+      // 2) Current Size\r
+      //\r
+      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+      return TRUE;\r
+    } else {\r
+      //\r
+      // We have these entry for SKU enabled PCD entry\r
+      // 1) MAX SIZE\r
+      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+      //\r
+      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
+      for (i = 0; i < SkuIdTable[0]; i++) {\r
+        if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
+          SizeTable[SizeTableIdx + 1 + i] = (SIZE_INFO) *CurrentSize;\r
+          return TRUE;\r
+        }\r
+      }\r
+      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+      return TRUE;\r
+    }\r
+  }\r
+\r
+}\r