X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FService.c;h=13abab001a824920ad34cfc345169dd56f50b335;hp=f175b14db238635ddad4aca521671305c90a4cd4;hb=a696a78c371709fc6a74295296c92c4e94b23a1d;hpb=1de04b4f83050f9a8f6c3eedce27f841591972f3 diff --git a/EdkModulePkg/Universal/PCD/Dxe/Service.c b/EdkModulePkg/Universal/PCD/Dxe/Service.c index f175b14db2..13abab001a 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Service.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Service.c @@ -1,5 +1,5 @@ /** @file -Private functions used by PCD DXE driver.s +Private functions used by PCD DXE driver. Copyright (c) 2006, Intel Corporation All rights reserved. This program and the accompanying materials @@ -17,11 +17,6 @@ Module Name: Service.c #include "Service.h" -// -// Build Tool will generate DXE_PCD_DB_INIT_VALUE in Autogen.h -// Compression Algorithm will take care of the size optimization. -// - PCD_DATABASE * mPcdDatabase; LIST_ENTRY *mCallbackFnTable; @@ -34,24 +29,31 @@ GetWorker ( { UINT32 *LocalTokenNumberTable; UINT16 *SizeTable; - BOOLEAN IsPeiDb; - UINT32 Offset; EFI_GUID *GuidTable; UINT16 *StringTable; EFI_GUID *Guid; UINT16 *Name; VARIABLE_HEAD *VariableHead; UINT8 *VaraiableDefaultBuffer; - EFI_STATUS Status; - UINTN DataSize; UINT8 *Data; VPD_HEAD *VpdHead; UINT8 *PcdDb; - UINT16 StringTableIdx; - UINT32 LocalTokenNumber; + VOID *RetPtr; UINTN MaxSize; UINTN TmpTokenNumber; + UINTN DataSize; + EFI_STATUS Status; + UINT32 LocalTokenNumber; + UINT32 Offset; + UINT16 StringTableIdx; + BOOLEAN IsPeiDb; + + // + // Aquire lock to prevent reentrance from TPL_CALLBACK level + // + EfiAcquireLock (&mPcdDatabaseLock); + RetPtr = NULL; // // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. // We have to decrement TokenNumber by 1 to make it usable @@ -61,12 +63,20 @@ GetWorker ( TmpTokenNumber = TokenNumber; - ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER); + // + // PCD_TOTAL_TOKEN_NUMBER is a auto-generated constant. + // It could be zero. EBC compiler is very choosy. It may + // report warning. So we add 1 in each size of the + // comparison. + // + ASSERT (TokenNumber + 1 < PCD_TOTAL_TOKEN_NUMBER + 1); ASSERT ((GetSize == DxePcdGetSize (TokenNumber + 1)) || (GetSize == 0)); - - IsPeiDb = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; + // EBC compiler is very choosy. It may report warning about comparison + // between UINTN and 0 . So we add 1 in each size of the + // comparison. + IsPeiDb = (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE; LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; @@ -97,7 +107,8 @@ GetWorker ( switch (LocalTokenNumber & PCD_TYPE_ALL_SET) { case PCD_TYPE_VPD: VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset); - return (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); + RetPtr = (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); + break; case PCD_TYPE_HII: GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable : @@ -116,7 +127,7 @@ GetWorker ( // It is a pointer type. So get the MaxSize reserved for // this PCD entry. // - GetPtrTypeSize (TokenNumber, &GetSize); + GetPtrTypeSize (TmpTokenNumber, &GetSize); } CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize); FreePool (Data); @@ -131,14 +142,16 @@ GetWorker ( // Return 1) either the default value specified by Platform Integrator // 2) Or the value Set by a PCD set operation. // - return (VOID *) VaraiableDefaultBuffer; + RetPtr = (VOID *) VaraiableDefaultBuffer; + break; case PCD_TYPE_STRING: StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset); - return (VOID *) &StringTable[StringTableIdx]; + RetPtr = (VOID *) &StringTable[StringTableIdx]; + break; case PCD_TYPE_DATA: - return (VOID *) ((UINT8 *) PcdDb + Offset); + RetPtr = (VOID *) ((UINT8 *) PcdDb + Offset); break; default: @@ -147,9 +160,9 @@ GetWorker ( } - ASSERT (FALSE); - - return NULL; + EfiReleaseLock (&mPcdDatabaseLock); + + return RetPtr; } @@ -252,14 +265,14 @@ DxeUnRegisterCallBackWorker ( -UINTN +EFI_STATUS ExGetNextTokeNumber ( - IN CONST EFI_GUID *Guid, - IN UINTN TokenNumber, - IN EFI_GUID *GuidTable, - IN UINTN SizeOfGuidTable, - IN DYNAMICEX_MAPPING *ExMapTable, - IN UINTN SizeOfExMapTable + IN CONST EFI_GUID *Guid, + IN OUT UINTN *TokenNumber, + IN EFI_GUID *GuidTable, + IN UINTN SizeOfGuidTable, + IN DYNAMICEX_MAPPING *ExMapTable, + IN UINTN SizeOfExMapTable ) { EFI_GUID *MatchGuid; @@ -269,7 +282,7 @@ ExGetNextTokeNumber ( MatchGuid = ScanGuid (GuidTable, SizeOfGuidTable, Guid); if (MatchGuid == NULL) { - return PCD_INVALID_TOKEN_NUMBER; + return EFI_NOT_FOUND; } Found = FALSE; @@ -282,35 +295,39 @@ ExGetNextTokeNumber ( } if (Found) { - if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) { - return ExMapTable[Idx].ExTokenNumber; + if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) { + *TokenNumber = ExMapTable[Idx].ExTokenNumber; + return EFI_SUCCESS; } for ( ; Idx < SizeOfExMapTable; Idx++) { - if (ExMapTable[Idx].ExTokenNumber == TokenNumber) { + if (ExMapTable[Idx].ExTokenNumber == *TokenNumber) { Idx++; if (Idx == SizeOfExMapTable) { // // Exceed the length of ExMap Table // - return PCD_INVALID_TOKEN_NUMBER; + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + return EFI_SUCCESS; } else if (ExMapTable[Idx].ExGuidIndex == GuidTableIdx) { // // Found the next match // - return ExMapTable[Idx].ExTokenNumber; + *TokenNumber = ExMapTable[Idx].ExTokenNumber; + return EFI_SUCCESS; } else { // // Guid has been changed. It is the next Token Space Guid. // We should flag no more TokenNumber. // - return PCD_INVALID_TOKEN_NUMBER; + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + return EFI_SUCCESS; } } } } - return PCD_INVALID_TOKEN_NUMBER; + return EFI_NOT_FOUND; } @@ -329,7 +346,6 @@ BuildPcdDxeDataBase ( ASSERT (mPcdDatabase != NULL); GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid); - if (GuidHob != NULL) { // @@ -358,11 +374,12 @@ BuildPcdDxeDataBase ( // Initialized the Callback Function Table // - if (PCD_TOTAL_TOKEN_NUMBER != 0) { - mCallbackFnTable = AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER * sizeof (LIST_ENTRY)); - } + mCallbackFnTable = AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER * sizeof (LIST_ENTRY)); - for (Idx = 0; Idx < PCD_TOTAL_TOKEN_NUMBER; Idx++) { + // EBC compiler is very choosy. It may report warning about comparison + // between UINTN and 0 . So we add 1 in each size of the + // comparison. + for (Idx = 0; Idx + 1 < PCD_TOTAL_TOKEN_NUMBER + 1; Idx++) { InitializeListHead (&mCallbackFnTable[Idx]); } @@ -375,18 +392,18 @@ EFI_STATUS GetHiiVariable ( IN EFI_GUID *VariableGuid, IN UINT16 *VariableName, - OUT VOID **VariableData, + OUT UINT8 **VariableData, OUT UINTN *VariableSize ) { UINTN Size; EFI_STATUS Status; - VOID *Buffer; + UINT8 *Buffer; Size = 0; Buffer = NULL; - Status = EfiGetVariable ( + Status = gRT->GetVariable ( (UINT16 *)VariableName, VariableGuid, NULL, @@ -395,11 +412,11 @@ GetHiiVariable ( ); if (Status == EFI_BUFFER_TOO_SMALL) { - Buffer = AllocatePool (Size); + Buffer = (UINT8 *) AllocatePool (Size); ASSERT (Buffer != NULL); - Status = EfiGetVariable ( + Status = gRT->GetVariable ( VariableName, VariableGuid, NULL, @@ -553,6 +570,11 @@ SetWorker ( UINTN MaxSize; UINTN TmpTokenNumber; + // + // Aquire lock to prevent reentrance from TPL_CALLBACK level + // + EfiAcquireLock (&mPcdDatabaseLock); + // // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. // We have to decrement TokenNumber by 1 to make it usable @@ -562,19 +584,29 @@ SetWorker ( TmpTokenNumber = TokenNumber; - ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER); + // EBC compiler is very choosy. It may report warning about comparison + // between UINTN and 0 . So we add 1 in each size of the + // comparison. + + ASSERT (TokenNumber + 1 < PCD_TOTAL_TOKEN_NUMBER + 1); if (!PtrType) { ASSERT (*Size == DxePcdGetSize (TokenNumber + 1)); } - IsPeiDb = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; + // EBC compiler is very choosy. It may report warning about comparison + // between UINTN and 0 . So we add 1 in each size of the + // comparison. + IsPeiDb = (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE; LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; - if ((TokenNumber < PEI_NEX_TOKEN_NUMBER) || - (TokenNumber >= PEI_LOCAL_TOKEN_NUMBER || TokenNumber < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER))) { + // EBC compiler is very choosy. It may report warning about comparison + // between UINTN and 0 . So we add 1 in each size of the + // comparison. + if ((TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1) || + (TokenNumber + 1 >= PEI_LOCAL_TOKEN_NUMBER + 1 || TokenNumber + 1 < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1))) { InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size); } @@ -604,20 +636,23 @@ SetWorker ( switch (LocalTokenNumber & PCD_TYPE_ALL_SET) { case PCD_TYPE_VPD: ASSERT (FALSE); - return EFI_INVALID_PARAMETER; + Status = EFI_INVALID_PARAMETER; + break; case PCD_TYPE_STRING: - if (SetPtrTypeSize (TokenNumber, Size)) { + if (SetPtrTypeSize (TmpTokenNumber, Size)) { CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, *Size); - return EFI_SUCCESS; + Status = EFI_SUCCESS; } else { - return EFI_INVALID_PARAMETER; + Status = EFI_INVALID_PARAMETER; } + break; case PCD_TYPE_HII: if (PtrType) { - if (!SetPtrTypeSize (TokenNumber, Size)) { - return EFI_INVALID_PARAMETER; + if (!SetPtrTypeSize (TmpTokenNumber, Size)) { + Status = EFI_INVALID_PARAMETER; + break; } } @@ -634,54 +669,55 @@ SetWorker ( if (EFI_NOT_FOUND == Status) { CopyMem (PcdDb + VariableHead->DefaultValueOffset, Data, *Size); - return EFI_SUCCESS; - } else { - return Status; - } + Status = EFI_SUCCESS; + } + break; - // - // Bug Bug: Please implement this - // - case PCD_TYPE_DATA: if (PtrType) { - if (SetPtrTypeSize (TokenNumber, Size)) { + if (SetPtrTypeSize (TmpTokenNumber, Size)) { CopyMem (InternalData, Data, *Size); - return EFI_SUCCESS; + Status = EFI_SUCCESS; } else { - return EFI_INVALID_PARAMETER; + Status = EFI_INVALID_PARAMETER; } + break; } + Status = EFI_SUCCESS; switch (*Size) { case sizeof(UINT8): *((UINT8 *) InternalData) = *((UINT8 *) Data); - return EFI_SUCCESS; + break; case sizeof(UINT16): *((UINT16 *) InternalData) = *((UINT16 *) Data); - return EFI_SUCCESS; + break; case sizeof(UINT32): *((UINT32 *) InternalData) = *((UINT32 *) Data); - return EFI_SUCCESS; + break; case sizeof(UINT64): *((UINT64 *) InternalData) = *((UINT64 *) Data); - return EFI_SUCCESS; + break; default: ASSERT (FALSE); - return EFI_NOT_FOUND; + Status = EFI_NOT_FOUND; + break; } + break; default: ASSERT (FALSE); + Status = EFI_NOT_FOUND; break; } - - ASSERT (FALSE); - return EFI_NOT_FOUND; + + EfiReleaseLock (&mPcdDatabaseLock); + + return Status; } @@ -751,10 +787,10 @@ SetHiiVariable ( Size = 0; - Status = EfiGetVariable ( + Status = gRT->GetVariable ( (UINT16 *)VariableName, VariableGuid, - &Attribute, + NULL, &Size, NULL ); @@ -765,7 +801,7 @@ SetHiiVariable ( ASSERT (Buffer != NULL); - Status = EfiGetVariable ( + Status = gRT->GetVariable ( VariableName, VariableGuid, &Attribute, @@ -777,7 +813,7 @@ SetHiiVariable ( CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize); - Status = EfiSetVariable ( + Status = gRT->SetVariable ( VariableName, VariableGuid, Attribute, @@ -979,7 +1015,10 @@ GetPtrTypeSize ( BOOLEAN IsPeiDb; UINT32 *LocalTokenNumberTable; - IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx < PEI_LOCAL_TOKEN_NUMBER); + // EBC compiler is very choosy. It may report warning about comparison + // between UINTN and 0 . So we add 1 in each size of the + // comparison. + IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < PEI_LOCAL_TOKEN_NUMBER + 1); if (IsPeiDb) { @@ -1051,7 +1090,10 @@ SetPtrTypeSize ( BOOLEAN IsPeiDb; UINT32 *LocalTokenNumberTable; - IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx < PEI_LOCAL_TOKEN_NUMBER); + // EBC compiler is very choosy. It may report warning about comparison + // between UINTN and 0 . So we add 1 in each size of the + // comparison. + IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < PEI_LOCAL_TOKEN_NUMBER + 1); if (IsPeiDb) { LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;