-/*++\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) Protocol\r
-\r
---*/\r
-\r
-#include <PcdEmulator.h>\r
-\r
-UINTN mSkuId = 0;\r
-\r
-STATIC UINTN \r
-GetPcdDataEntryCount (\r
- VOID\r
-) {\r
- return gEmulatedPcdDatabaseEx->Count;\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_PROTOCOL_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_PROTOCOL_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
-\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 = gEmulatedPcdEntryEx[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 = gEmulatedPcdEntryEx + GetPcdDataEntryCount ();\r
- if (++Pcd >= LastPcdEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- *Token = Pcd->Token;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-PCD_PROTOCOL mPcdProtocolInstance = {\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
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdEmulatorEntry (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
-\r
- GuidHob = GetFirstGuidHob (&gPcdHobGuid);\r
- gEmulatedPcdDatabaseEx = (EMULATED_PCD_DATABASE_EX *) GET_GUID_HOB_DATA(GuidHob);\r
- ASSERT (gEmulatedPcdDatabaseEx != NULL);\r
- gEmulatedPcdEntryEx = gEmulatedPcdDatabaseEx->Entry;\r
-\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &ImageHandle,\r
- &gPcdProtocolGuid, &mPcdProtocolInstance,\r
- NULL\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
-\r
- Count = GetPcdDataEntryCount ();\r
- for (Index = 0; Index < Count; Index++) {\r
- if (gEmulatedPcdEntryEx[Index].Token == TokenNumber) {\r
- return &gEmulatedPcdEntryEx[Index];\r
- }\r
- }\r
- return NULL;\r
-}\r