X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FPcd.c;h=3e35363a3b345f679bc867de09664cd1eaebcc99;hp=64191a7161a64908148e6e64a3cbc5788c814d60;hb=9c2aaac08e0565eb4634fe261dac1ba58d0738a8;hpb=dcec76514f12c39d6d8725dc1080be0728ad8eab diff --git a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c index 64191a7161..3e35363a3b 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c @@ -74,9 +74,9 @@ PcdDxeInit ( // // Make sure the Pcd Protocol is not already installed in the system // - + ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gPcdProtocolGuid); - + BuildPcdDxeDataBase (); // @@ -100,10 +100,10 @@ PcdDxeInit ( VOID EFIAPI DxePcdSetSku ( - IN SKU_ID SkuId + IN UINTN SkuId ) { - mPcdDatabase->PeiDb.Init.SystemSkuId = SkuId; + mPcdDatabase->PeiDb.Init.SystemSkuId = (SKU_ID) SkuId; return; } @@ -113,7 +113,7 @@ DxePcdSetSku ( UINT8 EFIAPI DxePcdGet8 ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8))); @@ -124,7 +124,7 @@ DxePcdGet8 ( UINT16 EFIAPI DxePcdGet16 ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16))); @@ -135,7 +135,7 @@ DxePcdGet16 ( UINT32 EFIAPI DxePcdGet32 ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32))); @@ -146,7 +146,7 @@ DxePcdGet32 ( UINT64 EFIAPI DxePcdGet64 ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned64(GetWorker (TokenNumber, sizeof (UINT64))); @@ -157,7 +157,7 @@ DxePcdGet64 ( VOID * EFIAPI DxePcdGetPtr ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return GetWorker (TokenNumber, 0); @@ -168,7 +168,7 @@ DxePcdGetPtr ( BOOLEAN EFIAPI DxePcdGetBool ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN))); @@ -179,18 +179,47 @@ DxePcdGetBool ( UINTN EFIAPI DxePcdGetSize ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { - UINT16 * SizeTable; + UINTN Size; + UINT32 *LocalTokenNumberTable; + BOOLEAN IsPeiDb; + UINTN MaxSize; + UINTN TmpTokenNumber; + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; - SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? mPcdDatabase->PeiDb.Init.SizeTable : - mPcdDatabase->DxeDb.Init.SizeTable; + // + // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber + // + TmpTokenNumber = TokenNumber; + ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER); - TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER); + IsPeiDb = (BOOLEAN) (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + + TokenNumber = IsPeiDb ? TokenNumber : + (TokenNumber - PEI_LOCAL_TOKEN_NUMBER); + + LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable + : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; + + Size = (LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT; + + if (Size == 0) { + // + // For pointer type, we need to scan the SIZE_TABLE to get the current size. + // + return GetPtrTypeSize (TmpTokenNumber, &MaxSize); + } else { + return Size; + } - return SizeTable[TokenNumber]; } @@ -199,7 +228,7 @@ UINT8 EFIAPI DxePcdGet8Ex ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINTN ExTokenNumber ) { return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8))); @@ -211,7 +240,7 @@ UINT16 EFIAPI DxePcdGet16Ex ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINTN ExTokenNumber ) { return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16))); @@ -223,7 +252,7 @@ UINT32 EFIAPI DxePcdGet32Ex ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINTN ExTokenNumber ) { return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32))); @@ -235,7 +264,7 @@ UINT64 EFIAPI DxePcdGet64Ex ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINTN ExTokenNumber ) { return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64))); @@ -247,10 +276,10 @@ VOID * EFIAPI DxePcdGetPtrEx ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINTN ExTokenNumber ) { - return ExGetWorker (Guid, ExTokenNumber, 0); + return ExGetWorker (Guid, ExTokenNumber, 0); } @@ -259,7 +288,7 @@ BOOLEAN EFIAPI DxePcdGetBoolEx ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINTN ExTokenNumber ) { return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN))); @@ -271,10 +300,10 @@ UINTN EFIAPI DxePcdGetSizeEx ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINTN ExTokenNumber ) { - return DxePcdGetSize(GetExPcdTokenNumber (Guid, ExTokenNumber)); + return DxePcdGetSize(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber)); } @@ -282,11 +311,11 @@ DxePcdGetSizeEx ( EFI_STATUS EFIAPI DxePcdSet8 ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN UINT8 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -294,11 +323,11 @@ DxePcdSet8 ( EFI_STATUS EFIAPI DxePcdSet16 ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN UINT16 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -306,11 +335,11 @@ DxePcdSet16 ( EFI_STATUS EFIAPI DxePcdSet32 ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN UINT32 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -318,11 +347,11 @@ DxePcdSet32 ( EFI_STATUS EFIAPI DxePcdSet64 ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN UINT64 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -330,9 +359,9 @@ DxePcdSet64 ( EFI_STATUS EFIAPI DxePcdSetPtr ( - IN PCD_TOKEN_NUMBER TokenNumber, - IN UINTN SizeOfBuffer, - IN VOID *Buffer + IN UINTN TokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN VOID *Buffer ) { return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE); @@ -343,11 +372,11 @@ DxePcdSetPtr ( EFI_STATUS EFIAPI DxePcdSetBool ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN BOOLEAN Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -356,17 +385,11 @@ EFI_STATUS EFIAPI DxePcdSet8Ex ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber, + IN UINTN ExTokenNumber, IN UINT8 Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -375,17 +398,11 @@ EFI_STATUS EFIAPI DxePcdSet16Ex ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber, + IN UINTN ExTokenNumber, IN UINT16 Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -394,17 +411,11 @@ EFI_STATUS EFIAPI DxePcdSet32Ex ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber, + IN UINTN ExTokenNumber, IN UINT32 Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -413,17 +424,11 @@ EFI_STATUS EFIAPI DxePcdSet64Ex ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber, + IN UINTN ExTokenNumber, IN UINT64 Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -431,19 +436,13 @@ DxePcdSet64Ex ( EFI_STATUS EFIAPI DxePcdSetPtrEx ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber, - IN UINTN SizeOfBuffer, - IN VOID *Buffer + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN VOID *Buffer ) { - return ExSetWorker( - ExTokenNumber, - Guid, - Buffer, - SizeOfBuffer, - TRUE - ); + return ExSetWorker(ExTokenNumber, Guid, Buffer, SizeOfBuffer, TRUE); } @@ -452,17 +451,11 @@ EFI_STATUS EFIAPI DxePcdSetBoolEx ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber, + IN UINTN ExTokenNumber, IN BOOLEAN Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - TRUE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -471,7 +464,7 @@ DxePcdSetBoolEx ( EFI_STATUS EFIAPI DxeRegisterCallBackOnSet ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL IN PCD_PROTOCOL_CALLBACK CallBackFunction ) @@ -486,14 +479,14 @@ DxeRegisterCallBackOnSet ( EFI_STATUS EFIAPI DxeUnRegisterCallBackOnSet ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { ASSERT (CallBackFunction != NULL); - return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); + return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); } @@ -502,10 +495,10 @@ EFI_STATUS EFIAPI DxePcdGetNextToken ( IN CONST EFI_GUID *Guid, OPTIONAL - IN OUT PCD_TOKEN_NUMBER *TokenNumber + IN OUT UINTN *TokenNumber ) { - PCD_TOKEN_NUMBER ExTokenNumber; + UINTN ExTokenNumber; // // Scan the local token space @@ -547,7 +540,9 @@ DxePcdGetNextToken ( ); } - if (!DXE_EXMAP_TABLE_EMPTY) { + if ((ExTokenNumber == PCD_INVALID_TOKEN_NUMBER) && + !DXE_EXMAP_TABLE_EMPTY + ) { ExTokenNumber = ExGetNextTokeNumber ( Guid, ExTokenNumber, @@ -563,3 +558,119 @@ DxePcdGetNextToken ( return EFI_SUCCESS; } + +EFI_GUID ** +GetDistinctTokenSpace ( + IN OUT UINTN *ExMapTableSize, + IN DYNAMICEX_MAPPING *ExMapTable, + IN EFI_GUID *GuidTable + ) +{ + EFI_GUID **DistinctTokenSpace; + UINTN OldGuidIndex; + UINTN TsIdx; + UINTN Idx; + + + DistinctTokenSpace = AllocateZeroPool (*ExMapTableSize * sizeof (EFI_GUID *)); + ASSERT (DistinctTokenSpace != NULL); + + TsIdx = 0; + OldGuidIndex = ExMapTable[0].ExGuidIndex; + DistinctTokenSpace[TsIdx] = &GuidTable[OldGuidIndex]; + for (Idx = 1; Idx < PEI_EXMAPPING_TABLE_SIZE; Idx++) { + if (ExMapTable[Idx].ExGuidIndex != OldGuidIndex) { + OldGuidIndex = ExMapTable[Idx].ExGuidIndex; + DistinctTokenSpace[++TsIdx] = &GuidTable[OldGuidIndex]; + } + } + + *ExMapTableSize = TsIdx; + return DistinctTokenSpace; + +} + + +STATIC EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE] = { 0 }; + +EFI_STATUS +EFIAPI +DxePcdGetNextTokenSpace ( + IN OUT CONST EFI_GUID **Guid + ) +{ + UINTN Idx; + UINTN Idx2; + UINTN Idx3; + UINTN PeiTokenSpaceTableSize; + UINTN DxeTokenSpaceTableSize; + EFI_GUID **PeiTokenSpaceTable; + EFI_GUID **DxeTokenSpaceTable; + BOOLEAN Match; + + ASSERT (Guid != NULL); + + if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) { + if (*Guid != NULL) { + return EFI_NOT_FOUND; + } else { + return EFI_SUCCESS; + } + } + + + if (TmpTokenSpaceBuffer[0] != NULL) { + PeiTokenSpaceTableSize = 0; + + if (!PEI_EXMAP_TABLE_EMPTY) { + PeiTokenSpaceTableSize = PEI_EXMAPPING_TABLE_SIZE; + PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize, + mPcdDatabase->PeiDb.Init.ExMapTable, + mPcdDatabase->PeiDb.Init.GuidTable + ); + CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize); + } + + if (!DXE_EXMAP_TABLE_EMPTY) { + DxeTokenSpaceTableSize = DXE_EXMAPPING_TABLE_SIZE; + DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize, + mPcdDatabase->DxeDb.Init.ExMapTable, + mPcdDatabase->DxeDb.Init.GuidTable + ); + + // + // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable + // + for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) { + Match = FALSE; + for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) { + if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) { + Match = TRUE; + break; + } + } + if (!Match) { + TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2]; + } + } + } + } + + if (*Guid == NULL) { + *Guid = TmpTokenSpaceBuffer[0]; + return EFI_SUCCESS; + } + + for (Idx = 0; Idx < (PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE); Idx++) { + if(CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) { + Idx++; + *Guid = TmpTokenSpaceBuffer[Idx]; + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; + +} + +