X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FPei%2FPcd.c;h=031259b22a6e694ecf68a1319a7d88186c363187;hb=4c114006de95489973d33a5415bb451bcd6cd62a;hp=3fb49dd54f925617256f56c9168d91b4b15dd128;hpb=878ddf1fc3540a715f63594ed22b6929e881afb4;p=mirror_edk2.git diff --git a/EdkModulePkg/Universal/PCD/Pei/Pcd.c b/EdkModulePkg/Universal/PCD/Pei/Pcd.c index 3fb49dd54f..031259b22a 100644 --- a/EdkModulePkg/Universal/PCD/Pei/Pcd.c +++ b/EdkModulePkg/Universal/PCD/Pei/Pcd.c @@ -1,5 +1,4 @@ -/** @file -PCD PEIM +/** @file PCD PEIM Copyright (c) 2006, Intel Corporation All rights reserved. This program and the accompanying materials @@ -15,7 +14,6 @@ Module Name: Pcd.c **/ -#include "../Common/PcdCommon.h" #include "Service.h" @@ -52,7 +50,7 @@ PCD_PPI mPcdPpiInstance = { PeiPcdSetPtrEx, PeiPcdSetBoolEx, - PcdRegisterCallBackOnSet, + PeiRegisterCallBackOnSet, PcdUnRegisterCallBackOnSet, PeiPcdGetNextToken }; @@ -75,12 +73,9 @@ PcdPeimInit ( ) { EFI_STATUS Status; - UINT8 *PcdImage; - - PcdImage = (UINT8 *) LocatePcdImage (); - - BuildPcdDatabase (PcdImage); + BuildPcdDatabase (); + Status = PeiCoreInstallPpi (&mPpiPCD); ASSERT_EFI_ERROR (Status); @@ -88,25 +83,16 @@ PcdPeimInit ( return EFI_SUCCESS; } - - -EFI_STATUS +VOID EFIAPI PeiPcdSetSku ( - IN UINTN SkuId + IN SKU_ID SkuId ) { - PCD_DATABASE *Database; - EFI_HOB_GUID_TYPE *GuidHob; - - GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid); - ASSERT (GuidHob != NULL); - - Database = (PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob); - Database->Info.SkuId = SkuId; + GetPcdDatabase()->Init.SystemSkuId = SkuId; - return SkuId; + return; } @@ -114,10 +100,10 @@ PeiPcdSetSku ( UINT8 EFIAPI PeiPcdGet8 ( - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER TokenNumber ) { - return PeiPcdGet8Ex (NULL, TokenNumber); + return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8))); } @@ -125,10 +111,10 @@ PeiPcdGet8 ( UINT16 EFIAPI PeiPcdGet16 ( - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER TokenNumber ) { - return PeiPcdGet16Ex (NULL, TokenNumber); + return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16))); } @@ -136,10 +122,10 @@ PeiPcdGet16 ( UINT32 EFIAPI PeiPcdGet32 ( - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER TokenNumber ) { - return PeiPcdGet32Ex (NULL, TokenNumber); + return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32))); } @@ -147,10 +133,10 @@ PeiPcdGet32 ( UINT64 EFIAPI PeiPcdGet64 ( - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER TokenNumber ) { - return PeiPcdGet64Ex (NULL, TokenNumber); + return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64))); } @@ -158,10 +144,10 @@ PeiPcdGet64 ( VOID * EFIAPI PeiPcdGetPtr ( - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER TokenNumber ) { - return PeiPcdGetPtrEx (NULL, TokenNumber); + return GetWorker (TokenNumber, 0); } @@ -169,10 +155,10 @@ PeiPcdGetPtr ( BOOLEAN EFIAPI PeiPcdGetBool ( - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER TokenNumber ) { - return PeiPcdGetBoolEx (NULL, TokenNumber); + return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN))); } @@ -180,10 +166,12 @@ PeiPcdGetBool ( UINTN EFIAPI PeiPcdGetSize ( - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER TokenNumber ) { - return PeiPcdGetSizeEx (NULL, TokenNumber); + ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + + return GetPcdDatabase()->Init.SizeTable[TokenNumber]; } @@ -192,14 +180,10 @@ UINT8 EFIAPI PeiPcdGet8Ex ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER ExTokenNumber ) { - UINT8 Data; - - PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Data); - - return Data; + return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8))); } @@ -208,14 +192,10 @@ UINT16 EFIAPI PeiPcdGet16Ex ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER ExTokenNumber ) { - UINT16 Data; - - PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Data); - - return Data; + return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16))); } @@ -224,14 +204,10 @@ UINT32 EFIAPI PeiPcdGet32Ex ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER ExTokenNumber ) { - UINT32 Data; - - PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Data); - - return Data; + return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32))); } @@ -240,14 +216,10 @@ UINT64 EFIAPI PeiPcdGet64Ex ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER ExTokenNumber ) { - UINT64 Data; - - PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Data); - - return Data; + return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64))); } @@ -256,14 +228,10 @@ VOID * EFIAPI PeiPcdGetPtrEx ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER ExTokenNumber ) { - VOID *Data; - - PeiGetPcdEntryWorker (TokenNumber, Guid, PcdPointer, &Data); - - return Data; + return ExGetWorker (Guid, ExTokenNumber, 0); } @@ -272,14 +240,10 @@ BOOLEAN EFIAPI PeiPcdGetBoolEx ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER ExTokenNumber ) { - BOOLEAN Data; - - PeiGetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Data); - - return Data; + return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN))); } @@ -288,10 +252,14 @@ UINTN EFIAPI PeiPcdGetSizeEx ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber + IN PCD_TOKEN_NUMBER ExTokenNumber ) { - return PeiGetPcdEntrySizeWorker (TokenNumber, Guid); + EX_PCD_ENTRY_ATTRIBUTE Attr; + + GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr); + + return Attr.Size; } @@ -299,11 +267,11 @@ PeiPcdGetSizeEx ( EFI_STATUS EFIAPI PeiPcdSet8 ( - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER TokenNumber, IN UINT8 Value ) { - return PeiPcdSet8Ex (NULL, TokenNumber, Value); + return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); } @@ -311,11 +279,11 @@ PeiPcdSet8 ( EFI_STATUS EFIAPI PeiPcdSet16 ( - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER TokenNumber, IN UINT16 Value ) { - return PeiPcdSet16Ex (NULL, TokenNumber, Value); + return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); } @@ -323,11 +291,11 @@ PeiPcdSet16 ( EFI_STATUS EFIAPI PeiPcdSet32 ( - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER TokenNumber, IN UINT32 Value ) { - return PeiPcdSet32Ex (NULL, TokenNumber, Value); + return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); } @@ -335,22 +303,23 @@ PeiPcdSet32 ( EFI_STATUS EFIAPI PeiPcdSet64 ( - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER TokenNumber, IN UINT64 Value ) { - return PeiPcdSet64Ex (NULL, TokenNumber, Value); + return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); } EFI_STATUS EFIAPI PeiPcdSetPtr ( - IN UINTN TokenNumber, - IN CONST VOID *Value + IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN SizeOfBuffer, + IN VOID *Buffer ) { - return PeiPcdSetPtrEx (NULL, TokenNumber, Value); + return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE); } @@ -358,11 +327,11 @@ PeiPcdSetPtr ( EFI_STATUS EFIAPI PeiPcdSetBool ( - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER TokenNumber, IN BOOLEAN Value ) { - return PeiPcdSetBoolEx (NULL, TokenNumber, Value); + return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); } @@ -371,11 +340,17 @@ EFI_STATUS EFIAPI PeiPcdSet8Ex ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER ExTokenNumber, IN UINT8 Value ) { - return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Value); + return ExSetWorker( + ExTokenNumber, + Guid, + &Value, + sizeof (Value), + FALSE + ); } @@ -384,11 +359,17 @@ EFI_STATUS EFIAPI PeiPcdSet16Ex ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER ExTokenNumber, IN UINT16 Value ) { - return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Value); + return ExSetWorker( + ExTokenNumber, + Guid, + &Value, + sizeof (Value), + FALSE + ); } @@ -397,11 +378,17 @@ EFI_STATUS EFIAPI PeiPcdSet32Ex ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER ExTokenNumber, IN UINT32 Value ) { - return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Value); + return ExSetWorker( + ExTokenNumber, + Guid, + &Value, + sizeof (Value), + FALSE + ); } @@ -410,11 +397,17 @@ EFI_STATUS EFIAPI PeiPcdSet64Ex ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER ExTokenNumber, IN UINT64 Value ) { - return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Value); + return ExSetWorker( + ExTokenNumber, + Guid, + &Value, + sizeof (Value), + FALSE + ); } @@ -423,11 +416,18 @@ EFI_STATUS EFIAPI PeiPcdSetPtrEx ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber, - IN CONST VOID *Value + IN PCD_TOKEN_NUMBER ExTokenNumber, + IN UINTN SizeOfBuffer, + IN VOID *Value ) { - return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdPointer, (VOID *)Value); + return ExSetWorker( + ExTokenNumber, + Guid, + Value, + SizeOfBuffer, + TRUE + ); } @@ -436,12 +436,17 @@ EFI_STATUS EFIAPI PeiPcdSetBoolEx ( IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER ExTokenNumber, IN BOOLEAN Value ) { - return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Value); - + return ExSetWorker( + ExTokenNumber, + Guid, + &Value, + sizeof (Value), + FALSE + ); } @@ -449,13 +454,15 @@ PeiPcdSetBoolEx ( EFI_STATUS EFIAPI -PcdRegisterCallBackOnSet ( - IN UINTN TokenNumber, +PeiRegisterCallBackOnSet ( + IN PCD_TOKEN_NUMBER ExTokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL IN PCD_PPI_CALLBACK CallBackFunction ) { - return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE); + ASSERT (CallBackFunction != NULL); + + return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE); } @@ -463,12 +470,14 @@ PcdRegisterCallBackOnSet ( EFI_STATUS EFIAPI PcdUnRegisterCallBackOnSet ( - IN UINTN TokenNumber, + IN PCD_TOKEN_NUMBER ExTokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL IN PCD_PPI_CALLBACK CallBackFunction ) { - return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, FALSE); + ASSERT (CallBackFunction != NULL); + + return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE); } @@ -477,10 +486,138 @@ EFI_STATUS EFIAPI PeiPcdGetNextToken ( IN CONST EFI_GUID *Guid, OPTIONAL - IN OUT UINTN *TokenNumber + IN OUT PCD_TOKEN_NUMBER *TokenNumber ) { - return PeiGetNextTokenWorker (TokenNumber, Guid); + UINTN GuidTableIdx; + PEI_PCD_DATABASE *PeiPcdDb; + EFI_GUID *MatchGuid; + DYNAMICEX_MAPPING *ExMapTable; + UINTN i; + BOOLEAN Found; + + if (Guid == NULL) { + (*TokenNumber)++; + + if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) { + *TokenNumber = 0; + } + + } else { + + if (PEI_EXMAP_TABLE_EMPTY) { + *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER; + return EFI_NOT_FOUND; + } + + // + // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order + // 1) ExGuid + // 2) ExTokenNumber + // + PeiPcdDb = GetPcdDatabase (); + + MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid); + + if (MatchGuid == NULL) { + *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER; + return EFI_NOT_FOUND; + } + + GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable; + + ExMapTable = PeiPcdDb->Init.ExMapTable; + + Found = FALSE; + for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { + if (ExMapTable[i].ExGuidIndex == GuidTableIdx) { + Found = TRUE; + break; + } + } + + if (Found) { + if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) { + *TokenNumber = ExMapTable[i].ExTokenNumber; + return EFI_SUCCESS; + } + + for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) { + if (ExMapTable[i].ExTokenNumber == *TokenNumber) { + i++; + if (ExMapTable[i].ExGuidIndex == GuidTableIdx) { + *TokenNumber = ExMapTable[i].ExTokenNumber; + return EFI_SUCCESS; + } else { + *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER; + return EFI_SUCCESS; + } + } + } + + return EFI_NOT_FOUND; + } + + } + + return EFI_SUCCESS; } +EFI_GUID * +EFIAPI +PeiPcdGetNextTokenSpaceGuid ( + IN CONST EFI_GUID *Guid + ) +{ + UINTN GuidTableIdx; + EFI_GUID *MatchGuid; + PEI_PCD_DATABASE *PeiPcdDb; + DYNAMICEX_MAPPING *ExMapTable; + UINTN i; + BOOLEAN Found; + + if (PEI_EXMAP_TABLE_EMPTY) { + return NULL; + } + + // + // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order + // 1) ExGuid + // 2) ExTokenNumber + // + PeiPcdDb = GetPcdDatabase (); + + MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid); + + if (MatchGuid == NULL) { + return NULL; + } + + GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable; + + ExMapTable = PeiPcdDb->Init.ExMapTable; + + Found = FALSE; + for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { + if (ExMapTable[i].ExGuidIndex == GuidTableIdx) { + Found = TRUE; + break; + } + } + + if (Found) { + for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) { + if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) { + if (i < PEI_EXMAPPING_TABLE_SIZE) { + return &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex]; + } else { + return NULL; + } + } + } + } + + return NULL; + +}