blob: 38863b8a024f663fdacfec71b869eae3f32a2711 [file] [log] [blame]
/*++
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
PcdEmulator.c
Abstract:
Platform Configuration Database (PCD) Protocol
--*/
#include <PcdEmulator.h>
UINTN mSkuId = 0;
STATIC UINTN
GetPcdDataEntryCount (
VOID
) {
return gEmulatedPcdDatabaseEx->Count;
}
EFI_STATUS
EFIAPI
PcdEmulatorSetSku (
IN UINTN SkuId
)
{
mSkuId = SkuId;
return EFI_SUCCESS;
}
UINT8
EFIAPI
PcdEmulatorGet8 (
IN UINTN TokenNumber
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
ASSERT (Pcd->DatumSize == 1);
return (UINT8)Pcd->Datum;
}
UINT16
EFIAPI
PcdEmulatorGet16 (
IN UINTN TokenNumber
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
ASSERT (Pcd->DatumSize == 2);
return (UINT16)Pcd->Datum;
}
UINT32
EFIAPI
PcdEmulatorGet32 (
IN UINTN TokenNumber
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
ASSERT (Pcd->DatumSize == 4);
return (UINT32)Pcd->Datum;
}
UINT64
EFIAPI
PcdEmulatorGet64 (
IN UINTN TokenNumber
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
ASSERT (Pcd->DatumSize == sizeof (UINT64));
return (UINT64)Pcd->Datum;
}
VOID *
EFIAPI
PcdEmulatorGetPtr (
IN UINTN TokenNumber
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
return (VOID *)(UINTN)Pcd->ExtendedData;
}
BOOLEAN
EFIAPI
PcdEmulatorGetBoolean (
IN UINTN TokenNumber
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
ASSERT (Pcd->DatumSize == 1);
return (BOOLEAN)Pcd->Datum;
}
UINTN
EFIAPI
PcdEmulatorGetSize (
IN UINTN TokenNumber
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
return Pcd->DatumSize;
}
UINT8
EFIAPI
PcdEmulatorGet8Ex (
IN CONST EFI_GUID *PcdDataBaseName,
IN UINTN TokenNumber
)
{
ASSERT (FALSE);
return 0;
}
UINT16
EFIAPI
PcdEmulatorGet16Ex (
IN CONST EFI_GUID *PcdDataBaseName,
IN UINTN TokenNumber
)
{
ASSERT (FALSE);
return 0;
}
UINT32
EFIAPI
PcdEmulatorGet32Ex (
IN CONST EFI_GUID *PcdDataBaseName,
IN UINTN TokenNumber
)
{
ASSERT (FALSE);
return 0;
}
UINT64
EFIAPI
PcdEmulatorGet64Ex (
IN CONST EFI_GUID *PcdDataBaseName,
IN UINTN TokenNumber
)
{
ASSERT (FALSE);
return 0;
}
VOID *
EFIAPI
PcdEmulatorGetPtrEx (
IN CONST EFI_GUID *PcdDataBaseName,
IN UINTN TokenNumber
)
{
ASSERT (FALSE);
return 0;
}
BOOLEAN
EFIAPI
PcdEmulatorGetBooleanEx (
IN CONST EFI_GUID *PcdDataBaseName,
IN UINTN TokenNumber
)
{
ASSERT (FALSE);
return 0;
}
UINTN
EFIAPI
PcdEmulatorGetSizeEx (
IN CONST EFI_GUID *PcdDataBaseName,
IN UINTN TokenNumber
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
return Pcd->DatumSize;
}
EFI_STATUS
EFIAPI
PcdEmulatorSet8 (
IN UINTN TokenNumber,
IN UINT8 Value
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
ASSERT (Pcd->DatumSize == sizeof (UINT8));
Pcd->Datum = Value;
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSet16 (
IN UINTN TokenNumber,
IN UINT16 Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSet32 (
IN UINTN TokenNumber,
IN UINT32 Value
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
ASSERT (Pcd->DatumSize == sizeof (UINT32));
Pcd->Datum = Value;
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSet64 (
IN UINTN TokenNumber,
IN UINT64 Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSetPtr (
IN UINTN TokenNumber,
IN CONST VOID *Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSetBoolean (
IN UINTN TokenNumber,
IN BOOLEAN Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSet8Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT8 Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSet16Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT16 Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSet32Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT32 Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSet64Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT64 Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSetPtrEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN CONST VOID *Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorSetBooleanEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN BOOLEAN Value
)
{
ASSERT (FALSE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorCallBackOnSet (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PROTOCOL_CALLBACK CallBackFunction
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
if (Pcd->CallBackListSize == Pcd->CallBackEntries) {
return EFI_OUT_OF_RESOURCES;
}
Pcd->CallBackList[Pcd->CallBackEntries++] = CallBackFunction;
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PcdEmulatorUnregisterCallBackOnSet (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PROTOCOL_CALLBACK CallBackfunction
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
UINT32 Index;
Pcd = GetPcdEntry (TokenNumber);
ASSERT (Pcd != NULL);
for (Index = 0; Index < Pcd->CallBackListSize; Index++) {
if (Pcd->CallBackList[Index] == CallBackfunction) {
Pcd->CallBackList[Index] = NULL;
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
EFIAPI
PcdEmulatorGetNextToken (
IN CONST EFI_GUID *Guid, OPTIONAL
IN UINTN *Token
)
{
EMULATED_PCD_ENTRY_EX *Pcd;
EMULATED_PCD_ENTRY_EX *LastPcdEntry;
if (*Token == PCD_INVALID_TOKEN) {
//
// BugBug: Due to variable size array, ensure we convert this to a reasonable database
// that can accomodate array references for simplicity's sake
*Token = gEmulatedPcdEntryEx[0].Token;
return EFI_SUCCESS;
}
Pcd = GetPcdEntry (*Token);
if (Pcd == NULL) {
return EFI_NOT_FOUND;
}
LastPcdEntry = gEmulatedPcdEntryEx + GetPcdDataEntryCount ();
if (++Pcd >= LastPcdEntry) {
return EFI_NOT_FOUND;
}
*Token = Pcd->Token;
return EFI_SUCCESS;
}
PCD_PROTOCOL mPcdProtocolInstance = {
PcdEmulatorSetSku,
PcdEmulatorGet8,
PcdEmulatorGet16,
PcdEmulatorGet32,
PcdEmulatorGet64,
PcdEmulatorGetPtr,
PcdEmulatorGetBoolean,
PcdEmulatorGetSize,
PcdEmulatorGet8Ex,
PcdEmulatorGet16Ex,
PcdEmulatorGet32Ex,
PcdEmulatorGet64Ex,
PcdEmulatorGetPtrEx,
PcdEmulatorGetBooleanEx,
PcdEmulatorGetSizeEx,
PcdEmulatorSet8,
PcdEmulatorSet16,
PcdEmulatorSet32,
PcdEmulatorSet64,
PcdEmulatorSetPtr,
PcdEmulatorSetBoolean,
PcdEmulatorSet8Ex,
PcdEmulatorSet16Ex,
PcdEmulatorSet32Ex,
PcdEmulatorSet64Ex,
PcdEmulatorSetPtrEx,
PcdEmulatorSetBooleanEx,
PcdEmulatorCallBackOnSet,
PcdEmulatorUnregisterCallBackOnSet,
PcdEmulatorGetNextToken
};
EFI_STATUS
EFIAPI
PcdEmulatorEntry (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_HOB_GUID_TYPE *GuidHob;
GuidHob = GetFirstGuidHob (&gPcdHobGuid);
gEmulatedPcdDatabaseEx = (EMULATED_PCD_DATABASE_EX *) GET_GUID_HOB_DATA(GuidHob);
ASSERT (gEmulatedPcdDatabaseEx != NULL);
gEmulatedPcdEntryEx = gEmulatedPcdDatabaseEx->Entry;
Status = gBS->InstallMultipleProtocolInterfaces (
&ImageHandle,
&gPcdProtocolGuid, &mPcdProtocolInstance,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}
EMULATED_PCD_ENTRY_EX *
GetPcdEntry (
IN UINTN TokenNumber
)
{
UINTN Index;
UINTN Count;
Count = GetPcdDataEntryCount ();
for (Index = 0; Index < Count; Index++) {
if (gEmulatedPcdEntryEx[Index].Token == TokenNumber) {
return &gEmulatedPcdEntryEx[Index];
}
}
return NULL;
}