-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
- PcdEmulator.c\r
-\r
-Abstract:\r
- Platform Configuration Database (PCD) Service PEIM\r
-\r
---*/\r
-\r
-#include <PcdEmulator.h>\r
-\r
-//\r
-// BugBug: PEI early phase does not support global variable!!!\r
-// This is only a temperary solution.\r
-//\r
-\r
-UINTN mSkuId = 0;\r
-\r
-\r
-STATIC EMULATED_PCD_DATABASE_EX *\r
-GetPcdDataBaseEx (\r
- VOID\r
-) {\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
- EMULATED_PCD_DATABASE_EX *EmulatedPcdDatabaseEx;\r
-\r
- GuidHob = GetFirstGuidHob (&gPcdHobGuid);\r
- EmulatedPcdDatabaseEx = (EMULATED_PCD_DATABASE_EX *) GET_GUID_HOB_DATA(GuidHob);\r
-\r
- return EmulatedPcdDatabaseEx;\r
-}\r
-\r
-STATIC UINTN \r
-GetPcdDataBaseExEntryCount (\r
- EMULATED_PCD_DATABASE_EX * Database\r
-) {\r
- return Database->Count;\r
-}\r
-\r
-STATIC UINTN \r
-GetPcdDataBaseExSize (\r
- EMULATED_PCD_DATABASE_EX * Database\r
-) {\r
- UINTN Size;\r
- \r
- Size = sizeof (Database->Count)\r
- + (sizeof (Database->Entry[0]) * Database->Count);\r
- \r
- return Size;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSetSku (\r
- IN UINTN SkuId\r
- )\r
-{\r
- mSkuId = SkuId;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-UINT8\r
-EFIAPI\r
-PcdEmulatorGet8 (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
- ASSERT (Pcd->DatumSize == 1);\r
-\r
- return (UINT8)Pcd->Datum;\r
-}\r
-\r
-UINT16\r
-EFIAPI\r
-PcdEmulatorGet16 (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
- ASSERT (Pcd->DatumSize == 2);\r
-\r
- return (UINT16)Pcd->Datum;\r
-}\r
-\r
-UINT32\r
-EFIAPI\r
-PcdEmulatorGet32 (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
- ASSERT (Pcd->DatumSize == 4);\r
-\r
- return (UINT32)Pcd->Datum;\r
-}\r
-\r
-UINT64\r
-EFIAPI\r
-PcdEmulatorGet64 (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
- ASSERT (Pcd->DatumSize == sizeof (UINT64));\r
-\r
- return (UINT64)Pcd->Datum;\r
-}\r
-\r
-VOID *\r
-EFIAPI\r
-PcdEmulatorGetPtr (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
-\r
- return (VOID *)(UINTN)Pcd->ExtendedData;\r
-}\r
-\r
-BOOLEAN\r
-EFIAPI\r
-PcdEmulatorGetBoolean (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
- ASSERT (Pcd->DatumSize == 1);\r
-\r
- return (BOOLEAN)Pcd->Datum;\r
-}\r
-\r
-UINTN\r
-EFIAPI\r
-PcdEmulatorGetSize (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
- return Pcd->DatumSize;\r
-}\r
-\r
-UINT8\r
-EFIAPI\r
-PcdEmulatorGet8Ex (\r
- IN CONST EFI_GUID *PcdDataBaseName,\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- ASSERT (FALSE);\r
- return 0;\r
-}\r
-\r
-UINT16\r
-EFIAPI\r
-PcdEmulatorGet16Ex (\r
- IN CONST EFI_GUID *PcdDataBaseName,\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- ASSERT (FALSE);\r
- return 0;\r
-}\r
-\r
-UINT32\r
-EFIAPI\r
-PcdEmulatorGet32Ex (\r
- IN CONST EFI_GUID *PcdDataBaseName,\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- ASSERT (FALSE);\r
- return 0;\r
-}\r
-\r
-UINT64\r
-EFIAPI\r
-PcdEmulatorGet64Ex (\r
- IN CONST EFI_GUID *PcdDataBaseName,\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- ASSERT (FALSE);\r
- return 0;\r
-}\r
-\r
-VOID *\r
-EFIAPI\r
-PcdEmulatorGetPtrEx (\r
- IN CONST EFI_GUID *PcdDataBaseName,\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- ASSERT (FALSE);\r
- return 0;\r
-}\r
-\r
-BOOLEAN\r
-EFIAPI\r
-PcdEmulatorGetBooleanEx (\r
- IN CONST EFI_GUID *PcdDataBaseName,\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- ASSERT (FALSE);\r
- return 0;\r
-}\r
-\r
-UINTN\r
-EFIAPI\r
-PcdEmulatorGetSizeEx (\r
- IN CONST EFI_GUID *PcdDataBaseName,\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
- return Pcd->DatumSize;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSet8 (\r
- IN UINTN TokenNumber,\r
- IN UINT8 Value\r
- )\r
-{ \r
-\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
-\r
- ASSERT (Pcd->DatumSize == sizeof (UINT8));\r
-\r
- Pcd->Datum = Value;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSet16 (\r
- IN UINTN TokenNumber,\r
- IN UINT16 Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSet32 (\r
- IN UINTN TokenNumber,\r
- IN UINT32 Value\r
- )\r
-{ \r
-\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
-\r
- ASSERT (Pcd->DatumSize == sizeof (UINT32));\r
-\r
- Pcd->Datum = Value;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSet64 (\r
- IN UINTN TokenNumber,\r
- IN UINT64 Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSetPtr (\r
- IN UINTN TokenNumber,\r
- IN CONST VOID *Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSetBoolean (\r
- IN UINTN TokenNumber,\r
- IN BOOLEAN Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSet8Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
- IN UINT8 Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSet16Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
- IN UINT16 Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSet32Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
- IN UINT32 Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSet64Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
- IN UINT64 Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSetPtrEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
- IN CONST VOID *Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorSetBooleanEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
- IN BOOLEAN Value\r
- )\r
-{ \r
-\r
- ASSERT (FALSE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorCallBackOnSet (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN PCD_PPI_CALLBACK CallBackFunction\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
-\r
- if (Pcd->CallBackListSize == Pcd->CallBackEntries) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Pcd->CallBackList[Pcd->CallBackEntries++] = CallBackFunction;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorUnregisterCallBackOnSet (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN PCD_PPI_CALLBACK CallBackfunction\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
- UINT32 Index;\r
-\r
- Pcd = GetPcdEntry (TokenNumber);\r
- ASSERT (Pcd != NULL);\r
-\r
- for (Index = 0; Index < Pcd->CallBackListSize; Index++) {\r
- if (Pcd->CallBackList[Index] == CallBackfunction) {\r
- Pcd->CallBackList[Index] = NULL;\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorGetNextToken (\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN UINTN *Token\r
- )\r
-{\r
- EMULATED_PCD_ENTRY_EX *Pcd;\r
- EMULATED_PCD_ENTRY_EX *LastPcdEntry;\r
- EMULATED_PCD_DATABASE_EX *PcdDatabase;\r
- EMULATED_PCD_ENTRY_EX *PcdEntry;\r
-\r
- PcdDatabase = GetPcdDataBaseEx (); \r
- PcdEntry = PcdDatabase->Entry;\r
-\r
- if (*Token == PCD_INVALID_TOKEN) {\r
- //\r
- // BugBug: Due to variable size array, ensure we convert this to a reasonable database\r
- // that can accomodate array references for simplicity's sake\r
- *Token = PcdEntry[0].Token;\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Pcd = GetPcdEntry (*Token);\r
- if (Pcd == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- LastPcdEntry = PcdEntry + GetPcdDataBaseExEntryCount (PcdDatabase);\r
- if (++Pcd >= LastPcdEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- *Token = Pcd->Token;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-PCD_PPI mPcdPpiInstance = {\r
- PcdEmulatorSetSku,\r
-\r
- PcdEmulatorGet8,\r
- PcdEmulatorGet16, \r
- PcdEmulatorGet32, \r
- PcdEmulatorGet64, \r
- PcdEmulatorGetPtr, \r
- PcdEmulatorGetBoolean, \r
- PcdEmulatorGetSize,\r
-\r
- PcdEmulatorGet8Ex,\r
- PcdEmulatorGet16Ex, \r
- PcdEmulatorGet32Ex, \r
- PcdEmulatorGet64Ex, \r
- PcdEmulatorGetPtrEx, \r
- PcdEmulatorGetBooleanEx, \r
- PcdEmulatorGetSizeEx,\r
- \r
- PcdEmulatorSet8,\r
- PcdEmulatorSet16, \r
- PcdEmulatorSet32, \r
- PcdEmulatorSet64, \r
- PcdEmulatorSetPtr, \r
- PcdEmulatorSetBoolean, \r
-\r
- PcdEmulatorSet8Ex,\r
- PcdEmulatorSet16Ex, \r
- PcdEmulatorSet32Ex, \r
- PcdEmulatorSet64Ex, \r
- PcdEmulatorSetPtrEx, \r
- PcdEmulatorSetBooleanEx, \r
-\r
- PcdEmulatorCallBackOnSet,\r
- PcdEmulatorUnregisterCallBackOnSet,\r
- PcdEmulatorGetNextToken\r
-};\r
-\r
-STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {\r
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
- &gPcdPpiGuid,\r
- &mPcdPpiInstance\r
-};\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeimPcdEmulatorEntry (\r
- IN EFI_FFS_FILE_HEADER *FfsHeader,\r
- IN EFI_PEI_SERVICES **PeiServices\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Count;\r
- UINTN Calculation;\r
- UINT8 *AllocatedBuffer;\r
- EMULATED_PCD_DATABASE_EX *EmulatedPcdDatabaseEx;\r
- EMULATED_PCD_ENTRY_EX *EmulatedPcdEntryEx;\r
-\r
- //\r
- // BugBug: Normally, we would read an FFS file for this data\r
- // We need to remember, that when we read the FFS file, items such as the VariableName will not be encoded as a pointer\r
- // but as an array of content. In this emulation, our init is encoding this data as a pointer.\r
- // In the FFS version, we will depend on the proper Entry Count in the FFS data since the structures will\r
- // now be variable length.\r
- //\r
- //\r
-\r
- //\r
- // We should now read from the FFS file into the cache - for now, we fake this.\r
- //\r
- Count = GetPcdDataBaseSize () / sizeof (EMULATED_PCD_ENTRY);\r
-\r
- //\r
- // Let's now determine how big of a buffer we need for our database\r
- // For the FFS version, we need to calculate/consider the VariableName/ExtendedData size!!!\r
- //\r
- Calculation = sizeof (UINTN) + (Count * sizeof (EMULATED_PCD_ENTRY_EX));\r
-\r
- EmulatedPcdDatabaseEx = (EMULATED_PCD_DATABASE_EX *) BuildGuidHob (&gPcdHobGuid, Calculation);\r
-\r
- EmulatedPcdDatabaseEx->Count = Count;\r
- EmulatedPcdEntryEx = EmulatedPcdDatabaseEx->Entry;\r
-\r
- AllocatedBuffer = AllocatePool (Count * sizeof (PCD_PPI_CALLBACK) * MAX_PCD_CALLBACK);\r
- ASSERT (AllocatedBuffer != NULL); \r
-\r
- for (Index = 0; Index < Count; Index++) {\r
- //\r
- // Copy from source to our own allocated buffer - normally an FFS read\r
- //\r
- (*PeiServices)->CopyMem (\r
- (VOID *) (EmulatedPcdEntryEx + Index),\r
- (VOID *) (gEmulatedPcdEntry + Index),\r
- sizeof (EMULATED_PCD_ENTRY)\r
- );\r
-\r
- //\r
- // All the CallBackList worker functions refer to this CallBackList as CallBackList[CallbackEntry]\r
- // so we seed the same buffer address here.\r
- //\r
- EmulatedPcdEntryEx[Index].CallBackList = (PCD_PPI_CALLBACK *)AllocatedBuffer;\r
- AllocatedBuffer+= (sizeof (PCD_PPI_CALLBACK) * MAX_PCD_CALLBACK);\r
- EmulatedPcdEntryEx[Index].CallBackEntries = 0;\r
- EmulatedPcdEntryEx[Index].CallBackListSize = MAX_PCD_CALLBACK;\r
- }\r
-\r
- //\r
- // Install PCD service PPI\r
- //\r
- Status = PeiServicesInstallPpi (&mPpiPCD);\r
-\r
- ASSERT_EFI_ERROR (Status);\r
- return Status;\r
-}\r
-\r
-\r
-EMULATED_PCD_ENTRY_EX *\r
-GetPcdEntry (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Count;\r
- EMULATED_PCD_DATABASE_EX *EmulatedPcdDatabaseEx;\r
- EMULATED_PCD_ENTRY_EX *EmulatedPcdEntryEx;\r
-\r
- CpuBreakpoint (); \r
-\r
- EmulatedPcdDatabaseEx = GetPcdDataBaseEx (); \r
- //\r
- // BugBug: This Count will change when we flip over to FFS version\r
- //\r
- Count = EmulatedPcdDatabaseEx->Count;\r
- EmulatedPcdEntryEx = EmulatedPcdDatabaseEx->Entry;\r
- for (Index = 0; Index < Count; Index++) {\r
- if (EmulatedPcdEntryEx[Index].Token == TokenNumber) {\r
- return &EmulatedPcdEntryEx[Index];\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-\r