From 85d0b97d8d60fdcc740ae21f19c06ab0eeba9950 Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Tue, 14 Apr 2015 08:54:11 +0000 Subject: [PATCH] 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 Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17173 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Universal/PCD/Dxe/Pcd.c | 41 +++++++++++++++--------- MdeModulePkg/Universal/PCD/Dxe/Service.c | 15 ++++++++- MdeModulePkg/Universal/PCD/Pei/Pcd.c | 32 +++++++++++------- MdeModulePkg/Universal/PCD/Pei/Service.c | 9 +++++- 4 files changed, 68 insertions(+), 29 deletions(-) diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c index 6afcd18dff..14d47849d8 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 7b0932a6e4..9b4701bdd7 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.
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
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 @@ -147,6 +147,19 @@ GetPcdName ( CHAR8 *PcdName; 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 diff --git a/MdeModulePkg/Universal/PCD/Pei/Pcd.c b/MdeModulePkg/Universal/PCD/Pei/Pcd.c index 91e94e263d..e6b1c15c44 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.
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
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 af40db8319..83309a6f39 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.
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
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 @@ -112,6 +112,13 @@ GetPcdName ( CHAR8 *PcdName; 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 -- 2.39.2