]> 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 b8ed5b2119f649885a26e2165ec4584b9a15944f..daaba4b539615654c82be19f0a959ed28e081eb2 100644 (file)
@@ -667,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