summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStar Zeng <star.zeng@intel.com>2015-04-14 08:54:11 +0000
committerlzeng14 <lzeng14@Edk2>2015-04-14 08:54:11 +0000
commit85d0b97d8d60fdcc740ae21f19c06ab0eeba9950 (patch)
tree2a4580a05bc2f5962c50145f48a329266d743eec
parenta4d42c22d23fe19634e10f6c1a2ce1badccd6233 (diff)
MdeModulePkg Pcd: Check the input SkuId in SetSku()
then GetSku() could return the currently active SkuId. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17173 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--MdeModulePkg/Universal/PCD/Dxe/Pcd.c41
-rw-r--r--MdeModulePkg/Universal/PCD/Dxe/Service.c15
-rw-r--r--MdeModulePkg/Universal/PCD/Pei/Pcd.c32
-rw-r--r--MdeModulePkg/Universal/PCD/Pei/Service.c9
4 files changed, 68 insertions, 29 deletions
diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c
index 6afcd18df..14d47849d 100644
--- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c
+++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c
@@ -152,21 +152,16 @@ PcdDxeInit (
ASSERT_EFI_ERROR (Status);
//
- // Only install PcdInfo PROTOCOL when PCD info content is present.
+ // Install GET_PCD_INFO_PROTOCOL to handle dynamic type PCD
+ // Install EFI_GET_PCD_INFO_PROTOCOL to handle dynamicEx type PCD
//
- if (mPcdDatabase.DxeDb->PcdNameTableOffset != 0) {
- //
- // Install GET_PCD_INFO_PROTOCOL to handle dynamic type PCD
- // Install EFI_GET_PCD_INFO_PROTOCOL to handle dynamicEx type PCD
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &mPcdHandle,
- &gGetPcdInfoProtocolGuid, &mGetPcdInfoInstance,
- &gEfiGetPcdInfoProtocolGuid, &mEfiGetPcdInfoInstance,
- NULL
- );
- ASSERT_EFI_ERROR (Status);
- }
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &mPcdHandle,
+ &gGetPcdInfoProtocolGuid, &mGetPcdInfoInstance,
+ &gEfiGetPcdInfoProtocolGuid, &mEfiGetPcdInfoInstance,
+ NULL
+ );
+ ASSERT_EFI_ERROR (Status);
//
// Register callback function upon VariableLockProtocol
@@ -274,8 +269,22 @@ DxePcdSetSku (
IN UINTN SkuId
)
{
- mPcdDatabase.DxeDb->SystemSkuId = (SKU_ID) SkuId;
-
+ SKU_ID *SkuIdTable;
+ UINTN Index;
+
+ SkuIdTable = (SKU_ID *) ((UINT8 *) mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->SkuIdTableOffset);
+ for (Index = 0; Index < SkuIdTable[0]; Index++) {
+ if (SkuId == SkuIdTable[Index + 1]) {
+ mPcdDatabase.DxeDb->SystemSkuId = (SKU_ID) SkuId;
+ return;
+ }
+ }
+
+ //
+ // Invalid input SkuId, the default SKU Id will be used for the system.
+ //
+ DEBUG ((EFI_D_INFO, "PcdDxe - Invalid input SkuId, the default SKU Id will be used.\n"));
+ mPcdDatabase.DxeDb->SystemSkuId = (SKU_ID) 0;
return;
}
diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.c b/MdeModulePkg/Universal/PCD/Dxe/Service.c
index 7b0932a6e..9b4701bdd 100644
--- a/MdeModulePkg/Universal/PCD/Dxe/Service.c
+++ b/MdeModulePkg/Universal/PCD/Dxe/Service.c
@@ -2,7 +2,7 @@
Help functions used by PCD DXE driver.
Copyright (c) 2014, Hewlett-Packard Development Company, L.P.<BR>
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -148,6 +148,19 @@ GetPcdName (
CHAR8 *Name;
//
+ // Return NULL when PCD name table is absent.
+ //
+ if (IsPeiDb) {
+ if (mPcdDatabase.PeiDb->PcdNameTableOffset == 0) {
+ return NULL;
+ }
+ } else {
+ if (mPcdDatabase.DxeDb->PcdNameTableOffset == 0) {
+ return NULL;
+ }
+ }
+
+ //
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
// We have to decrement TokenNumber by 1 to make it usable
// as the array index.
diff --git a/MdeModulePkg/Universal/PCD/Pei/Pcd.c b/MdeModulePkg/Universal/PCD/Pei/Pcd.c
index 91e94e263..e6b1c15c4 100644
--- a/MdeModulePkg/Universal/PCD/Pei/Pcd.c
+++ b/MdeModulePkg/Universal/PCD/Pei/Pcd.c
@@ -1,7 +1,7 @@
/** @file
All Pcd Ppi services are implemented here.
-Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -158,15 +158,10 @@ PcdPeimInit (
ASSERT_EFI_ERROR (Status);
//
- // Only install PcdInfo PPI when PCD info content is present.
+ // Install GET_PCD_INFO_PPI and EFI_GET_PCD_INFO_PPI.
//
- if (DataBase->PcdNameTableOffset != 0) {
- //
- // Install GET_PCD_INFO_PPI and EFI_GET_PCD_INFO_PPI.
- //
- Status = PeiServicesInstallPpi (&mPpiList2[0]);
- ASSERT_EFI_ERROR (Status);
- }
+ Status = PeiServicesInstallPpi (&mPpiList2[0]);
+ ASSERT_EFI_ERROR (Status);
return Status;
}
@@ -262,9 +257,24 @@ PeiPcdSetSku (
IN UINTN SkuId
)
{
+ PEI_PCD_DATABASE *PeiPcdDb;
+ SKU_ID *SkuIdTable;
+ UINTN Index;
+
+ PeiPcdDb = GetPcdDatabase();
+ SkuIdTable = (SKU_ID *) ((UINT8 *) PeiPcdDb + PeiPcdDb->SkuIdTableOffset);
+ for (Index = 0; Index < SkuIdTable[0]; Index++) {
+ if (SkuId == SkuIdTable[Index + 1]) {
+ PeiPcdDb->SystemSkuId = (SKU_ID) SkuId;
+ return;
+ }
+ }
- GetPcdDatabase()->SystemSkuId = (SKU_ID) SkuId;
-
+ //
+ // Invalid input SkuId, the default SKU Id will be used for the system.
+ //
+ DEBUG ((EFI_D_INFO, "PcdPei - Invalid input SkuId, the default SKU Id will be used.\n"));
+ PeiPcdDb->SystemSkuId = (SKU_ID) 0;
return;
}
diff --git a/MdeModulePkg/Universal/PCD/Pei/Service.c b/MdeModulePkg/Universal/PCD/Pei/Service.c
index af40db831..83309a6f3 100644
--- a/MdeModulePkg/Universal/PCD/Pei/Service.c
+++ b/MdeModulePkg/Universal/PCD/Pei/Service.c
@@ -2,7 +2,7 @@
The driver internal functions are implmented here.
They build Pei PCD database, and provide access service to PCD database.
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -113,6 +113,13 @@ GetPcdName (
CHAR8 *Name;
//
+ // Return NULL when PCD name table is absent.
+ //
+ if (Database->PcdNameTableOffset == 0) {
+ return NULL;
+ }
+
+ //
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
// We have to decrement TokenNumber by 1 to make it usable
// as the array index.