mirror of https://github.com/acidanthera/audk.git
558 lines
10 KiB
C
558 lines
10 KiB
C
/*++
|
|
|
|
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;
|
|
}
|