EdkCompatibilityPkg: Remove EdkCompatibilityPkg

https://bugzilla.tianocore.org/show_bug.cgi?id=1103

Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Shenglei Zhang
2019-03-21 09:47:31 +08:00
committed by Liming Gao
parent 5bca07268a
commit c455bc8c8d
2027 changed files with 0 additions and 361996 deletions

View File

@@ -1,249 +0,0 @@
/** @file
This is the driver that produce AcpiVariable hob and slit SmramReserve hob
for ECP platform.
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
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.
**/
#include <PiPei.h>
#include <Guid/SmramMemoryReserve.h>
#include <Guid/AcpiS3Context.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/DebugLib.h>
#include <Library/HobLib.h>
#include <Library/PeiServicesLib.h>
#include <Library/BaseMemoryLib.h>
/**
Retrieves the data structure associated witht he GUIDed HOB of type gEfiSmmPeiSmramMemoryReserveGuid
@retval NULL A HOB of type gEfiSmmPeiSmramMemoryReserveGuid could not be found.
@retval !NULL A pointer to the GUID data from a HIB of type gEfiSmmPeiSmramMemoryReserveGuid
**/
EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *
GetSrmamHobData (
VOID
)
{
VOID *GuidHob;
//
// Search SmramMemoryReserve HOB that describes SMRAM region
//
GuidHob = GetFirstGuidHob (&gEfiSmmPeiSmramMemoryReserveGuid);
if (GuidHob == NULL) {
return NULL;
}
return (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)GET_GUID_HOB_DATA (GuidHob);
}
/**
This routine will split SmramReserve hob to reserve 1 page for SMRAM content in S3 phase
for PI SMM core.
@retval EFI_SUCCESS The gEfiSmmPeiSmramMemoryReserveGuid is splited successfully.
@retval EFI_NOT_FOUND The gEfiSmmPeiSmramMemoryReserveGuid is not found.
**/
EFI_STATUS
EFIAPI
SplitSmramReserveHob (
VOID
)
{
EFI_HOB_GUID_TYPE *GuidHob;
EFI_PEI_HOB_POINTERS Hob;
EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *DescriptorBlock;
EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *NewDescriptorBlock;
UINTN BufferSize;
UINTN SmramRanges;
UINTN Index;
UINTN SubIndex;
//
// Retrieve the GUID HOB data that contains the set of SMRAM descriptyors
//
GuidHob = GetFirstGuidHob (&gEfiSmmPeiSmramMemoryReserveGuid);
if (GuidHob == NULL) {
return EFI_NOT_FOUND;
}
DescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)GET_GUID_HOB_DATA (GuidHob);
//
// Allocate one extra EFI_SMRAM_DESCRIPTOR to describe a page of SMRAM memory that contains a pointer
// to the SMM Services Table that is required on the S3 resume path
//
SmramRanges = DescriptorBlock->NumberOfSmmReservedRegions;
BufferSize = sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + (SmramRanges * sizeof (EFI_SMRAM_DESCRIPTOR));
Hob.Raw = BuildGuidHob (
&gEfiSmmPeiSmramMemoryReserveGuid,
BufferSize
);
ASSERT (Hob.Raw);
NewDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)Hob.Raw;
//
// Copy old EFI_SMRAM_HOB_DESCRIPTOR_BLOCK to new allocated region
//
CopyMem ((VOID *)Hob.Raw, DescriptorBlock, BufferSize - sizeof(EFI_SMRAM_DESCRIPTOR));
//
// Increase the number of SMRAM descriptors by 1 to make room for the ALLOCATED descriptor of size EFI_PAGE_SIZE
//
NewDescriptorBlock->NumberOfSmmReservedRegions = (UINT32)(SmramRanges + 1);
ASSERT (SmramRanges >= 1);
//
// Copy last entry to the end - we assume TSEG is last entry, which is same assumption as Framework CPU/SMM driver
//
CopyMem (&NewDescriptorBlock->Descriptor[SmramRanges], &NewDescriptorBlock->Descriptor[SmramRanges - 1], sizeof(EFI_SMRAM_DESCRIPTOR));
//
// Update the last but 1 entry in the array with a size of EFI_PAGE_SIZE and put into the ALLOCATED state
//
NewDescriptorBlock->Descriptor[SmramRanges - 1].PhysicalSize = EFI_PAGE_SIZE;
NewDescriptorBlock->Descriptor[SmramRanges - 1].RegionState |= EFI_ALLOCATED;
//
// Reduce the size of the last SMRAM descriptor by EFI_PAGE_SIZE
//
NewDescriptorBlock->Descriptor[SmramRanges].PhysicalStart += EFI_PAGE_SIZE;
NewDescriptorBlock->Descriptor[SmramRanges].CpuStart += EFI_PAGE_SIZE;
NewDescriptorBlock->Descriptor[SmramRanges].PhysicalSize -= EFI_PAGE_SIZE;
//
// Now, we have created SmramReserve Hob for SmmAccess drive. But the issue is that, Framework SmmAccess will assume there is 2 SmramReserve region only.
// Reporting 3 SmramReserve region will cause buffer overflow. Moreover, we would like to filter AB-SEG or H-SEG to avoid SMM cache-poisoning issue.
// So we uses scan SmmReserve Hob to remove AB-SEG or H-SEG.
//
for (Index = 0; Index <= SmramRanges; Index++) {
if (NewDescriptorBlock->Descriptor[Index].PhysicalSize == 0) {
//
// Skip zero entry
//
continue;
}
if (NewDescriptorBlock->Descriptor[Index].PhysicalStart < BASE_1MB) {
//
// Find AB-SEG or H-SEG
// remove this region
//
for (SubIndex = Index; SubIndex < NewDescriptorBlock->NumberOfSmmReservedRegions - 1; SubIndex++) {
CopyMem (&NewDescriptorBlock->Descriptor[SubIndex], &NewDescriptorBlock->Descriptor[SubIndex + 1], sizeof (EFI_SMRAM_DESCRIPTOR));
}
//
// Zero last one
//
ZeroMem (&NewDescriptorBlock->Descriptor[SubIndex], sizeof(EFI_SMRAM_DESCRIPTOR));
//
// Decrease Number
//
NewDescriptorBlock->NumberOfSmmReservedRegions --;
//
// Decrease Index to let it test mew entry
//
Index --;
}
}
//
// Last step, we can scrub old one
//
ZeroMem (&GuidHob->Name, sizeof(GuidHob->Name));
return EFI_SUCCESS;
}
/**
This routine will create AcpiVariable hob to point the reserved smram in S3 phase
for PI SMM core.
@retval EFI_SUCCESS The gEfiAcpiVariableGuid is created successfully.
@retval EFI_NOT_FOUND The gEfiSmmPeiSmramMemoryReserveGuid is not found.
**/
EFI_STATUS
EFIAPI
CreateAcpiVariableHob (
VOID
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *DescriptorBlock;
UINTN SmramRanges;
//
// Retrieve the GUID HOB data that contains the set of SMRAM descriptyors
//
DescriptorBlock = GetSrmamHobData ();
if (DescriptorBlock == NULL) {
return EFI_NOT_FOUND;
}
Hob.Raw = BuildGuidHob (
&gEfiAcpiVariableGuid,
sizeof (EFI_SMRAM_DESCRIPTOR)
);
ASSERT (Hob.Raw);
//
// It should be already patch, so just copy last but 1 region directly.
//
SmramRanges = DescriptorBlock->NumberOfSmmReservedRegions;
ASSERT (SmramRanges >= 2);
if (SmramRanges >= 2) {
CopyMem ((VOID *)Hob.Raw, &DescriptorBlock->Descriptor[SmramRanges - 2], sizeof (EFI_SMRAM_DESCRIPTOR));
}
return EFI_SUCCESS;
}
/**
Driver Entry for AcpiVariableHobOnSmramReservHob PEIM
@param FileHandle Handle of the file being invoked.
@param PeiServices Describes the list of possible PEI Services.
@retval EFI_SUCCESS Success create gEfiAcpiVariableGuid and
split gEfiSmmPeiSmramMemoryReserveGuid.
@retval EFI_NOT_FOUND Can not get gEfiSmmPeiSmramMemoryReserveGuid hob
**/
EFI_STATUS
EFIAPI
AcpiVariableHobEntry (
IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
EFI_STATUS Status;
//
// Split SmramReserve hob, which is required for PI SMM Core for S3.
//
Status = SplitSmramReserveHob ();
if (EFI_ERROR (Status)) {
return Status;
}
//
// Create AcpiVariable hob, which is required for PI SMM Core for S3.
//
Status = CreateAcpiVariableHob ();
return Status;
}

View File

@@ -1,52 +0,0 @@
## @file
# Component description file for AcpiVariableHob on SmramReservedHob Thunk driver.
#
# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = AcpiVariableHobOnSmramReserveHobThunk
FILE_GUID = 49B7F3E1-6C08-4a5b-911C-E9E397ED4178
MODULE_TYPE = PEIM
VERSION_STRING = 1.0
ENTRY_POINT = AcpiVariableHobEntry
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
AcpiVariableHobOnSmramReserveHobThunk.c
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
PeimEntryPoint
MemoryAllocationLib
DebugLib
HobLib
PeiServicesLib
BaseMemoryLib
[Guids]
gEfiSmmPeiSmramMemoryReserveGuid # ALWAYS_CONSUMED
gEfiAcpiVariableGuid # ALWAYS_CONSUMED
[Depex]
gEfiPeiMemoryDiscoveredPpiGuid

View File

@@ -1,82 +0,0 @@
## @file
# To implement Framework Boot Script Save protocol based on PI S3 Save State protocol
#
# Intel's Framework Boot Script Save Protocol is replaced by S3 Save State Protocol in PI.
# This module produces Framework Boot Script Save protocol by consuming PI S3 Save State protocol
#
# Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = BootScriptSaveOnS3SaveStateThunk
FILE_GUID = 062ACC82-1D1E-4f61-AA94-8B0C47236A3D
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = InitializeScriptSaveOnS3SaveState
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
ScriptSave.c
ScriptSave.h
[Sources.X64]
X64/AsmDispatchExecute.asm
X64/AsmDispatchExecute.S
X64/DispatchExecute.c
[Sources.Ia32]
IA32/DispatchExecute.c
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
MdeModulePkg/MdeModulePkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
UefiBootServicesTableLib
UefiRuntimeServicesTableLib
UefiDriverEntryPoint
BaseMemoryLib
MemoryAllocationLib
DebugLib
BaseLib
PeCoffLib
PcdLib
DxeServicesLib
CacheMaintenanceLib
BaseMemoryLib
DevicePathLib
UefiLib
[Protocols]
gEfiBootScriptSaveProtocolGuid ## PRODUCES
gEfiS3SaveStateProtocolGuid ## CONSUMES
[Guids]
gEdkiiMemoryProfileGuid
[Pcd]
gEfiEdkCompatibilityPkgTokenSpaceGuid.BootScriptThunkDataPtr
gEfiMdeModulePkgTokenSpaceGuid.PcdMemoryProfilePropertyMask
[Depex]
gEfiS3SaveStateProtocolGuid

View File

@@ -1,43 +0,0 @@
/** @file
Execute 32-bit code in Long Mode
Provide a thunk function to transition from long mode to compatibility mode to execute 32-bit code and then transit
back to long mode.
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "ScriptSave.h"
/**
Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
long mode.
@param Function The 32bit code entry to be executed.
@param Param1 The first parameter to pass to 32bit code
@param Param2 The second parameter to pass to 32bit code
@retval EFI_SUCCESS Execute 32bit code successfully.
@retval other Something wrong when execute the 32bit code
**/
EFI_STATUS
Execute32BitCode (
IN UINT64 Function,
IN UINT64 Param1,
IN UINT64 Param2
)
{
DISPATCH_ENTRYPOINT_FUNC EntryFunc;
EFI_STATUS Status;
EntryFunc = (DISPATCH_ENTRYPOINT_FUNC) (UINTN) (Function);
Status = EntryFunc ((VOID *)(UINTN)Param1, (VOID *)(UINTN)Param2);
return Status;
}

View File

@@ -1,993 +0,0 @@
/** @file
Implementation for S3 Boot Script Save thunk driver.
This thunk driver consumes PI S3SaveState protocol to produce framework S3BootScriptSave Protocol
Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "ScriptSave.h"
EFI_HANDLE mHandle;
EFI_BOOT_SCRIPT_SAVE_PROTOCOL mS3ScriptSave = {
BootScriptWrite,
BootScriptCloseTable
};
EFI_S3_SAVE_STATE_PROTOCOL *mS3SaveState;
/**
Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
long mode.
@param Function The 32bit code entry to be executed.
@param Param1 The first parameter to pass to 32bit code
@param Param2 The second parameter to pass to 32bit code
@retval EFI_SUCCESS Execute 32bit code successfully.
@retval other Something wrong when execute the 32bit code
**/
EFI_STATUS
Execute32BitCode (
IN UINT64 Function,
IN UINT64 Param1,
IN UINT64 Param2
);
/**
A stub to convert framework boot script dispatch to PI boot script dispatch.
@param ImageHandle It should be is NULL.
@param Context The first parameter to pass to 32bit code
@return dispatch value.
**/
EFI_STATUS
EFIAPI
FrameworkBootScriptDispatchStub (
IN EFI_HANDLE ImageHandle,
IN VOID *Context
)
{
EFI_STATUS Status;
DISPATCH_ENTRYPOINT_FUNC EntryFunc;
VOID *PeiServices;
IA32_DESCRIPTOR Idtr;
DEBUG ((EFI_D_ERROR, "FrameworkBootScriptDispatchStub - 0x%08x\n", (UINTN)Context));
EntryFunc = (DISPATCH_ENTRYPOINT_FUNC) (UINTN) (Context);
AsmReadIdtr (&Idtr);
PeiServices = (VOID *)(UINTN)(*(UINT32 *)(Idtr.Base - sizeof (UINT32)));
//
// ECP assumes first parameter is NULL, and second parameter is PeiServices.
//
Status = Execute32BitCode ((UINT64)(UINTN)EntryFunc, 0, (UINT64)(UINTN)PeiServices);
return Status;
}
/**
Internal function to add IO write opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptIoWrite (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT64 Address;
UINTN Count;
UINT8 *Buffer;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
Count = VA_ARG (Marker, UINTN);
Buffer = VA_ARG (Marker, UINT8 *);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_IO_WRITE_OPCODE,
Width,
Address,
Count,
Buffer
);
}
/**
Internal function to add IO read/write opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptIoReadWrite (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT64 Address;
UINT8 *Data;
UINT8 *DataMask;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
Data = VA_ARG (Marker, UINT8 *);
DataMask = VA_ARG (Marker, UINT8 *);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE,
Width,
Address,
Data,
DataMask
);
}
/**
Internal function to add memory write opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptMemWrite (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT64 Address;
UINTN Count;
UINT8 *Buffer;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
Count = VA_ARG (Marker, UINTN);
Buffer = VA_ARG (Marker, UINT8 *);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE,
Width,
Address,
Count,
Buffer
);
}
/**
Internal function to add memory read/write opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptMemReadWrite (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT64 Address;
UINT8 *Data;
UINT8 *DataMask;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
Data = VA_ARG (Marker, UINT8 *);
DataMask = VA_ARG (Marker, UINT8 *);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE,
Width,
Address,
Data,
DataMask
);
}
/**
Internal function to add PciCfg write opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptPciCfgWrite (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT64 Address;
UINTN Count;
UINT8 *Buffer;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
Count = VA_ARG (Marker, UINTN);
Buffer = VA_ARG (Marker, UINT8 *);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE,
Width,
Address,
Count,
Buffer
);
}
/**
Internal function to PciCfg read/write opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptPciCfgReadWrite (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT64 Address;
UINT8 *Data;
UINT8 *DataMask;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
Data = VA_ARG (Marker, UINT8 *);
DataMask = VA_ARG (Marker, UINT8 *);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE,
Width,
Address,
Data,
DataMask
);
}
/**
Internal function to add PciCfg2 write opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptPciCfg2Write (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT64 Address;
UINTN Count;
UINT8 *Buffer;
UINT16 Segment;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
Count = VA_ARG (Marker, UINTN);
Buffer = VA_ARG (Marker, UINT8 *);
Segment = VA_ARG (Marker, UINT16);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE,
Width,
Segment,
Address,
Count,
Buffer
);
}
/**
Internal function to PciCfg2 read/write opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptPciCfg2ReadWrite (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT16 Segment;
UINT64 Address;
UINT8 *Data;
UINT8 *DataMask;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
Segment = VA_ARG (Marker, UINT16);
Data = VA_ARG (Marker, UINT8 *);
DataMask = VA_ARG (Marker, UINT8 *);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE,
Width,
Segment,
Address,
Data,
DataMask
);
}
/**
Internal function to add smbus execute opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptSmbusExecute (
IN VA_LIST Marker
)
{
EFI_SMBUS_DEVICE_ADDRESS SlaveAddress;
EFI_SMBUS_DEVICE_COMMAND Command;
EFI_SMBUS_OPERATION Operation;
BOOLEAN PecCheck;
VOID *Buffer;
UINTN *DataSize;
SlaveAddress.SmbusDeviceAddress = VA_ARG (Marker, UINTN);
Command = VA_ARG (Marker, EFI_SMBUS_DEVICE_COMMAND);
Operation = VA_ARG (Marker, EFI_SMBUS_OPERATION);
PecCheck = VA_ARG (Marker, BOOLEAN);
DataSize = VA_ARG (Marker, UINTN *);
Buffer = VA_ARG (Marker, VOID *);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE,
SlaveAddress,
Command,
Operation,
PecCheck,
DataSize,
Buffer
);
}
/**
Internal function to add stall opcode to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptStall (
IN VA_LIST Marker
)
{
UINT32 Duration;
Duration = VA_ARG (Marker, UINT32);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_STALL_OPCODE,
Duration
);
}
/**
Internal function to add Save jmp address according to DISPATCH_OPCODE.
We ignore "Context" parameter
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptDispatch (
IN VA_LIST Marker
)
{
VOID *EntryPoint;
EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_DISPATCH_OPCODE,
EntryPoint
);
}
/**
Internal function to add Save jmp address according to DISPATCH_OPCODE.
We ignore "Context" parameter.
We need create thunk stub to convert PEI entrypoint (used in Framework version)
to DXE entrypoint (defined in PI spec).
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
FrameworkBootScriptDispatch (
IN VA_LIST Marker
)
{
VOID *EntryPoint;
VOID *Context;
EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
//
// Register callback
//
Context = EntryPoint;
EntryPoint = (VOID *)(UINTN)FrameworkBootScriptDispatchStub;
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE,
EntryPoint,
Context
);
}
/**
Internal function to add memory pool operation to the table.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptMemPoll (
IN VA_LIST Marker
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
UINT64 Address;
UINT8 *BitMask;
UINT8 *BitValue;
UINT64 Duration;
UINT64 LoopTimes;
UINT64 Delay;
Width = VA_ARG (Marker, EFI_BOOT_SCRIPT_WIDTH);
Address = VA_ARG (Marker, UINT64);
BitMask = VA_ARG (Marker, UINT8 *);
BitValue = VA_ARG (Marker, UINT8 *);
Duration = (UINT64)VA_ARG (Marker, UINT64);
LoopTimes = (UINT64)VA_ARG (Marker, UINT64);
//
// Framework version: Duration is used for Stall(), which is Microseconds.
// Total time is: Duration(Microseconds) * LoopTimes.
// PI version: Duration is always 100ns. Delay is LoopTimes.
// Total time is: 100ns * Delay.
// So Delay = Duration(Microseconds) * LoopTimes / 100ns
// = Duration * 1000ns * LoopTimes / 100ns
// = Duration * 10 * LoopTimes
//
Delay = MultU64x64 (MultU64x32 (Duration, 10), LoopTimes);
//
// Framework version: First BitMask, then BitValue
// PI version: First Data, then DataMask
// So we revert their order in function call
//
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_MEM_POLL_OPCODE,
Width,
Address,
BitValue,
BitMask,
Delay
);
}
/**
Internal function to add Save jmp address according to DISPATCH_OPCODE2.
The "Context" parameter is not ignored.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enough resource to do operation.
@retval EFI_SUCCESS Opcode is added.
**/
EFI_STATUS
BootScriptDispatch2 (
IN VA_LIST Marker
)
{
VOID *EntryPoint;
VOID *Context;
EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
Context = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE,
EntryPoint,
Context
);
}
/**
Internal function to add the opcode link node to the link
list.
@param Marker The variable argument list to get the opcode
and associated attributes.
@retval EFI_OUT_OF_RESOURCES Not enought resource to complete the operations.
@retval EFI_SUCCESS The opcode entry is added to the link list
successfully.
**/
EFI_STATUS
BootScriptInformation (
IN VA_LIST Marker
)
{
UINT32 InformationLength;
EFI_PHYSICAL_ADDRESS Information;
InformationLength = VA_ARG (Marker, UINT32);
Information = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
return mS3SaveState->Write (
mS3SaveState,
EFI_BOOT_SCRIPT_INFORMATION_OPCODE,
InformationLength,
(VOID*)(UINTN)Information
);
}
/**
Adds a record into a specified Framework boot script table.
This function is used to store a boot script record into a given boot
script table. If the table specified by TableName is nonexistent in the
system, a new table will automatically be created and then the script record
will be added into the new table. A boot script table can add new script records
until EFI_BOOT_SCRIPT_SAVE_PROTOCOL.CloseTable() is called. Currently, the only
meaningful table name is EFI_ACPI_S3_RESUME_SCRIPT_TABLE. This function is
responsible for allocating necessary memory for the script.
This function has a variable parameter list. The exact parameter list depends on
the OpCode that is passed into the function. If an unsupported OpCode or illegal
parameter list is passed in, this function returns EFI_INVALID_PARAMETER.
If there are not enough resources available for storing more scripts, this function returns
EFI_OUT_OF_RESOURCES.
@param This A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
@param TableName Name of the script table. Currently, the only meaningful value is
EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
@param OpCode The operation code (opcode) number.
@param ... Argument list that is specific to each opcode.
@retval EFI_SUCCESS The operation succeeded. A record was added into the
specified script table.
@retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported.
If the opcode is unknow or not supported because of the PCD
Feature Flags.
@retval EFI_OUT_OF_RESOURCES There is insufficient memory to store the boot script.
**/
EFI_STATUS
EFIAPI
BootScriptWrite (
IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL *This,
IN UINT16 TableName,
IN UINT16 OpCode,
...
)
{
EFI_STATUS Status;
VA_LIST Marker;
if (TableName != FRAMEWORK_EFI_ACPI_S3_RESUME_SCRIPT_TABLE) {
//
// Only S3 boot script is supported for now
//
return EFI_OUT_OF_RESOURCES;
}
//
// Build script according to opcode
//
switch (OpCode) {
case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptIoWrite (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptIoReadWrite (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptMemWrite (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptMemReadWrite (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptPciCfgWrite (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptPciCfgReadWrite (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptSmbusExecute (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_STALL_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptStall (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:
VA_START (Marker, OpCode);
Status = FrameworkBootScriptDispatch (Marker);
VA_END (Marker);
break;
case FRAMEWORK_EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptDispatch2 (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptInformation (Marker);
VA_END (Marker);
break;
case FRAMEWORK_EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptMemPoll (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptPciCfg2Write (Marker);
VA_END (Marker);
break;
case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
VA_START (Marker, OpCode);
Status = BootScriptPciCfg2ReadWrite (Marker);
VA_END (Marker);
break;
default:
Status = EFI_INVALID_PARAMETER;
break;
}
return Status;
}
/**
Closes the specified script table.
This function closes the specified boot script table and returns the base address
of the table. It allocates a new pool to duplicate all the boot scripts in the specified
table. Once this function is called, the specified table will be destroyed after it is
copied into the allocated pool. As a result, any attempts to add a script record into a
closed table will cause a new table to be created. The base address of the allocated pool
will be returned in Address. After using the boot script table, the caller is responsible
for freeing the pool that is allocated by this function. If the boot script table,
such as EFI_ACPI_S3_RESUME_SCRIPT_TABLE, is required to be stored in a nonperturbed
memory region, the caller should copy the table into the nonperturbed memory region by itself.
@param This A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
@param TableName Name of the script table. Currently, the only meaningful value is
EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
@param Address A pointer to the physical address where the table begins.
@retval EFI_SUCCESS The table was successfully returned.
@retval EFI_NOT_FOUND The specified table was not created previously.
@retval EFI_OUT_OF_RESOURCE Memory is insufficient to hold the reorganized boot script table.
@retval EFI_UNSUPPORTED the table type is not EFI_ACPI_S3_RESUME_SCRIPT_TABLE
**/
EFI_STATUS
EFIAPI
BootScriptCloseTable (
IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL *This,
IN UINT16 TableName,
OUT EFI_PHYSICAL_ADDRESS *Address
)
{
if (TableName != FRAMEWORK_EFI_ACPI_S3_RESUME_SCRIPT_TABLE) {
//
// Only S3 boot script is supported for now
//
return EFI_NOT_FOUND;
}
//
// Here the close table is not implemented.
//
return EFI_UNSUPPORTED;
}
/**
Register image to memory profile.
@param FileName File name of the image.
@param ImageBase Image base address.
@param ImageSize Image size.
@param FileType File type of the image.
**/
VOID
RegisterMemoryProfileImage (
IN EFI_GUID *FileName,
IN PHYSICAL_ADDRESS ImageBase,
IN UINT64 ImageSize,
IN EFI_FV_FILETYPE FileType
)
{
EFI_STATUS Status;
EDKII_MEMORY_PROFILE_PROTOCOL *ProfileProtocol;
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FilePath;
UINT8 TempBuffer[sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH) + sizeof (EFI_DEVICE_PATH_PROTOCOL)];
if ((PcdGet8 (PcdMemoryProfilePropertyMask) & BIT0) != 0) {
FilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)TempBuffer;
Status = gBS->LocateProtocol (&gEdkiiMemoryProfileGuid, NULL, (VOID **) &ProfileProtocol);
if (!EFI_ERROR (Status)) {
EfiInitializeFwVolDevicepathNode (FilePath, FileName);
SetDevicePathEndNode (FilePath + 1);
Status = ProfileProtocol->RegisterImage (
ProfileProtocol,
(EFI_DEVICE_PATH_PROTOCOL *) FilePath,
ImageBase,
ImageSize,
FileType
);
}
}
}
/**
This routine is entry point of ScriptSave driver.
@param ImageHandle Handle for this drivers loaded image protocol.
@param SystemTable EFI system table.
@retval EFI_OUT_OF_RESOURCES No enough resource
@retval EFI_SUCCESS Succesfully installed the ScriptSave driver.
@retval other Errors occured.
**/
EFI_STATUS
EFIAPI
InitializeScriptSaveOnS3SaveState (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
UINT8 *Buffer;
UINTN BufferSize;
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
BOOT_SCRIPT_THUNK_DATA *BootScriptThunkData;
EFI_STATUS Status;
VOID *DevicePath;
EFI_PHYSICAL_ADDRESS MemoryAddress;
UINTN PageNumber;
EFI_HANDLE NewImageHandle;
//
// Test if the gEfiCallerIdGuid of this image is already installed. if not, the entry
// point is loaded by DXE code which is the first time loaded. or else, it is already
// be reloaded be itself.This is a work-around
//
Status = gBS->LocateProtocol (&gEfiCallerIdGuid, NULL, &DevicePath);
if (EFI_ERROR (Status)) {
//
// This is the first-time loaded by DXE core. reload itself to RESERVED mem
//
//
// A workaround: Here we install a dummy handle
//
NewImageHandle = NULL;
Status = gBS->InstallProtocolInterface (
&NewImageHandle,
&gEfiCallerIdGuid,
EFI_NATIVE_INTERFACE,
NULL
);
ASSERT_EFI_ERROR (Status);
Status = GetSectionFromAnyFv (
&gEfiCallerIdGuid,
EFI_SECTION_PE32,
0,
(VOID **) &Buffer,
&BufferSize
);
ASSERT_EFI_ERROR (Status);
ImageContext.Handle = Buffer;
ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;
//
// Get information about the image being loaded
//
Status = PeCoffLoaderGetImageInfo (&ImageContext);
ASSERT_EFI_ERROR (Status);
MemoryAddress = SIZE_4GB - 1;
if (ImageContext.SectionAlignment > EFI_PAGE_SIZE) {
PageNumber = EFI_SIZE_TO_PAGES ((UINTN) (ImageContext.ImageSize + ImageContext.SectionAlignment));
} else {
PageNumber = EFI_SIZE_TO_PAGES ((UINTN) ImageContext.ImageSize);
}
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiReservedMemoryType,
PageNumber,
&MemoryAddress
);
ASSERT_EFI_ERROR (Status);
ImageContext.ImageAddress = (PHYSICAL_ADDRESS)(UINTN)MemoryAddress;
//
// Align buffer on section boundary
//
ImageContext.ImageAddress += ImageContext.SectionAlignment - 1;
ImageContext.ImageAddress &= ~(ImageContext.SectionAlignment - 1);
//
// Load the image to our new buffer
//
Status = PeCoffLoaderLoadImage (&ImageContext);
ASSERT_EFI_ERROR (Status);
//
// Relocate the image in our new buffer
//
Status = PeCoffLoaderRelocateImage (&ImageContext);
ASSERT_EFI_ERROR (Status);
//
// Free the buffer allocated by ReadSection since the image has been relocated in the new buffer
//
gBS->FreePool (Buffer);
//
// Flush the instruction cache so the image data is written before we execute it
//
InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);
RegisterMemoryProfileImage (
&gEfiCallerIdGuid,
ImageContext.ImageAddress,
ImageContext.ImageSize,
EFI_FV_FILETYPE_DRIVER
);
Status = ((EFI_IMAGE_ENTRY_POINT)(UINTN)(ImageContext.EntryPoint)) (NewImageHandle, SystemTable);
ASSERT_EFI_ERROR (Status);
//
// Additional step for BootScriptThunk integrity
//
//
// Allocate BootScriptThunkData
//
BootScriptThunkData = AllocatePool (sizeof (BOOT_SCRIPT_THUNK_DATA));
ASSERT (BootScriptThunkData != NULL);
BootScriptThunkData->BootScriptThunkBase = ImageContext.ImageAddress;
BootScriptThunkData->BootScriptThunkLength = ImageContext.ImageSize;
//
// Set BootScriptThunkData
//
PcdSet64 (BootScriptThunkDataPtr, (UINT64)(UINTN)BootScriptThunkData);
return EFI_SUCCESS;
} else {
//
// the entry point is invoked after reloading. following code only run in RESERVED mem
//
//
// Locate and cache PI S3 Save State Protocol.
//
Status = gBS->LocateProtocol (
&gEfiS3SaveStateProtocolGuid,
NULL,
(VOID **) &mS3SaveState
);
ASSERT_EFI_ERROR (Status);
return gBS->InstallProtocolInterface (
&mHandle,
&gEfiBootScriptSaveProtocolGuid,
EFI_NATIVE_INTERFACE,
&mS3ScriptSave
);
}
}

View File

@@ -1,119 +0,0 @@
/** @file
Header file for S3 Boot Script Saver thunk driver.
Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef __BOOT_SCRIPT_SAVE_ON_S3_SAVE_STATE_H__
#define __BOOT_SCRIPT_SAVE_ON_S3_SAVE_STATE_H__
#include <FrameworkDxe.h>
#include <Protocol/BootScriptSave.h>
#include <Protocol/S3SaveState.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/SmbusLib.h>
#include <Library/PeCoffLib.h>
#include <Library/PcdLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/DxeServicesLib.h>
#include <Library/CacheMaintenanceLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DevicePathLib.h>
#include <Library/UefiLib.h>
#include <Guid/BootScriptThunkData.h>
#include <Guid/MemoryProfile.h>
#include <IndustryStandard/SmBus.h>
typedef
EFI_STATUS
(EFIAPI *DISPATCH_ENTRYPOINT_FUNC) (
IN EFI_HANDLE ImageHandle,
IN VOID *Context
);
/**
Adds a record into a specified Framework boot script table.
This function is used to store a boot script record into a given boot
script table. If the table specified by TableName is nonexistent in the
system, a new table will automatically be created and then the script record
will be added into the new table. A boot script table can add new script records
until EFI_BOOT_SCRIPT_SAVE_PROTOCOL.CloseTable() is called. Currently, the only
meaningful table name is EFI_ACPI_S3_RESUME_SCRIPT_TABLE. This function is
responsible for allocating necessary memory for the script.
This function has a variable parameter list. The exact parameter list depends on
the OpCode that is passed into the function. If an unsupported OpCode or illegal
parameter list is passed in, this function returns EFI_INVALID_PARAMETER.
If there are not enough resources available for storing more scripts, this function returns
EFI_OUT_OF_RESOURCES.
@param This A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
@param TableName Name of the script table. Currently, the only meaningful value is
EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
@param OpCode The operation code (opcode) number.
@param ... Argument list that is specific to each opcode.
@retval EFI_SUCCESS The operation succeeded. A record was added into the
specified script table.
@retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported.
If the opcode is unknow or not supported because of the PCD
Feature Flags.
@retval EFI_OUT_OF_RESOURCES There is insufficient memory to store the boot script.
**/
EFI_STATUS
EFIAPI
BootScriptWrite (
IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL *This,
IN UINT16 TableName,
IN UINT16 OpCode,
...
);
/**
Closes the specified script table.
This function closes the specified boot script table and returns the base address
of the table. It allocates a new pool to duplicate all the boot scripts in the specified
table. Once this function is called, the specified table will be destroyed after it is
copied into the allocated pool. As a result, any attempts to add a script record into a
closed table will cause a new table to be created. The base address of the allocated pool
will be returned in Address. After using the boot script table, the caller is responsible
for freeing the pool that is allocated by this function. If the boot script table,
such as EFI_ACPI_S3_RESUME_SCRIPT_TABLE, is required to be stored in a nonperturbed
memory region, the caller should copy the table into the nonperturbed memory region by itself.
@param This A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance.
@param TableName Name of the script table. Currently, the only meaningful value is
EFI_ACPI_S3_RESUME_SCRIPT_TABLE.
@param Address A pointer to the physical address where the table begins.
@retval EFI_SUCCESS The table was successfully returned.
@retval EFI_NOT_FOUND The specified table was not created previously.
@retval EFI_OUT_OF_RESOURCE Memory is insufficient to hold the reorganized boot script table.
@retval EFI_UNSUPPORTED the table type is not EFI_ACPI_S3_RESUME_SCRIPT_TABLE
**/
EFI_STATUS
EFIAPI
BootScriptCloseTable (
IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL *This,
IN UINT16 TableName,
OUT EFI_PHYSICAL_ADDRESS *Address
);
#endif

View File

@@ -1,216 +0,0 @@
#
# Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
# 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:
#
# AsmDispatchExecute.asm
#
# Abstract:
#
# This is the assembly code to transition from long mode to compatibility mode to execute 32-bit code and then
# transit back to long mode.
#
#-------------------------------------------------------------------------------
#----------------------------------------------------------------------------
# Procedure: AsmExecute32BitCode
#
# Input: None
#
# Output: None
#
# Prototype: EFI_STATUS
# AsmExecute32BitCode (
# IN UINT64 Function,
# IN UINT64 Param1,
# IN UINT64 Param2,
# IN IA32_DESCRIPTOR *InternalGdtr
# );
#
#
# Description: A thunk function to execute 32-bit code in long mode.
#
#----------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(AsmExecute32BitCode)
ASM_PFX(AsmExecute32BitCode):
#
# save orignal GDTR and CS
#
movl %ds, %eax
push %rax
movl %cs, %eax
push %rax
subq $0x10, %rsp
sgdt (%rsp)
#
# load internal GDT
#
lgdt (%r9)
#
# Save general purpose register and rflag register
#
pushfq
push %rdi
push %rsi
push %rbp
push %rbx
#
# save CR3
#
movq %cr3, %rax
movq %rax, %rbp
#
# Prepare the CS and return address for the transition from 32-bit to 64-bit mode
#
movq $0x10, %rax # load long mode selector
shl $32, %rax
lea ReloadCS(%rip), %r9 #Assume the ReloadCS is under 4G
orq %r9, %rax
push %rax
#
# Save parameters for 32-bit function call
#
movq %r8, %rax
shl $32, %rax
orq %rdx, %rax
push %rax
#
# save the 32-bit function entry and the return address into stack which will be
# retrieve in compatibility mode.
#
lea ReturnBack(%rip), %rax #Assume the ReloadCS is under 4G
shl $32, %rax
orq %rcx, %rax
push %rax
#
# let rax save DS
#
movq $0x18, %rax
#
# Change to Compatible Segment
#
movq $8, %rcx # load compatible mode selector
shl $32, %rcx
lea Compatible(%rip), %rdx # assume address < 4G
orq %rdx, %rcx
push %rcx
.byte 0xcb # retf
Compatible:
# reload DS/ES/SS to make sure they are correct referred to current GDT
movw %ax, %ds
movw %ax, %es
movw %ax, %ss
#
# Disable paging
#
movq %cr0, %rcx
btc $31, %ecx
movq %rcx, %cr0
#
# Clear EFER.LME
#
movl $0xC0000080, %ecx
rdmsr
btc $8, %eax
wrmsr
# Now we are in protected mode
#
# Call 32-bit function. Assume the function entry address and parameter value is less than 4G
#
pop %rax # Here is the function entry
#
# Now the parameter is at the bottom of the stack, then call in to IA32 function.
#
jmp *%rax
ReturnBack:
pop %rcx # drop param1
pop %rcx # drop param2
#
# restore CR4
#
movq %cr4, %rax
bts $5, %eax
movq %rax, %cr4
#
# restore CR3
#
movl %ebp, %eax
movq %rax, %cr3
#
# Set EFER.LME to re-enable ia32-e
#
movl $0xC0000080, %ecx
rdmsr
bts $8, %eax
wrmsr
#
# Enable paging
#
movq %cr0, %rax
bts $31, %eax
mov %rax, %cr0
# Now we are in compatible mode
#
# Reload cs register
#
.byte 0xcb # retf
ReloadCS:
#
# Now we're in Long Mode
#
#
# Restore C register and eax hold the return status from 32-bit function.
# Note: Do not touch rax from now which hold the return value from IA32 function
#
pop %rbx
pop %rbp
pop %rsi
pop %rdi
popfq
#
# Switch to orignal GDT and CS. here rsp is pointer to the orignal GDT descriptor.
#
lgdt (%rsp)
#
# drop GDT descriptor in stack
#
addq $0x10, %rsp
#
# switch to orignal CS and GDTR
#
pop %r9 # get CS
shl $32, %r9 # rcx[32..47] <- Cs
lea ReturnToLongMode(%rip), %rcx
orq %r9, %rcx
push %rcx
.byte 0xcb # retf
ReturnToLongMode:
#
# Reload original DS/ES/SS
#
pop %rcx
movl %ecx, %ds
movl %ecx, %es
movl %ecx, %ss
ret

View File

@@ -1,216 +0,0 @@
;
; Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
; 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:
;
; AsmDispatchExecute.asm
;
; Abstract:
;
; This is the assembly code to transition from long mode to compatibility mode to execute 32-bit code and then
; transit back to long mode.
;
;-------------------------------------------------------------------------------
.code
;----------------------------------------------------------------------------
; Procedure: AsmExecute32BitCode
;
; Input: None
;
; Output: None
;
; Prototype: EFI_STATUS
; AsmExecute32BitCode (
; IN UINT64 Function,
; IN UINT64 Param1,
; IN UINT64 Param2,
; IN IA32_DESCRIPTOR *InternalGdtr
; );
;
;
; Description: A thunk function to execute 32-bit code in long mode.
;
;----------------------------------------------------------------------------
AsmExecute32BitCode PROC
;
; save orignal GDTR and CS
;
mov rax, ds
push rax
mov rax, cs
push rax
sub rsp, 10h
sgdt fword ptr [rsp]
;
; load internal GDT
;
lgdt fword ptr [r9]
;
; Save general purpose register and rflag register
;
pushfq
push rdi
push rsi
push rbp
push rbx
;
; save CR3
;
mov rax, cr3
mov rbp, rax
;
; Prepare the CS and return address for the transition from 32-bit to 64-bit mode
;
mov rax, 10h ; load long mode selector
shl rax, 32
mov r9, OFFSET ReloadCS ;Assume the ReloadCS is under 4G
or rax, r9
push rax
;
; Save parameters for 32-bit function call
;
mov rax, r8
shl rax, 32
or rax, rdx
push rax
;
; save the 32-bit function entry and the return address into stack which will be
; retrieve in compatibility mode.
;
mov rax, OFFSET ReturnBack ;Assume the ReloadCS is under 4G
shl rax, 32
or rax, rcx
push rax
;
; let rax save DS
;
mov rax, 018h
;
; Change to Compatible Segment
;
mov rcx, 08h ; load compatible mode selector
shl rcx, 32
mov rdx, OFFSET Compatible ; assume address < 4G
or rcx, rdx
push rcx
retf
Compatible:
; reload DS/ES/SS to make sure they are correct referred to current GDT
mov ds, ax
mov es, ax
mov ss, ax
;
; Disable paging
;
mov rcx, cr0
btc ecx, 31
mov cr0, rcx
;
; Clear EFER.LME
;
mov ecx, 0C0000080h
rdmsr
btc eax, 8
wrmsr
; Now we are in protected mode
;
; Call 32-bit function. Assume the function entry address and parameter value is less than 4G
;
pop rax ; Here is the function entry
;
; Now the parameter is at the bottom of the stack, then call in to IA32 function.
;
jmp rax
ReturnBack:
pop rcx ; drop param1
pop rcx ; drop param2
;
; restore CR4
;
mov rax, cr4
bts eax, 5
mov cr4, rax
;
; restore CR3
;
mov eax, ebp
mov cr3, rax
;
; Set EFER.LME to re-enable ia32-e
;
mov ecx, 0C0000080h
rdmsr
bts eax, 8
wrmsr
;
; Enable paging
;
mov rax, cr0
bts eax, 31
mov cr0, rax
; Now we are in compatible mode
;
; Reload cs register
;
retf
ReloadCS:
;
; Now we're in Long Mode
;
;
; Restore C register and eax hold the return status from 32-bit function.
; Note: Do not touch rax from now which hold the return value from IA32 function
;
pop rbx
pop rbp
pop rsi
pop rdi
popfq
;
; Switch to orignal GDT and CS. here rsp is pointer to the orignal GDT descriptor.
;
lgdt fword ptr[rsp]
;
; drop GDT descriptor in stack
;
add rsp, 10h
;
; switch to orignal CS and GDTR
;
pop r9 ; get CS
shl r9, 32 ; rcx[32..47] <- Cs
mov rcx, OFFSET @F
or rcx, r9
push rcx
retf
@@:
;
; Reload original DS/ES/SS
;
pop rcx
mov ds, rcx
mov es, rcx
mov ss, rcx
ret
AsmExecute32BitCode ENDP
END

View File

@@ -1,157 +0,0 @@
/** @file
Execute 32-bit code in Long Mode
Provide a thunk function to transition from long mode to compatibility mode to execute 32-bit code and then transit
back to long mode.
Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "ScriptSave.h"
#pragma pack(1)
typedef union {
struct {
UINT32 LimitLow : 16;
UINT32 BaseLow : 16;
UINT32 BaseMid : 8;
UINT32 Type : 4;
UINT32 System : 1;
UINT32 Dpl : 2;
UINT32 Present : 1;
UINT32 LimitHigh : 4;
UINT32 Software : 1;
UINT32 Reserved : 1;
UINT32 DefaultSize : 1;
UINT32 Granularity : 1;
UINT32 BaseHigh : 8;
} Bits;
UINT64 Uint64;
} IA32_GDT;
///
/// Byte packed structure for an IA-32 Interrupt Gate Descriptor.
///
typedef union {
struct {
UINT32 OffsetLow:16; ///< Offset bits 15..0.
UINT32 Selector:16; ///< Selector.
UINT32 Reserved_0:8; ///< Reserved.
UINT32 GateType:8; ///< Gate Type. See #defines above.
UINT32 OffsetHigh:16; ///< Offset bits 31..16.
} Bits;
UINT64 Uint64;
} IA32_IDT_ENTRY;
#pragma pack()
#define COMPATIBILITY_MODE_SELECTOR 8
//
// Global Descriptor Table (GDT)
//
GLOBAL_REMOVE_IF_UNREFERENCED IA32_GDT mGdtEntries[] = {
{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 0x0: reserve */
{{0xFFFF, 0, 0, 0xB, 1, 0, 1, 0xF, 0, 0, 1, 1, 0}}, /* 0x8: compatibility mode */
{{0xFFFF, 0, 0, 0xB, 1, 0, 1, 0xF, 0, 1, 0, 1, 0}}, /* 0x10: for long mode */
{{0xFFFF, 0, 0, 0x3, 1, 0, 1, 0xF, 0, 0, 1, 1, 0}}, /* 0x18: data */
{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 0x20: reserve */
};
//
// IA32 Gdt register
//
GLOBAL_REMOVE_IF_UNREFERENCED IA32_DESCRIPTOR mGdt = {
sizeof (mGdtEntries) - 1,
(UINTN) mGdtEntries
};
/**
Assembly function to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
long mode.
@param Function The 32bit code entry to be executed.
@param Param1 The first parameter to pass to 32bit code
@param Param2 The second parameter to pass to 32bit code
@param InternalGdtr The GDT and GDT descriptor used by this library
@retval EFI_SUCCESS Execute 32bit code successfully.
@retval other Something wrong when execute the 32bit code
**/
EFI_STATUS
AsmExecute32BitCode (
IN UINT64 Function,
IN UINT64 Param1,
IN UINT64 Param2,
IN IA32_DESCRIPTOR *InternalGdtr
);
/**
Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
long mode.
@param Function The 32bit code entry to be executed.
@param Param1 The first parameter to pass to 32bit code
@param Param2 The second parameter to pass to 32bit code
@retval EFI_SUCCESS Execute 32bit code successfully.
@retval other Something wrong when execute the 32bit code
**/
EFI_STATUS
Execute32BitCode (
IN UINT64 Function,
IN UINT64 Param1,
IN UINT64 Param2
)
{
EFI_STATUS Status;
IA32_DESCRIPTOR *Ia32Idtr;
IA32_DESCRIPTOR X64Idtr;
UINTN Ia32IdtEntryCount;
UINTN Index;
IA32_IDT_ENTRY *Ia32IdtEntry;
//
// Save x64 IDT Descriptor
//
AsmReadIdtr ((IA32_DESCRIPTOR *) &X64Idtr);
//
// Get the IA32 IDT Descriptor saved in 16 bytes in front of X64 IDT table.
//
Ia32Idtr = (IA32_DESCRIPTOR *) (UINTN) (X64Idtr.Base - 16);
Ia32IdtEntryCount = (Ia32Idtr->Limit + 1) / sizeof (IA32_IDT_ENTRY);
Ia32IdtEntry = (IA32_IDT_ENTRY *)(Ia32Idtr->Base);
for (Index = 0; Index < Ia32IdtEntryCount; Index ++ ) {
//
// Use the new Code Selector value
//
Ia32IdtEntry[Index].Bits.Selector = COMPATIBILITY_MODE_SELECTOR;
}
//
// Setup IA32 IDT table for 32-bit framework Boot Script code
//
AsmWriteIdtr (Ia32Idtr);
ASSERT (Function != 0);
Status = AsmExecute32BitCode (
Function,
Param1,
Param2,
&mGdt
);
//
// Restore X64 IDT table
//
AsmWriteIdtr ((IA32_DESCRIPTOR *) &X64Idtr);
return Status;
}

View File

@@ -1,73 +0,0 @@
/** @file
Boot Script Helper SMM driver.
This driver is responsible to store BootScriptThunk from ReservedMemory to SMRAM for security consideration.
Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
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.
**/
#include <PiDxe.h>
#include <Library/BaseLib.h>
#include <Library/PcdLib.h>
#include <Library/DebugLib.h>
#include <Library/LockBoxLib.h>
#include <Guid/BootScriptThunkData.h>
EFI_GUID mBootScriptThunkGuid = {
0xa053f561, 0xf56b, 0x4140, {0x89, 0x1, 0xb4, 0xcb, 0x5d, 0x70, 0x92, 0x9e}
};
/**
Entry point function of the Boot Script Thunk Helper SMM driver.
@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
@retval other Some error occurs when executing this entry point.
**/
EFI_STATUS
EFIAPI
BootScriptThunkHelperMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
BOOT_SCRIPT_THUNK_DATA *BootScriptThunkData;
EFI_STATUS Status;
//
// Get BootScriptThunk variable
//
BootScriptThunkData = (BOOT_SCRIPT_THUNK_DATA *)(UINTN)PcdGet64(BootScriptThunkDataPtr);
ASSERT (BootScriptThunkData != NULL);
if (BootScriptThunkData == NULL) {
return EFI_NOT_FOUND;
}
//
// Save BootScriptThunk image
//
Status = SaveLockBox (
&mBootScriptThunkGuid,
(VOID *)(UINTN)BootScriptThunkData->BootScriptThunkBase,
(UINTN)BootScriptThunkData->BootScriptThunkLength
);
ASSERT_EFI_ERROR (Status);
Status = SetLockBoxAttributes (&mBootScriptThunkGuid, LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE);
ASSERT_EFI_ERROR (Status);
return Status;
}

View File

@@ -1,52 +0,0 @@
## @file
# Component description file for Boot Script Thunk Helper SMM driver.
#
# Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = BootScriptThunkHelper
FILE_GUID = E633E57C-BBB1-4c6a-9F45-22C49378ADD0
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
PI_SPECIFICATION_VERSION = 0x0001000A
ENTRY_POINT = BootScriptThunkHelperMain
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
BootScriptThunkHelper.c
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
MdeModulePkg/MdeModulePkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
BaseLib
DebugLib
PcdLib
LockBoxLib
[Pcd]
gEfiEdkCompatibilityPkgTokenSpaceGuid.BootScriptThunkDataPtr
[Depex]
gEfiS3SaveStateProtocolGuid AND gEfiBootScriptSaveProtocolGuid AND gEfiLockBoxProtocolGuid

View File

@@ -1,214 +0,0 @@
/** @file
Implementation of CPU I/O 2 Protocol based on Framework CPU I/O Protocol.
Intel's Framework CPU I/O Protocol is replaced by CPU I/O 2 Protocol in PI.
This module produces PI CPU I/O 2 Protocol on top of Framework CPU I/O Protocol.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "CpuIo2OnCpuIoThunk.h"
EFI_HANDLE mCpuIo2Handle = NULL;
EFI_CPU_IO_PROTOCOL *mCpuIo;
EFI_CPU_IO2_PROTOCOL mCpuIo2 = {
{
CpuMemoryServiceRead,
CpuMemoryServiceWrite
},
{
CpuIoServiceRead,
CpuIoServiceWrite
}
};
/**
Enables a driver to read memory-mapped registers in the PI System memory space.
@param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance.
@param[in] Width Signifies the width of the memory operation.
@param[in] Address The base address of the memory operation.
@param[in] Count The number of memory operations to perform. The number of bytes moved
is Width size * Count, starting at Address.
@param[in, out] Buffer The destination buffer to store the results.
@retval EFI_SUCCESS The data was read from or written to the EFI system.
@retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL.
@retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width.
Or,The address range specified by Address, Width, and Count is not valid for this EFI system.
**/
EFI_STATUS
EFIAPI
CpuMemoryServiceRead (
IN EFI_CPU_IO2_PROTOCOL *This,
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
IN UINT64 Address,
IN UINTN Count,
IN OUT VOID *Buffer
)
{
return mCpuIo->Mem.Read (
mCpuIo,
Width,
Address,
Count,
Buffer
);
}
/**
Enables a driver to write memory-mapped registers in the PI System memory space.
@param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance.
@param[in] Width Signifies the width of the memory operation.
@param[in] Address The base address of the memory operation.
@param[in] Count The number of memory operations to perform. The number of bytes moved
is Width size * Count, starting at Address.
@param[in, out] Buffer The source buffer from which to write data.
@retval EFI_SUCCESS The data was read from or written to the EFI system.
@retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL.
@retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width.
Or,The address range specified by Address, Width, and Count is not valid for this EFI system.
**/
EFI_STATUS
EFIAPI
CpuMemoryServiceWrite (
IN EFI_CPU_IO2_PROTOCOL *This,
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
IN UINT64 Address,
IN UINTN Count,
IN OUT VOID *Buffer
)
{
return mCpuIo->Mem.Write (
mCpuIo,
Width,
Address,
Count,
Buffer
);
}
/**
Enables a driver to read registers in the PI CPU I/O space.
@param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance.
@param[in] Width Signifies the width of the I/O operation.
@param[in] Address The base address of the I/O operation. The caller is responsible
for aligning the Address if required.
@param[in] Count The number of I/O operations to perform. The number of bytes moved
is Width size * Count, starting at Address.
@param[in, out] Buffer The destination buffer to store the results.
@retval EFI_SUCCESS The data was read from or written to the EFI system.
@retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL.
@retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width.
Or,The address range specified by Address, Width, and Count is not valid for this EFI system.
**/
EFI_STATUS
EFIAPI
CpuIoServiceRead (
IN EFI_CPU_IO2_PROTOCOL *This,
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
IN UINT64 Address,
IN UINTN Count,
IN OUT VOID *Buffer
)
{
return mCpuIo->Io.Read (
mCpuIo,
Width,
Address,
Count,
Buffer
);
}
/**
Enables a driver to write registers in the PI CPU I/O space.
@param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance.
@param[in] Width Signifies the width of the I/O operation.
@param[in] Address The base address of the I/O operation. The caller is responsible
for aligning the Address if required.
@param[in] Count The number of I/O operations to perform. The number of bytes moved
is Width size * Count, starting at Address.
@param[in, out] Buffer The source buffer from which to write data.
@retval EFI_SUCCESS The data was read from or written to the EFI system.
@retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL.
@retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width.
Or,The address range specified by Address, Width, and Count is not valid for this EFI system.
**/
EFI_STATUS
EFIAPI
CpuIoServiceWrite (
IN EFI_CPU_IO2_PROTOCOL *This,
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
IN UINT64 Address,
IN UINTN Count,
IN OUT VOID *Buffer
)
{
return mCpuIo->Io.Write (
mCpuIo,
Width,
Address,
Count,
Buffer
);
}
/**
Entrypoint of CPU I/O 2 DXE thunk module.
@param ImageHandle The firmware allocated handle for the EFI image.
@param SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
**/
EFI_STATUS
EFIAPI
CpuIo2OnCpuIoThunkInitialize (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
//
// Locate and cache Framework CPU I/O Protocol.
//
Status = gBS->LocateProtocol (
&gEfiCpuIoProtocolGuid,
NULL,
(VOID **) &mCpuIo
);
ASSERT_EFI_ERROR (Status);
//
// Install the CPU I/O 2 Protocol on a new handle.
//
Status = gBS->InstallMultipleProtocolInterfaces (
&mCpuIo2Handle,
&gEfiCpuIo2ProtocolGuid, &mCpuIo2,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}

View File

@@ -1,130 +0,0 @@
/** @file
Internal include file for the CPU I/O 2 Protocol thunk driver.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef __CPU_IO2_ON_CPU_IO_H__
#define __CPU_IO2_ON_CPU_IO_H__
#include <Protocol/CpuIo2.h>
#include <Protocol/CpuIo.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
/**
Enables a driver to read memory-mapped registers in the PI System memory space.
@param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance.
@param[in] Width Signifies the width of the memory operation.
@param[in] Address The base address of the memory operation.
@param[in] Count The number of memory operations to perform. The number of bytes moved
is Width size * Count, starting at Address.
@param[in, out] Buffer The destination buffer to store the results.
@retval EFI_SUCCESS The data was read from or written to the EFI system.
@retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL.
@retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width.
Or,The address range specified by Address, Width, and Count is not valid for this EFI system.
**/
EFI_STATUS
EFIAPI
CpuMemoryServiceRead (
IN EFI_CPU_IO2_PROTOCOL *This,
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
IN UINT64 Address,
IN UINTN Count,
IN OUT VOID *Buffer
);
/**
Enables a driver to write memory-mapped registers in the PI System memory space.
@param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance.
@param[in] Width Signifies the width of the memory operation.
@param[in] Address The base address of the memory operation.
@param[in] Count The number of memory operations to perform. The number of bytes moved
is Width size * Count, starting at Address.
@param[in, out] Buffer The source buffer from which to write data.
@retval EFI_SUCCESS The data was read from or written to the EFI system.
@retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL.
@retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width.
Or,The address range specified by Address, Width, and Count is not valid for this EFI system.
**/
EFI_STATUS
EFIAPI
CpuMemoryServiceWrite (
IN EFI_CPU_IO2_PROTOCOL *This,
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
IN UINT64 Address,
IN UINTN Count,
IN OUT VOID *Buffer
);
/**
Enables a driver to read registers in the PI CPU I/O space.
@param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance.
@param[in] Width Signifies the width of the I/O operation.
@param[in] Address The base address of the I/O operation. The caller is responsible
for aligning the Address if required.
@param[in] Count The number of I/O operations to perform. The number of bytes moved
is Width size * Count, starting at Address.
@param[in, out] Buffer The destination buffer to store the results.
@retval EFI_SUCCESS The data was read from or written to the EFI system.
@retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL.
@retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width.
Or,The address range specified by Address, Width, and Count is not valid for this EFI system.
**/
EFI_STATUS
EFIAPI
CpuIoServiceRead (
IN EFI_CPU_IO2_PROTOCOL *This,
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
IN UINT64 Address,
IN UINTN Count,
IN OUT VOID *Buffer
);
/**
Enables a driver to write registers in the PI CPU I/O space.
@param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance.
@param[in] Width Signifies the width of the I/O operation.
@param[in] Address The base address of the I/O operation. The caller is responsible
for aligning the Address if required.
@param[in] Count The number of I/O operations to perform. The number of bytes moved
is Width size * Count, starting at Address.
@param[in, out] Buffer The source buffer from which to write data.
@retval EFI_SUCCESS The data was read from or written to the EFI system.
@retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL.
@retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width.
Or,The address range specified by Address, Width, and Count is not valid for this EFI system.
**/
EFI_STATUS
EFIAPI
CpuIoServiceWrite (
IN EFI_CPU_IO2_PROTOCOL *This,
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
IN UINT64 Address,
IN UINTN Count,
IN OUT VOID *Buffer
);
#endif

View File

@@ -1,53 +0,0 @@
## @file
# Implementation of CPU I/O 2 Protocol based on Framework CPU I/O Protocol.
#
# Intel's Framework CPU I/O Protocol is replaced by CPU I/O 2 Protocol in PI.
# This module produces PI CPU I/O 2 Protocol on top of Framework CPU I/O Protocol.
#
# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = CpuIo2OnCpuIoThunk
FILE_GUID = 503E70FE-047A-410B-A55F-4F63C9382C1E
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = CpuIo2OnCpuIoThunkInitialize
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
CpuIo2OnCpuIoThunk.c
CpuIo2OnCpuIoThunk.h
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
DebugLib
UefiBootServicesTableLib
[Protocols]
gEfiCpuIo2ProtocolGuid ## PRODUCES
gEfiCpuIoProtocolGuid ## CONSUMES
[Depex]
gEfiCpuIoProtocolGuid

View File

@@ -1,59 +0,0 @@
## @file
# Module Layer Device I/O on top of PCI Root Bridge I/O (Segment 0)
#
# Device I/O is on list of deprecated protocols for UEFI 2.0 and later.
# This module layers Device I/O on top of PCI Root Bridge I/O (Segment 0)
# Use if:
# There are no EDK modules present that produces Device I/O
# EFI drivers included that consume Device I/O
# Platform required to support EFI drivers that consume Device I/O
# Platform required to support EFI applications that consume Device I/O
#
# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = DeviceIoOnPciRootBridgeIoThunk
FILE_GUID = 6E5ED30F-EC52-4136-8A41-3F4324218E41
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = InitializeDeviceIo
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
DeviceIoOnPciRootBridgeIoThunk.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiDriverEntryPoint
UefiBootServicesTableLib
BaseLib
DebugLib
UefiLib
MemoryAllocationLib
BaseMemoryLib
DevicePathLib
[Protocols]
gEfiDeviceIoProtocolGuid
gEfiPciRootBridgeIoProtocolGuid
[Depex]
TRUE

View File

@@ -1,94 +0,0 @@
/** @file
DxeSmmReadyToLock Protocol on ExitPmAuth Protocol Thunk driver.
EDK platform uses ExitPmAuth point to lock SMRAM and SMM API.
But EDKII uses DxeSmmReadyToLock. We need a thunk driver to convert this event.
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "DxeSmmReadyToLockOnExitPmAuthThunk.h"
/**
ExitPmAuth Protocol notification event handler.
@param[in] Event Event whose notification function is being invoked.
@param[in] Context Pointer to the notification function's context.
**/
VOID
EFIAPI
ExitPmAuthProtocolNotification (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status;
EFI_HANDLE ImageHandle;
VOID *ExitPmAuth;
//
// Add more check to locate protocol after got event, because
// ECP will signal this event immediately once it is register
// just in case it is already installed.
//
Status = gBS->LocateProtocol (
&gExitPmAuthProtocolGuid,
NULL,
&ExitPmAuth
);
if (EFI_ERROR (Status)) {
return ;
}
//
// Install DxeSmmReadyToLock protocol to let PI SMM lock
//
ImageHandle = NULL;
Status = gBS->InstallProtocolInterface (
&ImageHandle,
&gEfiDxeSmmReadyToLockProtocolGuid,
EFI_NATIVE_INTERFACE,
NULL
);
ASSERT_EFI_ERROR (Status);
}
/**
Entry Point for DxeSmmReadyToLock Protocol on ExitPmAuth Protocol Thunk driver.
@param[in] ImageHandle Image handle of this driver.
@param[in] SystemTable A Pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
**/
EFI_STATUS
EFIAPI
DxeSmmReadyToLockMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
VOID *Registration;
//
// Install notifications for required protocols
//
EfiCreateProtocolNotifyEvent (
&gExitPmAuthProtocolGuid,
TPL_CALLBACK,
ExitPmAuthProtocolNotification,
NULL,
&Registration
);
return EFI_SUCCESS;
}

View File

@@ -1,28 +0,0 @@
/** @file
Include file for DxeSmmReadyToLock Protocol on ExitPmAuth Protocol Thunk driver.
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _DXE_SMM_READY_TO_LOCK_ON_EXIT_PMAUTH_THUNK_H_
#define _DXE_SMM_READY_TO_LOCK_ON_EXIT_PMAUTH_THUNK_H_
#include <PiDxe.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiLib.h>
#include <Protocol/DxeSmmReadyToLock.h>
#include <Protocol/ExitPmAuth.h>
#endif

View File

@@ -1,52 +0,0 @@
## @file
# Component description file for DxeSmmReadyToLock Protocol on
# ExitPmAuth Protocol Thunk driver.
#
# Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = DxeSmmReadyToLockOnExitPmAuthThunk
FILE_GUID = 82ECEE48-9571-4427-8485-85A5A45A0F39
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = DxeSmmReadyToLockMain
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
DxeSmmReadyToLockOnExitPmAuthThunk.c
DxeSmmReadyToLockOnExitPmAuthThunk.h
[Packages]
MdePkg/MdePkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
[LibraryClasses]
UefiDriverEntryPoint
UefiBootServicesTableLib
DebugLib
UefiLib
[Protocols]
gEfiDxeSmmReadyToLockProtocolGuid # PROTOCOL ALWAYS_PRODUCED
gExitPmAuthProtocolGuid # PROTOCOL ALWAYS_CONSUMED
[Depex]
TRUE

View File

@@ -1,146 +0,0 @@
/** @file
This file contains functions related to Config Access Protocols installed by
by HII Thunk Modules which is used to thunk UEFI Config Access Callback to
Framework HII Callback.
Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _HII_THUNK_CONFIG_ACCESS_H_
#define _HII_THUNK_CONFIG_ACCESS_H_
/**
This function installs a EFI_CONFIG_ACCESS_PROTOCOL instance for a form package registered
by a module using Framework HII Protocol Interfaces.
UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so
that Setup Utility can load the Buffer Storage using this protocol.
@param Packages The Package List.
@param ThunkContext The Thunk Context.
@retval EFI_SUCCESS The Config Access Protocol is installed successfully.
@retval EFI_OUT_RESOURCE There is not enough memory.
**/
EFI_STATUS
InstallDefaultConfigAccessProtocol (
IN CONST EFI_HII_PACKAGES *Packages,
IN OUT HII_THUNK_CONTEXT *ThunkContext
);
/**
This function un-installs the EFI_CONFIG_ACCESS_PROTOCOL instance for a form package registered
by a module using Framework HII Protocol Interfaces.
ASSERT if no Config Access is found for such pakcage list or failed to uninstall the protocol.
@param ThunkContext The Thunk Context.
**/
VOID
UninstallDefaultConfigAccessProtocol (
IN HII_THUNK_CONTEXT *ThunkContext
);
/**
This function implement the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig
so that data can be read from the data storage such as UEFI Variable or module's
customized storage exposed by EFI_FRAMEWORK_CALLBACK.
@param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL
@param Request A null-terminated Unicode string in <ConfigRequest> format. Note that this
includes the routing information as well as the configurable name / value pairs. It is
invalid for this string to be in <MultiConfigRequest> format.
@param Progress On return, points to a character in the Request string. Points to the string's null
terminator if request was successful. Points to the most recent '&' before the first
failing name / value pair (or the beginning of the string if the failure is in the first
name / value pair) if the request was not successful
@param Results A null-terminated Unicode string in <ConfigAltResp> format which has all
values filled in for the names in the Request string. String to be allocated by the called
function.
@retval EFI_INVALID_PARAMETER If there is no Buffer Storage for this Config Access instance.
@retval EFI_SUCCESS The setting is retrived successfully.
@retval !EFI_SUCCESS The error returned by UEFI Get Variable or Framework Form Callback Nvread.
**/
EFI_STATUS
EFIAPI
ThunkExtractConfig (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Request,
OUT EFI_STRING *Progress,
OUT EFI_STRING *Results
);
/**
This function implement the EFI_HII_CONFIG_ACCESS_PROTOCOL.RouteConfig
so that data can be written to the data storage such as UEFI Variable or module's
customized storage exposed by EFI_FRAMEWORK_CALLBACK.
@param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL
@param Configuration A null-terminated Unicode string in <ConfigResp> format.
@param Progress A pointer to a string filled in with the offset of the most recent '&' before the first
failing name / value pair (or the beginning of the string if the failure is in the first
name / value pair) or the terminating NULL if all was successful.
@retval EFI_INVALID_PARAMETER If there is no Buffer Storage for this Config Access instance.
@retval EFI_SUCCESS The setting is saved successfully.
@retval !EFI_SUCCESS The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.
**/
EFI_STATUS
EFIAPI
ThunkRouteConfig (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Configuration,
OUT EFI_STRING *Progress
);
/**
Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.CallBack to EFI_FORM_CALLBACK_PROTOCOL.Callback. Therefor,
the framework HII module willl do no porting and work with a UEFI HII SetupBrowser.
@param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
@param Action Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.
@param QuestionId A unique value which is sent to the original exporting driver so that it can identify the
type of data to expect. The format of the data tends to vary based on the opcode that
generated the callback.
@param Type The type of value for the question. See EFI_IFR_TYPE_x in
EFI_IFR_ONE_OF_OPTION.
@param Value A pointer to the data being sent to the original exporting driver. The type is specified
by Type. Type EFI_IFR_TYPE_VALUE is defined in
EFI_IFR_ONE_OF_OPTION.
@param ActionRequest On return, points to the action requested by the callback function. Type
EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form
Browser Protocol.
@retval EFI_UNSUPPORTED If the Framework HII module does not register Callback although it specify the opcode under
focuse to be INTERRACTIVE.
@retval EFI_SUCCESS The callback complete successfully.
@retval !EFI_SUCCESS The error code returned by EFI_FORM_CALLBACK_PROTOCOL.Callback.
**/
EFI_STATUS
EFIAPI
ThunkCallback (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
);
#endif

View File

@@ -1,187 +0,0 @@
/** @file
This file contains the Glyph related function.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
EFI_NARROW_GLYPH mNarrowGlyphBuffer = {0, 0, {0}};
BOOLEAN mSysFontColorCached = FALSE;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL mSysFGColor = {0};
/**
Translates a Unicode character into the corresponding font glyph.
Notes:
This function is only called by Graphics Console module and GraphicsLib.
Wrap the Framework HII GetGlyph function to UEFI Font Protocol.
EDK II provides a UEFI Graphics Console module. ECP provides a GraphicsLib
complying to UEFI HII.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Source A pointer to a Unicode string.
@param Index On input, the offset into the string from which to fetch the character. On successful completion, the
index is updated to the first character past the character(s) making up the just extracted glyph.
@param GlyphBuffer Pointer to an array where the glyphs corresponding to the characters in the source may be stored.
GlyphBuffer is assumed to be wide enough to accept a wide glyph character.
@param BitWidth If EFI_SUCCESS was returned, the UINT16 pointed to by this value is filled with the length of the glyph in pixels.
It is unchanged if the call was unsuccessful.
@param InternalStatus To save the time required to read the string from the beginning on each glyph extraction
(for example, to ensure that the narrow versus wide glyph mode is correct), this value is
updated each time the function is called with the status that is local to the call. The cell pointed
to by this parameter must be initialized to zero prior to invoking the call the first time for any string.
@retval EFI_SUCCESS It worked.
@retval EFI_NOT_FOUND A glyph for a character was not found.
**/
EFI_STATUS
EFIAPI
HiiGetGlyph (
IN EFI_HII_PROTOCOL *This,
IN CHAR16 *Source,
IN OUT UINT16 *Index,
OUT UINT8 **GlyphBuffer,
OUT UINT16 *BitWidth,
IN OUT UINT32 *InternalStatus
)
{
EFI_STATUS Status;
EFI_IMAGE_OUTPUT *Blt;
EFI_FONT_DISPLAY_INFO *FontInfo;
UINTN Xpos;
UINTN Ypos;
UINTN BaseLine;
if (!mSysFontColorCached) {
//
// Cache the system font's foreground color.
//
Status = mHiiFontProtocol->GetFontInfo (
mHiiFontProtocol,
NULL,
NULL,
&FontInfo,
NULL
);
if (!EFI_ERROR (Status)) {
ASSERT (StrCmp (FontInfo->FontInfo.FontName, L"sysdefault") == 0);
mSysFGColor = FontInfo->ForegroundColor;
FreePool (FontInfo);
mSysFontColorCached = TRUE;
}
}
Blt = NULL;
Status = mHiiFontProtocol->GetGlyph (
mHiiFontProtocol,
Source[*Index],
NULL,
&Blt,
&BaseLine
);
if (!EFI_ERROR (Status) && (Status != EFI_WARN_UNKNOWN_GLYPH)) {
//
// For simplicity, we only handle Narrow Glyph.
//
if (Blt->Height == EFI_GLYPH_HEIGHT && Blt->Width == EFI_GLYPH_WIDTH) {
ZeroMem (&mNarrowGlyphBuffer, sizeof (mNarrowGlyphBuffer));
mNarrowGlyphBuffer.UnicodeWeight = *Source;
for (Ypos = 0; Ypos < EFI_GLYPH_HEIGHT; Ypos++) {
for (Xpos = 0; Xpos < EFI_GLYPH_WIDTH; Xpos++) {
if (CompareMem (&Blt->Image.Bitmap[Ypos * EFI_GLYPH_WIDTH + Xpos], &mSysFGColor, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)) == 0) {
mNarrowGlyphBuffer.GlyphCol1[Ypos] = (UINT8) (mNarrowGlyphBuffer.GlyphCol1[Ypos] | (1 << (EFI_GLYPH_WIDTH - 1 - Xpos)));
}
}
}
*GlyphBuffer = (UINT8 *) &mNarrowGlyphBuffer;
*BitWidth = EFI_GLYPH_WIDTH;
*Index += 1;
} else {
Status = EFI_NOT_FOUND;
}
}
if (EFI_ERROR (Status) || (Status == EFI_WARN_UNKNOWN_GLYPH)) {
if (Status == EFI_WARN_UNKNOWN_GLYPH) {
Status = EFI_NOT_FOUND;
}
*GlyphBuffer = NULL;
}
return Status;
}
/**
Translates a glyph into the format required for input to the Universal Graphics Adapter (UGA) Block Transfer (BLT) routines.
Notes:
This function is only called by Graphics Console module and GraphicsLib.
EDK II provides a UEFI Graphics Console module. ECP provides a GraphicsLib
complying to UEFI HII.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param GlyphBuffer A pointer to the buffer that contains glyph data.
@param Foreground The foreground setting requested to be used for the generated BltBuffer data. Type EFI_UGA_PIXEL is defined in "Related Definitions" below.
@param Background The background setting requested to be used for the generated BltBuffer data.
@param Count The entry in the BltBuffer upon which to act.
@param Width The width in bits of the glyph being converted.
@param Height The height in bits of the glyph being converted
@param BltBuffer A pointer to the buffer that contains the data that is ready to be used by the UGA BLT routines.
@retval EFI_SUCCESS It worked.
@retval EFI_NOT_FOUND A glyph for a character was not found.
**/
EFI_STATUS
EFIAPI
HiiGlyphToBlt (
IN EFI_HII_PROTOCOL *This,
IN UINT8 *GlyphBuffer,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background,
IN UINTN Count,
IN UINTN Width,
IN UINTN Height,
IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer
)
{
UINTN Xpos;
UINTN Ypos;
//
// Convert Monochrome bitmap of the Glyph to BltBuffer structure
//
for (Ypos = 0; Ypos < Height; Ypos++) {
for (Xpos = 0; Xpos < Width; Xpos++) {
if ((((EFI_NARROW_GLYPH *) GlyphBuffer)->GlyphCol1[Ypos] & (1 << Xpos)) != 0) {
BltBuffer[Ypos * Width * Count + (Width - Xpos - 1)] = Foreground;
} else {
BltBuffer[Ypos * Width * Count + (Width - Xpos - 1)] = Background;
}
}
}
return EFI_SUCCESS;
}

View File

@@ -1,598 +0,0 @@
/** @file
This file contains the form processing code to the HII database.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
#include "UefiIfrDefault.h"
//
// This structure is only intended to be used in this file.
//
#pragma pack(1)
typedef struct {
EFI_HII_PACK_HEADER PackageHeader;
FRAMEWORK_EFI_IFR_FORM_SET FormSet;
EFI_IFR_END_FORM_SET EndFormSet;
} FW_HII_FORMSET_TEMPLATE;
#pragma pack()
FW_HII_FORMSET_TEMPLATE FormSetTemplate = {
{
sizeof (FW_HII_FORMSET_TEMPLATE),
EFI_HII_IFR
},
{
{
FRAMEWORK_EFI_IFR_FORM_SET_OP,
sizeof (FRAMEWORK_EFI_IFR_FORM_SET)
},
{0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}, //Guid
0,
0,
0,
0,
0,
0
},
{
{
EFI_IFR_END_FORM_SET_OP,
sizeof (EFI_IFR_END_FORM_SET)
}
}
};
EFI_GUID mTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;
/**
This thunk module only handles UEFI HII packages. The caller of this function
won't be able to parse the content. Therefore, it is not supported.
This function will ASSERT and return EFI_UNSUPPORTED.
@param This N.A.
@param Handle N.A.
@param BufferSize N.A.
@param Buffer N.A.
@retval EFI_UNSUPPORTED
**/
EFI_STATUS
EFIAPI
HiiExportDatabase (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN OUT UINTN *BufferSize,
OUT VOID *Buffer
)
{
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
/**
This function allows a program to extract a form or form package that has
previously been registered with the EFI HII database.
In this thunk module, this function will create a IFR Package with only
one Formset. Effectively, only the GUID of the Formset is updated and return
in this IFR package to caller. This is enable the Framework modules which call
a API named GetStringFromToken. GetStringFromToken retieves a String based on
a String Token from a Package List known only by the Formset GUID.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE is defined in
EFI_HII_PROTOCOL.NewPack() in the Packages section.
@param FormId Ignored by this implementation.
@param BufferLengthTemp On input, the size of input buffer. On output, it
is the size of FW_HII_FORMSET_TEMPLATE.
@param Buffer The buffer designed to receive the form(s).
@retval EFI_SUCCESS Buffer filled with the requested forms. BufferLength
was updated.
@retval EFI_INVALID_PARAMETER The handle is unknown.
@retval EFI_NOT_FOUND A form on the requested handle cannot be found with the
requested FormId.
@retval EFI_BUFFER_TOO_SMALL The buffer provided was not large enough to allow the form to be stored.
**/
EFI_STATUS
EFIAPI
HiiGetForms (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN EFI_FORM_ID FormId,
IN OUT UINTN *BufferLengthTemp,
OUT UINT8 *Buffer
)
{
HII_THUNK_PRIVATE_DATA *Private;
HII_THUNK_CONTEXT *ThunkContext;
FW_HII_FORMSET_TEMPLATE *OutputFormSet;
if (*BufferLengthTemp < sizeof(FW_HII_FORMSET_TEMPLATE)) {
*BufferLengthTemp = sizeof(FW_HII_FORMSET_TEMPLATE);
return EFI_BUFFER_TOO_SMALL;
}
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
ThunkContext = FwHiiHandleToThunkContext (Private, Handle);
if (ThunkContext == NULL) {
return EFI_NOT_FOUND;
}
OutputFormSet = (FW_HII_FORMSET_TEMPLATE *) Buffer;
CopyMem (OutputFormSet, &FormSetTemplate, sizeof (FW_HII_FORMSET_TEMPLATE));
CopyMem (&OutputFormSet->FormSet.Guid, &ThunkContext->TagGuid, sizeof (EFI_GUID));
if (ThunkContext->FormSet != NULL) {
OutputFormSet->FormSet.Class = ThunkContext->FormSet->Class;
OutputFormSet->FormSet.SubClass = ThunkContext->FormSet->SubClass;
OutputFormSet->FormSet.Help = ThunkContext->FormSet->Help;
OutputFormSet->FormSet.FormSetTitle = ThunkContext->FormSet->FormSetTitle;
}
return EFI_SUCCESS;
}
/**
This function allows a program to extract the NV Image
that represents the default storage image
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The HII handle from which will have default data retrieved.
UINTN - Mask used to retrieve the default image.
@param DefaultMask EDES_TODO: Add parameter description
@param VariablePackList Callee allocated, tightly-packed, link list data
structure that contain all default varaible packs
from the Hii Database.
@retval EFI_NOT_FOUND If Hii database does not contain any default images.
@retval EFI_INVALID_PARAMETER Invalid input parameter.
@retval EFI_SUCCESS Operation successful.
**/
EFI_STATUS
EFIAPI
HiiGetDefaultImage (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN UINTN DefaultMask,
OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList
)
{
LIST_ENTRY *UefiDefaults;
EFI_STATUS Status;
HII_THUNK_PRIVATE_DATA *Private;
HII_THUNK_CONTEXT *ThunkContext;
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
ThunkContext = FwHiiHandleToThunkContext (Private, Handle);
if (ThunkContext == NULL) {
ASSERT (FALSE);
return EFI_INVALID_PARAMETER;
}
UefiDefaults = NULL;
Status = UefiIfrGetBufferTypeDefaults (ThunkContext, &UefiDefaults);
if (EFI_ERROR (Status)) {
goto Done;
}
Status = UefiDefaultsToFwDefaults (UefiDefaults, DefaultMask, ThunkContext->FormSet->DefaultVarStoreId, VariablePackList);
Done:
FreeDefaultList (UefiDefaults);
return Status;
}
/**
This function update the FormCallbackProtocol cached in Config Access
private context data.
@param CallbackHandle The EFI Handle on which the Framework FormCallbackProtocol is
installed.
@param ThunkContext The Thunk Context.
@retval EFI_SUCCESS The update is successful.
@retval EFI_INVALID_PARAMETER If no Framework FormCallbackProtocol is located on CallbackHandle.
**/
EFI_STATUS
UpdateFormCallBack (
IN EFI_HANDLE CallbackHandle,
IN CONST HII_THUNK_CONTEXT *ThunkContext
)
{
EFI_STATUS Status;
EFI_FORM_CALLBACK_PROTOCOL *FormCallbackProtocol;
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccessProtocol;
EFI_HANDLE UefiDriverHandle;
CONFIG_ACCESS_PRIVATE *ConfigAccessPrivate;
Status = gBS->HandleProtocol (
CallbackHandle,
&gEfiFormCallbackProtocolGuid,
(VOID **) &FormCallbackProtocol
);
if (EFI_ERROR (Status)) {
return EFI_INVALID_PARAMETER;
}
Status = mHiiDatabase->GetPackageListHandle (
mHiiDatabase,
ThunkContext->UefiHiiHandle,
&UefiDriverHandle
);
ASSERT_EFI_ERROR (Status);
Status = gBS->HandleProtocol (
UefiDriverHandle,
&gEfiHiiConfigAccessProtocolGuid,
(VOID **) &ConfigAccessProtocol
);
ASSERT_EFI_ERROR (Status);
ConfigAccessPrivate = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (ConfigAccessProtocol);
ConfigAccessPrivate->FormCallbackProtocol = FormCallbackProtocol;
return EFI_SUCCESS;
}
/**
Get the package data from the Package List.
@param HiiPackageList Package List.
@param PackageIndex The index of the Package in the Package List.
@param BufferLen The Length of the Pacage data.
@param Buffer On output, the Package data.
@return EFI_NOT_FOUND No Package is found for PackageIndex.
@return EFI_SUCCESS The package data is returned.
**/
EFI_STATUS
GetPackageData (
IN EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,
IN UINT32 PackageIndex,
OUT UINT32 *BufferLen,
OUT EFI_HII_PACKAGE_HEADER **Buffer
)
{
UINT32 Index;
EFI_HII_PACKAGE_HEADER *Package;
UINT32 Offset;
UINT32 PackageListLength;
EFI_HII_PACKAGE_HEADER PackageHeader;
ASSERT(HiiPackageList != NULL);
if ((BufferLen == NULL) || (Buffer == NULL)) {
return EFI_INVALID_PARAMETER;
}
ZeroMem (&PackageHeader, sizeof (PackageHeader));
Package = NULL;
Index = 0;
Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
while (Offset < PackageListLength) {
Package = (EFI_HII_PACKAGE_HEADER *) (((UINT8 *) HiiPackageList) + Offset);
CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
if (Index == PackageIndex) {
break;
}
Offset += PackageHeader.Length;
Index++;
}
if (Offset >= PackageListLength) {
//
// no package found in this Package List
//
return EFI_NOT_FOUND;
}
*BufferLen = PackageHeader.Length;
*Buffer = Package;
return EFI_SUCCESS;
}
/**
Check if Label exist in the IFR form package and return the FormSet GUID
and Form ID.
@param Package The Package Header.
@param Label The Label ID.
@param FormsetGuid Returns the FormSet GUID.
@param FormId Returns the Form ID.
@retval EFI_SUCCESS The FORM ID is found.
@retval EFI_NOT_FOUND The FORM ID is not found.
**/
EFI_STATUS
LocateLabel (
IN CONST EFI_HII_PACKAGE_HEADER *Package,
IN EFI_FORM_LABEL Label,
OUT EFI_GUID *FormsetGuid,
OUT EFI_FORM_ID *FormId
)
{
UINTN Offset;
EFI_IFR_OP_HEADER *IfrOpHdr;
EFI_GUID InternalFormSetGuid;
EFI_FORM_ID InternalFormId;
BOOLEAN GetFormSet;
BOOLEAN GetForm;
EFI_IFR_GUID_LABEL *LabelOpcode;
IfrOpHdr = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + sizeof (EFI_HII_PACKAGE_HEADER));
Offset = sizeof (EFI_HII_PACKAGE_HEADER);
InternalFormId= 0;
ZeroMem (&InternalFormSetGuid, sizeof (EFI_GUID));
GetFormSet = FALSE;
GetForm = FALSE;
while (Offset < Package->Length) {
switch (IfrOpHdr->OpCode) {
case EFI_IFR_FORM_SET_OP :
CopyMem (&InternalFormSetGuid, &((EFI_IFR_FORM_SET *) IfrOpHdr)->Guid, sizeof (EFI_GUID));
GetFormSet = TRUE;
break;
case EFI_IFR_FORM_OP:
CopyMem (&InternalFormId, &((EFI_IFR_FORM *) IfrOpHdr)->FormId, sizeof (EFI_FORM_ID));
GetForm = TRUE;
break;
case EFI_IFR_GUID_OP :
LabelOpcode = (EFI_IFR_GUID_LABEL *) IfrOpHdr;
//
// If it is an Label opcode.
//
if ((LabelOpcode->ExtendOpCode == EFI_IFR_EXTEND_OP_LABEL) && (CompareMem (&LabelOpcode->Guid, &mTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0)) {
if (CompareMem (&Label, &LabelOpcode->Number, sizeof (UINT16)) == 0) {
ASSERT (GetForm && GetFormSet);
CopyGuid (FormsetGuid, &InternalFormSetGuid);
*FormId = InternalFormId;
return EFI_SUCCESS;
}
}
break;
default :
break;
}
//
// Go to the next Op-Code
//
Offset += IfrOpHdr->Length;
IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length);
}
return EFI_NOT_FOUND;
}
/**
Find the first EFI_FORM_LABEL in FormSets for a given EFI_HII_HANLDE defined.
EFI_FORM_LABEL is a specific to Tiano implementation. The current implementation
does not restrict labels with same label value to be duplicated in either FormSet
scope or Form scope. This function will only locate the FIRST EFI_FORM_LABEL
with value as the same as the input Label in the Formset registered with UefiHiiHandle. The FormSet GUID
and Form ID is returned if such Label is found.
@param Handle Uefi Hii Handle to be searched.
@param Label The first Label ID to be found.
@param FormsetGuid The matched FormSet GUID.
@param FormId The matched Form ID.
@retval EFI_INVALID_PARAMETER If UefiHiiHandle is not a valid handle.
@retval EFI_NOT_FOUND The package list identified by UefiHiiHandle deos not contain FormSet or
Form ID with value Label found in all Form Sets in the pacakge list.
@retval EFI_SUCCESS The first found Form ID is returned in FormId.
**/
EFI_STATUS
LocateFormId (
IN EFI_HII_HANDLE Handle,
IN EFI_FORM_LABEL Label,
OUT EFI_GUID *FormsetGuid,
OUT EFI_FORM_ID *FormId
)
{
EFI_STATUS Status;
EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
UINT32 Index;
UINTN BufferSize;
EFI_HII_PACKAGE_HEADER PackageHeader;
EFI_HII_PACKAGE_HEADER *Package;
UINT32 PackageLength;
BufferSize = 0;
HiiPackageList = NULL;
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);
if (Status == EFI_BUFFER_TOO_SMALL) {
HiiPackageList = AllocatePool (BufferSize);
ASSERT (HiiPackageList != NULL);
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);
if (EFI_ERROR (Status)) {
goto Done;
}
}
for (Index = 0; ; Index++) {
Status = GetPackageData (HiiPackageList, Index, &PackageLength, &Package);
if (!EFI_ERROR (Status)) {
CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
Status = LocateLabel (Package, Label, FormsetGuid, FormId);
if (!EFI_ERROR(Status)) {
break;
}
}
} else {
break;
}
}
Done:
FreePool (HiiPackageList);
return Status;
}
/**
This function allows the caller to update a form that has
previously been registered with the EFI HII database.
@param This EDES_TODO: Add parameter description
@param Handle Hii Handle associated with the Formset to modify
@param Label Update information starting immediately after this label in the IFR
@param AddData If TRUE, add data. If FALSE, remove data
@param Data If adding data, this is the pointer to the data to add
@retval EFI_SUCCESS Update success.
@retval Other Update fail.
**/
EFI_STATUS
EFIAPI
HiiThunkUpdateForm (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN EFI_FORM_LABEL Label,
IN BOOLEAN AddData,
IN EFI_HII_UPDATE_DATA *Data
)
{
EFI_STATUS Status;
HII_THUNK_PRIVATE_DATA *Private;
HII_THUNK_CONTEXT *ThunkContext;
EFI_HII_HANDLE UefiHiiHandle;
EFI_GUID FormsetGuid;
EFI_FORM_ID FormId;
EFI_TPL OldTpl;
VOID *StartOpCodeHandle;
VOID *EndOpCodeHandle;
EFI_IFR_GUID_LABEL *StartLabel;
EFI_IFR_GUID_LABEL *EndLabel;
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
mInFrameworkUpdatePakcage = TRUE;
Status = EFI_SUCCESS;
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
ThunkContext = FwHiiHandleToThunkContext (Private, Handle);
if (ThunkContext == NULL) {
Status = EFI_NOT_FOUND;
goto Done;
}
if (Data->FormSetUpdate) {
Status = UpdateFormCallBack ((EFI_HANDLE) (UINTN) Data->FormCallbackHandle, ThunkContext);
if (EFI_ERROR (Status)) {
goto Done;
}
}
if (ThunkContext->IfrPackageCount == 0) {
ASSERT (FALSE);
Status = EFI_INVALID_PARAMETER;
goto Done;
} else {
UefiHiiHandle = ThunkContext->UefiHiiHandle;
}
Status = LocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);
if (EFI_ERROR (Status)) {
//
// Can't find the label.
//
goto Done;
}
//
// Init OpCode Handle
//
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT (StartOpCodeHandle != NULL);
EndOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT (EndOpCodeHandle != NULL);
//
// Create Hii Extend Label OpCode as the start opcode
//
StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
StartLabel->Number = Label;
//
// Create Hii Extend Label OpCode as the end opcode
//
EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
EndLabel->Number = 0xffff;
if (AddData) {
if (Data->DataCount != 0) {
ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);
ASSERT (ThunkContext != NULL);
Status = FwUpdateDataToUefiUpdateData (ThunkContext, Data, StartOpCodeHandle);
ASSERT_EFI_ERROR (Status);
Status = HiiUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, StartOpCodeHandle, NULL);
ASSERT_EFI_ERROR (Status);
}
} else {
//
// Delete Opcode starting from Labe in FormId found
//
Status = HiiUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, StartOpCodeHandle, EndOpCodeHandle);
ASSERT_EFI_ERROR (Status);
}
HiiFreeOpCodeHandle (StartOpCodeHandle);
HiiFreeOpCodeHandle (EndOpCodeHandle);
Done:
mInFrameworkUpdatePakcage = FALSE;
gBS->RestoreTPL (OldTpl);
return Status;
}

View File

@@ -1,114 +0,0 @@
## @file
# Component description file for HiiDatabase module which produce a Framework HII Protocol instance
# based on the avaliable UEFI HII protocol found in the platform. This modules enables modules complying
# to Framework HII specification to able to run on a UEFI HII platform with only a rebuild. This is
# to ensure that all HII packages are generated by UEFI HII package generation tools (UEFI VfrCompiler and
# String Gather Tools). This thunk layer only produces the Frameowork HII protocol interface. The binary package
# data format complying to UEFI HII specification.
#
# This module inits HII database and installs HII protocol based on the avaliable UEFI HII protocol found in the platform..
# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = FrameworkHiiOnUefiHiiThunk
FILE_GUID = AC3435BB-B1D3-4EF8-957C-8048606FF671
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = InitializeHiiDatabase
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
SetupBrowser.c
SetupBrowser.h
HiiHandle.c
HiiHandle.h
ConfigAccess.c
ConfigAccess.h
OpcodeCreation.c
UefiIfrParser.c
UefiIfrParser.h
UefiIfrParserExpression.c
UefiIfrParserExpression.h
UefiIfrDefault.c
UefiIfrDefault.h
Keyboard.c
Fonts.c
Package.c
Strings.c
Forms.c
HiiDatabase.h
HiiDatabase.c
Utility.c
Utility.h
Strings.uni
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
UefiRuntimeServicesTableLib
UefiBootServicesTableLib
BaseMemoryLib
MemoryAllocationLib
UefiDriverEntryPoint
DebugLib
BaseLib
HiiLib
PrintLib
UefiLib
PcdLib
LanguageLib
[Guids]
gEfiIfrTianoGuid
gEfiIfrFrameworkGuid
gEfiHiiStandardFormGuid
gFrameworkBdsFrontPageFormsetGuid
gZeroGuid ## SOMETIMES_CONSUMES ## GUID
[Protocols]
gEfiHiiImageProtocolGuid
gEfiHiiDatabaseProtocolGuid
gEfiHiiStringProtocolGuid
gEfiHiiFontProtocolGuid
gEfiHiiConfigRoutingProtocolGuid
gEfiHiiConfigAccessProtocolGuid
gEfiFormCallbackProtocolGuid
gEfiUnicodeCollation2ProtocolGuid
gEfiHiiCompatibilityProtocolGuid
gEfiFormBrowserCompatibilityProtocolGuid
[Pcd]
gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut
[Depex]
gEfiHiiDatabaseProtocolGuid AND
gEfiHiiStringProtocolGuid AND
gEfiHiiConfigRoutingProtocolGuid AND
gEfiHiiFontProtocolGuid AND
gEfiFormBrowser2ProtocolGuid

View File

@@ -1,546 +0,0 @@
/** @file
Framework to UEFI 2.1 HII Thunk. The driver consume UEFI HII protocols
to produce a Framework HII protocol.
Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
#include "HiiHandle.h"
HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;
HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
HII_THUNK_PRIVATE_DATA_SIGNATURE,
(EFI_HANDLE) NULL,
{
HiiNewPack,
HiiRemovePack,
HiiFindHandles,
HiiExportDatabase,
HiiTestString,
HiiGetGlyph,
HiiGlyphToBlt,
HiiNewString,
HiiGetPrimaryLanguages,
HiiGetSecondaryLanguages,
HiiThunkGetString,
HiiResetStrings,
HiiGetLine,
HiiGetForms,
HiiGetDefaultImage,
HiiThunkUpdateForm,
HiiGetKeyboardLayout
},
{
///
/// HiiHandleLinkList
///
NULL, NULL
},
};
EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {
EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,
(EFI_HANDLE) NULL,
(HII_THUNK_PRIVATE_DATA *) NULL,
{
ThunkSendForm,
ThunkCreatePopUp
}
};
CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;
CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;
CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;
CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;
CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;
CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;
/**
This routine initializes the HII Database.
@param ImageHandle Image handle for PCD DXE driver.
@param SystemTable Pointer to SystemTable.
@retval EFI_SUCCESS The entry point alwasy return successfully.
**/
EFI_STATUS
EFIAPI
InitializeHiiDatabase (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
HII_THUNK_PRIVATE_DATA *Private;
EFI_HANDLE Handle;
EFI_STATUS Status;
UINTN BufferLength;
EFI_HII_HANDLE *Buffer;
UINTN Index;
HII_THUNK_CONTEXT *ThunkContext;
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiCompatibilityProtocolGuid);
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiFormBrowserCompatibilityProtocolGuid);
Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);
ASSERT (Private != NULL);
InitializeListHead (&Private->ThunkContextListHead);
InitHiiHandleDatabase ();
mHiiThunkPrivateData = Private;
Status = gBS->LocateProtocol (
&gEfiHiiDatabaseProtocolGuid,
NULL,
(VOID **) &mHiiDatabase
);
ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (
&gEfiHiiStringProtocolGuid,
NULL,
(VOID **) &mHiiStringProtocol
);
ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (
&gEfiHiiFontProtocolGuid,
NULL,
(VOID **) &mHiiFontProtocol
);
ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (
&gEfiHiiConfigRoutingProtocolGuid,
NULL,
(VOID **) &mHiiConfigRoutingProtocol
);
ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (
&gEfiFormBrowser2ProtocolGuid,
NULL,
(VOID **) &mFormBrowser2Protocol
);
ASSERT_EFI_ERROR (Status);
//
// Install protocol interface
//
Status = gBS->InstallProtocolInterface (
&Private->Handle,
&gEfiHiiCompatibilityProtocolGuid,
EFI_NATIVE_INTERFACE,
(VOID *) &Private->Hii
);
ASSERT_EFI_ERROR (Status);
Status = ListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);
if (Status == EFI_SUCCESS) {
ASSERT (Buffer != NULL);
for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {
ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]);
ASSERT (ThunkContext!= NULL);
InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);
}
FreePool (Buffer);
}
Status = mHiiDatabase->RegisterPackageNotify (
mHiiDatabase,
EFI_HII_PACKAGE_STRINGS,
NULL,
NewOrAddPackNotify,
EFI_HII_DATABASE_NOTIFY_NEW_PACK,
&Handle
);
ASSERT_EFI_ERROR (Status);
Status = mHiiDatabase->RegisterPackageNotify (
mHiiDatabase,
EFI_HII_PACKAGE_STRINGS,
NULL,
NewOrAddPackNotify,
EFI_HII_DATABASE_NOTIFY_ADD_PACK,
&Handle
);
ASSERT_EFI_ERROR (Status);
Status = mHiiDatabase->RegisterPackageNotify (
mHiiDatabase,
EFI_HII_PACKAGE_FORMS,
NULL,
NewOrAddPackNotify,
EFI_HII_DATABASE_NOTIFY_NEW_PACK,
&Handle
);
ASSERT_EFI_ERROR (Status);
Status = mHiiDatabase->RegisterPackageNotify (
mHiiDatabase,
EFI_HII_PACKAGE_FORMS,
NULL,
NewOrAddPackNotify,
EFI_HII_DATABASE_NOTIFY_ADD_PACK,
&Handle
);
ASSERT_EFI_ERROR (Status);
Status = mHiiDatabase->RegisterPackageNotify (
mHiiDatabase,
EFI_HII_PACKAGE_STRINGS,
NULL,
RemovePackNotify,
EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,
&Handle
);
ASSERT_EFI_ERROR (Status);
InitSetBrowserStrings ();
mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;
Status = gBS->InstallProtocolInterface (
&mBrowserThunkPrivateDataTemplate.Handle,
&gEfiFormBrowserCompatibilityProtocolGuid,
EFI_NATIVE_INTERFACE,
(VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser
);
ASSERT_EFI_ERROR (Status);
return Status;
}
/**
Determines the handles that are currently active in the database.
This function determines the handles that are currently active in the database.
For example, a program wishing to create a Setup-like configuration utility would use this call
to determine the handles that are available. It would then use calls defined in the forms section
below to extract forms and then interpret them.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param HandleBufferLength On input, a pointer to the length of the handle buffer.
On output, the length of the handle buffer that is required for the handles found.
@param Handle Pointer to an array of EFI_HII_HANDLE instances returned.
Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack() in the Packages section.
@retval EFI_SUCCESS Handle was updated successfully.
@retval EFI_BUFFER_TOO_SMALL The HandleBufferLength parameter indicates that Handle is too small
to support the number of handles. HandleBufferLength is updated with a value that
will enable the data to fit.
**/
EFI_STATUS
EFIAPI
HiiFindHandles (
IN EFI_HII_PROTOCOL *This,
IN OUT UINT16 *HandleBufferLength,
OUT FRAMEWORK_EFI_HII_HANDLE *Handle
)
{
UINT16 Count;
LIST_ENTRY *Link;
HII_THUNK_CONTEXT *ThunkContext;
HII_THUNK_PRIVATE_DATA *Private;
if (HandleBufferLength == NULL) {
return EFI_INVALID_PARAMETER;
}
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
//
// Count the number of handles.
//
Count = 0;
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
Count++;
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
if (Count > *HandleBufferLength) {
*HandleBufferLength = (UINT16) (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));
return EFI_BUFFER_TOO_SMALL;
}
//
// Output the handles.
//
Count = 0;
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
Handle[Count] = ThunkContext->FwHiiHandle;
Count++;
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
*HandleBufferLength = (UINT16) (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));
return EFI_SUCCESS;
}
/**
Allows a program to determine the primary languages that are supported on a given handle.
This routine is intended to be used by drivers to query the interface database for supported languages.
This routine returns a string of concatenated 3-byte language identifiers, one per string package associated with the handle.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The handle on which the strings reside. Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack()
in the Packages section.
@param LanguageString A string allocated by GetPrimaryLanguages() that contains a list of all primary languages
registered on the handle. The routine will not return the three-spaces language identifier used in
other functions to indicate non-language-specific strings.
@retval EFI_SUCCESS LanguageString was correctly returned.
@retval EFI_INVALID_PARAMETER The Handle was unknown.
**/
EFI_STATUS
EFIAPI
HiiGetPrimaryLanguages (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
OUT EFI_STRING *LanguageString
)
{
HII_THUNK_PRIVATE_DATA *Private;
EFI_HII_HANDLE UefiHiiHandle;
CHAR8 *LangCodes4646;
CHAR16 *UnicodeLangCodes639;
CHAR8 *LangCodes639;
EFI_STATUS Status;
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);
if (UefiHiiHandle == NULL) {
return EFI_INVALID_PARAMETER;
}
LangCodes4646 = HiiGetSupportedLanguages (UefiHiiHandle);
if (LangCodes4646 == NULL) {
return EFI_INVALID_PARAMETER;
}
LangCodes639 = ConvertLanguagesRfc4646ToIso639 (LangCodes4646);
if (LangCodes639 == NULL) {
Status = EFI_INVALID_PARAMETER;
goto Done;
}
UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));
if (UnicodeLangCodes639 == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Done;
}
//
// The language returned is in RFC 639-2 format.
//
AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);
*LanguageString = UnicodeLangCodes639;
Status = EFI_SUCCESS;
Done:
FreePool (LangCodes4646);
if (LangCodes639 != NULL) {
FreePool (LangCodes639);
}
return Status;
}
/**
This function returns the list of supported 2nd languages, in the format specified
in UEFI specification Appendix M.
If HiiHandle is not a valid Handle in the HII database, then ASSERT.
If not enough resource to complete the operation, then ASSERT.
@param HiiHandle The HII package list handle.
@param PrimaryLanguage Pointer to language name buffer.
@return The supported languages.
**/
CHAR8 *
EFIAPI
HiiGetSupportedSecondaryLanguages (
IN EFI_HII_HANDLE HiiHandle,
IN CONST CHAR8 *PrimaryLanguage
)
{
EFI_STATUS Status;
UINTN BufferSize;
CHAR8 *LanguageString;
ASSERT (HiiHandle != NULL);
//
// Collect current supported 2nd Languages for given HII handle
// First try allocate 4K buffer to store the current supported 2nd languages.
//
BufferSize = 0x1000;
LanguageString = AllocateZeroPool (BufferSize);
if (LanguageString == NULL) {
return NULL;
}
Status = mHiiStringProtocol->GetSecondaryLanguages (mHiiStringProtocol, HiiHandle, PrimaryLanguage, LanguageString, &BufferSize);
ASSERT (Status != EFI_NOT_FOUND);
if (Status == EFI_BUFFER_TOO_SMALL) {
FreePool (LanguageString);
LanguageString = AllocateZeroPool (BufferSize);
if (LanguageString == NULL) {
return NULL;
}
Status = mHiiStringProtocol->GetSecondaryLanguages (mHiiStringProtocol, HiiHandle, PrimaryLanguage, LanguageString, &BufferSize);
}
if (EFI_ERROR (Status)) {
LanguageString = NULL;
}
return LanguageString;
}
/**
Allows a program to determine which secondary languages are supported on a given handle for a given primary language
This routine is intended to be used by drivers to query the interface database for supported languages.
This routine returns a string of concatenated 3-byte language identifiers, one per string package associated with the handle.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The handle on which the strings reside. Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack()
in the Packages section.
@param PrimaryLanguage Pointer to a NULL-terminated string containing a single ISO 639-2 language identifier, indicating
the primary language.
@param LanguageString A string allocated by GetSecondaryLanguages() containing a list of all secondary languages registered
on the handle. The routine will not return the three-spaces language identifier used in other functions
to indicate non-language-specific strings, nor will it return the primary language. This function succeeds
but returns a NULL LanguageString if there are no secondary languages associated with the input Handle and
PrimaryLanguage pair. Type EFI_STRING is defined in String.
@retval EFI_SUCCESS LanguageString was correctly returned.
@retval EFI_INVALID_PARAMETER The Handle was unknown.
**/
EFI_STATUS
EFIAPI
HiiGetSecondaryLanguages (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN CHAR16 *PrimaryLanguage,
OUT EFI_STRING *LanguageString
)
{
HII_THUNK_PRIVATE_DATA *Private;
EFI_HII_HANDLE UefiHiiHandle;
CHAR8 *PrimaryLang4646;
CHAR8 *PrimaryLang639;
CHAR8 *SecLangCodes4646;
CHAR8 *SecLangCodes639;
CHAR16 *UnicodeSecLangCodes639;
EFI_STATUS Status;
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
SecLangCodes639 = NULL;
SecLangCodes4646 = NULL;
PrimaryLang4646 = NULL;
UnicodeSecLangCodes639 = NULL;
UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);
if (UefiHiiHandle == NULL) {
return EFI_INVALID_PARAMETER;
}
PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);
if (PrimaryLang639 == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Done;
}
UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);
PrimaryLang4646 = ConvertLanguagesIso639ToRfc4646 (PrimaryLang639);
ASSERT (PrimaryLang4646 != NULL);
SecLangCodes4646 = HiiGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang4646);
if (SecLangCodes4646 == NULL) {
Status = EFI_INVALID_PARAMETER;
goto Done;
}
SecLangCodes639 = ConvertLanguagesIso639ToRfc4646 (SecLangCodes4646);
if (SecLangCodes639 == NULL) {
Status = EFI_INVALID_PARAMETER;
goto Done;
}
UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));
if (UnicodeSecLangCodes639 == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Done;
}
//
// The language returned is in RFC 4646 format.
//
*LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);
Status = EFI_SUCCESS;
Done:
if (PrimaryLang639 != NULL) {
FreePool (PrimaryLang639);
}
if (SecLangCodes639 != NULL) {
FreePool (SecLangCodes639);
}
if (PrimaryLang4646 != NULL) {
FreePool (PrimaryLang4646);
}
if (SecLangCodes4646 != NULL) {
FreePool (SecLangCodes4646);
}
if (UnicodeSecLangCodes639 != NULL) {
FreePool (UnicodeSecLangCodes639);
}
return Status;
}

View File

@@ -1,947 +0,0 @@
/** @file
This file contains global defines and prototype definitions
for the Framework HII to Uefi HII Thunk Module.
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _HIIDATABASE_H_
#define _HIIDATABASE_H_
#include <FrameworkDxe.h>
#include <Guid/GlobalVariable.h>
#include <Protocol/FrameworkFormCallback.h>
#include <Protocol/FrameworkHii.h>
#include <Protocol/FrameworkFormBrowser.h>
//
// UEFI HII Protocols
//
#include <Protocol/HiiFont.h>
#include <Protocol/HiiImage.h>
#include <Protocol/HiiString.h>
#include <Protocol/HiiDatabase.h>
#include <Protocol/HiiConfigRouting.h>
#include <Protocol/HiiConfigAccess.h>
#include <Protocol/UgaDraw.h>
#include <Guid/HiiFormMapMethodGuid.h>
#include <Guid/FrameworkBdsFrontPageFormSet.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/HiiLib.h>
#include <Library/UefiLib.h>
#include <Library/PcdLib.h>
#include <Library/LanguageLib.h>
#include <Library/PrintLib.h>
#include <Guid/MdeModuleHii.h>
#include "UefiIfrParser.h"
//
// VARSTORE ID of 0 for Buffer Storage Type Storage is defined as invalid in UEFI 2.1 HII. VARSTORE ID
// 0 is the default VarStore ID for storage without explicit declaration in Framework HII 0.92. EDK II UEFI VFR compiler
// in compatible mode will assign 0x0001 as UEFI VARSTORE ID to this default storage id in Framework VFR without
// VARSTORE declaration.
//
// In addition, the Name of Default VarStore is assumed to be L"Setup" for those storage without explicit VARSTORE declaration in the formset
// by Framework HII. EDK II UEFI VFR compiler in compatible mode hard-coded L"Setup" as VARSTORE name.
//
#define FRAMEWORK_RESERVED_VARSTORE_ID 0x0001
#define FRAMEWORK_RESERVED_VARSTORE_NAME L"Setup"
///
/// The size of a 3 character ISO639 language code.
///
#define ISO_639_2_ENTRY_SIZE 3
#pragma pack (1)
typedef struct {
EFI_HII_PACK_HEADER FrameworkPackageHeader;
EFI_HII_PACKAGE_HEADER PackageHeader;
} TIANO_AUTOGEN_PACKAGES_HEADER;
#pragma pack ()
#define HII_THUNK_PRIVATE_DATA_FROM_THIS(Record) CR(Record, HII_THUNK_PRIVATE_DATA, Hii, HII_THUNK_PRIVATE_DATA_SIGNATURE)
#define HII_THUNK_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('H', 'i', 'I', 'T')
typedef struct {
UINTN Signature;
EFI_HANDLE Handle;
EFI_HII_PROTOCOL Hii;
//
// The head of link list for all HII_THUNK_CONTEXT.
//
LIST_ENTRY ThunkContextListHead;
EFI_HANDLE RemovePackNotifyHandle;
EFI_HANDLE AddPackNotifyHandle;
} HII_THUNK_PRIVATE_DATA;
#define QUESTION_ID_MAP_ENTRY_FROM_LINK(Record) CR(Record, QUESTION_ID_MAP_ENTRY, Link, QUESTION_ID_MAP_ENTRY_SIGNATURE)
#define QUESTION_ID_MAP_ENTRY_SIGNATURE SIGNATURE_32 ('Q', 'I', 'M', 'E')
typedef struct {
UINT32 Signature;
LIST_ENTRY Link;
UINT16 FwQId;
EFI_QUESTION_ID UefiQid;
} QUESTION_ID_MAP_ENTRY;
#define QUESTION_ID_MAP_FROM_LINK(Record) CR(Record, QUESTION_ID_MAP, Link, QUESTION_ID_MAP_SIGNATURE)
#define QUESTION_ID_MAP_SIGNATURE SIGNATURE_32 ('Q', 'I', 'M', 'P')
typedef struct {
UINT32 Signature;
LIST_ENTRY Link;
UINT16 VarStoreId;
UINTN VarSize;
LIST_ENTRY MapEntryListHead;
} QUESTION_ID_MAP;
#define HII_THUNK_CONTEXT_FROM_LINK(Record) CR(Record, HII_THUNK_CONTEXT, Link, HII_THUNK_CONTEXT_SIGNATURE)
#define HII_THUNK_CONTEXT_SIGNATURE SIGNATURE_32 ('H', 'T', 'H', 'M')
typedef struct {
LIST_ENTRY Link;
UINT32 Signature;
FRAMEWORK_EFI_HII_HANDLE FwHiiHandle;
EFI_HII_HANDLE UefiHiiHandle;
EFI_HANDLE UefiHiiDriverHandle;
UINTN IfrPackageCount;
UINTN StringPackageCount;
BOOLEAN ByFrameworkHiiNewPack;
//
// HII Thunk will use TagGuid to associate the String Package and Form Package togehter.
// See description for TagGuid. This field is to record if either one of the following condition
// is TRUE:
// 1) if ((SharingStringPack == TRUE) && (StringPackageCount != 0 && IfrPackageCount == 0)), then this Package List only
/// has String Packages and provides Strings to other IFR package.
// 2) if ((SharingStringPack == TRUE) && (StringPackageCount == 0 && IfrPackageCount != 1)), then this Form Package
// copied String Packages from other Package List.
// 3) if ((SharingStringPack == FALSE)), this Package does not provide String Package or copy String Packages from other
// Package List.
//
//
// When a Hii->NewString() is called for this FwHiiHandle and SharingStringPack is TRUE, then all Package List that sharing
// the same TagGuid will update or create String in there respective String Packages. If SharingStringPack is FALSE, then
// only the String from String Packages in this Package List will be updated or created.
//
BOOLEAN SharingStringPack;
//
// The HII 0.92 version of HII data implementation in EDK 1.03 and 1.04 make an the following assumption
// in both HII Database implementation and all modules that registering packages:
// If a Package List has only IFR package and no String Package, the IFR package will reference
// String in another Package List registered with the HII database with the same EFI_HII_PACKAGES.GuidId.
// TagGuid is the used to record this GuidId.
EFI_GUID TagGuid;
UINT8 *NvMapOverride;
FORM_BROWSER_FORMSET *FormSet;
} HII_THUNK_CONTEXT;
#define BUFFER_STORAGE_ENTRY_SIGNATURE SIGNATURE_32 ('H', 'T', 's', 'k')
#define BUFFER_STORAGE_ENTRY_FROM_LINK(Record) CR(Record, BUFFER_STORAGE_ENTRY, Link, BUFFER_STORAGE_ENTRY_SIGNATURE)
typedef struct {
LIST_ENTRY Link;
UINT32 Signature;
EFI_GUID Guid;
CHAR16 *Name;
UINTN Size;
UINT16 VarStoreId;
} BUFFER_STORAGE_ENTRY;
#pragma pack(1)
///
/// HII specific Vendor Device Path Node definition.
///
typedef struct {
VENDOR_DEVICE_PATH VendorDevicePath;
UINT32 Reserved;
UINT64 UniqueId;
} HII_VENDOR_DEVICE_PATH_NODE;
///
/// HII specific Vendor Device Path definition.
///
typedef struct {
HII_VENDOR_DEVICE_PATH_NODE Node;
EFI_DEVICE_PATH_PROTOCOL End;
} HII_VENDOR_DEVICE_PATH;
#pragma pack()
#define CONFIG_ACCESS_PRIVATE_SIGNATURE SIGNATURE_32 ('H', 'T', 'c', 'a')
#define CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL(Record) CR(Record, CONFIG_ACCESS_PRIVATE, ConfigAccessProtocol, CONFIG_ACCESS_PRIVATE_SIGNATURE)
typedef struct {
UINT32 Signature;
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccessProtocol;
//
// Framework's callback
//
EFI_FORM_CALLBACK_PROTOCOL *FormCallbackProtocol;
HII_THUNK_CONTEXT *ThunkContext;
} CONFIG_ACCESS_PRIVATE;
#define EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('F', 'B', 'T', 'd')
#define EFI_FORMBROWSER_THUNK_PRIVATE_DATA_FROM_THIS(Record) CR(Record, EFI_FORMBROWSER_THUNK_PRIVATE_DATA, FormBrowser, EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE)
typedef struct {
UINTN Signature;
EFI_HANDLE Handle;
HII_THUNK_PRIVATE_DATA *ThunkPrivate;
EFI_FORM_BROWSER_PROTOCOL FormBrowser;
} EFI_FORMBROWSER_THUNK_PRIVATE_DATA;
//
// Extern Variables
//
extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;
extern CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;
extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;
extern CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;
extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;
extern CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;
extern HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;
extern BOOLEAN mInFrameworkUpdatePakcage;
/**
Registers the various packages that are passed in a Package List.
@param This Pointer of Frameowk HII protocol instance.
@param Packages Pointer of HII packages.
@param Handle Handle value to be returned.
@retval EFI_SUCCESS Packages has added to HII database successfully.
@retval EFI_INVALID_PARAMETER If Handle or Packages is NULL.
**/
EFI_STATUS
EFIAPI
HiiNewPack (
IN EFI_HII_PROTOCOL *This,
IN EFI_HII_PACKAGES *Packages,
OUT FRAMEWORK_EFI_HII_HANDLE *Handle
);
/**
Remove a package from the HII database.
@param This Pointer of Frameowk HII protocol instance.
@param Handle Handle value to be removed.
@retval EFI_SUCCESS Packages has added to HII database successfully.
@retval EFI_INVALID_PARAMETER If Handle or Packages is NULL.
**/
EFI_STATUS
EFIAPI
HiiRemovePack (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle
);
/**
Determines the handles that are currently active in the database.
This function determines the handles that are currently active in the database.
For example, a program wishing to create a Setup-like configuration utility would use this call
to determine the handles that are available. It would then use calls defined in the forms section
below to extract forms and then interpret them.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param HandleBufferLength On input, a pointer to the length of the handle buffer.
On output, the length of the handle buffer that is required for the handles found.
@param Handle Pointer to an array of EFI_HII_HANDLE instances returned.
Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack() in the Packages section.
@retval EFI_SUCCESS Handle was updated successfully.
@retval EFI_BUFFER_TOO_SMALL The HandleBufferLength parameter indicates that Handle is too small
to support the number of handles. HandleBufferLength is updated with a value that
will enable the data to fit.
**/
EFI_STATUS
EFIAPI
HiiFindHandles (
IN EFI_HII_PROTOCOL *This,
IN OUT UINT16 *HandleBufferLength,
OUT FRAMEWORK_EFI_HII_HANDLE *Handle
);
/**
This thunk module only handles UEFI HII packages. The caller of this function
won't be able to parse the content. Therefore, it is not supported.
This function will ASSERT and return EFI_UNSUPPORTED.
@param This N.A.
@param Handle N.A.
@param BufferSize N.A.
@param Buffer N.A.
@retval EFI_UNSUPPORTED
**/
EFI_STATUS
EFIAPI
HiiExportDatabase (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN OUT UINTN *BufferSize,
OUT VOID *Buffer
);
/**
Translates a Unicode character into the corresponding font glyph.
Notes:
This function is only called by Graphics Console module and GraphicsLib.
Wrap the Framework HII GetGlyph function to UEFI Font Protocol.
EDK II provides a UEFI Graphics Console module. ECP provides a GraphicsLib
complying to UEFI HII.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Source A pointer to a Unicode string.
@param Index On input, the offset into the string from which to fetch the character. On successful completion, the
index is updated to the first character past the character(s) making up the just extracted glyph.
@param GlyphBuffer Pointer to an array where the glyphs corresponding to the characters in the source may be stored.
GlyphBuffer is assumed to be wide enough to accept a wide glyph character.
@param BitWidth If EFI_SUCCESS was returned, the UINT16 pointed to by this value is filled with the length of the glyph in pixels.
It is unchanged if the call was unsuccessful.
@param InternalStatus To save the time required to read the string from the beginning on each glyph extraction
(for example, to ensure that the narrow versus wide glyph mode is correct), this value is
updated each time the function is called with the status that is local to the call. The cell pointed
to by this parameter must be initialized to zero prior to invoking the call the first time for any string.
@retval EFI_SUCCESS It worked.
@retval EFI_NOT_FOUND A glyph for a character was not found.
**/
EFI_STATUS
EFIAPI
HiiGetGlyph (
IN EFI_HII_PROTOCOL *This,
IN CHAR16 *Source,
IN OUT UINT16 *Index,
OUT UINT8 **GlyphBuffer,
OUT UINT16 *BitWidth,
IN OUT UINT32 *InternalStatus
);
/**
Translates a glyph into the format required for input to the Universal Graphics Adapter (UGA) Block Transfer (BLT) routines.
Notes:
This function is only called by Graphics Console module and GraphicsLib.
EDK II provides a UEFI Graphics Console module. ECP provides a GraphicsLib
complying to UEFI HII.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param GlyphBuffer A pointer to the buffer that contains glyph data.
@param Foreground The foreground setting requested to be used for the generated BltBuffer data. Type EFI_UGA_PIXEL is defined in "Related Definitions" below.
@param Background The background setting requested to be used for the generated BltBuffer data.
@param Count The entry in the BltBuffer upon which to act.
@param Width The width in bits of the glyph being converted.
@param Height The height in bits of the glyph being converted
@param BltBuffer A pointer to the buffer that contains the data that is ready to be used by the UGA BLT routines.
@retval EFI_SUCCESS It worked.
@retval EFI_NOT_FOUND A glyph for a character was not found.
**/
EFI_STATUS
EFIAPI
HiiGlyphToBlt (
IN EFI_HII_PROTOCOL *This,
IN UINT8 *GlyphBuffer,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background,
IN UINTN Count,
IN UINTN Width,
IN UINTN Height,
IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer
);
/**
Create or update a String Token in a String Package.
If *Reference == 0, a new String Token is created.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Language Pointer to a NULL-terminated string containing a single ISO 639-2 language
identifier, indicating the language to print. A string consisting of
all spaces indicates that the string is applicable to all languages.
@param Handle The handle of the language pack to which the string is to be added.
@param Reference The string token assigned to the string.
@param NewString The string to be added.
@retval EFI_SUCCESS The string was effectively registered.
@retval EFI_INVALID_PARAMETER The Handle was unknown. The string is not created or updated in the
the string package.
**/
EFI_STATUS
EFIAPI
HiiNewString (
IN EFI_HII_PROTOCOL *This,
IN CHAR16 *Language,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN OUT STRING_REF *Reference,
IN CHAR16 *NewString
);
/**
This function extracts a string from a package already registered with the EFI HII database.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The HII handle on which the string resides.
@param Token The string token assigned to the string.
@param Raw If TRUE, the string is returned unedited in the internal storage format described
above. If false, the string returned is edited by replacing <cr> with <space>
and by removing special characters such as the <wide> prefix.
@param LanguageString Pointer to a NULL-terminated string containing a single ISO 639-2 language
identifier, indicating the language to print. If the LanguageString is empty (starts
with a NULL), the default system language will be used to determine the language.
@param BufferLength Length of the StringBuffer. If the status reports that the buffer width is too
small, this parameter is filled with the length of the buffer needed.
@param StringBuffer The buffer designed to receive the characters in the string. Type EFI_STRING is
defined in String.
@retval EFI_INVALID_PARAMETER If input parameter is invalid.
@retval EFI_BUFFER_TOO_SMALL If the *BufferLength is too small.
@retval EFI_SUCCESS Operation is successful.
**/
EFI_STATUS
EFIAPI
HiiThunkGetString (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN STRING_REF Token,
IN BOOLEAN Raw,
IN CHAR16 *LanguageString,
IN OUT UINTN *BufferLength,
OUT EFI_STRING StringBuffer
);
/**
This function removes any new strings that were added after the initial string export for this handle.
UEFI HII String Protocol does not have Reset String function. This function perform nothing.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The HII handle on which the string resides.
@retval EFI_SUCCESS This function is a NOP and always return EFI_SUCCESS.
**/
EFI_STATUS
EFIAPI
HiiResetStrings (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle
);
/**
Test if all of the characters in a string have corresponding font characters.
This is a deprecated API. No Framework HII module is calling it. This function will ASSERT and
return EFI_UNSUPPORTED.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param StringToTest A pointer to a Unicode string.
@param FirstMissing A pointer to an index into the string. On input, the index of
the first character in the StringToTest to examine. On exit, the index
of the first character encountered for which a glyph is unavailable.
If all glyphs in the string are available, the index is the index of the terminator
of the string.
@param GlyphBufferSize A pointer to a value. On output, if the function returns EFI_SUCCESS,
it contains the amount of memory that is required to store the string? glyph equivalent.
@retval EFI_UNSUPPORTED The function performs nothing and return EFI_UNSUPPORTED.
**/
EFI_STATUS
EFIAPI
HiiTestString (
IN EFI_HII_PROTOCOL *This,
IN CHAR16 *StringToTest,
IN OUT UINT32 *FirstMissing,
OUT UINT32 *GlyphBufferSize
);
/**
Allows a program to determine the primary languages that are supported on a given handle.
This routine is intended to be used by drivers to query the interface database for supported languages.
This routine returns a string of concatenated 3-byte language identifiers, one per string package associated with the handle.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The handle on which the strings reside. Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack()
in the Packages section.
@param LanguageString A string allocated by GetPrimaryLanguages() that contains a list of all primary languages
registered on the handle. The routine will not return the three-spaces language identifier used in
other functions to indicate non-language-specific strings.
@retval EFI_SUCCESS LanguageString was correctly returned.
@retval EFI_INVALID_PARAMETER The Handle was unknown.
**/
EFI_STATUS
EFIAPI
HiiGetPrimaryLanguages (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
OUT EFI_STRING *LanguageString
);
/**
Allows a program to determine which secondary languages are supported on a given handle for a given primary language
This routine is intended to be used by drivers to query the interface database for supported languages.
This routine returns a string of concatenated 3-byte language identifiers, one per string package associated with the handle.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The handle on which the strings reside. Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack()
in the Packages section.
@param PrimaryLanguage Pointer to a NULL-terminated string containing a single ISO 639-2 language identifier, indicating
the primary language.
@param LanguageString A string allocated by GetSecondaryLanguages() containing a list of all secondary languages registered
on the handle. The routine will not return the three-spaces language identifier used in other functions
to indicate non-language-specific strings, nor will it return the primary language. This function succeeds
but returns a NULL LanguageString if there are no secondary languages associated with the input Handle and
PrimaryLanguage pair. Type EFI_STRING is defined in String.
@retval EFI_SUCCESS LanguageString was correctly returned.
@retval EFI_INVALID_PARAMETER The Handle was unknown.
**/
EFI_STATUS
EFIAPI
HiiGetSecondaryLanguages (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN CHAR16 *PrimaryLanguage,
OUT EFI_STRING *LanguageString
);
/**
This function allows a program to extract a part of a string of not more than a given width.
With repeated calls, this allows a calling program to extract "lines" of text that fit inside
columns. The effort of measuring the fit of strings inside columns is localized to this call.
This is a deprecated API. No Framework HII module is calling it. This function will ASSERT and
return EFI_UNSUPPORTED.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The HII handle on which the string resides.
@param Token The string token assigned to the string.
@param Index On input, the offset into the string where the line is to start.
On output, the index is updated to point to beyond the last character returned
in the call.
@param LineWidth The maximum width of the line in units of narrow glyphs.
@param LanguageString Pointer to a NULL-terminated string containing a single ISO 639-2 language
identifier, indicating the language to print. If the LanguageString is empty (starts
with a NULL), the default system language will be used to determine the language.
@param BufferLength Length of the StringBuffer. If the status reports that the buffer width is too
small, this parameter is filled with the length of the buffer needed.
@param StringBuffer The buffer designed to receive the characters in the string. Type EFI_STRING is
defined in String.
@retval EFI_UNSUPPORTED.
**/
EFI_STATUS
EFIAPI
HiiGetLine (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN STRING_REF Token,
IN OUT UINT16 *Index,
IN UINT16 LineWidth,
IN CHAR16 *LanguageString,
IN OUT UINT16 *BufferLength,
OUT EFI_STRING StringBuffer
);
/**
This function allows a program to extract a form or form package that has
previously been registered with the EFI HII database.
In this thunk module, this function will create a IFR Package with only
one Formset. Effectively, only the GUID of the Formset is updated and return
in this IFR package to caller. This is enable the Framework modules which call
a API named GetStringFromToken. GetStringFromToken retieves a String based on
a String Token from a Package List known only by the Formset GUID.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE is defined in
EFI_HII_PROTOCOL.NewPack() in the Packages section.
@param FormId Ignored by this implementation.
@param BufferLengthTemp On input, the size of input buffer. On output, it
is the size of FW_HII_FORMSET_TEMPLATE.
@param Buffer The buffer designed to receive the form(s).
@retval EFI_SUCCESS Buffer filled with the requested forms. BufferLength
was updated.
@retval EFI_INVALID_PARAMETER The handle is unknown.
@retval EFI_NOT_FOUND A form on the requested handle cannot be found with the
requested FormId.
@retval EFI_BUFFER_TOO_SMALL The buffer provided was not large enough to allow the form to be stored.
**/
EFI_STATUS
EFIAPI
HiiGetForms (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN EFI_FORM_ID FormId,
IN OUT UINTN *BufferLengthTemp,
OUT UINT8 *Buffer
);
/**
This function allows a program to extract the NV Image
that represents the default storage image
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The HII handle from which will have default data retrieved.
UINTN - Mask used to retrieve the default image.
@param DefaultMask EDES_TODO: Add parameter description
@param VariablePackList Callee allocated, tightly-packed, link list data
structure that contain all default varaible packs
from the Hii Database.
@retval EFI_NOT_FOUND If Hii database does not contain any default images.
@retval EFI_INVALID_PARAMETER Invalid input parameter.
@retval EFI_SUCCESS Operation successful.
**/
EFI_STATUS
EFIAPI
HiiGetDefaultImage (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN UINTN DefaultMask,
OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList
);
/**
This function allows the caller to update a form that has
previously been registered with the EFI HII database.
@param This EDES_TODO: Add parameter description
@param Handle Hii Handle associated with the Formset to modify
@param Label Update information starting immediately after this label in the IFR
@param AddData If TRUE, add data. If FALSE, remove data
@param Data If adding data, this is the pointer to the data to add
@retval EFI_SUCCESS Update success.
@retval Other Update fail.
**/
EFI_STATUS
EFIAPI
HiiThunkUpdateForm (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN EFI_FORM_LABEL Label,
IN BOOLEAN AddData,
IN EFI_HII_UPDATE_DATA *Data
);
/**
Retrieves the current keyboard layout.
This function is not implemented by HII Thunk Module.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param DescriptorCount A pointer to the number of Descriptor entries being described in the keyboard layout being retrieved.
@param Descriptor A pointer to a buffer containing an array of EFI_KEY_DESCRIPTOR entries. Each entry will reflect the
definition of a specific physical key. Type EFI_KEY_DESCRIPTOR is defined in "Related Definitions" below.
@retval EFI_SUCCESS The keyboard layout was retrieved successfully.
**/
EFI_STATUS
EFIAPI
HiiGetKeyboardLayout (
IN EFI_HII_PROTOCOL *This,
OUT UINT16 *DescriptorCount,
OUT FRAMEWORK_EFI_KEY_DESCRIPTOR *Descriptor
);
/**
This is the Framework Setup Browser interface which displays a FormSet.
@param This The EFI_FORM_BROWSER_PROTOCOL context.
@param UseDatabase TRUE if the FormSet is from HII database. The Thunk implementation
only support UseDatabase is TRUE.
@param Handle The Handle buffer.
@param HandleCount The number of Handle in the Handle Buffer. It must be 1 for this implementation.
@param Packet The pointer to data buffer containing IFR and String package. Not supported.
@param CallbackHandle Not supported.
@param NvMapOverride The buffer is used only when there is no NV variable to define the
current settings and the caller needs to provide to the browser the
current settings for the the "fake" NV variable. If used, no saving of
an NV variable is possbile. This parameter is also ignored if Handle is NULL.
@param ScreenDimensions
Allows the browser to be called so that it occupies a portion of the physical
screen instead of dynamically determining the screen dimensions.
@param ResetRequired This BOOLEAN value denotes whether a reset is required based on the data that
might have been changed. The ResetRequired parameter is primarily applicable
for configuration applications, and is an optional parameter.
@retval EFI_SUCCESS If the Formset is displayed correctly.
@retval EFI_UNSUPPORTED If UseDatabase is FALSE or HandleCount is not 1.
@retval EFI_INVALID_PARAMETER If the *Handle passed in is not found in the database.
**/
EFI_STATUS
EFIAPI
ThunkSendForm (
IN EFI_FORM_BROWSER_PROTOCOL *This,
IN BOOLEAN UseDatabase,
IN FRAMEWORK_EFI_HII_HANDLE *Handle,
IN UINTN HandleCount,
IN EFI_IFR_PACKET *Packet, OPTIONAL
IN EFI_HANDLE CallbackHandle, OPTIONAL
IN UINT8 *NvMapOverride, OPTIONAL
IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR *ScreenDimensions, OPTIONAL
OUT BOOLEAN *ResetRequired OPTIONAL
);
/**
Rountine used to display a generic dialog interface and return
the Key or Input from user input.
@param LinesNumber The number of lines for the dialog box.
@param HotKey Defines if a single character is parsed (TRUE) and returned in KeyValue
or if a string is returned in StringBuffer.
@param MaximumStringSize The maximum size in bytes of a typed-in string.
@param StringBuffer On return contains the typed-in string if HotKey is FALSE.
@param Key The EFI_INPUT_KEY value returned if HotKey is TRUE.
@param FirstString The pointer to the first string in the list of strings
that comprise the dialog box.
@param ... A series of NumberOfLines text strings that will be used
to construct the dialog box.
@retval EFI_SUCCESS The dialog is created successfully and user interaction was received.
@retval EFI_DEVICE_ERROR The user typed in an ESC.
@retval EFI_INVALID_PARAMETER One of the parameters was invalid.(StringBuffer == NULL && HotKey == FALSE).
**/
EFI_STATUS
EFIAPI
ThunkCreatePopUp (
IN UINTN LinesNumber,
IN BOOLEAN HotKey,
IN UINTN MaximumStringSize,
OUT CHAR16 *StringBuffer,
OUT EFI_INPUT_KEY *Key,
IN CHAR16 *FirstString,
...
);
/**
This notification function will be called when a Package List is removed
using UEFI HII interface. The Package List removed need to be removed from
Framework Thunk module too.
If the Package List registered is not Sting Package,
then ASSERT. If the NotifyType is not REMOVE_PACK, then ASSERT.
Both cases means UEFI HII Database itself is buggy.
@param PackageType The Package Type.
@param PackageGuid The Package GUID.
@param Package The Package Header.
@param Handle The HII Handle of this Package List.
@param NotifyType The reason of the notification.
@retval EFI_SUCCESS The notification function is successful.
**/
EFI_STATUS
EFIAPI
RemovePackNotify (
IN UINT8 PackageType,
IN CONST EFI_GUID *PackageGuid,
IN CONST EFI_HII_PACKAGE_HEADER *Package,
IN EFI_HII_HANDLE Handle,
IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
);
/**
This notification function will be called when a Package List is registered
using UEFI HII interface. The Package List registered need to be recorded in
Framework Thunk module as Thunk Module may need to look for String Package in
the package registered.
If the Package List registered is not either Sting Package or IFR package,
then ASSERT. If the NotifyType is not ADD_PACK or NEW_PACK, then ASSERT.
Both cases means UEFI HII Database itself is buggy.
@param PackageType The Package Type.
@param PackageGuid The Package GUID.
@param Package The Package Header.
@param Handle The HII Handle of this Package List.
@param NotifyType The reason of the notification.
@retval EFI_SUCCESS The notification function is successful.
**/
EFI_STATUS
EFIAPI
NewOrAddPackNotify (
IN UINT8 PackageType,
IN CONST EFI_GUID *PackageGuid,
IN CONST EFI_HII_PACKAGE_HEADER *Package,
IN EFI_HII_HANDLE Handle,
IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
);
/**
Create a Hii Update data Handle used to call IfrLibUpdateForm.
@param ThunkContext The HII Thunk Context.
@param FwUpdateData The Framework Update Data.
@param UefiOpCodeHandle The UEFI Update Data.
@retval EFI_SUCCESS The UEFI Update Data is created successfully.
@retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData.
@retval EFI_OUT_OF_RESOURCES There is not enough resource.
**/
EFI_STATUS
FwUpdateDataToUefiUpdateData (
IN HII_THUNK_CONTEXT *ThunkContext,
IN CONST EFI_HII_UPDATE_DATA *FwUpdateData,
IN VOID *UefiOpCodeHandle
)
;
/**
Initialize string packages in HII database.
**/
VOID
InitSetBrowserStrings (
VOID
)
;
/**
Convert language code from RFC4646 to ISO639-2.
LanguageRfc4646 contain a single RFC 4646 code such as
"en-US" or "fr-FR".
The LanguageRfc4646 must be a buffer large enough
for ISO_639_2_ENTRY_SIZE characters.
If LanguageRfc4646 is NULL, then ASSERT.
If LanguageIso639 is NULL, then ASSERT.
@param LanguageRfc4646 RFC4646 language code.
@param LanguageIso639 ISO639-2 language code.
@retval EFI_SUCCESS Language code converted.
@retval EFI_NOT_FOUND Language code not found.
**/
EFI_STATUS
EFIAPI
ConvertRfc4646LanguageToIso639Language (
IN CHAR8 *LanguageRfc4646,
OUT CHAR8 *LanguageIso639
)
;
/**
Convert language code from ISO639-2 to RFC4646 and return the converted language.
Caller is responsible for freeing the allocated buffer.
LanguageIso639 contain a single ISO639-2 code such as
"eng" or "fra".
If LanguageIso639 is NULL, then ASSERT.
If LanguageRfc4646 is NULL, then ASSERT.
@param LanguageIso639 ISO639-2 language code.
@return the allocated buffer or NULL, if the language is not found.
**/
CHAR8*
EFIAPI
ConvertIso639LanguageToRfc4646Language (
IN CONST CHAR8 *LanguageIso639
)
;
/**
Get next language from language code list (with separator ';').
If LangCode is NULL, then ASSERT.
If Lang is NULL, then ASSERT.
@param LangCode On input: point to first language in the list. On
output: point to next language in the list, or
NULL if no more language in the list.
@param Lang The first language in the list.
**/
VOID
EFIAPI
GetNextLanguage (
IN OUT CHAR8 **LangCode,
OUT CHAR8 *Lang
)
;
#include "Utility.h"
#include "ConfigAccess.h"
#endif

View File

@@ -1,85 +0,0 @@
/** @file
This file is for functins related to assign and free Framework HII handle number.
Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiHandle.h"
//
// FRAMEWORK_EFI_HII_HANDLE
//
UINT8 mHandle[1024 * 8] = {0};
/**
Initialize the Framework Hii Handle database.
**/
VOID
InitHiiHandleDatabase (
VOID
)
{
//
// FRAMEWORK_EFI_HII_HANDLE 0 is reserved.
// Set Bit 0 in mHandle[0] to 1.
//
mHandle[0] |= 1 << 0;
}
/**
Allocate a new Framework HII handle.
@param Handle Returns the new Framework HII Handle assigned.
@retval EFI_SUCCESS A new Framework HII Handle is assigned.
@retval EFI_OUT_OF_RESOURCE The Framework HII Handle database is depleted.
**/
EFI_STATUS
AllocateHiiHandle (
OUT FRAMEWORK_EFI_HII_HANDLE *Handle
)
{
UINTN Index;
for (Index = 0; Index < sizeof (mHandle) * 8; Index++) {
if ((mHandle[Index / 8] & (1 << (Index % 8))) == 0) {
mHandle[Index / 8] = (UINT8) (mHandle[Index / 8] | (1 << (Index % 8)));
*Handle = (FRAMEWORK_EFI_HII_HANDLE) Index;
ASSERT (*Handle != 0);
return EFI_SUCCESS;
}
}
return EFI_OUT_OF_RESOURCES;
}
/**
Free Framework HII handle.
@param Handle The Framework HII Handle to be freed.
**/
VOID
FreeHiiHandle (
IN FRAMEWORK_EFI_HII_HANDLE Handle
)
{
UINT16 Num;
Num = (UINT16) Handle;
ASSERT ((mHandle [Num / 8] & (1 << (Num % 8))) != 0);
mHandle [Num / 8] = (UINT8) (mHandle [Num / 8] & (~(1 << (Num % 8))));
}

View File

@@ -1,60 +0,0 @@
/** @file
This file is for functins related to assign and free Framework HII handle number.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _HII_HANDLE_H_
#define _HII_HANDLE_H_
#include <FrameworkDxe.h>
#include <Protocol/FrameworkHii.h>
#include <Library/DebugLib.h>
/**
Initialize the Framework Hii Handle database.
**/
VOID
InitHiiHandleDatabase (
VOID
);
/**
Allocate a new Framework HII handle.
@param Handle Returns the new Framework HII Handle assigned.
@retval EFI_SUCCESS A new Framework HII Handle is assigned.
@retval EFI_OUT_OF_RESOURCE The Framework HII Handle database is depleted.
**/
EFI_STATUS
AllocateHiiHandle (
OUT FRAMEWORK_EFI_HII_HANDLE *Handle
);
/**
Free Framework HII handle.
@param Handle The Framework HII Handle to be freed.
**/
VOID
FreeHiiHandle (
IN FRAMEWORK_EFI_HII_HANDLE Handle
);
#endif

View File

@@ -1,45 +0,0 @@
/** @file
This file contains the keyboard processing code to the HII database.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
/**
Retrieves the current keyboard layout.
This function is not implemented by HII Thunk Module.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param DescriptorCount A pointer to the number of Descriptor entries being described in the keyboard layout being retrieved.
@param Descriptor A pointer to a buffer containing an array of EFI_KEY_DESCRIPTOR entries. Each entry will reflect the
definition of a specific physical key. Type EFI_KEY_DESCRIPTOR is defined in "Related Definitions" below.
@retval EFI_SUCCESS The keyboard layout was retrieved successfully.
**/
EFI_STATUS
EFIAPI
HiiGetKeyboardLayout (
IN EFI_HII_PROTOCOL *This,
OUT UINT16 *DescriptorCount,
OUT FRAMEWORK_EFI_KEY_DESCRIPTOR *Descriptor
)
{
ASSERT (FALSE);
//
// In previous Framewok HII implementation, GetKeyBoardLayout is defined in HII 0.92 specification,
// but it is not implemented. We ASSERT and return UNSUPPORTED here.
//
return EFI_UNSUPPORTED;
}

View File

@@ -1,984 +0,0 @@
/** @file
Implement Functions to convert IFR Opcode in format defined in Framework HII specification to
format defined in UEFI HII Specification.
Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
#include "UefiIfrDefault.h"
/**
The dynamic creation of these opcodes is supported in Framework HII modules.
Therefore, Framework HII Thunk module only map these opcode between Framework
HII's definitions to UEFI HII's.
**/
typedef struct {
UINT8 FrameworkIfrOp;
UINT8 UefiIfrOp;
} IFR_OPCODE_MAP;
IFR_OPCODE_MAP QuestionOpcodeMap[] = {
{ FRAMEWORK_EFI_IFR_ONE_OF_OP, EFI_IFR_ONE_OF_OP},
{ FRAMEWORK_EFI_IFR_CHECKBOX_OP, EFI_IFR_CHECKBOX_OP},
{ FRAMEWORK_EFI_IFR_NUMERIC_OP, EFI_IFR_NUMERIC_OP},
{ FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP, EFI_IFR_ONE_OF_OPTION_OP},
{ FRAMEWORK_EFI_IFR_ORDERED_LIST_OP, EFI_IFR_ORDERED_LIST_OP}
};
/**
Translate a Framework Question Opcode to UEFI Question Opcode.
@param FwOp Framework Opcode.
@param UefiOp UEFI Opcode.
@retval EFI_SUCCESS The UEFI opcode is found and returned.
@retval EFI_NOT_FOUND The UEFI opcode is not found.
**/
EFI_STATUS
QuestionOpFwToUefi (
IN UINT8 FwOp,
OUT UINT8 *UefiOp
)
{
UINTN Index;
for (Index = 0; Index < ARRAY_SIZE (QuestionOpcodeMap); Index++) {
if (FwOp == QuestionOpcodeMap[Index].FrameworkIfrOp) {
*UefiOp = QuestionOpcodeMap[Index].UefiIfrOp;
return EFI_SUCCESS;
}
}
*UefiOp = (UINT8) (EFI_IFR_LAST_OPCODE + 1);
return EFI_NOT_FOUND;
}
/**
Translate a Framework Question ID to UEFI Question ID.
@param FormSet FormSet context
@param FwOpCode Framework Opcode
@param FwQId Framework Question Id
@param UefiQId UEFI Question ID.
@retval EFI_SUCCESS The UEFI Question Id is found and returned.
@retval EFI_NOT_FOUND The UEFI Question Id is not found.
**/
EFI_STATUS
FwQIdToUefiQId (
IN CONST FORM_BROWSER_FORMSET *FormSet,
IN UINT8 FwOpCode,
IN UINT16 FwQId,
OUT UINT16 *UefiQId
)
{
LIST_ENTRY *FormList;
LIST_ENTRY *StatementList;
FORM_BROWSER_FORM *Form;
FORM_BROWSER_STATEMENT *Statement;
FORM_BROWSER_STATEMENT *StatementFound;
EFI_STATUS Status;
UINT8 UefiOp;
*UefiQId = 0;
StatementFound = NULL;
FormList = GetFirstNode (&FormSet->FormListHead);
while (!IsNull (&FormSet->FormListHead, FormList)) {
Form = FORM_BROWSER_FORM_FROM_LINK (FormList);
StatementList = GetFirstNode (&Form->StatementListHead);
while (!IsNull (&Form->StatementListHead, StatementList)) {
Statement = FORM_BROWSER_STATEMENT_FROM_LINK (StatementList);
if (Statement->VarStoreId != 0 && Statement->Storage->Type == EFI_HII_VARSTORE_BUFFER) {
if (FwQId == Statement->VarStoreInfo.VarOffset) {
Status = QuestionOpFwToUefi (FwOpCode, &UefiOp);
ASSERT_EFI_ERROR (Status);
if ((UefiOp == Statement->Operand) && (FormSet->DefaultVarStoreId == Statement->VarStoreId)) {
//
// If ASSERT here, the Framework VFR file has two Questions with all three attibutes the same:
// 1) Same Question Type,
// 2) Same Variable Storage
// 3) Refering to the Same offset in Variable Map (NvMap).
// This is ambigurity as FwQIdToUefiQId () can't find which UEFI Question
// ID to return.
//
// One possible solution is to remove the one of the duplicated questions in this Form Set.
//
ASSERT (StatementFound == NULL);
StatementFound= Statement;
//
// Continue the search to check if the Form Set contains more than one questins that has the 3 attributes
// with same value.
//
}
}
}
StatementList = GetNextNode (&Form->StatementListHead, StatementList);
}
FormList = GetNextNode (&FormSet->FormListHead, FormList);
}
if (StatementFound != NULL) {
*UefiQId = StatementFound->QuestionId;
return EFI_SUCCESS;
}
return EFI_NOT_FOUND;
}
/**
Assign a Question ID.
If FwQuestionId is 0, then assign a new question ID. The new question ID
is MaxQuestionId incremented by 1. The MaxQuestionId of FormSet is also
incremented by 1.
If FwQuestionId is not 0, then it is used as the Framework Question ID.
@param FwQuestionId
@param FormSet
@return The Framework Question ID.
**/
EFI_QUESTION_ID
AssignQuestionId (
IN UINT16 FwQuestionId,
IN FORM_BROWSER_FORMSET *FormSet
)
{
if (FwQuestionId == 0) {
FormSet->MaxQuestionId++;
return FormSet->MaxQuestionId;
} else {
return FwQuestionId;
}
}
/**
Create UEFI HII Text Opcode from a Framework HII Text Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param FwOpcode The input Framework Opcode.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateTextOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN CONST FRAMEWORK_EFI_IFR_TEXT *FwOpcode
)
{
EFI_IFR_TEXT UTextOpCode;
if ((FwOpcode->Flags & EFI_IFR_FLAG_INTERACTIVE) == 0) {
ZeroMem (&UTextOpCode, sizeof(UTextOpCode));
UTextOpCode.Header.OpCode = EFI_IFR_TEXT_OP;
UTextOpCode.Header.Length = (UINT8) sizeof (EFI_IFR_TEXT);
UTextOpCode.Statement.Help = FwOpcode->Help;
UTextOpCode.Statement.Prompt = FwOpcode->Text;
UTextOpCode.TextTwo = FwOpcode->TextTwo;
return HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UTextOpCode, sizeof(UTextOpCode));
} else {
//
// Iteractive Text Opcode is EFI_IFR_ACTION
//
return HiiCreateActionOpCode (UefiUpdateDataHandle, FwOpcode->Key, FwOpcode->Text, FwOpcode->Help, EFI_IFR_FLAG_CALLBACK, 0);
}
}
/**
Create UEFI HII Reference Opcode from a Framework HII Reference Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param FwOpcode The input Framework Opcode.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateReferenceOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN CONST FRAMEWORK_EFI_IFR_REF *FwOpcode
)
{
EFI_IFR_REF UOpcode;
ZeroMem (&UOpcode, sizeof(UOpcode));
UOpcode.Header.Length = (UINT8) sizeof (UOpcode);
UOpcode.Header.OpCode = EFI_IFR_REF_OP;
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;
UOpcode.Question.Header.Help = FwOpcode->Help;
UOpcode.Question.QuestionId = FwOpcode->Key;
UOpcode.FormId = FwOpcode->FormId;
//
// We only map EFI_IFR_FLAG_INTERACTIVE and EFI_IFR_FLAG_RESET_REQUIRED to
// UEFI IFR Opcode flags. The rest flags are obsolete.
//
UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_RESET_REQUIRED));
return HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));
}
/**
Create UEFI HII "One Of Option" Opcode from a Framework HII "One Of Option" Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param FwOpcode The input Framework Opcode.
@param Width The size of the One Of Option. 1 bytes or 2 bytes.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateOneOfOptionOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOpcode,
IN UINTN Width
)
{
EFI_IFR_ONE_OF_OPTION UOpcode;
ZeroMem (&UOpcode, sizeof(UOpcode));
UOpcode.Header.Length = (UINT8) sizeof (UOpcode);
UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;
UOpcode.Option = FwOpcode->Option;
CopyMem (&UOpcode.Value.u8, &FwOpcode->Value, Width);
//
// #define EFI_IFR_FLAG_DEFAULT 0x01
// #define EFI_IFR_FLAG_MANUFACTURING 0x02
// #define EFI_IFR_OPTION_DEFAULT 0x10
// #define EFI_IFR_OPTION_DEFAULT_MFG 0x20
//
UOpcode.Flags = (UINT8) (UOpcode.Flags | (FwOpcode->Flags & (EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_MANUFACTURING)) << 4);
switch (Width) {
case 1:
UOpcode.Type = EFI_IFR_TYPE_NUM_SIZE_8;
break;
case 2:
UOpcode.Type = EFI_IFR_TYPE_NUM_SIZE_16;
break;
default:
ASSERT (FALSE);
return NULL;
}
return HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));
}
/**
Create a GUID Opcode EFI_IFR_GUID_OPTIONKEY to map the Framework One Of Option callback key
to a UEFI Question ID. This information is used to invoke the Framework HII Browser Callback
function. The opcode is appened to UefiUpdateDataHandle.
@param UefiUpdateDataHandle The UEFI Update Data buffer.
@param QuestionId The UEFI Question ID.
@param OptionValue The value of the "One Of Option".
@param KeyValue The Framework "One Of Option" callback key.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
CreateGuidOptionKeyOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN EFI_QUESTION_ID QuestionId,
IN UINT16 OptionValue,
IN EFI_QUESTION_ID KeyValue
)
{
EFI_IFR_GUID_OPTIONKEY *UOpcode;
UOpcode = (EFI_IFR_GUID_OPTIONKEY *) HiiCreateGuidOpCode (
UefiUpdateDataHandle,
&gEfiIfrFrameworkGuid,
NULL,
sizeof (EFI_IFR_GUID_OPTIONKEY)
);
UOpcode->ExtendOpCode = EFI_IFR_EXTEND_OP_OPTIONKEY;
UOpcode->QuestionId = QuestionId;
CopyMem (&UOpcode->OptionValue, &OptionValue, sizeof (OptionValue));
UOpcode->KeyValue = KeyValue;
return (UINT8 *) UOpcode;
}
/**
Create UEFI HII "One Of" Opcode from a Framework HII "One Of" Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param ThunkContext The HII Thunk Context.
@param FwOpcode The input Framework Opcode.
@param NextFwOpcode Returns the position of the next Framework Opcode after EFI_IFR_END_ONE_OF_OP of
the "One Of Option".
@param OpcodeCount The number of Opcode for the complete Framework "One Of" Opcode.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateOneOfOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN HII_THUNK_CONTEXT *ThunkContext,
IN CONST FRAMEWORK_EFI_IFR_ONE_OF *FwOpcode,
OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,
OUT UINTN *OpcodeCount
)
{
EFI_STATUS Status;
EFI_IFR_ONE_OF UOpcode;
FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;
FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;
UINT8 *OpCodeBuffer;
UINT8 *OneOfOpCodeBuffer;
ASSERT (NextFwOpcode != NULL);
ASSERT (OpcodeCount != NULL);
ZeroMem (&UOpcode, sizeof(UOpcode));
*OpcodeCount = 0;
UOpcode.Header.Length = (UINT8) sizeof (UOpcode);
UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OP;
UOpcode.Header.Scope = 1;
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;
UOpcode.Question.Header.Help = FwOpcode->Help;
UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId;
UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;
//
// Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode
//
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);
while (FwOpHeader->OpCode != EFI_IFR_END_ONE_OF_OP) {
ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);
FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;
if ((FwOneOfOp->Flags & EFI_IFR_FLAG_INTERACTIVE) != 0) {
UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;
if (UOpcode.Question.QuestionId == 0) {
Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);
if (EFI_ERROR (Status)) {
UOpcode.Question.QuestionId = AssignQuestionId (FwOneOfOp->Key, ThunkContext->FormSet);
}
}
}
if ((FwOneOfOp->Flags & EFI_IFR_FLAG_RESET_REQUIRED) == EFI_IFR_FLAG_RESET_REQUIRED) {
UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;
}
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);
}
if (UOpcode.Question.QuestionId == 0) {
//
// Assign QuestionId if still not assigned.
//
Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);
if (EFI_ERROR (Status)) {
UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet);
}
}
OneOfOpCodeBuffer = HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof (UOpcode));
if (OneOfOpCodeBuffer == NULL) {
return NULL;
}
*OpcodeCount += 1;
//
// Go over again the Framework IFR binary to build the UEFI One Of Option opcodes.
//
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);
while (FwOpHeader->OpCode != EFI_IFR_END_ONE_OF_OP) {
FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;
OpCodeBuffer = F2UCreateOneOfOptionOpCode (UefiUpdateDataHandle, (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width);
if (OpCodeBuffer == NULL) {
return NULL;
}
OpCodeBuffer = CreateGuidOptionKeyOpCode (UefiUpdateDataHandle, UOpcode.Question.QuestionId, FwOneOfOp->Value, FwOneOfOp->Key);
if (OpCodeBuffer == NULL) {
return NULL;
}
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);
*OpcodeCount += 1;
}
OpCodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);
if (OpCodeBuffer != NULL) {
*NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);
*OpcodeCount += 1;
}
return OneOfOpCodeBuffer;
}
/**
Create UEFI HII "Ordered List" Opcode from a Framework HII "Ordered List" Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param ThunkContext The HII Thunk Context.
@param FwOpcode The input Framework Opcode.
@param NextFwOpcode Returns the position of the next Framework Opcode after EFI_IFR_END_ONE_OF_OP of
the "Ordered List".
@param OpcodeCount The number of Opcode for the complete Framework "Ordered List" Opcode.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateOrderedListOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN HII_THUNK_CONTEXT *ThunkContext,
IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,
OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,
OUT UINTN *OpcodeCount
)
{
EFI_IFR_ORDERED_LIST UOpcode;
EFI_STATUS Status;
FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;
FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;
UINT8 *OpcodeBuffer;
UINT8 *OrderListOpCode;
ZeroMem (&UOpcode, sizeof(UOpcode));
*OpcodeCount = 0;
UOpcode.Header.Length = (UINT8) sizeof (UOpcode);
UOpcode.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;
UOpcode.Header.Scope = 1;
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;
UOpcode.Question.Header.Help = FwOpcode->Help;
UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId;
UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;
UOpcode.MaxContainers = FwOpcode->MaxEntries;
//
// Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode
//
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);
while (FwOpHeader->OpCode != EFI_IFR_END_ONE_OF_OP) {
ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);
FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;
if ((FwOneOfOp->Flags & EFI_IFR_FLAG_INTERACTIVE) != 0) {
UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;
if (UOpcode.Question.QuestionId == 0) {
Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);
if (EFI_ERROR (Status)) {
UOpcode.Question.QuestionId = AssignQuestionId (FwOneOfOp->Key, ThunkContext->FormSet);
}
}
}
if ((FwOneOfOp->Flags & EFI_IFR_FLAG_RESET_REQUIRED) == EFI_IFR_FLAG_RESET_REQUIRED) {
UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;
}
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);
}
if (UOpcode.Question.QuestionId == 0) {
Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);
if (EFI_ERROR (Status)) {
UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet);
}
}
OrderListOpCode = HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));
if (OrderListOpCode == NULL) {
return NULL;
}
*OpcodeCount += 1;
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);
while (FwOpHeader->OpCode != EFI_IFR_END_ONE_OF_OP) {
//
// Each entry of Order List in Framework HII is always 1 byte in size
//
OpcodeBuffer = F2UCreateOneOfOptionOpCode (UefiUpdateDataHandle, (CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1);
if (OpcodeBuffer == NULL) {
return NULL;
}
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);
*OpcodeCount += 1;
}
OpcodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);
if (OpcodeBuffer != NULL) {
*NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);
*OpcodeCount += 1;
}
return OrderListOpCode;
}
/**
Create UEFI HII CheckBox Opcode from a Framework HII Checkbox Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param ThunkContext The HII Thunk Context.
@param FwOpcode The input Framework Opcode.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateCheckBoxOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN HII_THUNK_CONTEXT *ThunkContext,
IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode
)
{
EFI_STATUS Status;
EFI_IFR_CHECKBOX UOpcode;
ZeroMem (&UOpcode, sizeof(UOpcode));
UOpcode.Header.Length = (UINT8) sizeof (UOpcode);
UOpcode.Header.OpCode = EFI_IFR_CHECKBOX_OP;
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;
UOpcode.Question.Header.Help = FwOpcode->Help;
if (FwOpcode->Key == 0) {
Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);
if (EFI_ERROR (Status)) {
//
// Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.
//
UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet);
}
} else {
UOpcode.Question.QuestionId = FwOpcode->Key;
}
//
// We map 2 flags:
// EFI_IFR_FLAG_INTERACTIVE,
// EFI_IFR_FLAG_RESET_REQUIRED,
// to UEFI IFR Opcode Question flags. The rest flags are obsolete.
//
UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_RESET_REQUIRED));
UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId;
UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;
//
// We also map these 2 flags:
// EFI_IFR_FLAG_DEFAULT,
// EFI_IFR_FLAG_MANUFACTURING,
// to UEFI IFR CheckBox Opcode default flags.
//
UOpcode.Flags = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_MANUFACTURING));
return HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));
}
/**
Create UEFI HII Numeric Opcode from a Framework HII Numeric Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param ThunkContext The HII Thunk Context.
@param FwOpcode The input Framework Opcode.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateNumericOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN HII_THUNK_CONTEXT *ThunkContext,
IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode
)
{
EFI_STATUS Status;
EFI_IFR_NUMERIC UOpcode;
EFI_IFR_DEFAULT UOpcodeDefault;
UINT8 *NumbericOpCode;
UINT8 *OpcodeBuffer;
ZeroMem (&UOpcode, sizeof(UOpcode));
if (FwOpcode->Key == 0) {
Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);
if (EFI_ERROR (Status)) {
//
// Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.
//
UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet);
}
} else {
UOpcode.Question.QuestionId = FwOpcode->Key;
}
UOpcode.Header.Length = (UINT8) sizeof (UOpcode);
UOpcode.Header.OpCode = EFI_IFR_NUMERIC_OP;
//
// We need to create a nested default value for the UEFI Numeric Opcode.
// So turn on the scope.
//
UOpcode.Header.Scope = 1;
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;
UOpcode.Question.Header.Help = FwOpcode->Help;
UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId;
UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;
UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_RESET_REQUIRED));
//
// Framework Numeric values are all in UINT16 and displayed as decimal.
//
UOpcode.data.u16.MinValue = FwOpcode->Minimum;
UOpcode.data.u16.MaxValue = FwOpcode->Maximum;
UOpcode.data.u16.Step = FwOpcode->Step;
switch (FwOpcode->Width) {
case 1:
{
UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC;
break;
}
case 2:
{
UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC;
break;
}
default:
{
ASSERT (FALSE);
return NULL;
}
}
NumbericOpCode = HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));
if (NumbericOpCode == NULL) {
return NULL;
}
//
// We need to create a default value.
//
ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));
UOpcodeDefault.Header.Length = (UINT8) sizeof (UOpcodeDefault);
UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;
UOpcodeDefault.DefaultId = 0;
switch (FwOpcode->Width) {
case 1:
{
UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_8;
break;
}
case 2:
{
UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_16;
break;
}
}
CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);
OpcodeBuffer = HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault));
if (OpcodeBuffer == NULL) {
return NULL;
}
OpcodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);
if (OpcodeBuffer == NULL) {
return NULL;
}
return NumbericOpCode;
}
/**
Create UEFI HII String Opcode from a Framework HII String Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param ThunkContext The HII Thunk Context.
@param FwOpcode The input Framework Opcode.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateStringOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN HII_THUNK_CONTEXT *ThunkContext,
IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode
)
{
EFI_IFR_STRING UOpcode;
EFI_STATUS Status;
ZeroMem (&UOpcode, sizeof(UOpcode));
if (FwOpcode->Key == 0) {
Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);
if (EFI_ERROR (Status)) {
//
// Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.
//
UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet);
}
} else {
UOpcode.Question.QuestionId = FwOpcode->Key;
}
UOpcode.Header.Length = (UINT8) sizeof (UOpcode);
UOpcode.Header.OpCode = EFI_IFR_STRING_OP;
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;
UOpcode.Question.Header.Help = FwOpcode->Help;
UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_RESET_REQUIRED));
UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId;
UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;
UOpcode.MinSize = FwOpcode->MinSize;
UOpcode.MaxSize = FwOpcode->MaxSize;
UOpcode.Flags = EFI_IFR_STRING_MULTI_LINE;
return HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));
}
/**
Create UEFI HII Banner Opcode from a Framework HII Banner Opcode.
@param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.
@param FwOpcode The input Framework Opcode.
@retval NULL There is not enough space left in Buffer to add the opcode.
@retval Other A pointer to the created opcode.
**/
UINT8 *
F2UCreateBannerOpCode (
IN OUT VOID *UefiUpdateDataHandle,
IN CONST EFI_IFR_BANNER *FwOpcode
)
{
EFI_IFR_GUID_BANNER *UOpcode;
UOpcode = (EFI_IFR_GUID_BANNER *) HiiCreateGuidOpCode (
UefiUpdateDataHandle,
&gEfiIfrTianoGuid,
NULL,
sizeof (EFI_IFR_GUID_BANNER)
);
UOpcode->ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;
UOpcode->Title = FwOpcode->Title;
UOpcode->LineNumber = FwOpcode->LineNumber;
UOpcode->Alignment = FwOpcode->Alignment;
return (UINT8 *) UOpcode;
}
/**
Create a Hii Update data Handle used to call IfrLibUpdateForm.
@param ThunkContext The HII Thunk Context.
@param FwUpdateData The Framework Update Data.
@param UefiOpCodeHandle The UEFI opcode handle.
@retval EFI_SUCCESS The UEFI Update Data is created successfully.
@retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData.
@retval EFI_OUT_OF_RESOURCES There is not enough resource.
**/
EFI_STATUS
FwUpdateDataToUefiUpdateData (
IN HII_THUNK_CONTEXT *ThunkContext,
IN CONST EFI_HII_UPDATE_DATA *FwUpdateData,
IN VOID *UefiOpCodeHandle
)
{
FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode;
FRAMEWORK_EFI_IFR_OP_HEADER *NextFwOpCode;
UINTN Index;
UINTN DataCount;
UINT8 *OpCodeBuffer;
LIST_ENTRY *StorageList;
FORMSET_STORAGE *Storage;
FORM_BROWSER_FORMSET *FormSet;
CHAR16 *DefaultVarStoreName;
UINT16 DefaultVarStoreId;
EFI_IFR_VARSTORE_SELECT *SelectVarOp;
FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data;
FormSet = ThunkContext->FormSet;
DefaultVarStoreId = FormSet->DefaultVarStoreId;
DefaultVarStoreName = FormSet->OriginalDefaultVarStoreName;
for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) {
switch (FwOpCode->OpCode) {
case FRAMEWORK_EFI_IFR_SUBTITLE_OP:
OpCodeBuffer = HiiCreateSubTitleOpCode (UefiOpCodeHandle, ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode)->SubTitle, 0, 0, 0);
DataCount = 1;
break;
case FRAMEWORK_EFI_IFR_TEXT_OP:
OpCodeBuffer = F2UCreateTextOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_TEXT *) FwOpCode);
DataCount = 1;
break;
case FRAMEWORK_EFI_IFR_REF_OP:
OpCodeBuffer = F2UCreateReferenceOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_REF *) FwOpCode);
DataCount = 1;
break;
case FRAMEWORK_EFI_IFR_ONE_OF_OP:
OpCodeBuffer = F2UCreateOneOfOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, &NextFwOpCode, &DataCount);
if (OpCodeBuffer != NULL) {
FwOpCode = NextFwOpCode;
//
// FwOpCode is already updated to point to the next opcode.
//
continue;
}
break;
case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:
OpCodeBuffer = F2UCreateOrderedListOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, &NextFwOpCode, &DataCount);
if (OpCodeBuffer != NULL) {
FwOpCode = NextFwOpCode;
//
// FwOpCode is already updated to point to the next opcode.
//
continue;
}
break;
case FRAMEWORK_EFI_IFR_CHECKBOX_OP:
OpCodeBuffer = F2UCreateCheckBoxOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode);
DataCount = 1;
break;
case FRAMEWORK_EFI_IFR_STRING_OP:
OpCodeBuffer = F2UCreateStringOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode);
DataCount = 1;
break;
case EFI_IFR_BANNER_OP:
OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (EFI_IFR_BANNER *) FwOpCode);
DataCount = 1;
break;
case EFI_IFR_END_ONE_OF_OP:
OpCodeBuffer = HiiCreateEndOpCode (UefiOpCodeHandle);
DataCount = 1;
break;
case FRAMEWORK_EFI_IFR_NUMERIC_OP:
OpCodeBuffer = F2UCreateNumericOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode);
DataCount = 1;
break;
case EFI_IFR_VARSTORE_SELECT_OP:
OpCodeBuffer = (UINT8 *) FwOpCode;
SelectVarOp = (EFI_IFR_VARSTORE_SELECT *) FwOpCode;
//
// Check whether the selected VarId is in StorageList.
//
StorageList = GetFirstNode (&FormSet->StorageListHead);
while (!IsNull (&FormSet->StorageListHead, StorageList)) {
Storage = FORMSET_STORAGE_FROM_LINK (StorageList);
if (Storage->VarStoreId == SelectVarOp->VarId) {
break;
}
StorageList = GetNextNode (&FormSet->StorageListHead, StorageList);
}
ASSERT (!IsNull (&FormSet->StorageListHead, StorageList));
//
// Change VarStoreId to the selected VarId.
//
FormSet->DefaultVarStoreId = SelectVarOp->VarId;
if (SelectVarOp->VarId == DefaultVarStoreId) {
FormSet->OriginalDefaultVarStoreName = DefaultVarStoreName;
}
DataCount = 1;
break;
default:
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
if (OpCodeBuffer == NULL) {
return EFI_OUT_OF_RESOURCES;
}
FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);
}
//
// Revert FromSet default varstore ID.
//
FormSet->DefaultVarStoreId = DefaultVarStoreId;
FormSet->OriginalDefaultVarStoreName = DefaultVarStoreName;
return EFI_SUCCESS;
}

View File

@@ -1,897 +0,0 @@
/** @file
Implement protocol interface related to package registrations.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
#include "HiiHandle.h"
BOOLEAN mInFrameworkHiiNewPack = FALSE;
BOOLEAN mInFrameworkHiiRemovePack = FALSE;
BOOLEAN mInFrameworkUpdatePakcage = FALSE;
UINT64 mGuidCount = 0;
EFI_GUID mGuidBase = { 0x14f95e01, 0xd562, 0x432e, { 0x84, 0x4a, 0x95, 0xa4, 0x39, 0x5, 0x10, 0x7e }};
/**
Get the number of Form, STRING and Font packages in the package list passed in.
@param Packages Package List.
@param IfrPackageCount Number of IFR Packages.
@param StringPackageCount Number of String Packages.
@param FontPackageCount Number of Font Packages.
@retval EFI_INVALID_PARAMETER If the Package List has package with type of
EFI_HII_PACKAGE_KEYBOARD_LAYOUT, EFI_HII_PACKAGE_FONTS, EFI_HII_PACKAGE_IMAGES.
@retval EFI_SUCCESS Successfully get the number of IFR and STRING package.
**/
EFI_STATUS
GetPackageCount (
IN CONST EFI_HII_PACKAGES *Packages,
OUT UINTN *IfrPackageCount,
OUT UINTN *StringPackageCount,
OUT UINTN *FontPackageCount
)
{
UINTN Index;
TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;
ASSERT (Packages != NULL);
ASSERT (IfrPackageCount != NULL);
ASSERT (StringPackageCount != NULL);
ASSERT (FontPackageCount != NULL);
*IfrPackageCount = 0;
*StringPackageCount = 0;
*FontPackageCount = 0;
TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));
for (Index = 0; Index < Packages->NumberOfPackages; Index++) {
//
// The current UEFI HII build tool generate a binary in the format defined by
// TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in
// this binary is with same package type. So the returned IfrPackageCount and StringPackageCount
// may not be the exact number of valid package number in the binary generated
// by HII Build tool.
//
switch (TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Type) {
case EFI_HII_IFR:
*IfrPackageCount += 1;
break;
case EFI_HII_STRING:
*StringPackageCount += 1;
break;
case EFI_HII_FONT:
*FontPackageCount += 1;
break;
//
// The following fonts are invalid for a module that using Framework to UEFI thunk layer.
//
default:
ASSERT (FALSE);
return EFI_INVALID_PARAMETER;
break;
}
}
return EFI_SUCCESS;
}
/**
Insert the String Package into the Package Lists which has the TAG GUID matching
the PackageListGuid of the String Package.
The Package List must have only IFR Package and no String Package.
Otherwise, ASSERT.
@param Private The HII THUNK driver context data.
@param StringPackageThunkContext The HII THUNK context data.
@param StringPackageListHeader The String Package List Header.
**/
VOID
UpdatePackListWithOnlyIfrPack (
IN HII_THUNK_PRIVATE_DATA *Private,
IN HII_THUNK_CONTEXT *StringPackageThunkContext,
IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader
)
{
EFI_STATUS Status;
LIST_ENTRY *Link;
HII_THUNK_CONTEXT *ThunkContext;
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
if (StringPackageThunkContext != ThunkContext) {
//
// Skip the String Package Thunk Entry itself.
//
if (CompareGuid (&StringPackageListHeader->PackageListGuid, &ThunkContext->TagGuid)) {
ASSERT (ThunkContext->StringPackageCount == 0 && ThunkContext->IfrPackageCount == 1);
ThunkContext->StringPackageCount = GetPackageCountByType (StringPackageListHeader, EFI_HII_PACKAGE_STRINGS);
Status = mHiiDatabase->UpdatePackageList (
mHiiDatabase,
ThunkContext->UefiHiiHandle,
StringPackageListHeader
);
ASSERT_EFI_ERROR (Status);
ThunkContext->SharingStringPack = TRUE;
StringPackageThunkContext->SharingStringPack = TRUE;
}
}
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
}
/**
Caculate the size of UEFI Simple Font Package that is needed to
convert all the font a Framework Font Paackage.
ONLY Narrow Font is supported. Wide Font is discarded.
If the Package Header is not of EFI_HII_FONT type, then ASSERT.
@param PackHeader Pointer to Framework Font Package.
@return The size of the UEFI Simple Font Package.
**/
UINTN
GetUefiSimpleFontPackSize (
IN CONST EFI_HII_PACK_HEADER * PackHeader
)
{
UINTN Size;
EFI_HII_FONT_PACK *FwFontPack;
FwFontPack = (EFI_HII_FONT_PACK *) PackHeader;
ASSERT (FwFontPack->Header.Type == EFI_HII_FONT);
Size = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR)
+ (FwFontPack->NumberOfNarrowGlyphs * sizeof (EFI_NARROW_GLYPH));
return Size;
}
/**
Convert Font Package in Framework format to a newly allocated UEFI
Simple Font Package.
ONLY Narrow Font is supported. Wide Font is discarded.
If memory allocation fails, then ASSERT.
@param PackHeader Pointer to Framework Font Package header.
@return UEFI Simple Font Package.
**/
EFI_HII_SIMPLE_FONT_PACKAGE_HDR *
FrameworkFontPackToUefiSimpliedFont (
IN CONST EFI_HII_PACK_HEADER * PackHeader
)
{
EFI_HII_SIMPLE_FONT_PACKAGE_HDR *FontPack;
UINTN Size;
EFI_NARROW_GLYPH *FwNarrowGlyph;
EFI_NARROW_GLYPH *NarrowGlyph;
UINTN Idx;
EFI_HII_FONT_PACK *FwFontPack;
Size = GetUefiSimpleFontPackSize (PackHeader);
FwFontPack = (EFI_HII_FONT_PACK *) PackHeader;
FontPack = AllocateZeroPool (Size);
ASSERT (FontPack != NULL);
//
// Prepare the Header information.
//
FontPack->Header.Length = (UINT32) Size;
FontPack->Header.Type = EFI_HII_PACKAGE_SIMPLE_FONTS;
FontPack->NumberOfNarrowGlyphs = FwFontPack->NumberOfNarrowGlyphs;
//
// ONLY Narrow Font is supported. Wide Font is discarded.
//
FontPack->NumberOfWideGlyphs = 0;
//
// Copy Narrow Glyph
//
NarrowGlyph = (EFI_NARROW_GLYPH *) (FontPack + 1);
FwNarrowGlyph = (EFI_NARROW_GLYPH *) (FwFontPack + 1);
CopyMem (NarrowGlyph, FwNarrowGlyph, sizeof (EFI_NARROW_GLYPH) * FwFontPack->NumberOfNarrowGlyphs);
for (Idx = 0; Idx < FwFontPack->NumberOfNarrowGlyphs; Idx++) {
//
// Clear the GLYPH_NON_BREAKING (EFI_GLYPH_WIDE is used here as they are all 0x02)
// attribute which is not defined in UEFI EFI_NARROW_GLYPH
//
NarrowGlyph[Idx].Attributes = (UINT8) (NarrowGlyph[Idx].Attributes & ~(EFI_GLYPH_WIDE));
}
return FontPack;
}
/**
Prepare a UEFI Package List from a Framework HII package list registered
from a Framework HII NewPack () function.
If either Packages or PackageListGuid is NULL, then ASSERT.
@param Packages The Framework HII Package List.
@param PackageListGuid The Package List GUID.
@return The UEFI Package List.
**/
EFI_HII_PACKAGE_LIST_HEADER *
PrepareUefiPackageListFromFrameworkHiiPackages (
IN CONST EFI_HII_PACKAGES *Packages,
IN CONST EFI_GUID *PackageListGuid
)
{
UINTN NumberOfPackages;
EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;
UINT8 *PackageListData;
UINT32 PackageListLength;
UINT32 PackageLength;
EFI_HII_PACKAGE_HEADER PackageHeader;
UINTN Index;
TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;
EFI_HII_SIMPLE_FONT_PACKAGE_HDR *FontPack;
ASSERT (Packages != NULL);
ASSERT (PackageListGuid != NULL);
TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) ((UINT8 *) &Packages->GuidId + sizeof (Packages->GuidId));
NumberOfPackages = Packages->NumberOfPackages;
PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
for (Index = 0; Index < NumberOfPackages; Index++) {
if (TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Type == EFI_HII_FONT) {
//
// There is no tool to generate Font package in Framework HII's implementation.
// Therefore, Font Package be a C structure defined in Framework HII code.
// Therefore, Font Package will be in Framework HII format defined by EFI_HII_FONT_PACK.
// We need to create a UEFI Simple Font Package and copy over all data. Hence, EFI_HII_FONT
// is handled differently than EFI_HII_IFR and EFI_HII_STRING.
//
PackageListLength = (UINT32) (PackageListLength + GetUefiSimpleFontPackSize (&TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader));
} else {
//
// For EFI_HII_IFR and EFI_HII_STRING, EDK II's VFR Compiler and Build.exe will generate a binary in a format
// defined by TIANO_AUTOGEN_PACKAGES_HEADER. A Framework HII's EFI_HII_PACK_HEADER is inserted before
// the UEFI package data.
//
CopyMem (&PackageLength, &TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Length, sizeof (UINT32));
//
// EFI_HII_PACK_HEADER.FrameworkPackageHeader.Length include the sizeof FrameworkPackageHeader itself.
//
PackageListLength += (PackageLength - sizeof(EFI_HII_PACK_HEADER));
}
}
//
// Include the lenght of EFI_HII_PACKAGE_END
//
PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);
PackageListHeader = AllocateZeroPool (PackageListLength);
ASSERT (PackageListHeader != NULL);
CopyMem (&PackageListHeader->PackageListGuid, PackageListGuid, sizeof (EFI_GUID));
PackageListHeader->PackageLength = PackageListLength;
PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);
//
// Build the UEFI Package List.
//
for (Index = 0; Index < NumberOfPackages; Index++) {
if (TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Type == EFI_HII_FONT) {
PackageLength = (UINT32) GetUefiSimpleFontPackSize (&TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader);
FontPack = FrameworkFontPackToUefiSimpliedFont (&TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader);
CopyMem (PackageListData, FontPack, PackageLength);
FreePool (FontPack);
} else {
CopyMem (&PackageLength, &(TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Length), sizeof (UINT32));
PackageLength -= sizeof (EFI_HII_PACK_HEADER);
CopyMem (PackageListData, &(TianoAutogenPackageHdrArray[Index]->PackageHeader), PackageLength);
}
PackageListData += PackageLength;
}
//
// Append EFI_HII_PACKAGE_END
//
PackageHeader.Type = EFI_HII_PACKAGE_END;
PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);
CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);
return PackageListHeader;
}
/**
Generate a Random GUID.
@param Guid On output, a Random GUID will be filled.
**/
VOID
GenerateRandomGuid (
OUT EFI_GUID * Guid
)
{
CopyGuid (Guid, &mGuidBase);
mGuidCount++;
*((UINT64 *) Guid) = *((UINT64 *) Guid) + mGuidCount;
}
/**
Given a Package List with only a IFR package, find the Package List that only has a String Package based on
the TAG GUID. Then export the String Package from the Package List and insert it
to the given IFR package.
This is to handle the case of Framework HII interface which allow String Package
and IFR package to be registered using two different NewPack () calls.
@param Private The HII THUNK driver context data.
@param IfrThunkContext Package List with only a IFR package.
@retval EFI_SUCCESS If the String Package is found and inserted to the
Package List with only a IFR package.
@retval EFI_NOT_FOUND No String Package matching the TAG GUID is found.
**/
EFI_STATUS
FindStringPackAndUpdatePackListWithOnlyIfrPack (
IN HII_THUNK_PRIVATE_DATA *Private,
IN HII_THUNK_CONTEXT *IfrThunkContext
)
{
EFI_STATUS Status;
LIST_ENTRY *Link;
EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader;
UINTN Size;
HII_THUNK_CONTEXT *ThunkContext;
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
if (ThunkContext != IfrThunkContext) {
if (CompareGuid (&IfrThunkContext->TagGuid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount == 0)) {
StringPackageListHeader = NULL;
Status = ExportPackageLists (ThunkContext->UefiHiiHandle, &StringPackageListHeader, &Size);
ASSERT_EFI_ERROR (Status);
if (StringPackageListHeader == NULL) {
return EFI_NOT_FOUND;
}
IfrThunkContext->StringPackageCount = GetPackageCountByType (StringPackageListHeader, EFI_HII_PACKAGE_STRINGS);
//
// Add Function to only get only String Packages from the Package List
//
Status = mHiiDatabase->UpdatePackageList (
mHiiDatabase,
IfrThunkContext->UefiHiiHandle,
StringPackageListHeader
);
ASSERT_EFI_ERROR (Status);
FreePool (StringPackageListHeader);
IfrThunkContext->SharingStringPack = TRUE;
ThunkContext->SharingStringPack = TRUE;
return EFI_SUCCESS;
}
}
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
//
// A Form Package must have a String Package to function.
// If ASSERT here, check the sequence of call to Hii->NewPack.
// String Pack must be registered before Ifr Package is registered.
//
ASSERT (FALSE);
return EFI_NOT_FOUND;
}
/**
Register the Package List passed from the Framework HII NewPack () interface.
The FRAMEWORK_EFI_HII_HANDLE will be returned.
@param This The EFI_HII_PROTOCOL context data. Only used
to call HiiRemovePack.
@param Private The HII THUNK driver context data.
@param Packages Package List.
@param Handle On output, a FRAMEWORK_EFI_HII_HANDLE number is
returned.
@retval EFI_SUCCESS The Package List is registered successfully in
the database.
@retval EFI_UNSUPPORTED The number of IFR package in the package list
is greater than 1.
@retval EFI_OUT_OF_RESOURCE Not enough resouce.
**/
EFI_STATUS
UefiRegisterPackageList (
IN EFI_HII_PROTOCOL *This,
IN HII_THUNK_PRIVATE_DATA *Private,
IN EFI_HII_PACKAGES *Packages,
OUT FRAMEWORK_EFI_HII_HANDLE *Handle
)
{
EFI_STATUS Status;
UINTN StringPackageCount;
UINTN IfrPackageCount;
UINTN FontPackageCount;
EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;
HII_THUNK_CONTEXT *ThunkContext;
HII_THUNK_CONTEXT *ThunkContextToRemove;
EFI_GUID GuidId;
EFI_HII_PACKAGE_HEADER *IfrPackage;
PackageListHeader = NULL;
Status = GetPackageCount (Packages, &IfrPackageCount, &StringPackageCount, &FontPackageCount);
ASSERT_EFI_ERROR (Status);
if (IfrPackageCount > 1) {
//
// HII Thunk only handle package with 0 or 1 IFR package.
//
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);
if (ThunkContext == NULL) {
return EFI_OUT_OF_RESOURCES;
}
ThunkContext->ByFrameworkHiiNewPack = TRUE;
if (Packages->GuidId == NULL) {
//
// UEFI HII Database require Package List GUID must be unique.
//
// If Packages->GuidId is NULL, the caller of FramworkHii->NewPack is registering
// packages with at least 1 StringPack and 1 IfrPack. Therefore, Packages->GuidId is
// not used as the name of the package list. Formset GUID is used as the Package List
// GUID instead.
//
ASSERT ((StringPackageCount >=1 && IfrPackageCount == 1) || (FontPackageCount > 0));
if (IfrPackageCount > 0) {
IfrPackage = GetIfrPackage (Packages);
if (IfrPackage == NULL) {
Status = EFI_NOT_FOUND;
goto Done;
}
GetFormSetGuid (IfrPackage, &ThunkContext->TagGuid);
} else {
ASSERT (FontPackageCount > 0);
GenerateRandomGuid (&ThunkContext->TagGuid);
}
} else {
ThunkContextToRemove = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);
if (IfrPackageCount > 0 &&
StringPackageCount > 0 &&
(ThunkContextToRemove != NULL)) {
DEBUG((EFI_D_WARN, "Framework code registers HII package list with the same GUID more than once.\n"));
DEBUG((EFI_D_WARN, "Remove the previously registered package list and register the new one.\n"));
HiiRemovePack (This, ThunkContextToRemove->FwHiiHandle);
}
CopyGuid (&ThunkContext->TagGuid, Packages->GuidId);
}
//
// UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so
// that Setup Utility can load the Buffer Storage using this protocol. An UEFI VFR can only
// produce IFR package generated with Buffer Storage type and EFI Variable Storage.
// The default EFI_HII_CONFIG_ACCESS_PROTOCOL is used to Get/Set the Buffer Storage.
//
if (IfrPackageCount != 0) {
InstallDefaultConfigAccessProtocol (Packages, ThunkContext);
}
PackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &ThunkContext->TagGuid);
Status = mHiiDatabase->NewPackageList (
mHiiDatabase,
PackageListHeader,
ThunkContext->UefiHiiDriverHandle,
&ThunkContext->UefiHiiHandle
);
if (Status == EFI_INVALID_PARAMETER) {
FreePool (PackageListHeader);
//
// UEFI HII database does not allow two package list with the same GUID.
// In Framework HII implementation, Packages->GuidId is used as an identifier to associate
// a PackageList with only IFR to a Package list the with String package.
//
GenerateRandomGuid (&GuidId);
PackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &GuidId);
Status = mHiiDatabase->NewPackageList (
mHiiDatabase,
PackageListHeader,
ThunkContext->UefiHiiDriverHandle,
&ThunkContext->UefiHiiHandle
);
}
//
// BUGBUG: Remove when development is done
//
ASSERT_EFI_ERROR (Status);
if (EFI_ERROR (Status)) {
goto Done;
}
if (IfrPackageCount == 0) {
if (StringPackageCount != 0) {
//
// Look for a Package List with only IFR Package with the same TAG GUID name.
// If found one, add the String Packages to the found Package List.
// This is needed because Framework HII Module may not register the String Package
// and IFR Package in one NewPack () call.
//
UpdatePackListWithOnlyIfrPack (
Private,
ThunkContext,
PackageListHeader
);
}
} else {
if (StringPackageCount == 0) {
//
// Look for the String Package with the same TAG GUID name and add
// the found String Package to this Package List.
// This is needed because Framework HII Module may not register the String Package
// and IFR Package in one NewPack () call.
//
Status = FindStringPackAndUpdatePackListWithOnlyIfrPack (
Private,
ThunkContext
);
if (EFI_ERROR (Status)) {
goto Done;
}
}
//
// Parse the Formset. Must be called after FindStringPackAndUpdatePackListWithOnlyIfrPack is called so
// that String Package is ready.
//
ThunkContext->FormSet = ParseFormSet (ThunkContext->UefiHiiHandle);
ASSERT (ThunkContext->FormSet != NULL);
}
Done:
if (EFI_ERROR (Status)) {
DestroyThunkContext (ThunkContext);
} else {
InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);
*Handle = ThunkContext->FwHiiHandle;
}
if (PackageListHeader != NULL) {
FreePool (PackageListHeader);
}
return Status;
}
/**
Registers the various packages that are passed in a Package List.
@param This Pointer of Frameowk HII protocol instance.
@param Packages Pointer of HII packages.
@param Handle Handle value to be returned.
@retval EFI_SUCCESS Packages has added to HII database successfully.
@retval EFI_INVALID_PARAMETER If Handle or Packages is NULL.
**/
EFI_STATUS
EFIAPI
HiiNewPack (
IN EFI_HII_PROTOCOL *This,
IN EFI_HII_PACKAGES *Packages,
OUT FRAMEWORK_EFI_HII_HANDLE *Handle
)
{
EFI_STATUS Status;
HII_THUNK_PRIVATE_DATA *Private;
EFI_TPL OldTpl;
if (Handle == NULL) {
return EFI_INVALID_PARAMETER;
}
if (Packages == NULL) {
return EFI_INVALID_PARAMETER;
}
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
//
// We use a simple Global variable to inform NewOrAddPackNotify()
// that the package list registered here is already registered
// in the HII Thunk Layer. So NewOrAddPackNotify () does not need to
// call registered the Package List again.
//
mInFrameworkHiiNewPack = TRUE;
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
Status = UefiRegisterPackageList (
This,
Private,
Packages,
Handle
);
mInFrameworkHiiNewPack = FALSE;
gBS->RestoreTPL (OldTpl);
return Status;
}
/**
Remove a package from the HII database.
@param This Pointer of Frameowk HII protocol instance.
@param Handle Handle value to be removed.
@retval EFI_SUCCESS Packages has added to HII database successfully.
@retval EFI_INVALID_PARAMETER If Handle or Packages is NULL.
**/
EFI_STATUS
EFIAPI
HiiRemovePack (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle
)
{
EFI_STATUS Status;
HII_THUNK_PRIVATE_DATA *Private;
HII_THUNK_CONTEXT *ThunkContext;
EFI_TPL OldTpl;
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
mInFrameworkHiiRemovePack = TRUE;
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
ThunkContext = FwHiiHandleToThunkContext (Private, Handle);
if (ThunkContext != NULL) {
Status = mHiiDatabase->RemovePackageList (
mHiiDatabase,
ThunkContext->UefiHiiHandle
);
ASSERT_EFI_ERROR (Status);
if (ThunkContext->IfrPackageCount != 0) {
UninstallDefaultConfigAccessProtocol (ThunkContext);
}
DestroyThunkContext (ThunkContext);
}else {
Status = EFI_NOT_FOUND;
}
mInFrameworkHiiRemovePack = FALSE;
gBS->RestoreTPL (OldTpl);
return Status;
}
/**
This notification function will be called when a Package List is registered
using UEFI HII interface. The Package List registered need to be recorded in
Framework Thunk module as Thunk Module may need to look for String Package in
the package registered.
If the Package List registered is not either Sting Package or IFR package,
then ASSERT. If the NotifyType is not ADD_PACK or NEW_PACK, then ASSERT.
Both cases means UEFI HII Database itself is buggy.
@param PackageType The Package Type.
@param PackageGuid The Package GUID.
@param Package The Package Header.
@param Handle The HII Handle of this Package List.
@param NotifyType The reason of the notification.
@retval EFI_SUCCESS The notification function is successful.
**/
EFI_STATUS
EFIAPI
NewOrAddPackNotify (
IN UINT8 PackageType,
IN CONST EFI_GUID *PackageGuid,
IN CONST EFI_HII_PACKAGE_HEADER *Package,
IN EFI_HII_HANDLE Handle,
IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
)
{
EFI_STATUS Status;
HII_THUNK_PRIVATE_DATA *Private;
HII_THUNK_CONTEXT *ThunkContext;
ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS || PackageType == EFI_HII_PACKAGE_FORMS);
ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK || NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);
Status = EFI_SUCCESS;
Private = mHiiThunkPrivateData;
if (mInFrameworkHiiNewPack || mInFrameworkUpdatePakcage) {
return EFI_SUCCESS;
}
//
// We will create a ThunkContext to log the package list only if the
// package is not registered with by Framework HII Thunk module yet.
//
ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);
if (ThunkContext == NULL) {
ThunkContext = CreateThunkContextForUefiHiiHandle (Handle);
ASSERT (ThunkContext != NULL);
InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);
}
if (PackageType == EFI_HII_PACKAGE_FORMS) {
if (ThunkContext->FormSet != NULL) {
DestroyFormSet (ThunkContext->FormSet);
}
//
// Reparse the FormSet.
//
ThunkContext->FormSet = ParseFormSet (ThunkContext->UefiHiiHandle);
}
return Status;
}
/**
This notification function will be called when a Package List is removed
using UEFI HII interface. The Package List removed need to be removed from
Framework Thunk module too.
If the Package List registered is not Sting Package,
then ASSERT. If the NotifyType is not REMOVE_PACK, then ASSERT.
Both cases means UEFI HII Database itself is buggy.
@param PackageType The Package Type.
@param PackageGuid The Package GUID.
@param Package The Package Header.
@param Handle The HII Handle of this Package List.
@param NotifyType The reason of the notification.
@retval EFI_SUCCESS The notification function is successful.
**/
EFI_STATUS
EFIAPI
RemovePackNotify (
IN UINT8 PackageType,
IN CONST EFI_GUID *PackageGuid,
IN CONST EFI_HII_PACKAGE_HEADER *Package,
IN EFI_HII_HANDLE Handle,
IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
)
{
EFI_STATUS Status;
HII_THUNK_PRIVATE_DATA *Private;
HII_THUNK_CONTEXT *ThunkContext;
EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
UINTN BufferSize;
Status = EFI_SUCCESS;
ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);
ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);
if (mInFrameworkHiiRemovePack || mInFrameworkUpdatePakcage) {
return EFI_SUCCESS;
}
Private = mHiiThunkPrivateData;
ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);
//
// BugBug: Change to ASSERT if HII Database fix the bug and to also invoke
// NEW_PACK_NOTIFY for package (String Package) created internally.
//
if (ThunkContext != NULL) {
if (!ThunkContext->ByFrameworkHiiNewPack) {
HiiPackageList = NULL;
Status = ExportPackageLists (Handle, &HiiPackageList, &BufferSize);
ASSERT_EFI_ERROR (Status);
if (HiiPackageList == NULL) {
return EFI_NOT_FOUND;
}
if (GetPackageCountByType (HiiPackageList, EFI_HII_PACKAGE_STRINGS) == 1) {
//
// If the string package will be removed is the last string package
// in the package list, we will remove the HII Thunk entry from the
// database.
//
DestroyThunkContextForUefiHiiHandle (Private, Handle);
}
FreePool (HiiPackageList);
}
}
return Status;
}

View File

@@ -1,709 +0,0 @@
/** @file
Framework to UEFI 2.1 Setup Browser Thunk. The file consume EFI_FORM_BROWSER2_PROTOCOL
to produce a EFI_FORM_BROWSER_PROTOCOL.
Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
#include "SetupBrowser.h"
EFI_HII_HANDLE gStringPackHandle = NULL;
BOOLEAN mFrontPageDisplayed = FALSE;
//
// 106F3545-B788-4cb5-9D2A-CE0CDB208DF5
//
EFI_GUID gEfiHiiThunkProducerGuid = { 0x106f3545, 0xb788, 0x4cb5, { 0x9d, 0x2a, 0xce, 0xc, 0xdb, 0x20, 0x8d, 0xf5 } };
/**
Get string by string id from HII Interface
@param Id String ID.
@retval CHAR16 * String from ID.
@retval NULL If error occurs.
**/
CHAR16 *
GetStringById (
IN EFI_STRING_ID Id
)
{
return HiiGetString (gStringPackHandle, Id, NULL);
}
/**
Show progress bar with title above it. It only works in Graphics mode.
@param TitleForeground Foreground color for Title.
@param TitleBackground Background color for Title.
@param Title Title above progress bar.
@param ProgressColor Progress bar color.
@param Progress Progress (0-100)
@param PreviousValue The previous value of the progress.
@retval EFI_STATUS Success update the progress bar
**/
EFI_STATUS
PlatformBdsShowProgress (
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,
IN CHAR16 *Title,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,
IN UINTN Progress,
IN UINTN PreviousValue
)
{
EFI_STATUS Status;
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
EFI_UGA_DRAW_PROTOCOL *UgaDraw;
UINT32 SizeOfX;
UINT32 SizeOfY;
UINT32 ColorDepth;
UINT32 RefreshRate;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;
UINTN BlockHeight;
UINTN BlockWidth;
UINTN BlockNum;
UINTN PosX;
UINTN PosY;
UINTN Index;
if (Progress > 100) {
return EFI_INVALID_PARAMETER;
}
UgaDraw = NULL;
Status = gBS->HandleProtocol (
gST->ConsoleOutHandle,
&gEfiGraphicsOutputProtocolGuid,
(VOID **) &GraphicsOutput
);
if (EFI_ERROR (Status)) {
GraphicsOutput = NULL;
Status = gBS->HandleProtocol (
gST->ConsoleOutHandle,
&gEfiUgaDrawProtocolGuid,
(VOID **) &UgaDraw
);
}
if (EFI_ERROR (Status) || (GraphicsOutput == NULL && UgaDraw == NULL)) {
return EFI_UNSUPPORTED;
}
SizeOfX = 0;
SizeOfY = 0;
if (GraphicsOutput != NULL) {
SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;
SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;
} else {
Status = UgaDraw->GetMode (
UgaDraw,
&SizeOfX,
&SizeOfY,
&ColorDepth,
&RefreshRate
);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
}
BlockWidth = SizeOfX / 100;
BlockHeight = SizeOfY / 50;
BlockNum = Progress;
PosX = 0;
PosY = SizeOfY * 48 / 50;
if (BlockNum == 0) {
//
// Clear progress area
//
SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);
if (GraphicsOutput != NULL) {
Status = GraphicsOutput->Blt (
GraphicsOutput,
&Color,
EfiBltVideoFill,
0,
0,
0,
PosY - EFI_GLYPH_HEIGHT - 1,
SizeOfX,
SizeOfY - (PosY - EFI_GLYPH_HEIGHT - 1),
SizeOfX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
);
} else {
Status = UgaDraw->Blt (
UgaDraw,
(EFI_UGA_PIXEL *) &Color,
EfiUgaVideoFill,
0,
0,
0,
PosY - EFI_GLYPH_HEIGHT - 1,
SizeOfX,
SizeOfY - (PosY - EFI_GLYPH_HEIGHT - 1),
SizeOfX * sizeof (EFI_UGA_PIXEL)
);
}
}
//
// Show progress by drawing blocks
//
for (Index = PreviousValue; Index < BlockNum; Index++) {
PosX = Index * BlockWidth;
if (GraphicsOutput != NULL) {
Status = GraphicsOutput->Blt (
GraphicsOutput,
&ProgressColor,
EfiBltVideoFill,
0,
0,
PosX,
PosY,
BlockWidth - 1,
BlockHeight,
(BlockWidth) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
);
} else {
Status = UgaDraw->Blt (
UgaDraw,
(EFI_UGA_PIXEL *) &ProgressColor,
EfiUgaVideoFill,
0,
0,
PosX,
PosY,
BlockWidth - 1,
BlockHeight,
(BlockWidth) * sizeof (EFI_UGA_PIXEL)
);
}
}
PrintXY (
(SizeOfX - StrLen (Title) * EFI_GLYPH_WIDTH) / 2,
PosY - EFI_GLYPH_HEIGHT - 1,
&TitleForeground,
&TitleBackground,
Title
);
return EFI_SUCCESS;
}
/**
Function waits for a given event to fire, or for an optional timeout to expire.
@param Event The event to wait for
@param Timeout An optional timeout value in 100 ns units.
@retval EFI_SUCCESS Event fired before Timeout expired.
@retval EFI_TIME_OUT Timout expired before Event fired..
**/
EFI_STATUS
WaitForSingleEvent (
IN EFI_EVENT Event,
IN UINT64 Timeout OPTIONAL
)
{
EFI_STATUS Status;
UINTN Index;
EFI_EVENT TimerEvent;
EFI_EVENT WaitList[2];
if (Timeout != 0) {
//
// Create a timer event
//
Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);
if (!EFI_ERROR (Status)) {
//
// Set the timer event
//
gBS->SetTimer (
TimerEvent,
TimerRelative,
Timeout
);
//
// Wait for the original event or the timer
//
WaitList[0] = Event;
WaitList[1] = TimerEvent;
Status = gBS->WaitForEvent (2, WaitList, &Index);
gBS->CloseEvent (TimerEvent);
//
// If the timer expired, change the return to timed out
//
if (!EFI_ERROR (Status) && Index == 1) {
Status = EFI_TIMEOUT;
}
}
} else {
//
// No timeout... just wait on the event
//
Status = gBS->WaitForEvent (1, &Event, &Index);
ASSERT (!EFI_ERROR (Status));
ASSERT (Index == 0);
}
return Status;
}
/**
Function show progress bar to wait for user input.
@param TimeoutDefault - The fault time out value before the system
continue to boot.
@retval EFI_SUCCESS User pressed some key except "Enter"
@retval EFI_TIME_OUT Timout expired or user press "Enter"
**/
EFI_STATUS
ShowProgress (
IN UINT16 TimeoutDefault
)
{
EFI_STATUS Status;
CHAR16 *TmpStr;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;
EFI_INPUT_KEY Key;
UINT16 TimeoutRemain;
if (TimeoutDefault == 0) {
return EFI_TIMEOUT;
}
DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it! ...Zzz....\n"));
SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);
SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);
SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);
//
// Clear the progress status bar first
//
TmpStr = GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION));
if (TmpStr != NULL) {
PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);
}
TimeoutRemain = TimeoutDefault;
while (TimeoutRemain != 0) {
DEBUG ((EFI_D_INFO, "Showing progress bar...Remaining %d second!\n", TimeoutRemain));
Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND);
if (Status != EFI_TIMEOUT) {
break;
}
TimeoutRemain--;
//
// Show progress
//
if (TmpStr != NULL) {
PlatformBdsShowProgress (
Foreground,
Background,
TmpStr,
Color,
((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),
0
);
}
}
gBS->FreePool (TmpStr);
//
// Timeout expired
//
if (TimeoutRemain == 0) {
return EFI_TIMEOUT;
}
//
// User pressed some key
//
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
if (EFI_ERROR (Status)) {
return Status;
}
if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
//
// User pressed enter, equivalent to select "continue"
//
return EFI_TIMEOUT;
}
return EFI_SUCCESS;
}
/**
Return the default value for system Timeout variable.
@return Timeout value.
**/
UINT16
EFIAPI
GetTimeout (
VOID
)
{
return PcdGet16 (PcdPlatformBootTimeOut);
}
/**
This is the Framework Setup Browser interface which displays a FormSet.
@param This The EFI_FORM_BROWSER_PROTOCOL context.
@param UseDatabase TRUE if the FormSet is from HII database. The Thunk implementation
only support UseDatabase is TRUE.
@param Handle The Handle buffer.
@param HandleCount The number of Handle in the Handle Buffer. It must be 1 for this implementation.
@param Packet The pointer to data buffer containing IFR and String package. Not supported.
@param CallbackHandle Not supported.
@param NvMapOverride The buffer is used only when there is no NV variable to define the
current settings and the caller needs to provide to the browser the
current settings for the the "fake" NV variable. If used, no saving of
an NV variable is possbile. This parameter is also ignored if Handle is NULL.
@param ScreenDimensions
Allows the browser to be called so that it occupies a portion of the physical
screen instead of dynamically determining the screen dimensions.
@param ResetRequired This BOOLEAN value denotes whether a reset is required based on the data that
might have been changed. The ResetRequired parameter is primarily applicable
for configuration applications, and is an optional parameter.
@retval EFI_SUCCESS If the Formset is displayed correctly.
@retval EFI_UNSUPPORTED If UseDatabase is FALSE or HandleCount is not 1.
@retval EFI_INVALID_PARAMETER If the *Handle passed in is not found in the database.
**/
EFI_STATUS
EFIAPI
ThunkSendForm (
IN EFI_FORM_BROWSER_PROTOCOL *This,
IN BOOLEAN UseDatabase,
IN FRAMEWORK_EFI_HII_HANDLE *Handle,
IN UINTN HandleCount,
IN EFI_IFR_PACKET *Packet, OPTIONAL
IN EFI_HANDLE CallbackHandle, OPTIONAL
IN UINT8 *NvMapOverride, OPTIONAL
IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR *ScreenDimensions, OPTIONAL
OUT BOOLEAN *ResetRequired OPTIONAL
)
{
EFI_STATUS Status;
EFI_BROWSER_ACTION_REQUEST ActionRequest;
HII_THUNK_CONTEXT *ThunkContext;
HII_THUNK_PRIVATE_DATA *Private;
EFI_FORMBROWSER_THUNK_PRIVATE_DATA *BrowserPrivate;
if (!UseDatabase) {
//
// ThunkSendForm only support displays forms registered into the HII database.
//
return EFI_UNSUPPORTED;
}
if (HandleCount != 1 ) {
return EFI_UNSUPPORTED;
}
BrowserPrivate = EFI_FORMBROWSER_THUNK_PRIVATE_DATA_FROM_THIS (This);
Private = BrowserPrivate->ThunkPrivate;
ThunkContext = FwHiiHandleToThunkContext (Private, *Handle);
if (ThunkContext == NULL) {
return EFI_INVALID_PARAMETER;
}
//
// Following UEFI spec to do auto booting after a time-out. This feature is implemented
// in Framework Setup Browser and moved to MdeModulePkg/Universal/BdsDxe. The auto booting is
// moved here in HII Thunk module.
//
if (CompareGuid (&gFrameworkBdsFrontPageFormsetGuid, &ThunkContext->FormSet->Guid) && !mFrontPageDisplayed) {
//
// Send form is called before entering the
//
mFrontPageDisplayed = TRUE;
Status = ShowProgress (GetTimeout ());
if (EFI_ERROR (Status)) {
return Status;
}
}
if (NvMapOverride != NULL) {
ThunkContext->NvMapOverride = NvMapOverride;
}
Status = mFormBrowser2Protocol->SendForm (
mFormBrowser2Protocol,
&ThunkContext->UefiHiiHandle,
1,
NULL,
0,
(EFI_SCREEN_DESCRIPTOR *) ScreenDimensions,
&ActionRequest
);
if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {
*ResetRequired = TRUE;
}
return Status;
}
/**
Rountine used to display a generic dialog interface and return
the Key or Input from user input.
@param LinesNumber The number of lines for the dialog box.
@param HotKey Defines if a single character is parsed (TRUE) and returned in KeyValue
or if a string is returned in StringBuffer.
@param MaximumStringSize The maximum size in bytes of a typed-in string.
@param StringBuffer On return contains the typed-in string if HotKey is FALSE.
@param Key The EFI_INPUT_KEY value returned if HotKey is TRUE.
@param FirstString The pointer to the first string in the list of strings
that comprise the dialog box.
@param ... A series of NumberOfLines text strings that will be used
to construct the dialog box.
@retval EFI_SUCCESS The dialog is created successfully and user interaction was received.
@retval EFI_DEVICE_ERROR The user typed in an ESC.
@retval EFI_INVALID_PARAMETER One of the parameters was invalid.(StringBuffer == NULL && HotKey == FALSE).
**/
EFI_STATUS
EFIAPI
ThunkCreatePopUp (
IN UINTN LinesNumber,
IN BOOLEAN HotKey,
IN UINTN MaximumStringSize,
OUT CHAR16 *StringBuffer,
OUT EFI_INPUT_KEY *Key,
IN CHAR16 *FirstString,
...
)
{
VA_LIST Args;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
EFI_SIMPLE_TEXT_OUTPUT_MODE SavedConsoleMode;
UINTN Columns;
UINTN Rows;
UINTN Column;
UINTN Row;
UINTN NumberOfLines;
UINTN MaxLength;
CHAR16 *String;
UINTN Length;
CHAR16 *Line;
UINTN EventIndex;
if (!HotKey) {
return EFI_UNSUPPORTED;
}
if (MaximumStringSize == 0) {
//
// Blank strint to output
//
return EFI_INVALID_PARAMETER;
}
//
// Determine the length of the longest line in the popup and the the total
// number of lines in the popup
//
MaxLength = StrLen (FirstString);
NumberOfLines = 1;
VA_START (Args, FirstString);
while ((String = VA_ARG (Args, CHAR16 *)) != NULL) {
MaxLength = MAX (MaxLength, StrLen (String));
NumberOfLines++;
}
VA_END (Args);
//
// If the total number of lines in the popup is not same to the input NumberOfLines
// the parameter is not valid. Not check.
//
// if (NumberOfLines != LinesNumber) {
// return EFI_INVALID_PARAMETER;
// }
//
// If the maximum length of all the strings is not same to the input MaximumStringSize
// the parameter is not valid. Not check.
//
// if (MaxLength != MaximumStringSize) {
// return EFI_INVALID_PARAMETER;
// }
//
// Cache a pointer to the Simple Text Output Protocol in the EFI System Table
//
ConOut = gST->ConOut;
//
// Save the current console cursor position and attributes
//
CopyMem (&SavedConsoleMode, ConOut->Mode, sizeof (SavedConsoleMode));
//
// Retrieve the number of columns and rows in the current console mode
//
ConOut->QueryMode (ConOut, SavedConsoleMode.Mode, &Columns, &Rows);
//
// Disable cursor and set the foreground and background colors specified by Attribute
//
ConOut->EnableCursor (ConOut, FALSE);
ConOut->SetAttribute (ConOut, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE);
//
// Limit NumberOfLines to height of the screen minus 3 rows for the box itself
//
NumberOfLines = MIN (NumberOfLines, Rows - 3);
//
// Limit MaxLength to width of the screen minus 2 columns for the box itself
//
MaxLength = MIN (MaxLength, Columns - 2);
//
// Compute the starting row and starting column for the popup
//
Row = (Rows - (NumberOfLines + 3)) / 2;
Column = (Columns - (MaxLength + 2)) / 2;
//
// Allocate a buffer for a single line of the popup with borders and a Null-terminator
//
Line = AllocateZeroPool ((MaxLength + 3) * sizeof (CHAR16));
ASSERT (Line != NULL);
//
// Draw top of popup box
//
SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);
Line[0] = BOXDRAW_DOWN_RIGHT;
Line[MaxLength + 1] = BOXDRAW_DOWN_LEFT;
Line[MaxLength + 2] = L'\0';
ConOut->SetCursorPosition (ConOut, Column, Row++);
ConOut->OutputString (ConOut, Line);
//
// Draw middle of the popup with strings
//
VA_START (Args, FirstString);
String = FirstString;
while ((String != NULL) && (NumberOfLines > 0)) {
Length = StrLen (String);
SetMem16 (Line, (MaxLength + 2) * 2, L' ');
if (Length <= MaxLength) {
//
// Length <= MaxLength
//
CopyMem (Line + 1 + (MaxLength - Length) / 2, String , Length * sizeof (CHAR16));
} else {
//
// Length > MaxLength
//
CopyMem (Line + 1, String + (Length - MaxLength) / 2 , MaxLength * sizeof (CHAR16));
}
Line[0] = BOXDRAW_VERTICAL;
Line[MaxLength + 1] = BOXDRAW_VERTICAL;
Line[MaxLength + 2] = L'\0';
ConOut->SetCursorPosition (ConOut, Column, Row++);
ConOut->OutputString (ConOut, Line);
String = VA_ARG (Args, CHAR16 *);
NumberOfLines--;
}
VA_END (Args);
//
// Draw bottom of popup box
//
SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);
Line[0] = BOXDRAW_UP_RIGHT;
Line[MaxLength + 1] = BOXDRAW_UP_LEFT;
Line[MaxLength + 2] = L'\0';
ConOut->SetCursorPosition (ConOut, Column, Row++);
ConOut->OutputString (ConOut, Line);
//
// Free the allocated line buffer
//
FreePool (Line);
//
// Restore the cursor visibility, position, and attributes
//
ConOut->EnableCursor (ConOut, SavedConsoleMode.CursorVisible);
ConOut->SetCursorPosition (ConOut, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow);
ConOut->SetAttribute (ConOut, SavedConsoleMode.Attribute);
//
// Wait for a keystroke
//
if (Key != NULL) {
gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
gST->ConIn->ReadKeyStroke (gST->ConIn, Key);
}
return EFI_SUCCESS;
}
/**
Initialize string packages in HII database.
**/
VOID
InitSetBrowserStrings (
VOID
)
{
//
// Initialize strings to HII database
//
gStringPackHandle = HiiAddPackages (
&gEfiHiiThunkProducerGuid,
NULL,
STRING_ARRAY_NAME,
NULL
);
ASSERT (gStringPackHandle != NULL);
}

View File

@@ -1,20 +0,0 @@
/** @file
This file contains macros to be included by SetupBrowser.c.
Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _HIITHUNK_SETUPBROWSER_H_
#define _HIITHUNK_SETUPBROWSER_H_
#define ONE_SECOND 10000000
#endif

View File

@@ -1,438 +0,0 @@
/** @file
This file implements the protocol functions related to string package.
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
/**
Test if all of the characters in a string have corresponding font characters.
This is a deprecated API. No Framework HII module is calling it. This function will ASSERT and
return EFI_UNSUPPORTED.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param StringToTest A pointer to a Unicode string.
@param FirstMissing A pointer to an index into the string. On input, the index of
the first character in the StringToTest to examine. On exit, the index
of the first character encountered for which a glyph is unavailable.
If all glyphs in the string are available, the index is the index of the terminator
of the string.
@param GlyphBufferSize A pointer to a value. On output, if the function returns EFI_SUCCESS,
it contains the amount of memory that is required to store the string? glyph equivalent.
@retval EFI_UNSUPPORTED The function performs nothing and return EFI_UNSUPPORTED.
**/
EFI_STATUS
EFIAPI
HiiTestString (
IN EFI_HII_PROTOCOL *This,
IN CHAR16 *StringToTest,
IN OUT UINT32 *FirstMissing,
OUT UINT32 *GlyphBufferSize
)
{
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
/**
Find the corressponding TAG GUID from a Framework HII Handle given.
@param Private The HII Thunk Module Private context.
@param FwHiiHandle The Framemwork HII Handle.
@param TagGuid The output of TAG GUID found.
@return NULL If Framework HII Handle is invalid.
@return The corresponding HII Thunk Context.
**/
EFI_STATUS
GetTagGuidByFwHiiHandle (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle,
OUT EFI_GUID *TagGuid
)
{
LIST_ENTRY *Link;
HII_THUNK_CONTEXT *ThunkContext;
ASSERT (TagGuid != NULL);
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
if (FwHiiHandle == ThunkContext->FwHiiHandle) {
CopyGuid (TagGuid, &ThunkContext->TagGuid);
return EFI_SUCCESS;
}
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
return EFI_NOT_FOUND;
}
/**
Create or update the String given a new string and String ID.
@param ThunkContext The Thunk Context.
@param Rfc4646AsciiLanguage The RFC 4646 Language code in ASCII string format.
@param NewString The new string.
@param StringId The String ID. If StringId is 0, a new String Token
is created. Otherwise, the String Token StringId is
updated.
@retval EFI_SUCCESS The new string is created or updated successfully.
The new String Token ID is returned in StringId if
*StringId is 0 on input.
@return Others The update of string failed.
**/
EFI_STATUS
UpdateString (
IN CONST HII_THUNK_CONTEXT *ThunkContext,
IN CONST CHAR8 *Rfc4646AsciiLanguage,
IN CHAR16 *NewString,
IN OUT STRING_REF *StringId
)
{
EFI_STRING_ID NewStringId;
NewStringId = HiiSetString (ThunkContext->UefiHiiHandle, *StringId, NewString, Rfc4646AsciiLanguage);
*StringId = NewStringId;
if (NewStringId == 0) {
//
// Only EFI_INVALID_PARAMETER is defined in HII 0.92 specification.
//
return EFI_INVALID_PARAMETER;
} else {
return EFI_SUCCESS;
}
}
/**
Create or update a String Token in a String Package.
If *Reference == 0, a new String Token is created.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Language Pointer to a NULL-terminated string containing a single ISO 639-2 language
identifier, indicating the language to print. A string consisting of
all spaces indicates that the string is applicable to all languages.
@param Handle The handle of the language pack to which the string is to be added.
@param Reference The string token assigned to the string.
@param NewString The string to be added.
@retval EFI_SUCCESS The string was effectively registered.
@retval EFI_INVALID_PARAMETER The Handle was unknown. The string is not created or updated in the
the string package.
**/
EFI_STATUS
EFIAPI
HiiNewString (
IN EFI_HII_PROTOCOL *This,
IN CHAR16 *Language,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN OUT STRING_REF *Reference,
IN CHAR16 *NewString
)
{
EFI_STATUS Status;
HII_THUNK_PRIVATE_DATA *Private;
EFI_GUID TagGuid;
LIST_ENTRY *Link;
HII_THUNK_CONTEXT *ThunkContext;
HII_THUNK_CONTEXT *StringPackThunkContext;
EFI_STRING_ID StringId;
EFI_STRING_ID LastStringId;
CHAR8 AsciiLanguage[ISO_639_2_ENTRY_SIZE + 1];
CHAR16 LanguageCopy[ISO_639_2_ENTRY_SIZE + 1];
CHAR8 *Rfc4646AsciiLanguage;
LastStringId = (EFI_STRING_ID) 0;
StringId = (EFI_STRING_ID) 0;
Rfc4646AsciiLanguage = NULL;
if (Language != NULL) {
ZeroMem (AsciiLanguage, sizeof (AsciiLanguage));;
ZeroMem (LanguageCopy, sizeof (LanguageCopy));
CopyMem (LanguageCopy, Language, ISO_639_2_ENTRY_SIZE * sizeof (CHAR16));
UnicodeStrToAsciiStr (LanguageCopy, AsciiLanguage);
Rfc4646AsciiLanguage = ConvertLanguagesIso639ToRfc4646 (AsciiLanguage);
ASSERT (Rfc4646AsciiLanguage != NULL);
}
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
StringPackThunkContext = FwHiiHandleToThunkContext (Private, Handle);
if (StringPackThunkContext == NULL) {
return EFI_INVALID_PARAMETER;
}
if (StringPackThunkContext->SharingStringPack) {
Status = GetTagGuidByFwHiiHandle (Private, Handle, &TagGuid);
ASSERT_EFI_ERROR (Status);
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
if (CompareGuid (&TagGuid, &ThunkContext->TagGuid)) {
if (ThunkContext->SharingStringPack) {
StringId = *Reference;
Status = UpdateString (ThunkContext, Rfc4646AsciiLanguage, NewString, &StringId);
if (EFI_ERROR (Status)) {
break;
}
DEBUG_CODE_BEGIN ();
if (*Reference == 0) {
//
// When creating new string token, make sure all created token is the same
// for all string packages registered using FW HII interface.
//
if (LastStringId == (EFI_STRING_ID) 0) {
LastStringId = StringId;
} else {
if (LastStringId != StringId) {
ASSERT(FALSE);
}
}
}
DEBUG_CODE_END ();
}
}
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
} else {
StringId = *Reference;
Status = UpdateString (StringPackThunkContext, Rfc4646AsciiLanguage, NewString, &StringId);
}
if (!EFI_ERROR (Status)) {
if (*Reference == 0) {
*Reference = StringId;
}
} else {
//
// Only EFI_INVALID_PARAMETER is defined in HII 0.92 specification.
//
Status = EFI_INVALID_PARAMETER;
}
return Status;
}
/**
This function removes any new strings that were added after the initial string export for this handle.
UEFI HII String Protocol does not have Reset String function. This function perform nothing.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The HII handle on which the string resides.
@retval EFI_SUCCESS This function is a NOP and always return EFI_SUCCESS.
**/
EFI_STATUS
EFIAPI
HiiResetStrings (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle
)
{
return EFI_SUCCESS;
}
/**
This function extracts a string from a package already registered with the EFI HII database.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The HII handle on which the string resides.
@param Token The string token assigned to the string.
@param Raw If TRUE, the string is returned unedited in the internal storage format described
above. If false, the string returned is edited by replacing <cr> with <space>
and by removing special characters such as the <wide> prefix.
@param LanguageString Pointer to a NULL-terminated string containing a single ISO 639-2 language
identifier, indicating the language to print. If the LanguageString is empty (starts
with a NULL), the default system language will be used to determine the language.
@param BufferLength Length of the StringBuffer. If the status reports that the buffer width is too
small, this parameter is filled with the length of the buffer needed.
@param StringBuffer The buffer designed to receive the characters in the string. Type EFI_STRING is
defined in String.
@retval EFI_INVALID_PARAMETER If input parameter is invalid.
@retval EFI_BUFFER_TOO_SMALL If the *BufferLength is too small.
@retval EFI_SUCCESS Operation is successful.
**/
EFI_STATUS
EFIAPI
HiiThunkGetString (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN STRING_REF Token,
IN BOOLEAN Raw,
IN CHAR16 *LanguageString,
IN OUT UINTN *BufferLength,
OUT EFI_STRING StringBuffer
)
{
HII_THUNK_PRIVATE_DATA *Private;
CHAR8 *Iso639AsciiLanguage;
CHAR8 *Rfc4646AsciiLanguage;
CHAR8 *SupportedLanguages;
CHAR8 *PlatformLanguage;
CHAR8 *BestLanguage;
EFI_HII_HANDLE UefiHiiHandle;
EFI_STATUS Status;
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
Rfc4646AsciiLanguage = NULL;
SupportedLanguages = NULL;
PlatformLanguage = NULL;
Status = EFI_SUCCESS;
if (LanguageString != NULL) {
Iso639AsciiLanguage = AllocateZeroPool (StrLen (LanguageString) + 1);
if (Iso639AsciiLanguage == NULL) {
return EFI_OUT_OF_RESOURCES;
}
UnicodeStrToAsciiStr (LanguageString, Iso639AsciiLanguage);
//
// Caller of Framework HII Interface uses the Language Identification String defined
// in Iso639. So map it to the Language Identifier defined in RFC4646.
//
Rfc4646AsciiLanguage = ConvertLanguagesIso639ToRfc4646 (Iso639AsciiLanguage);
FreePool (Iso639AsciiLanguage);
//
// If Rfc4646AsciiLanguage is NULL, more language mapping must be added to
// Iso639ToRfc4646Map.
//
ASSERT (Rfc4646AsciiLanguage != NULL);
}
UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);
if (UefiHiiHandle == NULL) {
Status = EFI_NOT_FOUND;
goto Done;
}
//
// Get the languages that the package specified by HiiHandle supports
//
SupportedLanguages = HiiGetSupportedLanguages (UefiHiiHandle);
if (SupportedLanguages == NULL) {
goto Done;
}
//
// Get the current platform language setting
//
GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&PlatformLanguage, NULL);
//
// Get the best matching language from SupportedLanguages
//
BestLanguage = GetBestLanguage (
SupportedLanguages,
FALSE, // RFC 4646 mode
(Rfc4646AsciiLanguage != NULL) ? Rfc4646AsciiLanguage : "", // Highest priority
(PlatformLanguage != NULL) ? PlatformLanguage : "", // Next highest priority
SupportedLanguages, // Lowest priority
NULL
);
if (BestLanguage != NULL) {
Status = mHiiStringProtocol->GetString (
mHiiStringProtocol,
BestLanguage,
UefiHiiHandle,
Token,
StringBuffer,
BufferLength,
NULL
);
FreePool (BestLanguage);
} else {
Status = EFI_INVALID_PARAMETER;
}
Done:
if (Rfc4646AsciiLanguage != NULL) {
FreePool (Rfc4646AsciiLanguage);
}
if (SupportedLanguages != NULL) {
FreePool (SupportedLanguages);
}
if (PlatformLanguage != NULL) {
FreePool (PlatformLanguage);
}
return Status;
}
/**
This function allows a program to extract a part of a string of not more than a given width.
With repeated calls, this allows a calling program to extract "lines" of text that fit inside
columns. The effort of measuring the fit of strings inside columns is localized to this call.
This is a deprecated API. No Framework HII module is calling it. This function will ASSERT and
return EFI_UNSUPPORTED.
@param This A pointer to the EFI_HII_PROTOCOL instance.
@param Handle The HII handle on which the string resides.
@param Token The string token assigned to the string.
@param Index On input, the offset into the string where the line is to start.
On output, the index is updated to point to beyond the last character returned
in the call.
@param LineWidth The maximum width of the line in units of narrow glyphs.
@param LanguageString Pointer to a NULL-terminated string containing a single ISO 639-2 language
identifier, indicating the language to print. If the LanguageString is empty (starts
with a NULL), the default system language will be used to determine the language.
@param BufferLength Length of the StringBuffer. If the status reports that the buffer width is too
small, this parameter is filled with the length of the buffer needed.
@param StringBuffer The buffer designed to receive the characters in the string. Type EFI_STRING is
defined in String.
@retval EFI_UNSUPPORTED.
**/
EFI_STATUS
EFIAPI
HiiGetLine (
IN EFI_HII_PROTOCOL *This,
IN FRAMEWORK_EFI_HII_HANDLE Handle,
IN STRING_REF Token,
IN OUT UINT16 *Index,
IN UINT16 LineWidth,
IN CHAR16 *LanguageString,
IN OUT UINT16 *BufferLength,
OUT EFI_STRING StringBuffer
)
{
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}

View File

@@ -1,543 +0,0 @@
/** @file
Function and Macro defintions for to extract default values from UEFI Form package.
Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
#include "UefiIfrParser.h"
#include "UefiIfrDefault.h"
//
// Extern Variables
//
extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;
extern CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;
extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;
extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;
/**
Set the data position at Offset with Width in Node->Buffer based
the value passed in.
@param Node The Buffer Storage Node.
@param Value The input value.
@param Offset The offset in Node->Buffer for the update.
@param Width The length of the Value.
**/
VOID
SetNodeBuffer (
OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node,
IN CONST EFI_HII_VALUE *Value,
IN UINTN Offset,
IN UINTN Width
)
{
ASSERT (Node->Signature == UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE);
ASSERT (Offset + Width <= Node->Size);
CopyMem (Node->Buffer + Offset, &Value->Value.u8, Width);
}
/**
Get question default value, and set it into the match var storage.
Note Framework 0.92's HII Implementation does not support for default value for these opcodes:
EFI_IFR_ORDERED_LIST_OP:
EFI_IFR_PASSWORD_OP:
EFI_IFR_STRING_OP:
@param Question Question to be set to its default value.
@param DefaultId The Class of the default.
@param VarStoreId Id of var storage.
@param Node Var storage buffer to store the got default value.
@retval EFI_SUCCESS Question is reset to default value.
**/
EFI_STATUS
GetQuestionDefault (
IN FORM_BROWSER_STATEMENT *Question,
IN UINT16 DefaultId,
IN UINT16 VarStoreId,
OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node
)
{
EFI_STATUS Status;
LIST_ENTRY *Link;
QUESTION_DEFAULT *Default;
QUESTION_OPTION *Option;
EFI_HII_VALUE *HiiValue;
Status = EFI_SUCCESS;
//
// Statement don't have storage, skip them
//
if (Question->QuestionId == 0) {
return Status;
}
if (Question->VarStoreId != VarStoreId) {
return Status;
}
ASSERT (Question->Storage->Type == EFI_HII_VARSTORE_BUFFER);
//
// There are three ways to specify default value for a Question:
// 1, use nested EFI_IFR_DEFAULT (highest priority)
// 2, set flags of EFI_ONE_OF_OPTION (provide Standard and Manufacturing default)
// 3, set flags of EFI_IFR_CHECKBOX (provide Standard and Manufacturing default) (lowest priority)
//
HiiValue = &Question->HiiValue;
//
// EFI_IFR_DEFAULT has highest priority
//
if (!IsListEmpty (&Question->DefaultListHead)) {
Link = GetFirstNode (&Question->DefaultListHead);
while (!IsNull (&Question->DefaultListHead, Link)) {
Default = QUESTION_DEFAULT_FROM_LINK (Link);
if (Default->DefaultId == DefaultId) {
//
// Default value is embedded in EFI_IFR_DEFAULT
//
CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE));
SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);
return EFI_SUCCESS;
}
Link = GetNextNode (&Question->DefaultListHead, Link);
}
}
//
// EFI_ONE_OF_OPTION
//
if ((Question->Operand == EFI_IFR_ONE_OF_OP) && !IsListEmpty (&Question->OptionListHead)) {
if (DefaultId <= EFI_HII_DEFAULT_CLASS_MANUFACTURING) {
//
// OneOfOption could only provide Standard and Manufacturing default
//
Link = GetFirstNode (&Question->OptionListHead);
while (!IsNull (&Question->OptionListHead, Link)) {
Option = QUESTION_OPTION_FROM_LINK (Link);
if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && ((Option->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT)) ||
((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && ((Option->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG))
) {
CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));
SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);
return EFI_SUCCESS;
}
Link = GetNextNode (&Question->OptionListHead, Link);
}
}
}
//
// EFI_IFR_CHECKBOX - lowest priority
//
if (Question->Operand == EFI_IFR_CHECKBOX_OP) {
if (DefaultId <= EFI_HII_DEFAULT_CLASS_MANUFACTURING) {
//
// Checkbox could only provide Standard and Manufacturing default
//
if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && ((Question->Flags & EFI_IFR_CHECKBOX_DEFAULT) == EFI_IFR_CHECKBOX_DEFAULT)) ||
((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && ((Question->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG) == EFI_IFR_CHECKBOX_DEFAULT_MFG))
) {
HiiValue->Value.b = TRUE;
} else {
HiiValue->Value.b = FALSE;
}
SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);
return EFI_SUCCESS;
}
}
return Status;
}
/**
Extract the default values from all questions in the input Form,
and set default value into the matched var storage.
@param Form The Form which to be reset.
@param DefaultId The Class of the default.
@param VarStoreId Id of var storage.
@param Node Var storage buffer to store the got default value.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
ExtractFormDefault (
IN FORM_BROWSER_FORM *Form,
IN UINT16 DefaultId,
IN UINT16 VarStoreId,
OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node
)
{
EFI_STATUS Status;
LIST_ENTRY *Link;
FORM_BROWSER_STATEMENT *Question;
Link = GetFirstNode (&Form->StatementListHead);
while (!IsNull (&Form->StatementListHead, Link)) {
Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);
//
// Reset Question to its default value
//
Status = GetQuestionDefault (Question, DefaultId, VarStoreId, Node);
if (EFI_ERROR (Status)) {
continue;
}
Link = GetNextNode (&Form->StatementListHead, Link);
}
return EFI_SUCCESS;
}
/**
Destroy all the buffer allocated for the fileds of
UEFI_IFR_BUFFER_STORAGE_NODE. The Node itself
will be freed too.
@param Node Var storage buffer.
**/
VOID
DestroyDefaultNode (
IN UEFI_IFR_BUFFER_STORAGE_NODE *Node
)
{
FreePool (Node->Buffer);
FreePool (Node->Name);
FreePool (Node);
}
/**
Get the default value for Buffer Type storage named by
a Default Store and a Storage Store from a FormSet.
The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE
allocated by this function. It is inserted to the link list.
@param DefaultStore The Default Store.
@param Storage The Storage.
@param FormSet The Form Set.
@param UefiDefaultsListHead The head of link list for the output.
@retval EFI_SUCCESS Successful.
**/
EFI_STATUS
GetBufferTypeDefaultIdAndStorageId (
IN FORMSET_DEFAULTSTORE *DefaultStore,
IN FORMSET_STORAGE *Storage,
IN FORM_BROWSER_FORMSET *FormSet,
OUT LIST_ENTRY *UefiDefaultsListHead
)
{
UEFI_IFR_BUFFER_STORAGE_NODE *Node;
LIST_ENTRY *Link;
FORM_BROWSER_FORM *Form;
EFI_STATUS Status;
Node = AllocateZeroPool (sizeof (UEFI_IFR_BUFFER_STORAGE_NODE));
ASSERT (Node != NULL);
Node->Signature = UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE;
Node->Name = AllocateCopyPool (StrSize (Storage->Name), Storage->Name);
Node->DefaultId = DefaultStore->DefaultId;
Node->StoreId = Storage->VarStoreId;
CopyGuid (&Node->Guid, &Storage->Guid);
Node->Size = Storage->Size;
Node->Buffer = AllocateZeroPool (Node->Size);
//
// Extract default from IFR binary
//
Link = GetFirstNode (&FormSet->FormListHead);
while (!IsNull (&FormSet->FormListHead, Link)) {
Form = FORM_BROWSER_FORM_FROM_LINK (Link);
Status = ExtractFormDefault (Form, DefaultStore->DefaultId, Storage->VarStoreId, Node);
ASSERT_EFI_ERROR (Status);
Link = GetNextNode (&FormSet->FormListHead, Link);
}
InsertTailList (UefiDefaultsListHead, &Node->List);
return EFI_SUCCESS;
}
/**
Get the default value for Buffer Type storage named by
a Default Store from a FormSet.
The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE
allocated by this function. The output can be multiple instances
of UEFI_IFR_BUFFER_STORAGE_NODE. It is inserted to the link list.
@param DefaultStore The Default Store.
@param FormSet The Form Set.
@param UefiDefaultsListHead The head of link list for the output.
@retval EFI_SUCCESS Successful.
**/
EFI_STATUS
GetBufferTypeDefaultId (
IN FORMSET_DEFAULTSTORE *DefaultStore,
IN FORM_BROWSER_FORMSET *FormSet,
OUT LIST_ENTRY *UefiDefaultsListHead
)
{
LIST_ENTRY *StorageLink;
FORMSET_STORAGE *Storage;
EFI_STATUS Status;
StorageLink = GetFirstNode (&FormSet->StorageListHead);
while (!IsNull (&FormSet->StorageListHead, StorageLink)) {
Storage = FORMSET_STORAGE_FROM_LINK(StorageLink);
if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {
Status = GetBufferTypeDefaultIdAndStorageId (DefaultStore, Storage, FormSet, UefiDefaultsListHead);
ASSERT_EFI_ERROR (Status);
}
StorageLink = GetNextNode (&FormSet->StorageListHead, StorageLink);
}
return EFI_SUCCESS;
}
/**
Get the default value for Buffer Type storage from the FormSet in ThunkContext.
The results can be multiple instances of UEFI_IFR_BUFFER_STORAGE_NODE.
They are inserted to the link list.
@param ThunkContext Hii thunk context.
@param UefiDefaults The head of link list for the output.
@retval EFI_SUCCESS Successful.
**/
EFI_STATUS
UefiIfrGetBufferTypeDefaults (
IN HII_THUNK_CONTEXT *ThunkContext,
OUT LIST_ENTRY **UefiDefaults
)
{
LIST_ENTRY *DefaultLink;
FORMSET_DEFAULTSTORE *DefaultStore;
EFI_STATUS Status;
ASSERT (UefiDefaults != NULL);
*UefiDefaults = AllocateZeroPool (sizeof (LIST_ENTRY));
ASSERT (*UefiDefaults != NULL);
InitializeListHead (*UefiDefaults);
DefaultLink = GetFirstNode (&ThunkContext->FormSet->DefaultStoreListHead);
while (!IsNull (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink)) {
DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);
Status = GetBufferTypeDefaultId (DefaultStore, ThunkContext->FormSet, *UefiDefaults);
ASSERT_EFI_ERROR (Status);
DefaultLink = GetNextNode (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink);
}
return EFI_SUCCESS;
}
/**
Convert the UEFI Buffer Type default values to a Framework HII default
values specified by a EFI_HII_VARIABLE_PACK_LIST structure.
@param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE
which contains the default values retrived from a UEFI form set.
@param DefaultMask The default mask.
The valid values are EFI_IFR_FLAG_DEFAULT and EFI_IFR_FLAG_MANUFACTURING.
UEFI spec only map EFI_IFR_FLAG_DEFAULT and EFI_IFR_FLAG_MANUFACTURING
from specification to valid default class.
@param UefiFormSetDefaultVarStoreId
ID of the default varstore in FormSet.
@param VariablePackList The output default value in a format defined in Framework.
@retval EFI_SUCCESS Successful.
@retval EFI_INVALID_PARAMETER The default mask is not EFI_IFR_FLAG_DEFAULT or
EFI_IFR_FLAG_MANUFACTURING.
**/
EFI_STATUS
UefiDefaultsToFwDefaults (
IN LIST_ENTRY *ListHead,
IN UINTN DefaultMask,
IN EFI_VARSTORE_ID UefiFormSetDefaultVarStoreId,
OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList
)
{
LIST_ENTRY *List;
UEFI_IFR_BUFFER_STORAGE_NODE *Node;
UINTN Size;
UINTN Count;
UINT16 DefaultId;
EFI_HII_VARIABLE_PACK *Pack;
EFI_HII_VARIABLE_PACK_LIST *PackList;
UINTN Index;
if (DefaultMask == EFI_IFR_FLAG_DEFAULT) {
DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
} else if (DefaultMask == EFI_IFR_FLAG_MANUFACTURING) {
DefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;
} else {
//
// UEFI spec only map EFI_IFR_FLAG_DEFAULT and EFI_IFR_FLAG_MANUFACTURING
// from specification to valid default class.
//
ASSERT (FALSE);
return EFI_INVALID_PARAMETER;
}
//
// Calculate the size of the output EFI_HII_VARIABLE_PACK_LIST structure
//
Size = 0;
Count = 0;
List = GetFirstNode (ListHead);
while (!IsNull (ListHead, List)) {
Node = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List);
if (Node->DefaultId == DefaultId) {
Size += Node->Size;
Size += StrSize (Node->Name);
Count++;
}
List = GetNextNode (ListHead, List);
}
if (Count == 0) {
*VariablePackList = NULL;
return EFI_NOT_FOUND;
}
Size = Size + Count * (sizeof (EFI_HII_VARIABLE_PACK_LIST) + sizeof (EFI_HII_VARIABLE_PACK));
*VariablePackList = AllocateZeroPool (Size);
ASSERT (*VariablePackList != NULL);
List = GetFirstNode (ListHead);
PackList = (EFI_HII_VARIABLE_PACK_LIST *) *VariablePackList;
Pack = (EFI_HII_VARIABLE_PACK *) (PackList + 1);
Index = 0;
while (!IsNull (ListHead, List)) {
Node = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List);
Size = 0;
if (Node->DefaultId == DefaultId) {
Size += Node->Size;
Size += sizeof (EFI_HII_VARIABLE_PACK);
Pack->VariableNameLength = (UINT32) StrSize (Node->Name);
if (Node->StoreId == UefiFormSetDefaultVarStoreId) {
//
// The default VARSTORE in VFR from a Framework module has Varstore ID of 0.
//
Pack->VariableId = 0;
} else {
Pack->VariableId = Node->StoreId;
}
CopyMem ((UINT8 *) Pack + sizeof (EFI_HII_VARIABLE_PACK), Node->Name, StrSize (Node->Name));
Size += Pack->VariableNameLength;
//
// Initialize EFI_HII_VARIABLE_PACK
//
Pack->Header.Type = 0;
Pack->Header.Length = (UINT32) Size;
CopyMem (&Pack->VariableGuid, &Node->Guid, sizeof (EFI_GUID));
CopyMem ((UINT8 *) Pack + sizeof (EFI_HII_VARIABLE_PACK) + Pack->VariableNameLength, Node->Buffer, Node->Size);
Size += sizeof (EFI_HII_VARIABLE_PACK_LIST);
//
// Initialize EFI_HII_VARIABLE_PACK_LIST
//
PackList->VariablePack = Pack;
Index++;
if (Index < Count) {
PackList->NextVariablePack = (EFI_HII_VARIABLE_PACK_LIST *)((UINT8 *) PackList + Size);
PackList = PackList->NextVariablePack;
Pack = (EFI_HII_VARIABLE_PACK *) (PackList + 1);
}
}
List = GetNextNode (ListHead, List);
}
return EFI_SUCCESS;
}
/**
Free up all buffer allocated for the link list of UEFI_IFR_BUFFER_STORAGE_NODE.
@param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE
which contains the default values retrived from
a UEFI form set.
**/
VOID
FreeDefaultList (
IN LIST_ENTRY *ListHead
)
{
LIST_ENTRY *Link;
UEFI_IFR_BUFFER_STORAGE_NODE *Default;
while (!IsListEmpty (ListHead)) {
Link = GetFirstNode (ListHead);
Default = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Link);
RemoveEntryList (Link);
DestroyDefaultNode (Default);
}
FreePool (ListHead);
}

View File

@@ -1,92 +0,0 @@
/** @file
Header file for Function and Macro defintions for to extract default values from UEFI Form package.
Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _HII_THUNK_UEFI_IFR_DEFAULT_
#define _HII_THUNK_UEFI_IFR_DEFAULT_
#define UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(a) CR(a, UEFI_IFR_BUFFER_STORAGE_NODE, List, UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE)
#define UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE SIGNATURE_32 ('I', 'b', 'S', 'n')
typedef struct {
LIST_ENTRY List;
UINT32 Signature;
EFI_GUID Guid;
CHAR16 *Name;
UINT16 DefaultId;
UINT16 StoreId;
UINTN Size;
UINT8 *Buffer;
} UEFI_IFR_BUFFER_STORAGE_NODE;
/**
Get the default value for Buffer Type storage from the FormSet in ThunkContext.
The results can be multiple instances of UEFI_IFR_BUFFER_STORAGE_NODE.
They are inserted to the link list.
@param ThunkContext Hii thunk context.
@param UefiDefaults The head of link list for the output.
@retval EFI_SUCCESS Successful.
**/
EFI_STATUS
UefiIfrGetBufferTypeDefaults (
IN HII_THUNK_CONTEXT *ThunkContext,
OUT LIST_ENTRY **UefiDefaults
);
/**
Convert the UEFI Buffer Type default values to a Framework HII default
values specified by a EFI_HII_VARIABLE_PACK_LIST structure.
@param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE
which contains the default values retrived from a UEFI form set.
@param DefaultMask The default mask.
The valid values are EFI_IFR_FLAG_DEFAULT and EFI_IFR_FLAG_MANUFACTURING.
UEFI spec only map EFI_IFR_FLAG_DEFAULT and EFI_IFR_FLAG_MANUFACTURING
from specification to valid default class.
@param UefiFormSetDefaultVarStoreId
ID of the default varstore in FormSet.
@param VariablePackList The output default value in a format defined in Framework.
@retval EFI_SUCCESS Successful.
@retval EFI_INVALID_PARAMETER The default mask is not EFI_IFR_FLAG_DEFAULT or
EFI_IFR_FLAG_MANUFACTURING.
**/
EFI_STATUS
UefiDefaultsToFwDefaults (
IN LIST_ENTRY *ListHead,
IN UINTN DefaultMask,
IN EFI_VARSTORE_ID UefiFormSetDefaultVarStoreId,
OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList
);
/**
Free up all buffer allocated for the link list of UEFI_IFR_BUFFER_STORAGE_NODE.
@param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE
which contains the default values retrived from
a UEFI form set.
**/
VOID
FreeDefaultList (
IN LIST_ENTRY *ListHead
);
#endif

View File

@@ -1,342 +0,0 @@
/** @file
Function and Macro defintions for IFR parsing. To get the default value from IFR package, the IFR
opcode needs to be parsed. Most of code is taken from MdeModulePkg\Universal\SetupBrowserDxe\IfrParse.c.
This parser is simplified from the origianl IfrParser.c in the following way:
1) All data structure definition that have nothing to do with IFR Default value scanning (
required to implement Framework HII's GetDefaultImage ()) is removed.
2) Ignore the IFR opcode which is invalid for Form Package
generated using Framework VFR file.
Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _HII_THUNK_UEFI_IFR_PARSER_
#define _HII_THUNK_UEFI_IFR_PARSER_
//
// IFR relative definition
//
#define EFI_HII_EXPRESSION_INCONSISTENT_IF 0
#define EFI_HII_EXPRESSION_NO_SUBMIT_IF 1
#define EFI_HII_EXPRESSION_GRAY_OUT_IF 2
#define EFI_HII_EXPRESSION_SUPPRESS_IF 3
#define EFI_HII_EXPRESSION_DISABLE_IF 4
#define EFI_HII_EXPRESSION_VALUE 5
#define EFI_HII_EXPRESSION_RULE 6
#define EFI_HII_VARSTORE_BUFFER 0
#define EFI_HII_VARSTORE_NAME_VALUE 1
#define EFI_HII_VARSTORE_EFI_VARIABLE 2
#define FORM_INCONSISTENT_VALIDATION 0
#define FORM_NO_SUBMIT_VALIDATION 1
extern EFI_GUID gTianoHiiIfrGuid;
#define ONE_OF_OPTION_MAP_ENTRY_FROM_LINK(Record) CR(Record, ONE_OF_OPTION_MAP_ENTRY, Link, ONE_OF_OPTION_MAP_ENTRY_SIGNATURE)
#define ONE_OF_OPTION_MAP_ENTRY_SIGNATURE SIGNATURE_32 ('O', 'O', 'M', 'E')
typedef struct {
UINT32 Signature;
LIST_ENTRY Link;
UINT16 FwKey;
EFI_IFR_TYPE_VALUE Value;
} ONE_OF_OPTION_MAP_ENTRY;
#define ONE_OF_OPTION_MAP_FROM_LINK(Record) CR(Record, ONE_OF_OPTION_MAP, Link, ONE_OF_OPTION_MAP_SIGNATURE)
#define ONE_OF_OPTION_MAP_SIGNATURE SIGNATURE_32 ('O', 'O', 'O', 'M')
typedef struct {
UINT32 Signature;
LIST_ENTRY Link;
UINT16 VarStoreId;
UINT8 ValueType; //EFI_IFR_TYPE_NUM_*
EFI_QUESTION_ID QuestionId;
LIST_ENTRY OneOfOptionMapEntryListHead; //ONE_OF_OPTION_MAP_ENTRY
} ONE_OF_OPTION_MAP;
typedef struct {
UINT8 Type;
EFI_IFR_TYPE_VALUE Value;
} EFI_HII_VALUE;
#define NAME_VALUE_NODE_SIGNATURE SIGNATURE_32 ('N', 'V', 'S', 'T')
#define FORMSET_STORAGE_SIGNATURE SIGNATURE_32 ('F', 'S', 'T', 'G')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
UINT8 Type; // Storage type
UINT16 VarStoreId;
EFI_GUID Guid;
CHAR16 *Name; // For EFI_IFR_VARSTORE
UINT16 Size;
UINT32 Attributes; // For EFI_IFR_VARSTORE_EFI: EFI Variable attribute
} FORMSET_STORAGE;
#define FORMSET_STORAGE_FROM_LINK(a) CR (a, FORMSET_STORAGE, Link, FORMSET_STORAGE_SIGNATURE)
#if 0
#define EXPRESSION_OPCODE_SIGNATURE SIGNATURE_32 ('E', 'X', 'O', 'P')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
UINT8 Operand;
UINT8 Format; // For EFI_IFR_TO_STRING, EFI_IFR_FIND
UINT8 Flags; // For EFI_IFR_SPAN
UINT8 RuleId; // For EFI_IFR_RULE_REF
EFI_HII_VALUE Value; // For EFI_IFR_EQ_ID_VAL, EFI_IFR_UINT64, EFI_IFR_UINT32, EFI_IFR_UINT16, EFI_IFR_UINT8, EFI_IFR_STRING_REF1
EFI_QUESTION_ID QuestionId; // For EFI_IFR_EQ_ID_ID, EFI_IFR_EQ_ID_VAL_LIST, EFI_IFR_QUESTION_REF1
EFI_QUESTION_ID QuestionId2;
UINT16 ListLength; // For EFI_IFR_EQ_ID_VAL_LIST
UINT16 *ValueList;
EFI_STRING_ID DevicePath; // For EFI_IFR_QUESTION_REF3_2, EFI_IFR_QUESTION_REF3_3
EFI_GUID Guid;
} EXPRESSION_OPCODE;
#define EXPRESSION_OPCODE_FROM_LINK(a) CR (a, EXPRESSION_OPCODE, Link, EXPRESSION_OPCODE_SIGNATURE)
#define FORM_EXPRESSION_SIGNATURE SIGNATURE_32 ('F', 'E', 'X', 'P')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
UINT8 Type; // Type for this expression
UINT8 RuleId; // For EFI_IFR_RULE only
EFI_STRING_ID Error; // For EFI_IFR_NO_SUBMIT_IF, EFI_IFR_INCONSISTENT_IF only
EFI_HII_VALUE Result; // Expression evaluation result
LIST_ENTRY OpCodeListHead; // OpCodes consist of this expression (EXPRESSION_OPCODE)
} FORM_EXPRESSION;
#define FORM_EXPRESSION_FROM_LINK(a) CR (a, FORM_EXPRESSION, Link, FORM_EXPRESSION_SIGNATURE)
#endif
#define QUESTION_DEFAULT_SIGNATURE SIGNATURE_32 ('Q', 'D', 'F', 'T')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
UINT16 DefaultId;
EFI_HII_VALUE Value; // Default value
} QUESTION_DEFAULT;
#define QUESTION_DEFAULT_FROM_LINK(a) CR (a, QUESTION_DEFAULT, Link, QUESTION_DEFAULT_SIGNATURE)
#define QUESTION_OPTION_SIGNATURE SIGNATURE_32 ('Q', 'O', 'P', 'T')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
EFI_STRING_ID Text;
UINT8 Flags;
EFI_HII_VALUE Value;
EFI_IMAGE_ID ImageId;
} QUESTION_OPTION;
#define QUESTION_OPTION_FROM_LINK(a) CR (a, QUESTION_OPTION, Link, QUESTION_OPTION_SIGNATURE)
typedef union {
EFI_STRING_ID VarName;
UINT16 VarOffset;
} VAR_STORE_INFO;
#define FORM_BROWSER_STATEMENT_SIGNATURE SIGNATURE_32 ('F', 'S', 'T', 'A')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
UINT8 Operand; // The operand (first byte) of this Statement or Question
//
// Statement Header
//
EFI_STRING_ID Prompt;
EFI_STRING_ID Help;
EFI_STRING_ID TextTwo; // For EFI_IFR_TEXT
//
// Question Header
//
EFI_QUESTION_ID QuestionId; // The value of zero is reserved
EFI_VARSTORE_ID VarStoreId; // A value of zero indicates no variable storage
FORMSET_STORAGE *Storage;
VAR_STORE_INFO VarStoreInfo;
UINT16 StorageWidth;
UINT8 QuestionFlags;
EFI_HII_VALUE HiiValue; // Edit copy for checkbox, numberic, oneof
UINT8 *BufferValue; // Edit copy for string, password, orderedlist
//
// OpCode specific members
//
UINT8 Flags; // for EFI_IFR_CHECKBOX, EFI_IFR_DATE, EFI_IFR_NUMERIC, EFI_IFR_ONE_OF,
// EFI_IFR_ORDERED_LIST, EFI_IFR_STRING,EFI_IFR_SUBTITLE,EFI_IFR_TIME, EFI_IFR_BANNER
UINT8 MaxContainers; // for EFI_IFR_ORDERED_LIST
UINT16 BannerLineNumber; // for EFI_IFR_BANNER, 1-based line number
EFI_STRING_ID QuestionConfig; // for EFI_IFR_ACTION, if 0 then no configuration string will be processed
UINT64 Minimum; // for EFI_IFR_ONE_OF/EFI_IFR_NUMERIC, it's Min/Max value
UINT64 Maximum; // for EFI_IFR_STRING/EFI_IFR_PASSWORD, it's Min/Max length
UINT64 Step;
EFI_DEFAULT_ID DefaultId; // for EFI_IFR_RESET_BUTTON
EFI_FORM_ID RefFormId; // for EFI_IFR_REF
EFI_QUESTION_ID RefQuestionId; // for EFI_IFR_REF2
EFI_GUID RefFormSetId; // for EFI_IFR_REF3
EFI_STRING_ID RefDevicePath; // for EFI_IFR_REF4
//
// Get from IFR parsing
//
LIST_ENTRY DefaultListHead; // nested EFI_IFR_DEFAULT list (QUESTION_DEFAULT), provide default values
LIST_ENTRY OptionListHead; // nested EFI_IFR_ONE_OF_OPTION list (QUESTION_OPTION)
EFI_IMAGE_ID ImageId; // nested EFI_IFR_IMAGE
UINT8 RefreshInterval; // nested EFI_IFR_REFRESH, refresh interval(in seconds) for Question value, 0 means no refresh
BOOLEAN InSubtitle; // nesting inside of EFI_IFR_SUBTITLE
} FORM_BROWSER_STATEMENT;
#define FORM_BROWSER_STATEMENT_FROM_LINK(a) CR (a, FORM_BROWSER_STATEMENT, Link, FORM_BROWSER_STATEMENT_SIGNATURE)
#define FORM_BROWSER_FORM_SIGNATURE SIGNATURE_32 ('F', 'F', 'R', 'M')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
UINT16 FormId;
EFI_STRING_ID FormTitle;
EFI_IMAGE_ID ImageId;
#if 0
LIST_ENTRY ExpressionListHead; // List of Expressions (FORM_EXPRESSION)
#endif
LIST_ENTRY StatementListHead; // List of Statements and Questions (FORM_BROWSER_STATEMENT)
} FORM_BROWSER_FORM;
#define FORM_BROWSER_FORM_FROM_LINK(a) CR (a, FORM_BROWSER_FORM, Link, FORM_BROWSER_FORM_SIGNATURE)
#define FORMSET_DEFAULTSTORE_SIGNATURE SIGNATURE_32 ('F', 'D', 'F', 'S')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
UINT16 DefaultId;
EFI_STRING_ID DefaultName;
} FORMSET_DEFAULTSTORE;
#define FORMSET_DEFAULTSTORE_FROM_LINK(a) CR (a, FORMSET_DEFAULTSTORE, Link, FORMSET_DEFAULTSTORE_SIGNATURE)
typedef struct {
EFI_HII_HANDLE HiiHandle;
UINTN IfrBinaryLength;
UINT8 *IfrBinaryData;
EFI_GUID Guid;
EFI_STRING_ID FormSetTitle;
EFI_STRING_ID Help;
UINT16 Class;
UINT16 SubClass;
EFI_IMAGE_ID ImageId;
FORM_BROWSER_STATEMENT *StatementBuffer; // Buffer for all Statements and Questions
#if 0
EXPRESSION_OPCODE *ExpressionBuffer; // Buffer for all Expression OpCode
#endif
LIST_ENTRY StorageListHead; // Storage list (FORMSET_STORAGE)
LIST_ENTRY DefaultStoreListHead; // DefaultStore list (FORMSET_DEFAULTSTORE)
LIST_ENTRY FormListHead; // Form list (FORM_BROWSER_FORM)
LIST_ENTRY OneOfOptionMapListHead; //ONE_OF_OPTION_MAP
UINT16 MaxQuestionId;
//
// Added for Framework HII Thunk.
// Default Variable Storage built from a Framework VFR file using UEFI VFR Compiler in Compatibility mode is determined
// by priority rules defined in GetFormsetDefaultVarstoreId (). See the function description for details.
//
EFI_VARSTORE_ID DefaultVarStoreId;
CHAR16 *OriginalDefaultVarStoreName;
UINTN NumberOfStatement;
} FORM_BROWSER_FORMSET;
/**
Parse opcodes in the formset IFR binary.
@param FormSet Pointer of the FormSet data structure.
@retval EFI_SUCCESS Opcode parse success.
@retval Other Opcode parse fail.
**/
EFI_STATUS
ParseOpCodes (
IN FORM_BROWSER_FORMSET *FormSet
);
/**
Free resources allocated for a FormSet
@param FormSet Pointer of the FormSet
@return None.
**/
VOID
DestroyFormSet (
IN OUT FORM_BROWSER_FORMSET *FormSet
);
#endif

View File

@@ -1,365 +0,0 @@
/** @file
Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
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:
Expression.c
Abstract:
Expression evaluation.
**/
#include <PiDxe.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PrintLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/UnicodeCollation.h>
#include "UefiIfrParser.h"
//
// Global stack used to evaluate boolean expresions
//
EFI_HII_VALUE *mOpCodeScopeStack = NULL;
EFI_HII_VALUE *mOpCodeScopeStackEnd = NULL;
EFI_HII_VALUE *mOpCodeScopeStackPointer = NULL;
EFI_HII_VALUE *mExpressionEvaluationStack = NULL;
EFI_HII_VALUE *mExpressionEvaluationStackEnd = NULL;
EFI_HII_VALUE *mExpressionEvaluationStackPointer = NULL;
#define EXPRESSION_STACK_SIZE_INCREMENT 0x100
/**
Grow size of the stack
@param Stack On input: old stack; On output: new stack
@param StackPtr On input: old stack pointer; On output: new stack
pointer
@param StackEnd On input: old stack end; On output: new stack end
@retval EFI_SUCCESS Grow stack success.
@retval EFI_OUT_OF_RESOURCES No enough memory for stack space.
**/
EFI_STATUS
GrowStack (
IN OUT EFI_HII_VALUE **Stack,
IN OUT EFI_HII_VALUE **StackPtr,
IN OUT EFI_HII_VALUE **StackEnd
)
{
UINTN Size;
EFI_HII_VALUE *NewStack;
Size = EXPRESSION_STACK_SIZE_INCREMENT;
if (*StackPtr != NULL) {
Size = Size + (*StackEnd - *Stack);
}
NewStack = AllocatePool (Size * sizeof (EFI_HII_VALUE));
if (NewStack == NULL) {
return EFI_OUT_OF_RESOURCES;
}
if (*StackPtr != NULL) {
//
// Copy from Old Stack to the New Stack
//
CopyMem (
NewStack,
*Stack,
(*StackEnd - *Stack) * sizeof (EFI_HII_VALUE)
);
//
// Free The Old Stack
//
gBS->FreePool (*Stack);
}
//
// Make the Stack pointer point to the old data in the new stack
//
*StackPtr = NewStack + (*StackPtr - *Stack);
*Stack = NewStack;
*StackEnd = NewStack + Size;
return EFI_SUCCESS;
}
/**
Push an element onto the Boolean Stack
@param Stack On input: old stack; On output: new stack
@param StackPtr On input: old stack pointer; On output: new stack
pointer
@param StackEnd On input: old stack end; On output: new stack end
@param Data Data to push.
@retval EFI_SUCCESS Push stack success.
**/
EFI_STATUS
PushStack (
IN OUT EFI_HII_VALUE **Stack,
IN OUT EFI_HII_VALUE **StackPtr,
IN OUT EFI_HII_VALUE **StackEnd,
IN EFI_HII_VALUE *Data
)
{
EFI_STATUS Status;
//
// Check for a stack overflow condition
//
if (*StackPtr >= *StackEnd) {
//
// Grow the stack
//
Status = GrowStack (Stack, StackPtr, StackEnd);
if (EFI_ERROR (Status)) {
return Status;
}
}
//
// Push the item onto the stack
//
CopyMem (*StackPtr, Data, sizeof (EFI_HII_VALUE));
*StackPtr = *StackPtr + 1;
return EFI_SUCCESS;
}
/**
Pop an element from the stack.
@param Stack On input: old stack; On output: new stack
@param StackPtr On input: old stack pointer; On output: new stack
pointer
@param StackEnd On input: old stack end; On output: new stack end
@param Data Data to pop.
@retval EFI_SUCCESS The value was popped onto the stack.
@retval EFI_ACCESS_DENIED The pop operation underflowed the stack
**/
EFI_STATUS
PopStack (
IN OUT EFI_HII_VALUE **Stack,
IN OUT EFI_HII_VALUE **StackPtr,
IN OUT EFI_HII_VALUE **StackEnd,
OUT EFI_HII_VALUE *Data
)
{
//
// Check for a stack underflow condition
//
if (*StackPtr == *Stack) {
return EFI_ACCESS_DENIED;
}
//
// Pop the item off the stack
//
*StackPtr = *StackPtr - 1;
CopyMem (Data, *StackPtr, sizeof (EFI_HII_VALUE));
return EFI_SUCCESS;
}
/**
Reset stack pointer to begin of the stack.
**/
VOID
ResetScopeStack (
VOID
)
{
mOpCodeScopeStackPointer = mOpCodeScopeStack;
}
/**
Push an Operand onto the Stack
@param Operand Operand to push.
@retval EFI_SUCCESS The value was pushed onto the stack.
@retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
stack.
**/
EFI_STATUS
PushScope (
IN UINT8 Operand
)
{
EFI_HII_VALUE Data;
Data.Type = EFI_IFR_TYPE_NUM_SIZE_8;
Data.Value.u8 = Operand;
return PushStack (
&mOpCodeScopeStack,
&mOpCodeScopeStackPointer,
&mOpCodeScopeStackEnd,
&Data
);
}
/**
Pop an Operand from the Stack
@param Operand Operand to pop.
@retval EFI_SUCCESS The value was pushed onto the stack.
@retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
stack.
**/
EFI_STATUS
PopScope (
OUT UINT8 *Operand
)
{
EFI_STATUS Status;
EFI_HII_VALUE Data;
Status = PopStack (
&mOpCodeScopeStack,
&mOpCodeScopeStackPointer,
&mOpCodeScopeStackEnd,
&Data
);
*Operand = Data.Value.u8;
return Status;
}
/**
Reset stack pointer to begin of the stack.
**/
VOID
ResetExpressionStack (
VOID
)
{
mExpressionEvaluationStackPointer = mExpressionEvaluationStack;
}
/**
Push an Expression value onto the Stack
@param Value Expression value to push.
@retval EFI_SUCCESS The value was pushed onto the stack.
@retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
stack.
**/
EFI_STATUS
PushExpression (
IN EFI_HII_VALUE *Value
)
{
return PushStack (
&mExpressionEvaluationStack,
&mExpressionEvaluationStackPointer,
&mExpressionEvaluationStackEnd,
Value
);
}
/**
Pop an Expression value from the stack.
@param Value Expression value to pop.
@retval EFI_SUCCESS The value was popped onto the stack.
@retval EFI_ACCESS_DENIED The pop operation underflowed the stack
**/
EFI_STATUS
PopExpression (
OUT EFI_HII_VALUE *Value
)
{
return PopStack (
&mExpressionEvaluationStack,
&mExpressionEvaluationStackPointer,
&mExpressionEvaluationStackEnd,
Value
);
}
/**
Zero extend integer/boolean/date/time to UINT64 for comparing.
@param Value HII Value to be converted.
@return None.
**/
VOID
ExtendValueToU64 (
IN EFI_HII_VALUE *Value
)
{
UINT64 Temp;
Temp = 0;
switch (Value->Type) {
case EFI_IFR_TYPE_NUM_SIZE_8:
Temp = Value->Value.u8;
break;
case EFI_IFR_TYPE_NUM_SIZE_16:
Temp = Value->Value.u16;
break;
case EFI_IFR_TYPE_NUM_SIZE_32:
Temp = Value->Value.u32;
break;
case EFI_IFR_TYPE_BOOLEAN:
Temp = Value->Value.b;
break;
case EFI_IFR_TYPE_TIME:
Temp = Value->Value.u32 & 0xffffff;
break;
case EFI_IFR_TYPE_DATE:
Temp = Value->Value.u32;
break;
default:
return;
}
Value->Value.u64 = Temp;
}

View File

@@ -1,92 +0,0 @@
/** @file
Internal Function and Macro defintions for IFR Expression evaluation used in Ifr Parsing. This header file should only
be included by UefiIfrParserExpression.c and UefiIfrParser.c
Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _HII_THUNK_UEFI_IFR_PARSER_EXPRESSION_
#define _HII_THUNK_UEFI_IFR_PARSER_EXPRESSION_
/**
Reset stack pointer to begin of the stack.
**/
VOID
ResetScopeStack (
VOID
);
/**
Push an Operand onto the Stack
@param Operand Operand to push.
@retval EFI_SUCCESS The value was pushed onto the stack.
@retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
stack.
**/
EFI_STATUS
PushScope (
IN UINT8 Operand
);
/**
Pop an Operand from the Stack
@param Operand Operand to pop.
@retval EFI_SUCCESS The value was pushed onto the stack.
@retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
stack.
**/
EFI_STATUS
PopScope (
OUT UINT8 *Operand
);
/**
Zero extend integer/boolean/date/time to UINT64 for comparing.
@param Value HII Value to be converted.
@return None.
**/
VOID
ExtendValueToU64 (
IN EFI_HII_VALUE *Value
);
/**
Compare two Hii value.
@param Value1 Expression value to compare on left-hand
@param Value2 Expression value to compare on right-hand
@param HiiHandle Only required for string compare
@retval EFI_INVALID_PARAMETER Could not perform comparation on two values
@retval 0 Two operators equeal
@retval 0 Value1 is greater than Value2
@retval 0 Value1 is less than Value2
**/
INTN
CompareHiiValue (
IN EFI_HII_VALUE *Value1,
IN EFI_HII_VALUE *Value2,
IN EFI_HII_HANDLE HiiHandle OPTIONAL
);
#endif

View File

@@ -1,891 +0,0 @@
/** @file
This file contains the keyboard processing code to the HII database.
Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "HiiDatabase.h"
#include "HiiHandle.h"
#include <Library/DebugLib.h>
#include <Guid/ZeroGuid.h>
CONST CHAR16 FrameworkReservedVarstoreName[] = FRAMEWORK_RESERVED_VARSTORE_NAME;
/**
This function returns a list of the package handles of the
specified type that are currently active in the HII database. The
pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package
handles to be listed.
If HandleBufferLength is NULL, then ASSERT.
If HandleBuffer is NULL, the ASSERT.
If PackageType is EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is
NULL, then ASSERT.
If PackageType is not EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is not
NULL, then ASSERT.
@param PackageType Specifies the package type of the packages
to list or EFI_HII_PACKAGE_TYPE_ALL for
all packages to be listed.
@param PackageGuid If PackageType is
EFI_HII_PACKAGE_TYPE_GUID, then this is
the pointer to the GUID which must match
the Guid field of
EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it
must be NULL.
@param HandleBufferLength On output, the length of the handle buffer
that is required for the handles found.
@param HandleBuffer On output, an array of EFI_HII_HANDLE instances returned.
The caller is responcible to free this pointer allocated.
@retval EFI_SUCCESS The matching handles are outputted successfully.
HandleBufferLength is updated with the actual length.
@retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operation.
@retval EFI_NOT_FOUND No matching handle could not be found in database.
**/
EFI_STATUS
EFIAPI
ListPackageLists (
IN UINT8 PackageType,
IN CONST EFI_GUID *PackageGuid,
IN OUT UINTN *HandleBufferLength,
OUT EFI_HII_HANDLE **HandleBuffer
)
{
EFI_STATUS Status;
ASSERT (HandleBufferLength != NULL);
ASSERT (HandleBuffer != NULL);
*HandleBufferLength = 0;
*HandleBuffer = NULL;
if (PackageType == EFI_HII_PACKAGE_TYPE_GUID) {
ASSERT (PackageGuid != NULL);
} else {
ASSERT (PackageGuid == NULL);
}
Status = mHiiDatabase->ListPackageLists (
mHiiDatabase,
PackageType,
PackageGuid,
HandleBufferLength,
*HandleBuffer
);
if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
//
// No packages is registered to UEFI HII Database, just return.
//
//
return Status;
}
*HandleBuffer = AllocateZeroPool (*HandleBufferLength);
if (*HandleBuffer == NULL) {
return EFI_OUT_OF_RESOURCES;
}
return mHiiDatabase->ListPackageLists (
mHiiDatabase,
PackageType,
PackageGuid,
HandleBufferLength,
*HandleBuffer
);
}
/**
Exports the contents of one or all package lists in the HII database into a buffer.
If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database,
then ASSERT.
If PackageListHeader is NULL, then ASSERT.
If PackageListSize is NULL, then ASSERT.
@param Handle The HII Handle.
@param PackageListHeader A pointer to a buffer that will contain the results of
the export function.
@param PackageListSize On output, the length of the buffer that is required for the exported data.
@retval EFI_SUCCESS Package exported.
@retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations.
**/
EFI_STATUS
EFIAPI
ExportPackageLists (
IN EFI_HII_HANDLE Handle,
OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,
OUT UINTN *PackageListSize
)
{
EFI_STATUS Status;
UINTN Size;
EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr;
ASSERT (PackageListSize != NULL);
ASSERT (PackageListHeader != NULL);
Size = 0;
PackageListHdr = NULL;
Status = mHiiDatabase->ExportPackageLists (
mHiiDatabase,
Handle,
&Size,
PackageListHdr
);
ASSERT (Status != EFI_BUFFER_TOO_SMALL);
if (Status == EFI_BUFFER_TOO_SMALL) {
PackageListHdr = AllocateZeroPool (Size);
if (PackageListHeader == NULL) {
return EFI_OUT_OF_RESOURCES;
} else {
Status = mHiiDatabase->ExportPackageLists (
mHiiDatabase,
Handle,
&Size,
PackageListHdr
);
}
}
if (!EFI_ERROR (Status)) {
*PackageListHeader = PackageListHdr;
*PackageListSize = Size;
} else {
FreePool (PackageListHdr);
}
return Status;
}
/**
Extract Hii package list GUID for given HII handle.
If HiiHandle could not be found in the HII database, then ASSERT.
If Guid is NULL, then ASSERT.
@param Handle Hii handle
@param Guid Package list GUID
@retval EFI_SUCCESS Successfully extract GUID from Hii database.
**/
EFI_STATUS
EFIAPI
ExtractGuidFromHiiHandle (
IN EFI_HII_HANDLE Handle,
OUT EFI_GUID *Guid
)
{
EFI_STATUS Status;
UINTN BufferSize;
EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
ASSERT (Guid != NULL);
ASSERT (Handle != NULL);
//
// Get HII PackageList
//
BufferSize = 0;
HiiPackageList = NULL;
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);
ASSERT (Status != EFI_NOT_FOUND);
if (Status == EFI_BUFFER_TOO_SMALL) {
HiiPackageList = AllocatePool (BufferSize);
ASSERT (HiiPackageList != NULL);
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);
}
if (EFI_ERROR (Status)) {
FreePool (HiiPackageList);
return Status;
}
//
// Extract GUID
//
CopyGuid (Guid, &HiiPackageList->PackageListGuid);
FreePool (HiiPackageList);
return EFI_SUCCESS;
}
/**
Find the corressponding UEFI HII Handle from a Framework HII Handle given.
@param Private The HII Thunk Module Private context.
@param FwHiiHandle The Framemwork HII Handle.
@return NULL If Framework HII Handle is invalid.
@return The corresponding UEFI HII Handle.
**/
EFI_HII_HANDLE
FwHiiHandleToUefiHiiHandle (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle
)
{
HII_THUNK_CONTEXT *ThunkContext;
ASSERT (FwHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);
ASSERT (Private != NULL);
ThunkContext = FwHiiHandleToThunkContext (Private, FwHiiHandle);
if (ThunkContext != NULL) {
return ThunkContext->UefiHiiHandle;
}
return (EFI_HII_HANDLE) NULL;
}
/**
Find the corressponding HII Thunk Context from a Framework HII Handle given.
@param Private The HII Thunk Module Private context.
@param FwHiiHandle The Framemwork HII Handle.
@return NULL If Framework HII Handle is invalid.
@return The corresponding HII Thunk Context.
**/
HII_THUNK_CONTEXT *
FwHiiHandleToThunkContext (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle
)
{
LIST_ENTRY *Link;
HII_THUNK_CONTEXT *ThunkContext;
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
if (FwHiiHandle == ThunkContext->FwHiiHandle) {
return ThunkContext;
}
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
return NULL;
}
/**
Find the corressponding HII Thunk Context from a UEFI HII Handle given.
@param Private The HII Thunk Module Private context.
@param UefiHiiHandle The UEFI HII Handle.
@return NULL If UEFI HII Handle is invalid.
@return The corresponding HII Thunk Context.
**/
HII_THUNK_CONTEXT *
UefiHiiHandleToThunkContext (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN EFI_HII_HANDLE UefiHiiHandle
)
{
LIST_ENTRY *Link;
HII_THUNK_CONTEXT *ThunkContext;
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
if (UefiHiiHandle == ThunkContext->UefiHiiHandle) {
return ThunkContext;
}
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
return NULL;
}
/**
Find the corressponding HII Thunk Context from a Tag GUID.
@param Private The HII Thunk Module Private context.
@param Guid The Tag GUID.
@return NULL No HII Thunk Context matched the Tag GUID.
@return The corresponding HII Thunk Context.
**/
HII_THUNK_CONTEXT *
TagGuidToIfrPackThunkContext (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN CONST EFI_GUID *Guid
)
{
LIST_ENTRY *Link;
HII_THUNK_CONTEXT *ThunkContext;
Link = GetFirstNode (&Private->ThunkContextListHead);
while (!IsNull (&Private->ThunkContextListHead, Link)) {
ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {
return ThunkContext;
}
Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
return NULL;
}
/**
Clean up the HII Thunk Context for a UEFI HII Handle.
@param Private The HII Thunk Module Private context.
@param UefiHiiHandle The UEFI HII Handle.
**/
VOID
DestroyThunkContextForUefiHiiHandle (
IN HII_THUNK_PRIVATE_DATA *Private,
IN EFI_HII_HANDLE UefiHiiHandle
)
{
HII_THUNK_CONTEXT *ThunkContext;
ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);
ASSERT (ThunkContext != NULL);
DestroyThunkContext (ThunkContext);
}
/**
This function create a HII_THUNK_CONTEXT for the input UEFI HiiHandle
that is created when a package list registered by a module calling
EFI_HII_DATABASE_PROTOCOL.NewPackageList.
This function records the PackageListGuid of EFI_HII_PACKAGE_LIST_HEADER
into the TagGuid of the created HII_THUNK_CONTEXT.
@param UefiHiiHandle The UEFI HII Handle.
@return the new created Hii thunk context.
**/
HII_THUNK_CONTEXT *
CreateThunkContextForUefiHiiHandle (
IN EFI_HII_HANDLE UefiHiiHandle
)
{
EFI_STATUS Status;
EFI_GUID PackageGuid;
HII_THUNK_CONTEXT *ThunkContext;
ThunkContext = AllocateZeroPool (sizeof (*ThunkContext));
ASSERT (ThunkContext != NULL);
ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;
Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);
if (EFI_ERROR (Status)) {
return NULL;
}
ThunkContext->UefiHiiHandle = UefiHiiHandle;
Status = ExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);
ASSERT_EFI_ERROR (Status);
CopyGuid(&ThunkContext->TagGuid, &PackageGuid);
return ThunkContext;
}
/**
Get the number of HII Package for a Package type.
@param PackageListHeader The Package List.
@param PackageType The Package Type.
@return The number of Package for given type.
**/
UINTN
GetPackageCountByType (
IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader,
IN UINT8 PackageType
)
{
UINTN Count;
EFI_HII_PACKAGE_HEADER *PackageHeader;
PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageListHeader + sizeof (EFI_HII_PACKAGE_LIST_HEADER));
Count = 0;
while (PackageHeader->Type != EFI_HII_PACKAGE_END) {
if (PackageHeader->Type == PackageType ) {
Count++;
}
PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);
}
return Count;
}
/**
Get the Form Package from a Framework Package List.
@param Packages Framework Package List.
@return The Form Package Header found.
**/
EFI_HII_PACKAGE_HEADER *
GetIfrPackage (
IN CONST EFI_HII_PACKAGES *Packages
)
{
UINTN Index;
TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;
ASSERT (Packages != NULL);
TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));
for (Index = 0; Index < Packages->NumberOfPackages; Index++) {
//
// The current UEFI HII build tool generate a binary in the format defined by
// TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in
// this binary is with same package type. So the returned IfrPackageCount and StringPackageCount
// may not be the exact number of valid package number in the binary generated
// by HII Build tool.
//
switch (TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Type) {
case EFI_HII_IFR:
return &TianoAutogenPackageHdrArray[Index]->PackageHeader;
break;
case EFI_HII_STRING:
case EFI_HII_FONT:
break;
default:
ASSERT (FALSE);
return NULL;
break;
}
}
return NULL;
}
/**
Get FormSet GUID.
ASSERT if no FormSet Opcode is found.
@param Packages Form Framework Package.
@param FormSetGuid Return the FormSet Guid.
**/
VOID
GetFormSetGuid (
IN EFI_HII_PACKAGE_HEADER *Package,
OUT EFI_GUID *FormSetGuid
)
{
UINTN Offset;
EFI_IFR_OP_HEADER *OpCode;
EFI_IFR_FORM_SET *FormSet;
Offset = sizeof (EFI_HII_PACKAGE_HEADER);
while (Offset < Package->Length) {
OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);
switch (OpCode->OpCode) {
case EFI_IFR_FORM_SET_OP:
FormSet = (EFI_IFR_FORM_SET *) OpCode;
CopyGuid (FormSetGuid, (EFI_GUID *)(VOID *)&FormSet->Guid);
return;
default:
break;
}
Offset += OpCode->Length;
}
//
// A proper IFR must have a formset opcode.
//
ASSERT (FALSE);
}
/**
Creat a Thunk Context.
ASSERT if no FormSet Opcode is found.
@param Private The HII Thunk Private Context.
@param StringPackageCount The String package count.
@param IfrPackageCount The IFR Package count.
@return A newly created Thunk Context.
@retval NULL No resource to create a new Thunk Context.
**/
HII_THUNK_CONTEXT *
CreateThunkContext (
IN HII_THUNK_PRIVATE_DATA *Private,
IN UINTN StringPackageCount,
IN UINTN IfrPackageCount
)
{
EFI_STATUS Status;
HII_THUNK_CONTEXT *ThunkContext;
ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));
ASSERT (ThunkContext != NULL);
ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;
ThunkContext->IfrPackageCount = IfrPackageCount;
ThunkContext->StringPackageCount = StringPackageCount;
Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);
if (EFI_ERROR (Status)) {
return NULL;
}
return ThunkContext;
}
/**
Destroy the Thunk Context and free up all resource.
@param ThunkContext The HII Thunk Private Context to be freed.
**/
VOID
DestroyThunkContext (
IN HII_THUNK_CONTEXT *ThunkContext
)
{
ASSERT (ThunkContext != NULL);
FreeHiiHandle (ThunkContext->FwHiiHandle);
RemoveEntryList (&ThunkContext->Link);
if (ThunkContext->FormSet != NULL) {
DestroyFormSet (ThunkContext->FormSet);
}
FreePool (ThunkContext);
}
/**
Get the FormSet's Default Varstore ID based on the rule (Descending Priority):
1) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01) is found, Var Store ID is used.
2) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID is not found, First Var Store ID is used
as the default Var Store ID.
@param FormSet The Form Set. The Default Varstore ID is updated if found.
**/
VOID
GetFormsetDefaultVarstoreId (
IN OUT FORM_BROWSER_FORMSET * FormSet
)
{
LIST_ENTRY *StorageList;
FORMSET_STORAGE *Storage;
//
// VarStoreId 0 is invalid in UEFI IFR.
//
FormSet->DefaultVarStoreId = 0;
StorageList = GetFirstNode (&FormSet->StorageListHead);
while (!IsNull (&FormSet->StorageListHead, StorageList)) {
Storage = FORMSET_STORAGE_FROM_LINK (StorageList);
DEBUG ((EFI_D_INFO, "FormSet %g: Found Varstore ID %x Name %s Size 0x%x\n", &FormSet->Guid, Storage->VarStoreId, Storage->Name, Storage->Size));
if (Storage->VarStoreId == FRAMEWORK_RESERVED_VARSTORE_ID) {
//
// 1) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01) is found, Var Store ID is used.
//
FormSet->DefaultVarStoreId = FRAMEWORK_RESERVED_VARSTORE_ID;
break;
}
StorageList = GetNextNode (&FormSet->StorageListHead, StorageList);
}
if (FormSet->DefaultVarStoreId != FRAMEWORK_RESERVED_VARSTORE_ID) {
//
//
// 2) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID is not found, First Var Store ID is used
// as the default Var Store ID.
//
StorageList = GetFirstNode (&FormSet->StorageListHead);
if (!IsNull (&FormSet->StorageListHead, StorageList)) {
Storage = FORMSET_STORAGE_FROM_LINK (StorageList);
FormSet->DefaultVarStoreId = Storage->VarStoreId;
}
}
if (FormSet->DefaultVarStoreId == 0) {
DEBUG ((EFI_D_INFO, "FormSet %g: No Varstore Found\n", &FormSet->Guid));
}
return;
}
/**
Fetch the Ifr binary data of a FormSet.
@param Handle PackageList Handle
@param FormSetGuid GUID of a formset. If not specified (NULL or zero
GUID), take the first FormSet found in package
list.
@param BinaryLength The length of the FormSet IFR binary.
@param BinaryData The buffer designed to receive the FormSet.
@retval EFI_SUCCESS Buffer filled with the requested FormSet.
BufferLength was updated.
@retval EFI_INVALID_PARAMETER The handle is unknown.
@retval EFI_NOT_FOUND A form or FormSet on the requested handle cannot
be found with the requested FormId.
**/
EFI_STATUS
GetIfrBinaryData (
IN EFI_HII_HANDLE Handle,
IN OUT EFI_GUID *FormSetGuid,
OUT UINTN *BinaryLength,
OUT UINT8 **BinaryData
)
{
EFI_STATUS Status;
EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
UINTN BufferSize;
UINT8 *Package;
UINT8 *OpCodeData;
UINT32 Offset;
UINT32 Offset2;
BOOLEAN ReturnDefault;
UINT32 PackageListLength;
EFI_HII_PACKAGE_HEADER PackageHeader;
OpCodeData = NULL;
Package = NULL;
ZeroMem (&PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));;
//
// if FormSetGuid is NULL or zero GUID, return first FormSet in the package list
//
if (FormSetGuid == NULL || CompareGuid (FormSetGuid, &gZeroGuid)) {
ReturnDefault = TRUE;
} else {
ReturnDefault = FALSE;
}
//
// Get HII PackageList
//
BufferSize = 0;
HiiPackageList = NULL;
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);
if (Status == EFI_BUFFER_TOO_SMALL) {
HiiPackageList = AllocatePool (BufferSize);
ASSERT (HiiPackageList != NULL);
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);
}
if (EFI_ERROR (Status) || HiiPackageList == NULL) {
return EFI_NOT_FOUND;
}
//
// Get Form package from this HII package List
//
Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
Offset2 = 0;
CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
while (Offset < PackageListLength) {
Package = ((UINT8 *) HiiPackageList) + Offset;
CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
//
// Search FormSet in this Form Package
//
Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);
while (Offset2 < PackageHeader.Length) {
OpCodeData = Package + Offset2;
if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {
//
// Check whether return default FormSet
//
if (ReturnDefault) {
break;
}
//
// FormSet GUID is specified, check it
//
if (CompareGuid (FormSetGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {
break;
}
}
Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;
}
if (Offset2 < PackageHeader.Length) {
//
// Target formset found
//
break;
}
}
Offset += PackageHeader.Length;
}
if (Offset >= PackageListLength) {
//
// Form package not found in this Package List
//
gBS->FreePool (HiiPackageList);
return EFI_NOT_FOUND;
}
if (ReturnDefault && FormSetGuid != NULL) {
//
// Return the default FormSet GUID
//
CopyMem (FormSetGuid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID));
}
//
// To determine the length of a whole FormSet IFR binary, one have to parse all the Opcodes
// in this FormSet; So, here just simply copy the data from start of a FormSet to the end
// of the Form Package.
//
*BinaryLength = PackageHeader.Length - Offset2;
*BinaryData = AllocateCopyPool (*BinaryLength, OpCodeData);
gBS->FreePool (HiiPackageList);
if (*BinaryData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
return EFI_SUCCESS;
}
/**
Initialize the internal data structure of a FormSet.
@param Handle PackageList Handle
@param FormSetGuid GUID of a formset. If not specified (NULL or zero
GUID), take the first FormSet found in package
list.
@param FormSet FormSet data structure.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_NOT_FOUND The specified FormSet could not be found.
**/
EFI_STATUS
InitializeFormSet (
IN EFI_HII_HANDLE Handle,
IN OUT EFI_GUID *FormSetGuid,
OUT FORM_BROWSER_FORMSET *FormSet
)
{
EFI_STATUS Status;
Status = GetIfrBinaryData (Handle, FormSetGuid, &FormSet->IfrBinaryLength, &FormSet->IfrBinaryData);
if (EFI_ERROR (Status)) {
return Status;
}
FormSet->HiiHandle = Handle;
CopyMem (&FormSet->Guid, FormSetGuid, sizeof (EFI_GUID));
//
// Parse the IFR binary OpCodes
//
Status = ParseOpCodes (FormSet);
if (EFI_ERROR (Status)) {
return Status;
}
GetFormsetDefaultVarstoreId (FormSet);
return Status;
}
/**
Parse the Form Package and build a FORM_BROWSER_FORMSET structure.
@param UefiHiiHandle PackageList Handle
@return A pointer to FORM_BROWSER_FORMSET.
**/
FORM_BROWSER_FORMSET *
ParseFormSet (
IN EFI_HII_HANDLE UefiHiiHandle
)
{
FORM_BROWSER_FORMSET *FormSet;
EFI_GUID FormSetGuid;
EFI_STATUS Status;
FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET));
ASSERT (FormSet != NULL);
CopyGuid (&FormSetGuid, &gZeroGuid);
Status = InitializeFormSet (UefiHiiHandle, &FormSetGuid, FormSet);
if (EFI_ERROR (Status)) {
FreePool (FormSet);
return NULL;
}
return FormSet;
}

View File

@@ -1,287 +0,0 @@
/** @file
This file contains utility functions by HII Thunk Modules.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _HII_THUNK_UTILITY_H_
#define _HII_THUNK_UTILITY_H_
/**
This function returns a list of the package handles of the
specified type that are currently active in the HII database. The
pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package
handles to be listed.
If HandleBufferLength is NULL, then ASSERT.
If HandleBuffer is NULL, the ASSERT.
If PackageType is EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is
NULL, then ASSERT.
If PackageType is not EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is not
NULL, then ASSERT.
@param PackageType Specifies the package type of the packages
to list or EFI_HII_PACKAGE_TYPE_ALL for
all packages to be listed.
@param PackageGuid If PackageType is
EFI_HII_PACKAGE_TYPE_GUID, then this is
the pointer to the GUID which must match
the Guid field of
EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it
must be NULL.
@param HandleBufferLength On output, the length of the handle buffer
that is required for the handles found.
@param HandleBuffer On output, an array of EFI_HII_HANDLE instances returned.
The caller is responcible to free this pointer allocated.
@retval EFI_SUCCESS The matching handles are outputted successfully.
HandleBufferLength is updated with the actual length.
@retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operation.
@retval EFI_NOT_FOUND No matching handle could not be found in database.
**/
EFI_STATUS
EFIAPI
ListPackageLists (
IN UINT8 PackageType,
IN CONST EFI_GUID *PackageGuid,
IN OUT UINTN *HandleBufferLength,
OUT EFI_HII_HANDLE **HandleBuffer
)
;
/**
Exports the contents of one or all package lists in the HII database into a buffer.
If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database,
then ASSERT.
If PackageListHeader is NULL, then ASSERT.
If PackageListSize is NULL, then ASSERT.
@param Handle The HII Handle.
@param PackageListHeader A pointer to a buffer that will contain the results of
the export function.
@param PackageListSize On output, the length of the buffer that is required for the exported data.
@retval EFI_SUCCESS Package exported.
@retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations.
**/
EFI_STATUS
EFIAPI
ExportPackageLists (
IN EFI_HII_HANDLE Handle,
OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,
OUT UINTN *PackageListSize
)
;
/**
Extract Hii package list GUID for given HII handle.
If HiiHandle could not be found in the HII database, then ASSERT.
If Guid is NULL, then ASSERT.
@param Handle Hii handle
@param Guid Package list GUID
@retval EFI_SUCCESS Successfully extract GUID from Hii database.
**/
EFI_STATUS
EFIAPI
ExtractGuidFromHiiHandle (
IN EFI_HII_HANDLE Handle,
OUT EFI_GUID *Guid
)
;
/**
Find the corressponding UEFI HII Handle from a Framework HII Handle given.
@param Private The HII Thunk Module Private context.
@param FwHiiHandle The Framemwork HII Handle.
@return NULL If Framework HII Handle is invalid.
@return The corresponding UEFI HII Handle.
**/
EFI_HII_HANDLE
FwHiiHandleToUefiHiiHandle (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle
);
/**
Find the corressponding HII Thunk Context from a Framework HII Handle given.
@param Private The HII Thunk Module Private context.
@param FwHiiHandle The Framemwork HII Handle.
@return NULL If Framework HII Handle is invalid.
@return The corresponding HII Thunk Context.
**/
HII_THUNK_CONTEXT *
FwHiiHandleToThunkContext (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle
);
/**
Find the corressponding HII Thunk Context from a UEFI HII Handle given.
@param Private The HII Thunk Module Private context.
@param UefiHiiHandle The UEFI HII Handle.
@return NULL If UEFI HII Handle is invalid.
@return The corresponding HII Thunk Context.
**/
HII_THUNK_CONTEXT *
UefiHiiHandleToThunkContext (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN EFI_HII_HANDLE UefiHiiHandle
);
/**
Find the corressponding HII Thunk Context from a Tag GUID.
@param Private The HII Thunk Module Private context.
@param Guid The Tag GUID.
@return NULL No HII Thunk Context matched the Tag GUID.
@return The corresponding HII Thunk Context.
**/
HII_THUNK_CONTEXT *
TagGuidToIfrPackThunkContext (
IN CONST HII_THUNK_PRIVATE_DATA *Private,
IN CONST EFI_GUID *Guid
);
/**
This function create a HII_THUNK_CONTEXT for the input UEFI HiiHandle
that is created when a package list registered by a module calling
EFI_HII_DATABASE_PROTOCOL.NewPackageList.
This function records the PackageListGuid of EFI_HII_PACKAGE_LIST_HEADER
into the TagGuid of the created HII_THUNK_CONTEXT.
@param UefiHiiHandle The UEFI HII Handle.
@return the new created Hii thunk context.
**/
HII_THUNK_CONTEXT *
CreateThunkContextForUefiHiiHandle (
IN EFI_HII_HANDLE UefiHiiHandle
);
/**
Clean up the HII Thunk Context for a UEFI HII Handle.
@param Private The HII Thunk Module Private context.
@param UefiHiiHandle The UEFI HII Handle.
**/
VOID
DestroyThunkContextForUefiHiiHandle (
IN HII_THUNK_PRIVATE_DATA *Private,
IN EFI_HII_HANDLE UefiHiiHandle
);
/**
Get the number of HII Package for a Package type.
@param PackageListHeader The Package List.
@param PackageType The Package Type.
@return The number of Package for given type.
**/
UINTN
GetPackageCountByType (
IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader,
IN UINT8 PackageType
);
/**
Creat a Thunk Context.
ASSERT if no FormSet Opcode is found.
@param Private The HII Thunk Private Context.
@param StringPackageCount The String package count.
@param IfrPackageCount The IFR Package count.
@return A newly created Thunk Context.
@retval NULL No resource to create a new Thunk Context.
**/
HII_THUNK_CONTEXT *
CreateThunkContext (
IN HII_THUNK_PRIVATE_DATA *Private,
IN UINTN StringPackageCount,
IN UINTN IfrPackageCount
);
/**
Destroy the Thunk Context and free up all resource.
@param ThunkContext The HII Thunk Private Context to be freed.
**/
VOID
DestroyThunkContext (
IN HII_THUNK_CONTEXT *ThunkContext
);
/**
Get FormSet GUID.
ASSERT if no FormSet Opcode is found.
@param Packages Form Framework Package.
@param FormSetGuid Return the FormSet Guid.
**/
VOID
GetFormSetGuid (
IN EFI_HII_PACKAGE_HEADER *Package,
OUT EFI_GUID *FormSetGuid
);
/**
Get the Form Package from a Framework Package List.
@param Packages Framework Package List.
@return The Form Package Header found.
**/
EFI_HII_PACKAGE_HEADER *
GetIfrPackage (
IN CONST EFI_HII_PACKAGES *Packages
);
/**
Parse the Form Package and build a FORM_BROWSER_FORMSET structure.
@param UefiHiiHandle PackageList Handle
@return A pointer to FORM_BROWSER_FORMSET.
**/
FORM_BROWSER_FORMSET *
ParseFormSet (
IN EFI_HII_HANDLE UefiHiiHandle
);
#endif

View File

@@ -1,72 +0,0 @@
/** @file
Framework SMM Status Code Protocol on PI SMM Status Code Protocol Thunk.
This thunk driver locates PI SMM Status Code Protocol in the SMM protocol database and
installs it in the UEFI protocol database.
Note that Framework SMM Status Code Protocol and PI SMM Status Code Protocol have identical protocol
GUID and interface structure, but they are in different handle databases.
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that 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.
**/
#include <PiSmm.h>
#include <Protocol/SmmStatusCode.h>
#include <Library/DebugLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/SmmServicesTableLib.h>
/**
Entry point of this thunk driver.
@param ImageHandle The firmware allocated handle for the EFI image.
@param SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
**/
EFI_STATUS
EFIAPI
SmmStatusCodeThunkMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_HANDLE Handle;
EFI_SMM_STATUS_CODE_PROTOCOL *SmmStatusCode;
//
// Locate the PI SMM Status Code Protocol in the SMM protocol database.
//
Status = gSmst->SmmLocateProtocol (
&gEfiSmmStatusCodeProtocolGuid,
NULL,
(VOID **)&SmmStatusCode
);
ASSERT_EFI_ERROR (Status);
//
// Install the PI SMM Status Code Protocol into the UEFI protocol database.
//
Handle = NULL;
Status = SystemTable->BootServices->InstallProtocolInterface (
&Handle,
&gEfiSmmStatusCodeProtocolGuid,
EFI_NATIVE_INTERFACE,
SmmStatusCode
);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}

View File

@@ -1,48 +0,0 @@
## @file
# Framework SMM Status Code Protocol on PI SMM Status Code Protocol Thunk driver.
#
# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = FrameworkSmmStatusCodeOnPiSmmStatusCodeThunk
FILE_GUID = 88B49226-A63F-4505-9D3C-B5A67B846133
MODULE_TYPE = DXE_SMM_DRIVER
PI_SPECIFICATION_VERSION = 0x0001000A
VERSION_STRING = 1.0
ENTRY_POINT = SmmStatusCodeThunkMain
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
FrameworkSmmStatusCodeOnPiSmmStatusCodeThunk.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiDriverEntryPoint
SmmServicesTableLib
DebugLib
BaseLib
[Protocols]
gEfiSmmStatusCodeProtocolGuid ## PRODUCES/CONSUMES
[Depex]
gEfiSmmStatusCodeProtocolGuid

File diff suppressed because it is too large Load Diff

View File

@@ -1,58 +0,0 @@
## @file
# Module produce FV2 on top of FV.
#
# UEFI PI specification supersedes Inte's Framework Specification.
# EFI_FIRMWARE_VOLUME_PROTOCOL defined in Intel Framework Pkg is replaced by
# EFI_FIRMWARE_VOLUME2_PROTOCOL in MdePkg.
# This module produces FV2 on top of FV. This module is used on platform when both of
# these two conditions are true:
# 1) Framework module producing FV is present
# 2) And the rest of modules on the platform consume FV2
#
# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = Fv2OnFvThunk
FILE_GUID = D8A6F4A6-0E97-4a8b-A475-39F1B28B5AEC
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = InitializeFirmwareVolume
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
Fv2OnFvThunk.c
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
UefiBootServicesTableLib
BaseLib
DebugLib
UefiLib
MemoryAllocationLib
[Protocols]
gEfiFirmwareVolume2ProtocolGuid
gEfiFirmwareVolumeProtocolGuid
[Depex]
TRUE

View File

@@ -1,137 +0,0 @@
/** @file
Module produce Framework's EFI_PEI_FV_FILE_LOADER_PPI top of EFI_PEI_LOAD_FILE_PPI.
UEFI PI Spec supersedes Intel's Framework Specs.
EFI_PEI_FV_FILE_LOADER_PPI defined in Intel Framework Pkg is replaced by EFI_PEI_LOAD_FILE_PPI
in MdePkg.
This module produces EFI_PEI_FV_FILE_LOADER_PPI on top of EFI_PEI_LOAD_FILE_PPI .
This module is used on platform when both of these two conditions are true:
1) Framework module consumes EFI_PEI_FV_FILE_LOADER_PPI is present.
2) The platform has PI modules that produce EFI_PEI_LOAD_FILE_PPI.
Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
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:
**/
#include <PiPei.h>
#include <Ppi/LoadFile.h>
#include <Ppi/FvLoadFile.h>
#include <Library/DebugLib.h>
#include <Library/PeiServicesLib.h>
/**
Wrap the call to PI's EFI_PEI_LOAD_FILE_PPI.
@param This A pointer to EFI_PEI_FV_FILE_LOADER_PPI.
@param FfsHeader Pointer to the FFS header of the file to load.
@param ImageAddress The loaded address of the Image.
@param ImageSize Pointer to the size of the loaded image.
@param EntryPoint Pointer to the entry point of the image.
@retval EFI_SUCCESS The image was loaded successfully.
@retval EFI_OUT_OF_RESOURCE There was not enought memory.
@retval EFI_INVALID_PARAMETER The contents of the FFS file did not contain a valid PE/COFF image that could be loaded.
**/
EFI_STATUS
EFIAPI
FrameworkLoadFile (
IN EFI_PEI_FV_FILE_LOADER_PPI *This,
IN EFI_FFS_FILE_HEADER *FfsHeader,
OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
OUT UINT64 *ImageSize,
OUT EFI_PHYSICAL_ADDRESS *EntryPoint
);
EFI_PEI_FV_FILE_LOADER_PPI mLoadFilePpi = {
FrameworkLoadFile
};
EFI_PEI_PPI_DESCRIPTOR mPpiFrameworkLoadFile = {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEfiPeiFvFileLoaderPpiGuid,
&mLoadFilePpi
};
/**
Standard entry point of a PEIM.
@param FfsHeader The FFS file header
@param PeiServices General purpose services available to every PEIM.
@retval EFI_SUCCESS If the gEfiPeiReadOnlyVariablePpiGuid interface could be successfully installed.
**/
EFI_STATUS
EFIAPI
InitPeim (
IN EFI_PEI_FILE_HANDLE FfsHeader,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
//
// This thunk module can only be used together with a PI PEI core, as we
// assume PeiServices Pointer Table can be located in a standard way defined
// in PI spec.
//
ASSERT ((*PeiServices)->Hdr.Revision >= 0x00010000);
return (*PeiServices)->InstallPpi (PeiServices, &mPpiFrameworkLoadFile);
}
/**
Wrap the call to PI's EFI_PEI_LOAD_FILE_PPI.
@param This A pointer to EFI_PEI_FV_FILE_LOADER_PPI.
@param FfsHeader The pointer to the file header to be loaded by the Pe/Coff loader.
@param ImageAddress The loaded address of the Image.
@param ImageSize Pointer to the size of the loaded image.
@param EntryPoint Pointer to the entry point of the image.
@retval EFI_SUCCESS The image was loaded successfully.
@retval EFI_OUT_OF_RESOURCE There was not enought memory.
@retval EFI_INVALID_PARAMETER The contents of the FFS file did not contain a valid PE/COFF image that could be loaded.
**/
EFI_STATUS
EFIAPI
FrameworkLoadFile (
IN EFI_PEI_FV_FILE_LOADER_PPI *This,
IN EFI_FFS_FILE_HEADER *FfsHeader,
OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
OUT UINT64 *ImageSize,
OUT EFI_PHYSICAL_ADDRESS *EntryPoint
)
{
EFI_STATUS Status;
EFI_PEI_LOAD_FILE_PPI *PiLoadFile;
UINT32 AuthenticationState;
Status = PeiServicesLocatePpi (
&gEfiPeiLoadFilePpiGuid,
0,
NULL,
(VOID **) &PiLoadFile
);
ASSERT_EFI_ERROR (Status);
return PiLoadFile->LoadFile (
PiLoadFile,
(EFI_PEI_FILE_HANDLE) FfsHeader,
ImageAddress,
ImageSize,
EntryPoint,
&AuthenticationState
);
}

View File

@@ -1,56 +0,0 @@
## @file
# Module produce Framework's EFI_PEI_FV_FILE_LOADER_PPI top of EFI_PEI_LOAD_FILE_PPI.
#
# UEFI PI Spec supersedes Intel's Framework Specs.
# EFI_PEI_FV_FILE_LOADER_PPI defined in Intel Framework Pkg is replaced by EFI_PEI_LOAD_FILE_PPI
# in MdePkg.
# This module produces EFI_PEI_FV_FILE_LOADER_PPI on top of EFI_PEI_LOAD_FILE_PPI .
# This module is used on platform when both of these two conditions are true:
# 1) Framework module consumes EFI_PEI_FV_FILE_LOADER_PPI is present.
# 2) The platform has PI modules that produce EFI_PEI_LOAD_FILE_PPI.
#
# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = FvFileLoaderOnLoadFileThunk
FILE_GUID = 6CDDBF28-89AC-4e01-9692-616B8A1009C8
MODULE_TYPE = PEIM
VERSION_STRING = 1.0
ENTRY_POINT = InitPeim
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
FvFileLoaderOnLoadFileThunk.c
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
[LibraryClasses]
PeimEntryPoint
PeiServicesLib
DebugLib
[Ppis]
gEfiPeiLoadFilePpiGuid #ALWAYS_CONSUME
gEfiPeiFvFileLoaderPpiGuid #ALWAYS_PRODUCE
[Depex]
gEfiPeiLoadFilePpiGuid

View File

@@ -1,515 +0,0 @@
/** @file
UEFI PI specification supersedes Inte's Framework Specification.
EFI_FIRMWARE_VOLUME_PROTOCOL defined in Intel Framework Pkg is replaced by
EFI_FIRMWARE_VOLUME2_PROTOCOL in MdePkg.
This module produces FV on top of FV2. This module is used on platform when both of
these two conditions are true:
1) Framework module consuming FV is present
2) And the platform only produces FV2
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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:
**/
#include <PiDxe.h>
#include <Protocol/FirmwareVolume2.h>
#include <Protocol/FirmwareVolume.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiLib.h>
#include <Library/MemoryAllocationLib.h>
#define FIRMWARE_VOLUME_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('f', 'v', 't', 'h')
typedef struct {
UINTN Signature;
EFI_FIRMWARE_VOLUME_PROTOCOL FirmwareVolume;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
} FIRMWARE_VOLUME_PRIVATE_DATA;
#define FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS(a) CR (a, FIRMWARE_VOLUME_PRIVATE_DATA, FirmwareVolume, FIRMWARE_VOLUME_PRIVATE_DATA_SIGNATURE)
/**
Convert FV attrbiutes to FV2 attributes.
@param Fv2Attributes FV2 attributes.
@return FV attributes.
**/
FRAMEWORK_EFI_FV_ATTRIBUTES
Fv2AttributesToFvAttributes (
IN EFI_FV_ATTRIBUTES Fv2Attributes
)
{
//
// Clear those filed that is not defined in Framework FV spec and Alignment conversion.
//
return (Fv2Attributes & 0x1ff) | ((UINTN) EFI_FV_ALIGNMENT_2 << RShiftU64((Fv2Attributes & EFI_FV2_ALIGNMENT), 16));
}
/**
Retrieves attributes, insures positive polarity of attribute bits, returns
resulting attributes in output parameter.
@param This Calling context
@param Attributes output buffer which contains attributes
@retval EFI_SUCCESS The firmware volume attributes were returned.
**/
EFI_STATUS
EFIAPI
FvGetVolumeAttributes (
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes
)
{
EFI_STATUS Status;
FIRMWARE_VOLUME_PRIVATE_DATA *Private;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);
FirmwareVolume2 = Private->FirmwareVolume2;
Status = FirmwareVolume2->GetVolumeAttributes (
FirmwareVolume2,
Attributes
);
if (!EFI_ERROR (Status)) {
*Attributes = Fv2AttributesToFvAttributes (*Attributes);
}
return Status;
}
/**
Sets volume attributes.
@param This Calling context
@param Attributes Buffer which contains attributes
@retval EFI_INVALID_PARAMETER A bit in Attributes was invalid
@retval EFI_SUCCESS The requested firmware volume attributes were set
and the resulting EFI_FV_ATTRIBUTES is returned in
Attributes.
@retval EFI_ACCESS_DENIED The Device is locked and does not permit modification.
**/
EFI_STATUS
EFIAPI
FvSetVolumeAttributes (
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
IN OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes
)
{
FIRMWARE_VOLUME_PRIVATE_DATA *Private;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
EFI_FV_ATTRIBUTES Fv2Attributes;
EFI_STATUS Status;
Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);
FirmwareVolume2 = Private->FirmwareVolume2;
Fv2Attributes = (*Attributes & 0x1ff);
Status = FirmwareVolume2->SetVolumeAttributes (
FirmwareVolume2,
&Fv2Attributes
);
*Attributes = Fv2AttributesToFvAttributes (Fv2Attributes);
return Status;
}
/**
Read the requested file (NameGuid) and returns data in Buffer.
@param This Calling context
@param NameGuid Filename identifying which file to read
@param Buffer Pointer to pointer to buffer in which contents of file are returned.
<br>
If Buffer is NULL, only type, attributes, and size are returned as
there is no output buffer.
<br>
If Buffer != NULL and *Buffer == NULL, the output buffer is allocated
from BS pool by ReadFile
<br>
If Buffer != NULL and *Buffer != NULL, the output buffer has been
allocated by the caller and is being passed in.
@param BufferSize Indicates the buffer size passed in, and on output the size
required to complete the read
@param FoundType Indicates the type of the file who's data is returned
@param FileAttributes Indicates the attributes of the file who's data is resturned
@param AuthenticationStatus Indicates the authentication status of the data
@retval EFI_SUCCESS The call completed successfully
@retval EFI_WARN_BUFFER_TOO_SMALL The buffer is too small to contain the requested output.
The buffer is filled and the output is truncated.
@retval EFI_NOT_FOUND NameGuid was not found in the firmware volume.
@retval EFI_DEVICE_ERROR A hardware error occurred when attempting to access the firmware volume.
@retval EFI_ACCESS_DENIED The firmware volume is configured to disallow reads.
@retval EFI_OUT_OF_RESOURCES An allocation failure occurred.
**/
EFI_STATUS
EFIAPI
FvReadFile (
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
IN EFI_GUID *NameGuid,
IN OUT VOID **Buffer,
IN OUT UINTN *BufferSize,
OUT EFI_FV_FILETYPE *FoundType,
OUT EFI_FV_FILE_ATTRIBUTES *FileAttributes,
OUT UINT32 *AuthenticationStatus
)
{
FIRMWARE_VOLUME_PRIVATE_DATA *Private;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
EFI_STATUS Status;
Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);
FirmwareVolume2 = Private->FirmwareVolume2;
Status = FirmwareVolume2->ReadFile (
FirmwareVolume2,
NameGuid,
Buffer,
BufferSize,
FoundType,
FileAttributes,
AuthenticationStatus
);
//
// For Framework FV attrbutes, only alignment fields are valid.
//
*FileAttributes = *FileAttributes & EFI_FV_FILE_ATTRIB_ALIGNMENT;
return Status;
}
/**
Read the requested section from the specified file and returns data in Buffer.
@param This Calling context
@param NameGuid Filename identifying the file from which to read
@param SectionType Indicates what section type to retrieve
@param SectionInstance Indicates which instance of SectionType to retrieve
@param Buffer Pointer to pointer to buffer in which contents of file are returned.
<br>
If Buffer is NULL, only type, attributes, and size are returned as
there is no output buffer.
<br>
If Buffer != NULL and *Buffer == NULL, the output buffer is allocated
from BS pool by ReadFile
<br>
If Buffer != NULL and *Buffer != NULL, the output buffer has been
allocated by the caller and is being passed in.
@param BufferSize Indicates the buffer size passed in, and on output the size
required to complete the read
@param AuthenticationStatus Indicates the authentication status of the data
@retval EFI_SUCCESS The call completed successfully.
@retval EFI_WARN_BUFFER_TOO_SMALL The buffer is too small to contain the requested output.
The buffer is filled and the output is truncated.
@retval EFI_OUT_OF_RESOURCES An allocation failure occurred.
@retval EFI_NOT_FOUND Name was not found in the firmware volume.
@retval EFI_DEVICE_ERROR A hardware error occurred when attempting to access the firmware volume.
@retval EFI_ACCESS_DENIED The firmware volume is configured to disallow reads.
**/
EFI_STATUS
EFIAPI
FvReadSection (
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
IN EFI_GUID *NameGuid,
IN EFI_SECTION_TYPE SectionType,
IN UINTN SectionInstance,
IN OUT VOID **Buffer,
IN OUT UINTN *BufferSize,
OUT UINT32 *AuthenticationStatus
)
{
FIRMWARE_VOLUME_PRIVATE_DATA *Private;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);
FirmwareVolume2 = Private->FirmwareVolume2;
return FirmwareVolume2->ReadSection (
FirmwareVolume2,
NameGuid,
SectionType,
SectionInstance,
Buffer,
BufferSize,
AuthenticationStatus
);
}
/**
Write the supplied file (NameGuid) to the FV.
@param This Calling context
@param NumberOfFiles Indicates the number of file records pointed to by FileData
@param WritePolicy Indicates the level of reliability of the write with respect to
things like power failure events.
@param FileData A pointer to an array of EFI_FV_WRITE_FILE_DATA structures. Each
element in the array indicates a file to write, and there are
NumberOfFiles elements in the input array.
@retval EFI_SUCCESS The write completed successfully.
@retval EFI_OUT_OF_RESOURCES The firmware volume does not have enough free space to store file(s).
@retval EFI_DEVICE_ERROR A hardware error occurred when attempting to access the firmware volume.
@retval EFI_WRITE_PROTECTED The firmware volume is configured to disallow writes.
@retval EFI_NOT_FOUND A delete was requested, but the requested file was not
found in the firmware volume.
@retval EFI_INVALID_PARAMETER A delete was requested with a multiple file write.
An unsupported WritePolicy was requested.
An unknown file type was specified.
A file system specific error has occurred.
**/
EFI_STATUS
EFIAPI
FvWriteFile (
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
IN UINT32 NumberOfFiles,
IN FRAMEWORK_EFI_FV_WRITE_POLICY WritePolicy,
IN FRAMEWORK_EFI_FV_WRITE_FILE_DATA *FileData
)
{
FIRMWARE_VOLUME_PRIVATE_DATA *Private;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
EFI_FV_WRITE_FILE_DATA *PiFileData;
EFI_STATUS Status;
UINTN Index;
Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);
FirmwareVolume2 = Private->FirmwareVolume2;
PiFileData = AllocateCopyPool (sizeof (EFI_FV_WRITE_FILE_DATA), FileData);
ASSERT (PiFileData != NULL);
//
// Framework Spec assume firmware files are Memory-Mapped.
//
for (Index = 0; Index < NumberOfFiles; Index++) {
PiFileData[Index].FileAttributes |= EFI_FV_FILE_ATTRIB_MEMORY_MAPPED;
}
Status = FirmwareVolume2->WriteFile (
FirmwareVolume2,
NumberOfFiles,
WritePolicy,
(EFI_FV_WRITE_FILE_DATA *)FileData
);
FreePool (PiFileData);
return Status;
}
/**
Given the input key, search for the next matching file in the volume.
@param This Calling context
@param Key Pointer to a caller allocated buffer that contains an implementation
specific key that is used to track where to begin searching on
successive calls.
@param FileType Indicates the file type to filter for
@param NameGuid Guid filename of the file found
@param Attributes Attributes of the file found
@param Size Size in bytes of the file found
@retval EFI_SUCCESS The output parameters are filled with data obtained from
the first matching file that was found.
@retval EFI_NOT_FOUND No files of type FileType were found.
@retval EFI_DEVICE_ERROR A hardware error occurred when attempting to access
the firmware volume.
@retval EFI_ACCESS_DENIED The firmware volume is configured to disallow reads.
**/
EFI_STATUS
EFIAPI
FvGetNextFile (
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
IN OUT VOID *Key,
IN OUT EFI_FV_FILETYPE *FileType,
OUT EFI_GUID *NameGuid,
OUT EFI_FV_FILE_ATTRIBUTES *Attributes,
OUT UINTN *Size
)
{
FIRMWARE_VOLUME_PRIVATE_DATA *Private;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
EFI_STATUS Status;
Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);
FirmwareVolume2 = Private->FirmwareVolume2;
Status = FirmwareVolume2->GetNextFile (
FirmwareVolume2,
Key,
FileType,
NameGuid,
Attributes,
Size
);
//
// For Framework FV attrbutes, only alignment fields are valid.
//
*Attributes = *Attributes & EFI_FV_FILE_ATTRIB_ALIGNMENT;
return Status;
}
//
// Firmware Volume Protocol template
//
EFI_EVENT mFvRegistration;
FIRMWARE_VOLUME_PRIVATE_DATA gFirmwareVolumePrivateDataTemplate = {
FIRMWARE_VOLUME_PRIVATE_DATA_SIGNATURE,
{
FvGetVolumeAttributes,
FvSetVolumeAttributes,
FvReadFile,
FvReadSection,
FvWriteFile,
FvGetNextFile,
0,
NULL
},
NULL
};
//
// Module globals
//
/**
This notification function is invoked when an instance of the
EFI_FIRMWARE_VOLUME2_PROTOCOL is produced. It installs another instance of the
EFI_FIRMWARE_VOLUME_PROTOCOL on the same handle.
@param Event The event that occured
@param Context Context of event. Not used in this nofication function.
**/
VOID
EFIAPI
FvNotificationEvent (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status;
UINTN BufferSize;
EFI_HANDLE Handle;
FIRMWARE_VOLUME_PRIVATE_DATA *Private;
EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
while (TRUE) {
BufferSize = sizeof (Handle);
Status = gBS->LocateHandle (
ByRegisterNotify,
&gEfiFirmwareVolume2ProtocolGuid,
mFvRegistration,
&BufferSize,
&Handle
);
if (EFI_ERROR (Status)) {
//
// Exit Path of While Loop....
//
break;
}
//
// Skip this handle if the Firmware Volume Protocol is already installed
//
Status = gBS->HandleProtocol (
Handle,
&gEfiFirmwareVolumeProtocolGuid,
(VOID **)&FirmwareVolume
);
if (!EFI_ERROR (Status)) {
continue;
}
//
// Allocate private data structure
//
Private = AllocateCopyPool (sizeof (FIRMWARE_VOLUME_PRIVATE_DATA), &gFirmwareVolumePrivateDataTemplate);
if (Private == NULL) {
continue;
}
//
// Retrieve the Firmware Volume2 Protocol
//
Status = gBS->HandleProtocol (
Handle,
&gEfiFirmwareVolume2ProtocolGuid,
(VOID **)&Private->FirmwareVolume2
);
ASSERT_EFI_ERROR (Status);
//
// Fill in rest of private data structure
//
Private->FirmwareVolume.KeySize = Private->FirmwareVolume2->KeySize;
Private->FirmwareVolume.ParentHandle = Private->FirmwareVolume2->ParentHandle;
//
// Install Firmware Volume Protocol onto same handle
//
Status = gBS->InstallMultipleProtocolInterfaces (
&Handle,
&gEfiFirmwareVolumeProtocolGuid,
&Private->FirmwareVolume,
NULL
);
ASSERT_EFI_ERROR (Status);
}
}
/**
The user Entry Point for DXE driver. The user code starts with this function
as the real entry point for the image goes into a library that calls this
function.
@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
@retval other Some error occurs when executing this entry point.
**/
EFI_STATUS
EFIAPI
InitializeFirmwareVolume2 (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EfiCreateProtocolNotifyEvent (
&gEfiFirmwareVolume2ProtocolGuid,
TPL_CALLBACK,
FvNotificationEvent,
NULL,
&mFvRegistration
);
return EFI_SUCCESS;
}

View File

@@ -1,58 +0,0 @@
## @file
# Module produce FV on top of FV2.
#
# UEFI PI specification supersedes Inte's Framework Specification.
# EFI_FIRMWARE_VOLUME_PROTOCOL defined in Intel Framework Pkg is replaced by
# EFI_FIRMWARE_VOLUME2_PROTOCOL in MdePkg.
# This module produces FV on top of FV2. This module is used on platform when both of
# these two conditions are true:
# 1) Framework module consuming FV is present
# 2) And the platform only produces FV2
#
# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = FvOnFv2Thunk
FILE_GUID = 5007A40E-A5E0-44f7-86AE-662F9A91DA26
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = InitializeFirmwareVolume2
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
FvOnFv2Thunk.c
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
UefiBootServicesTableLib
BaseLib
DebugLib
UefiLib
MemoryAllocationLib
[Protocols]
gEfiFirmwareVolume2ProtocolGuid
gEfiFirmwareVolumeProtocolGuid
[Depex]
TRUE

View File

@@ -1,31 +0,0 @@
/** @file
Define Name, GUID and data format for an EFI PCD that is used to save the image base and size
of a code segment which will be loaded and executed by a boot script thunk on S3 boot path.
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _BOOT_SCRIPT_THUNK_VARIABLE_H_
#define _BOOT_SCRIPT_THUNK_VARIABLE_H_
//
// The following structure boosts performance by combining structure all ACPI related variables into one.
//
#pragma pack(1)
typedef struct {
EFI_PHYSICAL_ADDRESS BootScriptThunkBase;
EFI_PHYSICAL_ADDRESS BootScriptThunkLength;
} BOOT_SCRIPT_THUNK_DATA;
#pragma pack()
#endif

View File

@@ -1,30 +0,0 @@
/** @file
GUID and Name are used to configure PcdBootState to DynamicHii PCD, which can
make EDKII core work with the EDK implementation.
The EDK implementation may depend on this guid variable to check the boot state.
However, the EDKII core uses a dynamic PcdBootState to save the boot state. To be compatible with EDK implementations,
BootStateGuid and BootStateName are used to configure PcdBootState to DynamicHii PCD to
save the boot state as a variable.
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _BOOT_STATE_H_
#define _BOOT_STATE_H_
#define BOOT_STATE_VARIABLE_NAME L"BootState"
#define EFI_BOOT_STATE_VARIABLE_GUID \
{ 0x60b5e939, 0xfcf, 0x4227, { 0xba, 0x83, 0x6b, 0xbe, 0xd4, 0x5b, 0xc0, 0xe3 } }
extern EFI_GUID gEfiBootStateGuid;
#endif

View File

@@ -1,24 +0,0 @@
/** @file
Framework BDS FrontPage FormSet GUID. It will be used when HiiThunk works with Framework BDS driver.
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef __FRAMEWORK_BDS_FRONTPAGE_FORMSET_H__
#define __FRAMEWORK_BDS_FRONTPAGE_FORMSET_H__
//
// In order to follow UEFI spec to do auto booting after a time-out, the GUID of Formset of Frontpage must match this value.
//
#define FRAMEWORK_BDS_FRONTPAGE_FORMSET_GUID { 0x9e0c30bc, 0x3f06, 0x4ba6, {0x82, 0x88, 0x9, 0x17, 0x9b, 0x85, 0x5d, 0xbe }}
extern EFI_GUID gFrameworkBdsFrontPageFormsetGuid;
#endif

View File

@@ -1,94 +0,0 @@
/** @file
GUID and data structures for communication between SMM Base on SMM Base2 Thunk driver
and SmmBaseHelper driver.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _SMM_BASE_THUNK_COMMUNICATION_H_
#define _SMM_BASE_THUNK_COMMUNICATION_H_
#include <Protocol/SmmBase.h>
#define EFI_SMM_BASE_THUNK_COMMUNICATION_GUID \
{ 0x6568a3d6, 0x15f, 0x4b4a, { 0x9c, 0x89, 0x1d, 0x14, 0x63, 0x14, 0x13, 0xa } }
typedef struct {
EFI_DEVICE_PATH_PROTOCOL *FilePath;
VOID *SourceBuffer;
UINTN SourceSize;
EFI_HANDLE *ImageHandle;
BOOLEAN LegacyIA32Binary;
} SMMBASE_REGISTER_ARG;
typedef struct {
EFI_HANDLE ImageHandle;
} SMMBASE_UNREGISTER_ARG;
typedef struct {
EFI_HANDLE SmmImageHandle;
EFI_SMM_CALLBACK_ENTRY_POINT CallbackAddress;
BOOLEAN MakeLast;
BOOLEAN FloatingPointSave;
} SMMBASE_REGISTER_CALLBACK_ARG;
typedef struct {
EFI_MEMORY_TYPE PoolType;
UINTN Size;
VOID **Buffer;
} SMMBASE_ALLOCATE_POOL_ARG;
typedef struct {
VOID *Buffer;
} SMMBASE_FREE_POOL_ARG;
typedef struct {
EFI_HANDLE ImageHandle;
VOID *CommunicationBuffer;
UINTN *SourceSize;
} SMMBASE_COMMUNICATE_ARG;
typedef union {
SMMBASE_REGISTER_ARG Register;
SMMBASE_UNREGISTER_ARG UnRegister;
SMMBASE_REGISTER_CALLBACK_ARG RegisterCallback;
SMMBASE_ALLOCATE_POOL_ARG AllocatePool;
SMMBASE_FREE_POOL_ARG FreePool;
SMMBASE_COMMUNICATE_ARG Communicate;
} SMMBASE_FUNCTION_ARGS;
typedef enum {
SmmBaseFunctionRegister,
SmmBaseFunctionUnregister,
SmmBaseFunctionRegisterCallback,
SmmBaseFunctionAllocatePool,
SmmBaseFunctionFreePool,
SmmBaseFunctionCommunicate
} SMMBASE_FUNCTION;
typedef struct {
SMMBASE_FUNCTION Function;
EFI_STATUS Status;
SMMBASE_FUNCTION_ARGS Args;
EFI_HANDLE SmmBaseImageHandle;
} SMMBASE_FUNCTION_DATA;
#pragma pack(1)
typedef struct {
EFI_GUID HeaderGuid;
UINTN MessageLength;
SMMBASE_FUNCTION_DATA FunctionData;
} SMMBASETHUNK_COMMUNICATION_DATA;
#pragma pack()
extern EFI_GUID gEfiSmmBaseThunkCommunicationGuid;
#endif

View File

@@ -1,122 +0,0 @@
/** @file
Provides functions for language conversion between ISO 639-2 and RFC 4646 styles.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef __LANGUAGE_LIB__
#define __LANGUAGE_LIB__
/**
Converts an ISO 639-2 language code to an RFC 4646 language code.
If the ISO 639-2 language code has a corresponding ISO 639-1 code, then that ISO 639-1
code is returned in the out parameter. Else the original ISO 639-2 code is returned. The returned RFC 4646
language code is composed of only a primary language subtag.
If Iso639Language is NULL, then ASSERT().
If Rfc4646Language is NULL, then ASSERT().
@param[out] Rfc4646Language Pointers to a buffer large enough for an ASCII string
representing an RFC 4646 language code containing only
either a ISO 639-1 or ISO 639-2 primary language subtag.
This string is Null-terminated.
@param[in] Iso639Language The pointer to a 3-letter ASCII string that represents
an ISO 639-2 language code. This string is not required
to be Null-terminated.
@retval TRUE The ISO 639-2 language code was converted to an ISO 639-1 code.
@retval FALSE The language code does not have a corresponding ISO 639-1 code.
**/
BOOLEAN
EFIAPI
ConvertIso639ToRfc4646 (
OUT CHAR8 *Rfc4646Language,
IN CONST CHAR8 *Iso639Language
);
/**
Converts an RFC 4646 language code to an ISO 639-2 language code. The primary language
subtag of the RFC 4646 code must be either an ISO 639-1 or 639-2 code. If the primary
language subtag is an ISO 639-1 code, then it is converted to its corresponding ISO 639-2
code (T code if applies). Else the ISO 639-2 code is returned.
If Rfc4646Language is NULL, then ASSERT().
If Iso639Language is NULL, then ASSERT().
@param[out] Iso639Language Pointers to a buffer large enough for a 3-letter ASCII string
representing an ISO 639-2 language code. The string
is Null-terminated.
@param[in] Rfc4646Language The pointer to a RFC 4646 language code string.
This string is terminated
by a NULL or a ';' character.
@retval TRUE Language code converted successfully.
@retval FALSE The RFC 4646 language code is invalid or unsupported.
**/
BOOLEAN
EFIAPI
ConvertRfc4646ToIso639 (
OUT CHAR8 *Iso639Language,
IN CONST CHAR8 *Rfc4646Language
);
/**
Converts ISO 639-2 language codes to RFC 4646 codes and returns the converted codes.
Caller is responsible for freeing the allocated buffer.
If Iso639Languages is NULL, then ASSERT.
@param[in] Iso639Languages Pointers to Null-terminated ISO 639-2 language code strings containing
one or more ISO 639-2 3-letter language codes.
@retval NULL Invalid ISO 639-2 language code found.
@retval NULL Out of memory.
@return The pointer to the allocate buffer containing the
Null-terminated converted language codes string.
This string is composed of one or more RFC4646
language codes each of which has only
ISO 639-1 2-letter primary language subtag.
**/
CHAR8 *
EFIAPI
ConvertLanguagesIso639ToRfc4646 (
IN CONST CHAR8 *Iso639Languages
);
/**
Converts RFC 4646 language codes to ISO 639-2 codes and returns the converted codes.
The primary language subtag of the RFC 4646 code must be either an ISO 639-1 or 639-2 code.
Caller is responsible for freeing the allocated buffer.
If Rfc4646Languages is NULL, then ASSERT.
@param[in] Rfc4646Languages Pointers to a Null-terminated RFC 4646 language codes
string containing one or more RFC 4646 language codes.
@retval NULL Invalid or unsupported RFC 4646 language code found.
@retval NULL Out of memory.
@return The pointer to the allocate buffer containing the
Null-terminated converted language codes string.
This string is composed of one or more ISO 639-2
language codes.
**/
CHAR8 *
EFIAPI
ConvertLanguagesRfc4646ToIso639 (
IN CONST CHAR8 *Rfc4646Languages
);
#endif

View File

@@ -1,60 +0,0 @@
/** @file
This PPI is the same as the PPI in the framework PciCfg, with one exception.
Specifically, this PPI does not include a modify API, while the PPI in the framework PciCfg does.
Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _PEI_PCI_CFG_H_
#define _PEI_PCI_CFG_H_
#include <Ppi/PciCfg.h>
#define ECP_PEI_PCI_CFG_PPI_GUID \
{0xb0ee53d4, 0xa049, 0x4a79, { 0xb2, 0xff, 0x19, 0xd9, 0xfa, 0xef, 0xaa, 0x94}}
typedef struct _ECP_PEI_PCI_CFG_PPI ECP_PEI_PCI_CFG_PPI;
/**
A PCI read and write operation.
Writes to, or reads from, a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table
published by the PEI Foundation.
@param This The pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the
operation at this time.
**/
typedef
EFI_STATUS
(EFIAPI *ECP_PEI_PCI_CFG_PPI_IO)(
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_PCI_CFG_PPI * This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
);
struct _ECP_PEI_PCI_CFG_PPI {
ECP_PEI_PCI_CFG_PPI_IO Read;
ECP_PEI_PCI_CFG_PPI_IO Write;
};
extern EFI_GUID gEcpPeiPciCfgPpiGuid;
#endif

View File

@@ -1,82 +0,0 @@
/** @file
The lite print protocol defines only one print function to
print the format unicode string.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef __PPRINT_H__
#define __PPRINT_H__
#define EFI_PRINT_PROTOCOL_GUID \
{ 0xdf2d868e, 0x32fc, 0x4cf0, {0x8e, 0x6b, 0xff, 0xd9, 0x5d, 0x13, 0x43, 0xd0} }
//
// Forward reference for pure ANSI compatability
//
typedef struct _EFI_PRINT_PROTOCOL EFI_PRINT_PROTOCOL;
/**
Produces a Null-terminated Unicode string in an output buffer, based on
a Null-terminated Unicode format string and a VA_LIST argument list.
Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
and BufferSize.
The Unicode string is produced by parsing the format string specified by FormatString.
Arguments are pulled from the variable argument list specified by Marker based on the
contents of the format string.
The number of Unicode characters in the produced output buffer is returned, not including
the Null-terminator.
If BufferSize is 0 or 1, then no output buffer is produced, and 0 is returned.
If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
If BufferSize > 1 and StartOfBuffer is not aligned on a 16-bit boundary, then ASSERT().
If BufferSize > 1 and FormatString is NULL, then ASSERT().
If BufferSize > 1 and FormatString is not aligned on a 16-bit boundary, then ASSERT().
If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
ASSERT().
If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
contains more than PcdMaximumUnicodeStringLength Unicode characters, not including the
Null-terminator, then ASSERT().
@param StartOfBuffer A pointer to the output buffer for the produced Null-terminated
Unicode string.
@param BufferSize The size, in bytes, of the output buffer specified by StartOfBuffer.
@param FormatString A Null-terminated Unicode format string.
@param Marker VA_LIST marker for the variable argument list.
@return The number of Unicode characters in the produced output buffer not including the
Null-terminator.
**/
typedef
UINTN
(EFIAPI *UNI_VSPRINT)(
OUT CHAR16 *StartOfBuffer,
IN UINTN BufferSize,
IN CONST CHAR16 *FormatString,
IN VA_LIST Marker
);
/**
EFI_PRINT_PROTOCOL provides one service to produce a Null-terminated Unicode string,
based on a Null-terminated Unicode format string and a VA_LIST argument list, and fills into
the buffer as output.
**/
struct _EFI_PRINT_PROTOCOL {
UNI_VSPRINT VSPrint;
};
extern EFI_GUID gEfiPrintProtocolGuid;
#endif

View File

@@ -1,41 +0,0 @@
/** @file
EFI SMM Base Helper Ready Protocol.
This UEFI protocol is produced by the SMM Base Helper SMM driver to provide
a Framework SMST to the SMM Base Thunk driver. This protocol is also an indicator
that the SMM Base Helper SMM driver is ready in SMRAM for communication with
the SMM Base Thunk driver.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef __EFI_SMM_BASE_HELPER_READY_H__
#define __EFI_SMM_BASE_HELPER_READY_H__
#define EFI_SMM_BASE_HELPER_READY_PROTOCOL_GUID \
{ \
0x910dca07, 0x1f94, 0x4ee7, { 0xaf, 0x2f, 0xff, 0x72, 0xf3, 0x15, 0x43, 0x53 } \
}
typedef struct {
///
/// Pointer to the Framework SMST built from PI SMST by SMM Base Helper SMM driver.
///
EFI_SMM_SYSTEM_TABLE *FrameworkSmst;
///
/// Services function directly called by SMM Base Thunk when in SMM
///
EFI_SMM_HANDLER_ENTRY_POINT2 ServiceEntry;
} EFI_SMM_BASE_HELPER_READY_PROTOCOL;
extern EFI_GUID gEfiSmmBaseHelperReadyProtocolGuid;
#endif

View File

@@ -1,289 +0,0 @@
/** @file
Implementation of Legacy Region 2 Protocol based on Framework Legacy Region Protocol.
Intel's Framework Legacy Region Protocol is replaced by Legacy Region 2 Protocol in PI 1.2.
This module produces PI Legacy Region 2 Protocol on top of Framework Legacy Region Protocol.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "LegacyRegion2OnLegacyRegionThunk.h"
EFI_HANDLE mLegacyRegion2Handle = NULL;
EFI_LEGACY_REGION_PROTOCOL *mLegacyRegion;
EFI_LEGACY_REGION2_PROTOCOL mLegacyRegion2 = {
LegacyRegion2Decode,
LegacyRegion2Lock,
LegacyRegion2BootLock,
LegacyRegion2Unlock,
LegacyRegionGetInfo
};
/**
Modify the hardware to allow (decode) or disallow (not decode) memory reads in a region.
If the On parameter evaluates to TRUE, this function enables memory reads in the address range
Start to (Start + Length - 1).
If the On parameter evaluates to FALSE, this function disables memory reads in the address range
Start to (Start + Length - 1).
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param Start[in] The beginning of the physical address of the region whose attributes
should be modified.
@param Length[in] The number of bytes of memory whose attributes should be modified.
The actual number of bytes modified may be greater than the number
specified.
@param Granularity[out] The number of bytes in the last region affected. This may be less
than the total number of bytes affected if the starting address
was not aligned to a region's starting address or if the length
was greater than the number of bytes in the first region.
@param On[in] Decode / Non-Decode flag.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
**/
EFI_STATUS
EFIAPI
LegacyRegion2Decode (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
IN UINT32 Start,
IN UINT32 Length,
OUT UINT32 *Granularity,
IN BOOLEAN *On
)
{
if ((Start < 0xC0000) || ((Start + Length - 1) > 0xFFFFF)) {
return EFI_INVALID_PARAMETER;
}
ASSERT (Granularity != NULL);
*Granularity = 0;
return mLegacyRegion->Decode (
mLegacyRegion,
Start,
Length,
On
);
}
/**
Modify the hardware to disallow memory writes in a region.
This function changes the attributes of a memory range to not allow writes.
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param Start[in] The beginning of the physical address of the region whose
attributes should be modified.
@param Length[in] The number of bytes of memory whose attributes should be modified.
The actual number of bytes modified may be greater than the number
specified.
@param Granularity[out] The number of bytes in the last region affected. This may be less
than the total number of bytes affected if the starting address was
not aligned to a region's starting address or if the length was
greater than the number of bytes in the first region.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
**/
EFI_STATUS
EFIAPI
LegacyRegion2Lock (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
IN UINT32 Start,
IN UINT32 Length,
OUT UINT32 *Granularity
)
{
if ((Start < 0xC0000) || ((Start + Length - 1) > 0xFFFFF)) {
return EFI_INVALID_PARAMETER;
}
ASSERT (Granularity != NULL);
return mLegacyRegion->Lock (
mLegacyRegion,
Start,
Length,
Granularity
);
}
/**
Modify the hardware to disallow memory attribute changes in a region.
This function makes the attributes of a region read only. Once a region is boot-locked with this
function, the read and write attributes of that region cannot be changed until a power cycle has
reset the boot-lock attribute. Calls to Decode(), Lock() and Unlock() will have no effect.
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param Start[in] The beginning of the physical address of the region whose
attributes should be modified.
@param Length[in] The number of bytes of memory whose attributes should be modified.
The actual number of bytes modified may be greater than the number
specified.
@param Granularity[out] The number of bytes in the last region affected. This may be less
than the total number of bytes affected if the starting address was
not aligned to a region's starting address or if the length was
greater than the number of bytes in the first region.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
@retval EFI_UNSUPPORTED The chipset does not support locking the configuration registers in
a way that will not affect memory regions outside the legacy memory
region.
**/
EFI_STATUS
EFIAPI
LegacyRegion2BootLock (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
IN UINT32 Start,
IN UINT32 Length,
OUT UINT32 *Granularity
)
{
if ((Start < 0xC0000) || ((Start + Length - 1) > 0xFFFFF)) {
return EFI_INVALID_PARAMETER;
}
//
// PI Legacy Region 2 Protocol and Framework Legacy Region Protocol have different
// semantic of BootLock() API, so we cannot thunk to Framework Legacy Region Protocol
// to produce the functionality of PI version. In addition, this functionality is
// chipset dependent, so here we return EFI_UNSUPPORTED, which is a valid return status
// code specified by PI spec.
//
return EFI_UNSUPPORTED;
}
/**
Modify the hardware to allow memory writes in a region.
This function changes the attributes of a memory range to allow writes.
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param Start[in] The beginning of the physical address of the region whose
attributes should be modified.
@param Length[in] The number of bytes of memory whose attributes should be modified.
The actual number of bytes modified may be greater than the number
specified.
@param Granularity[out] The number of bytes in the last region affected. This may be less
than the total number of bytes affected if the starting address was
not aligned to a region's starting address or if the length was
greater than the number of bytes in the first region.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
**/
EFI_STATUS
EFIAPI
LegacyRegion2Unlock (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
IN UINT32 Start,
IN UINT32 Length,
OUT UINT32 *Granularity
)
{
if ((Start < 0xC0000) || ((Start + Length - 1) > 0xFFFFF)) {
return EFI_INVALID_PARAMETER;
}
ASSERT (Granularity != NULL);
return mLegacyRegion->UnLock (
mLegacyRegion,
Start,
Length,
Granularity
);
}
/**
Get region information for the attributes of the Legacy Region.
This function is used to discover the granularity of the attributes for the memory in the legacy
region. Each attribute may have a different granularity and the granularity may not be the same
for all memory ranges in the legacy region.
@param This[in] Indicates the EFI_LEGACY_REGION2_PROTOCOL instance.
@param DescriptorCount[out] The number of region descriptor entries returned in the Descriptor
buffer.
@param Descriptor[out] A pointer to a pointer used to return a buffer where the legacy
region information is deposited. This buffer will contain a list of
DescriptorCount number of region descriptors. This function will
provide the memory for the buffer.
@retval EFI_SUCCESS The information structure was returned.
@retval EFI_UNSUPPORTED This function is not supported.
**/
EFI_STATUS
EFIAPI
LegacyRegionGetInfo (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
OUT UINT32 *DescriptorCount,
OUT EFI_LEGACY_REGION_DESCRIPTOR **Descriptor
)
{
return EFI_UNSUPPORTED;
}
/**
The user Entry Point for module LegacyRegionDxe. The user code starts with this function.
@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
**/
EFI_STATUS
EFIAPI
LegacyRegion2OnLegacyRegionThunkInitialize (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
//
// Make sure the Legacy Region 2 Protocol is not already installed in the system
//
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiLegacyRegion2ProtocolGuid);
//
// Locate and cache Framework Legacy Region Protocol.
//
Status = gBS->LocateProtocol (
&gEfiLegacyRegionProtocolGuid,
NULL,
(VOID **) &mLegacyRegion
);
ASSERT_EFI_ERROR (Status);
//
// Install the protocol on a new handle.
//
Status = gBS->InstallMultipleProtocolInterfaces (
&mLegacyRegion2Handle,
&gEfiLegacyRegion2ProtocolGuid, &mLegacyRegion2,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}

View File

@@ -1,177 +0,0 @@
/** @file
Internal include file for the Legacy Region 2 Protocol thunk driver.
Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef __LEGACY_REGION2_ON_LEGACY_REGION_H__
#define __LEGACY_REGION2_ON_LEGACY_REGION_H__
#include <Protocol/LegacyRegion2.h>
#include <Protocol/LegacyRegion.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
/**
Modify the hardware to allow (decode) or disallow (not decode) memory reads in a region.
If the On parameter evaluates to TRUE, this function enables memory reads in the address range
Start to (Start + Length - 1).
If the On parameter evaluates to FALSE, this function disables memory reads in the address range
Start to (Start + Length - 1).
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param Start[in] The beginning of the physical address of the region whose attributes
should be modified.
@param Length[in] The number of bytes of memory whose attributes should be modified.
The actual number of bytes modified may be greater than the number
specified.
@param Granularity[out] The number of bytes in the last region affected. This may be less
than the total number of bytes affected if the starting address
was not aligned to a region's starting address or if the length
was greater than the number of bytes in the first region.
@param On[in] Decode / Non-Decode flag.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
**/
EFI_STATUS
EFIAPI
LegacyRegion2Decode (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
IN UINT32 Start,
IN UINT32 Length,
OUT UINT32 *Granularity,
IN BOOLEAN *On
);
/**
Modify the hardware to disallow memory writes in a region.
This function changes the attributes of a memory range to not allow writes.
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param Start[in] The beginning of the physical address of the region whose
attributes should be modified.
@param Length[in] The number of bytes of memory whose attributes should be modified.
The actual number of bytes modified may be greater than the number
specified.
@param Granularity[out] The number of bytes in the last region affected. This may be less
than the total number of bytes affected if the starting address was
not aligned to a region's starting address or if the length was
greater than the number of bytes in the first region.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
**/
EFI_STATUS
EFIAPI
LegacyRegion2Lock (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
IN UINT32 Start,
IN UINT32 Length,
OUT UINT32 *Granularity
);
/**
Modify the hardware to disallow memory attribute changes in a region.
This function makes the attributes of a region read only. Once a region is boot-locked with this
function, the read and write attributes of that region cannot be changed until a power cycle has
reset the boot-lock attribute. Calls to Decode(), Lock() and Unlock() will have no effect.
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param Start[in] The beginning of the physical address of the region whose
attributes should be modified.
@param Length[in] The number of bytes of memory whose attributes should be modified.
The actual number of bytes modified may be greater than the number
specified.
@param Granularity[out] The number of bytes in the last region affected. This may be less
than the total number of bytes affected if the starting address was
not aligned to a region's starting address or if the length was
greater than the number of bytes in the first region.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
@retval EFI_UNSUPPORTED The chipset does not support locking the configuration registers in
a way that will not affect memory regions outside the legacy memory
region.
**/
EFI_STATUS
EFIAPI
LegacyRegion2BootLock (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
IN UINT32 Start,
IN UINT32 Length,
OUT UINT32 *Granularity
);
/**
Modify the hardware to allow memory writes in a region.
This function changes the attributes of a memory range to allow writes.
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param Start[in] The beginning of the physical address of the region whose
attributes should be modified.
@param Length[in] The number of bytes of memory whose attributes should be modified.
The actual number of bytes modified may be greater than the number
specified.
@param Granularity[out] The number of bytes in the last region affected. This may be less
than the total number of bytes affected if the starting address was
not aligned to a region's starting address or if the length was
greater than the number of bytes in the first region.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
**/
EFI_STATUS
EFIAPI
LegacyRegion2Unlock (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
IN UINT32 Start,
IN UINT32 Length,
OUT UINT32 *Granularity
);
/**
Get region information for the attributes of the Legacy Region.
This function is used to discover the granularity of the attributes for the memory in the legacy
region. Each attribute may have a different granularity and the granularity may not be the same
for all memory ranges in the legacy region.
@param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
@param DescriptorCount[out] The number of region descriptor entries returned in the Descriptor
buffer.
@param Descriptor[out] A pointer to a pointer used to return a buffer where the legacy
region information is deposited. This buffer will contain a list of
DescriptorCount number of region descriptors. This function will
provide the memory for the buffer.
@retval EFI_SUCCESS The region's attributes were successfully modified.
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
**/
EFI_STATUS
EFIAPI
LegacyRegionGetInfo (
IN EFI_LEGACY_REGION2_PROTOCOL *This,
OUT UINT32 *DescriptorCount,
OUT EFI_LEGACY_REGION_DESCRIPTOR **Descriptor
);
#endif

View File

@@ -1,53 +0,0 @@
## @file
# Implementation of Legacy Region 2 Protocol based on Framework Legacy Region Protocol.
#
# Intel's Framework Legacy Region Protocol is replaced by Legacy Region 2 Protocol in PI 1.2.
# This module produces PI Legacy Region 2 Protocol on top of Framework Legacy Region Protocol.
#
# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = LegacyRegion2OnLegacyRegionThunk
FILE_GUID = 5167FD5D-AAA2-4FE1-9D0D-5CFCAB36C14C
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = LegacyRegion2OnLegacyRegionThunkInitialize
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
LegacyRegion2OnLegacyRegionThunk.c
LegacyRegion2OnLegacyRegionThunk.h
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
DebugLib
UefiBootServicesTableLib
[Protocols]
gEfiLegacyRegion2ProtocolGuid ## PRODUCES
gEfiLegacyRegionProtocolGuid ## CONSUMES
[Depex]
gEfiLegacyRegionProtocolGuid

View File

@@ -1,501 +0,0 @@
/** @file
Language Library implementation that provides functions for language conversion
between ISO 639-2 and RFC 4646 language codes.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include <Uefi.h>
#include <Library/LanguageLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
//
// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes
// Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.
// The last 2 CHAR8 values are the ISO 639-1 code.
//
// ISO 639-2 B codes and deprecated ISO 639-1 codes are not supported.
//
// Commonly used language codes such as English and French are put in the front of the table for quick match.
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mIso639ToRfc4646ConversionTable[] =
"\
engen\
frafr\
aaraa\
abkab\
aveae\
afraf\
akaak\
amham\
argan\
araar\
asmas\
avaav\
aymay\
azeaz\
bakba\
belbe\
bulbg\
bihbh\
bisbi\
bambm\
benbn\
bodbo\
brebr\
bosbs\
catca\
chece\
chach\
cosco\
crecr\
cescs\
chucu\
chvcv\
cymcy\
danda\
deude\
divdv\
dzodz\
eweee\
ellel\
epoeo\
spaes\
estet\
euseu\
fasfa\
fulff\
finfi\
fijfj\
faofo\
fryfy\
glega\
glagd\
glggl\
grngn\
gujgu\
glvgv\
hauha\
hebhe\
hinhi\
hmoho\
hrvhr\
hatht\
hunhu\
hyehy\
herhz\
inaia\
indid\
ileie\
iboig\
iiiii\
ipkik\
idoio\
islis\
itait\
ikuiu\
jpnja\
javjv\
katka\
konkg\
kikki\
kuakj\
kazkk\
kalkl\
khmkm\
kankn\
korko\
kaukr\
kasks\
kurku\
komkv\
corkw\
kirky\
latla\
ltzlb\
luglg\
limli\
linln\
laolo\
litlt\
lublu\
lavlv\
mlgmg\
mahmh\
mrimi\
mkdmk\
malml\
monmn\
marmr\
msams\
mltmt\
myamy\
nauna\
nobnb\
ndend\
nepne\
ndong\
nldnl\
nnonn\
norno\
nblnr\
navnv\
nyany\
ocioc\
ojioj\
ormom\
orior\
ossos\
panpa\
plipi\
polpl\
pusps\
porpt\
quequ\
rohrm\
runrn\
ronro\
rusru\
kinrw\
sansa\
srdsc\
sndsd\
smese\
sagsg\
sinsi\
slksk\
slvsl\
smosm\
snasn\
somso\
sqisq\
srpsr\
sswss\
sotst\
sunsu\
swesv\
swasw\
tamta\
telte\
tgktg\
thath\
tirti\
tuktk\
tgltl\
tsntn\
tonto\
turtr\
tsots\
tattt\
twitw\
tahty\
uigug\
ukruk\
urdur\
uzbuz\
venve\
vievi\
volvo\
wlnwa\
wolwo\
xhoxh\
yidyi\
yoryo\
zhaza\
zhozh\
zulzu\
";
/**
Converts upper case ASCII characters in an ASCII string to lower case ASCII
characters in an ASCII string.
If a an ASCII character in Source is in the range 'A'..'Z', then it is converted
to an ASCII character in the range 'a'..'z' in Destination. Otherwise, no
conversion is performed. Length ASCII characters from Source are convertered and
stored in Destination.
@param Destination An ASCII string to store the results of the conversion.
@param Source The source ASCII string of the conversion.
@param Length The number of ASCII characters to convert.
**/
VOID
EFIAPI
InternalLanguageLibToLower (
OUT CHAR8 *Destination,
IN CONST CHAR8 *Source,
IN UINTN Length
)
{
for (; Length > 0; Length--, Destination++, Source++) {
*Destination = (CHAR8)((*Source >= 'A' && *Source <= 'Z') ? *Source + ('a' - 'A') : *Source);
}
}
/**
Convert an ISO 639-2 language code to a RFC 4646 language code.
If the ISO 639-2 language code has a corresponding ISO 639-1 code, then the ISO 639-1
code is returned. Else the original ISO 639-2 code is returned. The returned RFC 4646
language code is composed of only a primary language subtag.
If Iso639Language is NULL, then ASSERT.
If Rfc4646Language is NULL, then ASSERT.
@param[out] Rfc4646Language Pointers to a buffer large enough for an ASCII string
which reprsents a RFC 4646 language code containging only
either a ISO 639-1 or ISO 639-2 primary language subtag.
This string is Null-terminated.
@param[in] Iso639Language Pointer to a 3-letter ASCII string which represents
an ISO 639-2 language code. This string is not required
to be Null-terminated.
@retval TRUE The ISO 639-2 language code was converted to a ISO 639-1 code.
@retval FALSE The language code does not have corresponding ISO 639-1 code.
**/
BOOLEAN
EFIAPI
ConvertIso639ToRfc4646 (
OUT CHAR8 *Rfc4646Language,
IN CONST CHAR8 *Iso639Language
)
{
CONST CHAR8 *Match;
ASSERT (Iso639Language != NULL);
ASSERT (Rfc4646Language != NULL);
//
// Convert first 3 characters of Iso639Language to lower case ASCII characters in Rfc4646Language
//
InternalLanguageLibToLower (Rfc4646Language, Iso639Language, 3);
Rfc4646Language[3] = '\0';
Match = mIso639ToRfc4646ConversionTable;
do {
Match = AsciiStrStr (Match, Rfc4646Language);
if (Match == NULL) {
return FALSE;
}
if (((Match - mIso639ToRfc4646ConversionTable) % 5) == 0) {
break;
}
++Match;
} while (TRUE);
Rfc4646Language[0] = Match[3];
Rfc4646Language[1] = Match[4];
Rfc4646Language[2] = '\0';
return TRUE;
}
/**
Convert a RFC 4646 language code to an ISO 639-2 language code. The primary language
subtag of the RFC 4646 code must be either an ISO 639-1 or 639-2 code. If the primary
language subtag is an ISO 639-1 code, then it is converted to its corresponding ISO 639-2
code (T code if applies). Else the ISO 639-2 code is returned.
If Rfc4646Language is NULL, then ASSERT.
If Iso639Language is NULL, then ASSERT.
@param[out] Iso639Language Pointers to a buffer large enough for a 3-letter ASCII string
which reprsents an ISO 639-2 language code. The string is Null-terminated.
@param[in] Rfc4646Language Pointer to a RFC 4646 language code string. This string is terminated
by a NULL or a ';' character.
@retval TRUE Language code converted successfully.
@retval FALSE The RFC 4646 language code is invalid or unsupported.
**/
BOOLEAN
EFIAPI
ConvertRfc4646ToIso639 (
OUT CHAR8 *Iso639Language,
IN CONST CHAR8 *Rfc4646Language
)
{
CONST CHAR8 *Match;
ASSERT (Rfc4646Language != NULL);
ASSERT (Iso639Language != NULL);
//
// RFC 4646 language code check before determining
// if the primary language subtag is ISO 639-1 or 639-2 code
//
if (Rfc4646Language[0] == '\0' || Rfc4646Language[1] == '\0') {
return FALSE;
}
//
// Check if the primary language subtag is ISO 639-1 code
//
if (Rfc4646Language[2] == ';' || Rfc4646Language[2] == '-' || Rfc4646Language[2] == '\0') {
//
// Convert first 2 characters of Rfc4646Language to lower case ASCII characters in Iso639Language
//
InternalLanguageLibToLower (Iso639Language, Rfc4646Language, 2);
//
// Convert ISO 639-1 code to ISO 639-2 code
//
Iso639Language[2] = '\0';
Match = mIso639ToRfc4646ConversionTable;
do {
Match = AsciiStrStr (Match, Iso639Language);
if (Match == NULL) {
return FALSE;
}
if (((Match - mIso639ToRfc4646ConversionTable) % 5) == 3) {
break;
}
++Match;
} while (TRUE);
Rfc4646Language = Match - 3;
} else if (!(Rfc4646Language[3] == ';' || Rfc4646Language[3] == '-' || Rfc4646Language[3] == '\0')) {
return FALSE;
}
Iso639Language[0] = Rfc4646Language[0];
Iso639Language[1] = Rfc4646Language[1];
Iso639Language[2] = Rfc4646Language[2];
Iso639Language[3] = '\0';
return TRUE;
}
/**
Convert ISO 639-2 language codes to RFC 4646 codes and return the converted codes.
Caller is responsible for freeing the allocated buffer.
If Iso639Languages is NULL, then ASSERT.
@param[in] Iso639Languages Pointers to a Null-terminated ISO 639-2 language codes string containing
one or more ISO 639-2 3-letter language codes.
@retval NULL Invalid ISO 639-2 language code found.
@retval NULL Out of memory.
@return Pointer to the allocate buffer containing the Null-terminated converted language codes string.
This string is composed of one or more RFC4646 language codes each of which has only
ISO 639-1 2-letter primary language subtag.
**/
CHAR8 *
EFIAPI
ConvertLanguagesIso639ToRfc4646 (
IN CONST CHAR8 *Iso639Languages
)
{
UINTN Length;
UINTN Iso639Index;
UINTN Rfc4646Index;
CHAR8 *Rfc4646Languages;
ASSERT (Iso639Languages != NULL);
//
// The length of ISO 639-2 lanugage codes string must be multiple of 3
//
Length = AsciiStrLen (Iso639Languages);
if (Length % 3 != 0) {
return NULL;
}
//
// Allocate buffer for RFC 4646 language codes string
//
Rfc4646Languages = AllocatePool (Length + (Length / 3));
if (Rfc4646Languages == NULL) {
return NULL;
}
for (Iso639Index = 0, Rfc4646Index = 0; Iso639Languages[Iso639Index] != '\0'; Iso639Index += 3) {
if (ConvertIso639ToRfc4646 (&Rfc4646Languages[Rfc4646Index], &Iso639Languages[Iso639Index])) {
Rfc4646Index += 2;
} else {
Rfc4646Index += 3;
}
Rfc4646Languages[Rfc4646Index++] = ';';
}
Rfc4646Languages[Rfc4646Index - 1] = '\0';
return Rfc4646Languages;
}
/**
Convert RFC 4646 language codes to ISO 639-2 codes and return the converted codes.
The primary language subtag of the RFC 4646 code must be either an ISO 639-1 or 639-2 code.
Caller is responsible for freeing the allocated buffer.
If Rfc4646Languages is NULL, then ASSERT.
@param[in] Rfc4646Languages Pointers to a Null-terminated RFC 4646 language codes string containing
one or more RFC 4646 language codes.
@retval NULL Invalid or unsupported RFC 4646 language code found.
@retval NULL Out of memory.
@return Pointer to the allocate buffer containing the Null-terminated converted language codes string.
This string is composed of one or more ISO 639-2 language codes.
**/
CHAR8 *
EFIAPI
ConvertLanguagesRfc4646ToIso639 (
IN CONST CHAR8 *Rfc4646Languages
)
{
UINTN NumLanguages;
UINTN Iso639Index;
UINTN Rfc4646Index;
CHAR8 *Iso639Languages;
ASSERT (Rfc4646Languages != NULL);
//
// Determine the number of languages in the RFC 4646 language codes string
//
for (Rfc4646Index = 0, NumLanguages = 1; Rfc4646Languages[Rfc4646Index] != '\0'; Rfc4646Index++) {
if (Rfc4646Languages[Rfc4646Index] == ';') {
NumLanguages++;
}
}
//
// Allocate buffer for ISO 639-2 language codes string
//
Iso639Languages = AllocateZeroPool (NumLanguages * 3 + 1);
if (Iso639Languages == NULL) {
return NULL;
}
//
// Do the conversion for each RFC 4646 language code
//
for (Rfc4646Index = 0, Iso639Index = 0; Rfc4646Languages[Rfc4646Index] != '\0';) {
if (ConvertRfc4646ToIso639 (&Iso639Languages[Iso639Index], &Rfc4646Languages[Rfc4646Index])) {
Iso639Index += 3;
} else {
FreePool (Iso639Languages);
return NULL;
}
//
// Locate next language code
//
while (Rfc4646Languages[Rfc4646Index] != ';' && Rfc4646Languages[Rfc4646Index] != '\0') {
Rfc4646Index++;
}
if (Rfc4646Languages[Rfc4646Index] == ';') {
Rfc4646Index++;
}
}
Iso639Languages[Iso639Index] = '\0';
return Iso639Languages;
}

View File

@@ -1,41 +0,0 @@
## @file
# Instance of Language Library.
#
# The Language Library implementation that provides functions for language conversion
# between ISO 639-2 and RFC 4646 language codes.
#
# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = UefiLanguageLib
FILE_GUID = 283cad13-a151-4d55-be2d-96ea57392a82
MODULE_TYPE = UEFI_DRIVER
VERSION_STRING = 1.0
LIBRARY_CLASS = LanguageLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
UefiLanguageLib.c
[Packages]
MdePkg/MdePkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
BaseLib
DebugLib
MemoryAllocationLib

View File

@@ -1,26 +0,0 @@
;------------------------------------------------------------------------------
; Include file for IA32 MpFuncs.asm
;
; Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
; 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.
;
;------------------------------------------------------------------------------
VacantFlag Equ 00h
NotVacantFlag Equ 0ffh
LockLocation equ RendezvousFunnelProcEnd - RendezvousFunnelProcStart
StackStart equ LockLocation + 4h
StackSize equ LockLocation + 8h
RendezvousProc equ LockLocation + 0Ch
GdtrProfile equ LockLocation + 10h
IdtrProfile equ LockLocation + 16h
BufferStart equ LockLocation + 1Ch
ProcessorNumber equ LockLocation + 20h
;-------------------------------------------------------------------------------

View File

@@ -1,174 +0,0 @@
#------------------------------------------------------------------------------
# IA32 assembly file for AP startup vector.
#
# Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
# 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.
#
#------------------------------------------------------------------------------
#define VacantFlag 0x0
#define NotVacantFlag 0xff
#define LockLocation RendezvousFunnelProcEnd - RendezvousFunnelProcStart
#define StackStart RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x04
#define StackSize RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x08
#define RendezvousProc RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x0C
#define GdtrProfile RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x10
#define IdtrProfile RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x16
#define BufferStart RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x1C
#define ProcessorNumber RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x20
#-------------------------------------------------------------------------------------
#RendezvousFunnelProc procedure follows. All APs execute their procedure. This
#procedure serializes all the AP processors through an Init sequence. It must be
#noted that APs arrive here very raw...ie: real mode, no stack.
#ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
#IS IN MACHINE CODE.
#-------------------------------------------------------------------------------------
#RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
ASM_GLOBAL ASM_PFX(RendezvousFunnelProc)
ASM_PFX(RendezvousFunnelProc):
RendezvousFunnelProcStart:
# At this point CS = 0x(vv00) and ip= 0x0.
.byte 0x8c,0xc8 # mov ax, cs
.byte 0x8e,0xd8 # mov ds, ax
.byte 0x8e,0xc0 # mov es, ax
.byte 0x8e,0xd0 # mov ss, ax
.byte 0x33,0xc0 # xor ax, ax
.byte 0x8e,0xe0 # mov fs, ax
.byte 0x8e,0xe8 # mov gs, ax
# Switch to flat mode.
.byte 0xBE
.word BufferStart
.byte 0x66,0x8B,0xC # mov ecx,dword ptr [si] ; ECX is keeping the start address of wakeup buffer
.byte 0xFA # cli
.byte 0xBE
.word GdtrProfile
.byte 0x66 # db 66h
.byte 0x2E,0xF,0x1,0x14 # lgdt fword ptr cs:[si]
.byte 0xBE
.word IdtrProfile
.byte 0x66 # db 66h
.byte 0x2E,0xF,0x1,0x1C # lidt fword ptr cs:[si]
.byte 0x33,0xC0 # xor ax, ax
.byte 0x8E,0xD8 # mov ds, ax
.byte 0xF,0x20,0xC0 # mov eax, cr0 ; Get control register 0
.byte 0x66,0x83,0xC8,0x1 # or eax, 000000001h ; Set PE bit (bit #0)
.byte 0xF,0x22,0xC0 # mov cr0, eax
#step-4:
FLAT32_JUMP:
.byte 0x66
.byte 0x67
.byte 0xEA # far jump
.long 0x0
.word 0x10
ProtectedModeStart: # protected mode entry point
movw $0x8,%ax
.byte 0x66
movw %ax,%ds
.byte 0x66
movw %ax,%es
.byte 0x66
movw %ax,%fs
.byte 0x66
movw %ax,%gs
.byte 0x66
movw %ax,%ss # Flat mode setup.
#
# ProgramStack
#
movl $0x1b, %ecx
rdmsr
btl $10, %eax # Check for x2apic mode
jnc LegacyApicMode
movl $0x802, %ecx # Read APIC_ID
rdmsr
movl %eax, %ebx # ebx == apicid
jmp GetCpuNumber
LegacyApicMode:
andl $0xfffff000, %eax
addl $0x20, %eax
movl (%eax), %ebx
shrl $24, %ebx # ebx == apicid
GetCpuNumber:
xorl %ecx, %ecx
movl %esi,%edi
addl $ProcessorNumber, %edi
movl (%edi, %ebx, 4), %ecx
movl %esi,%edi
addl $StackSize, %edi
movl (%edi), %eax
incl %ecx
mull %ecx
movl %esi,%edi
addl $StackStart, %edi
movl (%edi), %ebx
addl %ebx, %eax
movl %eax, %esp
#
# Call C Function
#
movl %esi,%edi
addl $RendezvousProc, %edi
movl (%edi), %ebx
testl %ebx,%ebx
jz GoToSleep
call *%ebx # Call C function
#Step-6: Sleep
GoToSleep:
cli
hlt
jmp GoToSleep
RendezvousFunnelProcEnd:
#-------------------------------------------------------------------------------------
# AsmGetAddressMap (&AddressMap);
#-------------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(AsmGetAddressMap)
ASM_PFX(AsmGetAddressMap):
pushal
movl %esp,%ebp
movl 0x24(%ebp), %ebx
movl $RendezvousFunnelProcStart, (%ebx)
movl $(ProtectedModeStart - RendezvousFunnelProcStart), 0x4(%ebx)
movl $(FLAT32_JUMP - RendezvousFunnelProcStart), 0x8(%ebx)
movl $0, 0x0c(%ebx)
movl $0, 0x10(%ebx)
movl $(RendezvousFunnelProcEnd - RendezvousFunnelProcStart), 0x14(%ebx)
popal
ret

View File

@@ -1,167 +0,0 @@
;------------------------------------------------------------------------------
; IA32 assembly file for AP startup vector.
;
; Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
; 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.
;
;------------------------------------------------------------------------------
.686p
.model flat
.code
include AsmInclude.inc
;-------------------------------------------------------------------------------------
FJMP32 MACRO Selector, Offset
DB 066h
DB 067h
DB 0EAh ; far jump
DD Offset ; 32-bit offset
DW Selector ; 16-bit selector
ENDM
;-------------------------------------------------------------------------------------
;RendezvousFunnelProc procedure follows. All APs execute their procedure. This
;procedure serializes all the AP processors through an Init sequence. It must be
;noted that APs arrive here very raw...ie: real mode, no stack.
;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
;IS IN MACHINE CODE.
;-------------------------------------------------------------------------------------
;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
RendezvousFunnelProc PROC near C PUBLIC
RendezvousFunnelProcStart::
; At this point CS = 0x(vv00) and ip= 0x0.
db 8ch, 0c8h ; mov ax, cs
db 8eh, 0d8h ; mov ds, ax
db 8eh, 0c0h ; mov es, ax
db 8eh, 0d0h ; mov ss, ax
db 33h, 0c0h ; xor ax, ax
db 8eh, 0e0h ; mov fs, ax
db 8eh, 0e8h ; mov gs, ax
; Switch to flat mode.
db 0BEh
dw BufferStart ; mov si, BufferStart
db 66h, 8Bh, 0Ch ; mov ecx,dword ptr [si] ; ECX is keeping the start address of wakeup buffer
db 0FAh ; cli
db 0BEh
dw GdtrProfile ; mov si, GdtrProfile
db 66h ; db 66h
db 2Eh,0Fh, 01h, 14h ; lgdt fword ptr cs:[si]
db 0BEh
dw IdtrProfile ; mov si, IdtrProfile
db 66h ; db 66h
db 2Eh,0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]
db 33h, 0C0h ; xor ax, ax
db 8Eh, 0D8h ; mov ds, ax
db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0
db 66h, 83h, 0C8h, 01h ; or eax, 000000001h ; Set PE bit (bit #0)
db 0Fh, 22h, 0C0h ; mov cr0, eax
FLAT32_JUMP::
FJMP32 010h,0h ; Far jmp using code segment descriptor
ProtectedModeStart:: ; protected mode entry point
mov ax, 8h
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax ; Flat mode setup.
;
; ProgramStack
;
mov ecx, 1bh ; Read IA32_APIC_BASE MSR
rdmsr
bt eax, 10 ; Check for x2apic mode
jnc LegacyApicMode
mov ecx, 802h ; Read APIC_ID
rdmsr
mov ebx, eax ; ebx == apicid
jmp GetCpuNumber
LegacyApicMode::
and eax, 0fffff000h
add eax, 20h
mov ebx, dword ptr [eax]
shr ebx, 24 ; ebx == apicid
GetCpuNumber::
xor ecx, ecx
mov edi, esi
add edi, ProcessorNumber
mov ecx, dword ptr [edi + 4 * ebx] ; ECX = CpuNumber
mov edi, esi
add edi, StackSize
mov eax, dword ptr [edi]
inc ecx
mul ecx ; EAX = StackSize * (CpuNumber + 1)
mov edi, esi
add edi, StackStart
mov ebx, dword ptr [edi]
add eax, ebx ; EAX = StackStart + StackSize * (CpuNumber + 1)
mov esp, eax
;
; Call C Function
;
mov edi, esi
add edi, RendezvousProc
mov ebx, dword ptr [edi]
test ebx, ebx
jz GoToSleep
call ebx ; Call C function
GoToSleep::
cli
hlt
jmp $-2
RendezvousFunnelProc ENDP
RendezvousFunnelProcEnd::
;-------------------------------------------------------------------------------------
; AsmGetAddressMap (&AddressMap);
;-------------------------------------------------------------------------------------
AsmGetAddressMap PROC near C PUBLIC
pushad
mov ebp,esp
mov ebx, dword ptr [ebp+24h]
mov dword ptr [ebx], RendezvousFunnelProcStart
mov dword ptr [ebx+4h], ProtectedModeStart - RendezvousFunnelProcStart
mov dword ptr [ebx+8h], FLAT32_JUMP - RendezvousFunnelProcStart
mov dword ptr [ebx+0ch], 0
mov dword ptr [ebx+10h], 0
mov dword ptr [ebx+14h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
popad
ret
AsmGetAddressMap ENDP
END

View File

@@ -1,533 +0,0 @@
/** @file
Include file for PI MP Services Protocol Thunk.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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:
**/
#ifndef _MP_SERVICES_ON_FRAMEWORK_MP_SERVICES_THUNK_
#define _MP_SERVICES_ON_FRAMEWORK_MP_SERVICES_THUNK_
#include <Protocol/MpService.h>
#include <Protocol/FrameworkMpService.h>
#include <Protocol/GenericMemoryTest.h>
#include <Library/BaseLib.h>
#include <Library/SynchronizationLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/DxeServicesTableLib.h>
#include <Library/IoLib.h>
#include <Library/TimerLib.h>
#include <Library/DebugAgentLib.h>
#include <Library/LocalApicLib.h>
#define AP_STACK_SIZE 0x8000
#define MAX_CPU_NUMBER 256
//
// Bit definition for IPI
//
#define BROADCAST_MODE_ALL_EXCLUDING_SELF_BIT 0xC0000
#define SPECIFY_CPU_MODE_BIT 0x00000
#define TRIGGER_MODE_LEVEL_BIT 0x08000
#define ASSERT_BIT 0x04000
//
// Local APIC register definition for IPI.
//
#define APIC_REGISTER_SPURIOUS_VECTOR_OFFSET 0xF0
#define APIC_REGISTER_ICR_LOW_OFFSET 0x300
#define APIC_REGISTER_ICR_HIGH_OFFSET 0x310
#define APIC_REGISTER_LVT_TIMER 0x320
#define APIC_REGISTER_TIMER_INIT_COUNT 0x380
#define APIC_REGISTER_LINT0_VECTOR_OFFSET 0x350
#define APIC_REGISTER_LINT1_VECTOR_OFFSET 0x360
#define APIC_REGISTER_TIMER_COUNT 0x390
#define APIC_REGISTER_TIMER_DIVIDE 0x3E0
//
// Definition for MSR address
//
#define MSR_IA32_TIME_STAMP_COUNTER 0x10
#define MSR_IA32_APIC_BASE 0x1B
typedef struct {
UINTN Lock;
VOID *StackStart;
UINTN StackSize;
VOID *ApFunction;
IA32_DESCRIPTOR GdtrProfile;
IA32_DESCRIPTOR IdtrProfile;
UINT32 BufferStart;
UINT32 Cr3;
UINT32 ProcessorNumber[MAX_CPU_NUMBER];
} MP_CPU_EXCHANGE_INFO;
typedef struct {
UINT8 *RendezvousFunnelAddress;
UINTN PModeEntryOffset;
UINTN FlatJumpOffset;
UINTN LModeEntryOffset;
UINTN LongJumpOffset;
UINTN Size;
} MP_ASSEMBLY_ADDRESS_MAP;
typedef enum {
CpuStateIdle,
CpuStateReady,
CpuStateBusy,
CpuStateFinished,
CpuStateDisabled
} CPU_STATE;
//
// Define Individual Processor Data block.
//
typedef struct {
EFI_AP_PROCEDURE volatile Procedure;
VOID* volatile Parameter;
EFI_EVENT WaitEvent;
BOOLEAN *Finished;
UINT64 ExpectedTime;
UINT64 CurrentTime;
UINT64 TotalTime;
SPIN_LOCK CpuDataLock;
CPU_STATE volatile State;
} CPU_DATA_BLOCK;
//
// Define MP data block which consumes individual processor block.
//
typedef struct {
SPIN_LOCK APSerializeLock;
EFI_EVENT CheckAPsEvent;
UINTN FinishCount;
UINTN StartCount;
BOOLEAN CpuList[MAX_CPU_NUMBER];
EFI_AP_PROCEDURE Procedure;
VOID *ProcArguments;
BOOLEAN SingleThread;
EFI_EVENT WaitEvent;
UINTN **FailedCpuList;
UINT64 ExpectedTime;
UINT64 CurrentTime;
UINT64 TotalTime;
CPU_DATA_BLOCK CpuData[MAX_CPU_NUMBER];
} MP_SYSTEM_DATA;
/**
Implementation of GetNumberOfProcessors() service of MP Services Protocol.
This service retrieves the number of logical processor in the platform
and the number of those logical processors that are enabled on this boot.
This service may only be called from the BSP.
@param This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
@param NumberOfProcessors Pointer to the total number of logical processors in the system,
including the BSP and disabled APs.
@param NumberOfEnabledProcessors Pointer to the number of enabled logical processors that exist
in system, including the BSP.
@retval EFI_SUCCESS Number of logical processors and enabled logical processors retrieved..
@retval EFI_DEVICE_ERROR Caller processor is AP.
@retval EFI_INVALID_PARAMETER NumberOfProcessors is NULL
@retval EFI_INVALID_PARAMETER NumberOfEnabledProcessors is NULL
**/
EFI_STATUS
EFIAPI
GetNumberOfProcessors (
IN EFI_MP_SERVICES_PROTOCOL *This,
OUT UINTN *NumberOfProcessors,
OUT UINTN *NumberOfEnabledProcessors
);
/**
Implementation of GetNumberOfProcessors() service of MP Services Protocol.
Gets detailed MP-related information on the requested processor at the
instant this call is made. This service may only be called from the BSP.
@param This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
@param ProcessorNumber The handle number of processor.
@param ProcessorInfoBuffer A pointer to the buffer where information for the requested processor is deposited.
@retval EFI_SUCCESS Processor information successfully returned.
@retval EFI_DEVICE_ERROR Caller processor is AP.
@retval EFI_INVALID_PARAMETER ProcessorInfoBuffer is NULL
@retval EFI_NOT_FOUND Processor with the handle specified by ProcessorNumber does not exist.
**/
EFI_STATUS
EFIAPI
GetProcessorInfo (
IN EFI_MP_SERVICES_PROTOCOL *This,
IN UINTN ProcessorNumber,
OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer
);
/**
Implementation of StartupAllAPs() service of MP Services Protocol.
This service lets the caller get all enabled APs to execute a caller-provided function.
This service may only be called from the BSP.
@param This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
@param Procedure A pointer to the function to be run on enabled APs of the system.
@param SingleThread Indicates whether to execute the function simultaneously or one by one..
@param WaitEvent The event created by the caller.
If it is NULL, then execute in blocking mode.
If it is not NULL, then execute in non-blocking mode.
@param TimeoutInMicroSeconds The time limit in microseconds for this AP to finish the function.
Zero means infinity.
@param ProcedureArgument Pointer to the optional parameter of the assigned function.
@param FailedCpuList The list of processor numbers that fail to finish the function before
TimeoutInMicrosecsond expires.
@retval EFI_SUCCESS In blocking mode, all APs have finished before the timeout expired.
@retval EFI_SUCCESS In non-blocking mode, function has been dispatched to all enabled APs.
@retval EFI_DEVICE_ERROR Caller processor is AP.
@retval EFI_NOT_STARTED No enabled AP exists in the system.
@retval EFI_NOT_READY Any enabled AP is busy.
@retval EFI_TIMEOUT In blocking mode, The timeout expired before all enabled APs have finished.
@retval EFI_INVALID_PARAMETER Procedure is NULL.
**/
EFI_STATUS
EFIAPI
StartupAllAPs (
IN EFI_MP_SERVICES_PROTOCOL *This,
IN EFI_AP_PROCEDURE Procedure,
IN BOOLEAN SingleThread,
IN EFI_EVENT WaitEvent OPTIONAL,
IN UINTN TimeoutInMicroSeconds,
IN VOID *ProcedureArgument OPTIONAL,
OUT UINTN **FailedCpuList OPTIONAL
);
/**
Implementation of StartupThisAP() service of MP Services Protocol.
This service lets the caller get one enabled AP to execute a caller-provided function.
This service may only be called from the BSP.
@param This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
@param Procedure A pointer to the function to be run on the designated AP.
@param ProcessorNumber The handle number of AP..
@param WaitEvent The event created by the caller.
If it is NULL, then execute in blocking mode.
If it is not NULL, then execute in non-blocking mode.
@param TimeoutInMicroseconds The time limit in microseconds for this AP to finish the function.
Zero means infinity.
@param ProcedureArgument Pointer to the optional parameter of the assigned function.
@param Finished Indicates whether AP has finished assigned function.
In blocking mode, it is ignored.
@retval EFI_SUCCESS In blocking mode, specified AP has finished before the timeout expires.
@retval EFI_SUCCESS In non-blocking mode, function has been dispatched to specified AP.
@retval EFI_DEVICE_ERROR Caller processor is AP.
@retval EFI_TIMEOUT In blocking mode, the timeout expires before specified AP has finished.
@retval EFI_NOT_READY Specified AP is busy.
@retval EFI_NOT_FOUND Processor with the handle specified by ProcessorNumber does not exist.
@retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP or disabled AP.
@retval EFI_INVALID_PARAMETER Procedure is NULL.
**/
EFI_STATUS
EFIAPI
StartupThisAP (
IN EFI_MP_SERVICES_PROTOCOL *This,
IN EFI_AP_PROCEDURE Procedure,
IN UINTN ProcessorNumber,
IN EFI_EVENT WaitEvent OPTIONAL,
IN UINTN TimeoutInMicroseconds,
IN VOID *ProcedureArgument OPTIONAL,
OUT BOOLEAN *Finished OPTIONAL
);
/**
Implementation of SwitchBSP() service of MP Services Protocol.
This service switches the requested AP to be the BSP from that point onward.
This service may only be called from the current BSP.
@param This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
@param ProcessorNumber The handle number of processor.
@param EnableOldBSP Whether to enable or disable the original BSP.
@retval EFI_SUCCESS BSP successfully switched.
@retval EFI_DEVICE_ERROR Caller processor is AP.
@retval EFI_NOT_FOUND Processor with the handle specified by ProcessorNumber does not exist.
@retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP or disabled AP.
@retval EFI_NOT_READY Specified AP is busy.
**/
EFI_STATUS
EFIAPI
SwitchBSP (
IN EFI_MP_SERVICES_PROTOCOL *This,
IN UINTN ProcessorNumber,
IN BOOLEAN EnableOldBSP
);
/**
Implementation of EnableDisableAP() service of MP Services Protocol.
This service lets the caller enable or disable an AP.
This service may only be called from the BSP.
@param This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
@param ProcessorNumber The handle number of processor.
@param EnableAP Indicates whether the newstate of the AP is enabled or disabled.
@param HealthFlag Indicates new health state of the AP..
@retval EFI_SUCCESS AP successfully enabled or disabled.
@retval EFI_DEVICE_ERROR Caller processor is AP.
@retval EFI_NOT_FOUND Processor with the handle specified by ProcessorNumber does not exist.
@retval EFI_INVALID_PARAMETERS ProcessorNumber specifies the BSP.
**/
EFI_STATUS
EFIAPI
EnableDisableAP (
IN EFI_MP_SERVICES_PROTOCOL *This,
IN UINTN ProcessorNumber,
IN BOOLEAN EnableAP,
IN UINT32 *HealthFlag OPTIONAL
);
/**
Implementation of WhoAmI() service of MP Services Protocol.
This service lets the caller processor get its handle number.
This service may be called from the BSP and APs.
@param This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.
@param ProcessorNumber Pointer to the handle number of AP.
@retval EFI_SUCCESS Processor number successfully returned.
@retval EFI_INVALID_PARAMETER ProcessorNumber is NULL
**/
EFI_STATUS
EFIAPI
WhoAmI (
IN EFI_MP_SERVICES_PROTOCOL *This,
OUT UINTN *ProcessorNumber
);
/**
Checks APs' status periodically.
This function is triggered by timer periodically to check the
state of APs for StartupAllAPs() and StartupThisAP() executed
in non-blocking mode.
@param Event Event triggered.
@param Context Parameter passed with the event.
**/
VOID
EFIAPI
CheckAPsStatus (
IN EFI_EVENT Event,
IN VOID *Context
);
/**
Checks status of all APs.
This function checks whether all APs have finished task assigned by StartupAllAPs(),
and whether timeout expires.
@retval EFI_SUCCESS All APs have finished task assigned by StartupAllAPs().
@retval EFI_TIMEOUT The timeout expires.
@retval EFI_NOT_READY APs have not finished task and timeout has not expired.
**/
EFI_STATUS
CheckAllAPs (
VOID
);
/**
Checks status of specified AP.
This function checks whether specified AP has finished task assigned by StartupThisAP(),
and whether timeout expires.
@param ProcessorNumber The handle number of processor.
@retval EFI_SUCCESS Specified AP has finished task assigned by StartupThisAPs().
@retval EFI_TIMEOUT The timeout expires.
@retval EFI_NOT_READY Specified AP has not finished task and timeout has not expired.
**/
EFI_STATUS
CheckThisAP (
UINTN ProcessorNumber
);
/**
Calculate timeout value and return the current performance counter value.
Calculate the number of performance counter ticks required for a timeout.
If TimeoutInMicroseconds is 0, return value is also 0, which is recognized
as infinity.
@param TimeoutInMicroseconds Timeout value in microseconds.
@param CurrentTime Returns the current value of the performance counter.
@return Expected timestamp counter for timeout.
If TimeoutInMicroseconds is 0, return value is also 0, which is recognized
as infinity.
**/
UINT64
CalculateTimeout (
IN UINTN TimeoutInMicroseconds,
OUT UINT64 *CurrentTime
);
/**
Checks whether timeout expires.
Check whether the number of ellapsed performance counter ticks required for a timeout condition
has been reached. If Timeout is zero, which means infinity, return value is always FALSE.
@param PreviousTime On input, the value of the performance counter when it was last read.
On output, the current value of the performance counter
@param TotalTime The total amount of ellapsed time in performance counter ticks.
@param Timeout The number of performance counter ticks required to reach a timeout condition.
@retval TRUE A timeout condition has been reached.
@retval FALSE A timeout condition has not been reached.
**/
BOOLEAN
CheckTimeout (
IN OUT UINT64 *PreviousTime,
IN UINT64 *TotalTime,
IN UINT64 Timeout
);
/**
Searches for the next waiting AP.
Search for the next AP that is put in waiting state by single-threaded StartupAllAPs().
@param NextProcessorNumber Pointer to the processor number of the next waiting AP.
@retval EFI_SUCCESS The next waiting AP has been found.
@retval EFI_NOT_FOUND No waiting AP exists.
**/
EFI_STATUS
GetNextWaitingProcessorNumber (
OUT UINTN *NextProcessorNumber
);
/**
Wrapper function for all procedures assigned to AP.
Wrapper function for all procedures assigned to AP via MP service protocol.
It controls states of AP and invokes assigned precedure.
**/
VOID
ApProcWrapper (
VOID
);
/**
Function to wake up a specified AP and assign procedure to it.
@param ProcessorNumber Handle number of the specified processor.
@param Procedure Procedure to assign.
@param ProcArguments Argument for Procedure.
**/
VOID
WakeUpAp (
IN UINTN ProcessorNumber,
IN EFI_AP_PROCEDURE Procedure,
IN VOID *ProcArguments
);
/**
Terminate AP's task and set it to idle state.
This function terminates AP's task due to timeout by sending INIT-SIPI,
and sends it to idle state.
@param ProcessorNumber Handle number of the specified processor.
**/
VOID
ResetProcessorToIdleState (
UINTN ProcessorNumber
);
/**
Worker function of EnableDisableAP ()
Worker function of EnableDisableAP (). Changes state of specified processor.
@param ProcessorNumber Processor number of specified AP.
@param NewState Desired state of the specified AP.
@retval EFI_SUCCESS AP's state successfully changed.
**/
EFI_STATUS
ChangeCpuState (
IN UINTN ProcessorNumber,
IN BOOLEAN NewState
);
/**
Gets the processor number of BSP.
@return The processor number of BSP.
**/
UINTN
GetBspNumber (
VOID
);
/**
Get address map of RendezvousFunnelProc.
This function gets address map of RendezvousFunnelProc.
@param AddressMap Output buffer for address map information
**/
VOID
AsmGetAddressMap (
OUT MP_ASSEMBLY_ADDRESS_MAP *AddressMap
);
#endif

View File

@@ -1,72 +0,0 @@
## @file
# Produces PI MP Services Protocol on top of Framework MP Services Protocol.
#
# Intel's Framework MP Services Protocol is replaced by EFI_MP_SERVICES_PROTOCOL in PI 1.1.
# This module produces PI MP Services Protocol on top of Framework MP Services Protocol.
#
# Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = MpServicesOnFrameworkMpServicesThunk
FILE_GUID = 51739E2A-A022-4D73-ADB9-91F0C9BC7142
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = InitializeMpServicesProtocol
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
MpServicesOnFrameworkMpServicesThunk.c
MpServicesOnFrameworkMpServicesThunk.h
[Sources.X64]
X64/MpFuncs.asm
X64/MpFuncs.S
[Sources.IA32]
IA32/MpFuncs.asm
IA32/MpFuncs.S
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
UefiCpuPkg/UefiCpuPkg.dec
[LibraryClasses]
TimerLib
IoLib
UefiBootServicesTableLib
DxeServicesTableLib
MemoryAllocationLib
UefiDriverEntryPoint
BaseMemoryLib
UefiLib
DebugLib
BaseLib
SynchronizationLib
DebugAgentLib
LocalApicLib
[Protocols]
gEfiMpServiceProtocolGuid ## PRODUCES
gFrameworkEfiMpServiceProtocolGuid ## CONSUMES
gEfiGenericMemTestProtocolGuid ## SOMETIMES_CONSUMES
[Depex]
gFrameworkEfiMpServiceProtocolGuid

View File

@@ -1,28 +0,0 @@
;------------------------------------------------------------------------------
; Include file for X64 MpFuncs.asm
;
; Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
; 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.
;
;------------------------------------------------------------------------------
VacantFlag Equ 00h
NotVacantFlag Equ 0ffh
LockLocation equ RendezvousFunnelProcEnd - RendezvousFunnelProcStart
StackStartAddressLocation equ LockLocation + 08h
StackSizeLocation equ LockLocation + 10h
CProcedureLocation equ LockLocation + 18h
GdtrLocation equ LockLocation + 20h
IdtrLocation equ LockLocation + 2Ah
BufferStartLocation equ LockLocation + 34h
Cr3OffsetLocation equ LockLocation + 38h
ProcessorNumberLocation equ LockLocation + 3Ch
;-------------------------------------------------------------------------------

View File

@@ -1,210 +0,0 @@
#------------------------------------------------------------------------------
# X64 assembly file for AP startup vector.
#
# Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
# 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.
#
#------------------------------------------------------------------------------
.set VacantFlag, 0x0
.set NotVacantFlag, 0xff
.set LockLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart
.set StackStartAddressLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x08
.set StackSizeLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x10
.set CProcedureLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x18
.set GdtrLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x20
.set IdtrLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x2A
.set BufferStartLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x34
.set Cr3OffsetLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x38
.set ProcessorNumberLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x38
#-------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------
#RendezvousFunnelProc procedure follows. All APs execute their procedure. This
#procedure serializes all the AP processors through an Init sequence. It must be
#noted that APs arrive here very raw...ie: real mode, no stack.
#ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
#IS IN MACHINE CODE.
#-------------------------------------------------------------------------------------
#RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
.text
ASM_GLOBAL ASM_PFX(RendezvousFunnelProc)
ASM_PFX(RendezvousFunnelProc):
RendezvousFunnelProcStart:
# At this point CS = 0x(vv00) and ip= 0x0.
.byte 0x8c,0xc8 # mov ax, cs
.byte 0x8e,0xd8 # mov ds, ax
.byte 0x8e,0xc0 # mov es, ax
.byte 0x8e,0xd0 # mov ss, ax
.byte 0x33,0xc0 # xor ax, ax
.byte 0x8e,0xe0 # mov fs, ax
.byte 0x8e,0xe8 # mov gs, ax
# Switch to flat mode.
.byte 0xBE
.word BufferStartLocation
.byte 0x66,0x8B,0x14 # mov edx,dword ptr [si] ; EDX is keeping the start address of wakeup buffer
.byte 0xBE
.word Cr3OffsetLocation
.byte 0x66,0x8B,0xC # mov ecx,dword ptr [si] ; ECX is keeping the value of CR3
.byte 0xBE
.word GdtrLocation
.byte 0x66 # db 66h
.byte 0x2E,0xF,0x1,0x14 # lgdt fword ptr cs:[si]
.byte 0xBE
.word IdtrLocation
.byte 0x66 # db 66h
.byte 0x2E,0xF,0x1,0x1C # lidt fword ptr cs:[si]
.byte 0x33,0xC0 # xor ax, ax
.byte 0x8E,0xD8 # mov ds, ax
.byte 0xF,0x20,0xC0 # mov eax, cr0 ; Get control register 0
.byte 0x66,0x83,0xC8,0x1 # or eax, 000000001h ; Set PE bit (bit #0)
.byte 0xF,0x22,0xC0 # mov cr0, eax
FLAT32_JUMP:
.byte 0x66,0x67,0xEA # far jump
.long 0x0 # 32-bit offset
.word 0x20 # 16-bit selector
ProtectedModeStart:
.byte 0x66,0xB8,0x18,0x0 # mov ax, 18h
.byte 0x66,0x8E,0xD8 # mov ds, ax
.byte 0x66,0x8E,0xC0 # mov es, ax
.byte 0x66,0x8E,0xE0 # mov fs, ax
.byte 0x66,0x8E,0xE8 # mov gs, ax
.byte 0x66,0x8E,0xD0 # mov ss, ax ; Flat mode setup.
.byte 0xF,0x20,0xE0 # mov eax, cr4
.byte 0xF,0xBA,0xE8,0x5 # bts eax, 5
.byte 0xF,0x22,0xE0 # mov cr4, eax
.byte 0xF,0x22,0xD9 # mov cr3, ecx
.byte 0x8B,0xF2 # mov esi, edx ; Save wakeup buffer address
.byte 0xB9
.long 0xC0000080 # mov ecx, 0c0000080h ; EFER MSR number.
.byte 0xF,0x32 # rdmsr ; Read EFER.
.byte 0xF,0xBA,0xE8,0x8 # bts eax, 8 ; Set LME=1.
.byte 0xF,0x30 # wrmsr ; Write EFER.
.byte 0xF,0x20,0xC0 # mov eax, cr0 ; Read CR0.
.byte 0xF,0xBA,0xE8,0x1F # bts eax, 31 ; Set PG=1.
.byte 0xF,0x22,0xC0 # mov cr0, eax ; Write CR0.
LONG_JUMP:
.byte 0x67,0xEA # far jump
.long 0x0 # 32-bit offset
.word 0x38 # 16-bit selector
LongModeStart:
movw $0x30,%ax
.byte 0x66
movw %ax,%ds
.byte 0x66
movw %ax,%es
.byte 0x66
movw %ax,%ss
#
# ProgramStack
#
movl $0x1b, %ecx
rdmsr
btl $10, %eax # Check for x2apic mode
jnc LegacyApicMode
movl $0x802, %ecx # Read APIC_ID
rdmsr
movl %eax, %ebx # ebx == apicid
jmp GetCpuNumber
LegacyApicMode:
andl $0xfffff000, %eax
addl $0x20, %eax
movl (%eax), %ebx
shrl $24, %ebx # ebx == apicid
GetCpuNumber:
xorq %rcx, %rcx
movl %esi,%edi
addl $ProcessorNumberLocation, %edi
movl (%edi, %ebx, 4), %ecx
movl %esi,%edi
addl $StackSizeLocation, %edi
movq (%edi), %rax
incq %rcx
mulq %rcx
movl %esi,%edi
addl $StackStartAddressLocation, %edi
movq (%edi), %rbx
addq %rbx, %rax
movq %rax, %rsp
#
# Call C Function
#
movl %esi,%edi
addl $CProcedureLocation, %edi
movq (%edi), %rax
testq %rax, %rax
jz GoToSleep
subq $0x20, %rsp
call *%rax
addq $0x20, %rsp
GoToSleep:
cli
hlt
jmp .-2
RendezvousFunnelProcEnd:
#-------------------------------------------------------------------------------------
# AsmGetAddressMap (&AddressMap);
#-------------------------------------------------------------------------------------
# comments here for definition of address map
ASM_GLOBAL ASM_PFX(AsmGetAddressMap)
ASM_PFX(AsmGetAddressMap):
#ifdef __APPLE__
int $3
#else
movq $RendezvousFunnelProcStart, %rax
movq %rax, (%rcx)
movq $(ProtectedModeStart - RendezvousFunnelProcStart), 0x08(%rcx)
movq $(FLAT32_JUMP - RendezvousFunnelProcStart), 0x10(%rcx)
movq $(LongModeStart - RendezvousFunnelProcStart), 0x18(%rcx)
movq $(LONG_JUMP - RendezvousFunnelProcStart), 0x20(%rcx)
movq $(RendezvousFunnelProcEnd - RendezvousFunnelProcStart), 0x28(%rcx)
#endif
ret

View File

@@ -1,196 +0,0 @@
;------------------------------------------------------------------------------
; X64 assembly file for AP startup vector.
;
; Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
; 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.
;
;------------------------------------------------------------------------------
.code
include AsmInclude.inc
;-------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------
;RendezvousFunnelProc procedure follows. All APs execute their procedure. This
;procedure serializes all the AP processors through an Init sequence. It must be
;noted that APs arrive here very raw...ie: real mode, no stack.
;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
;IS IN MACHINE CODE.
;-------------------------------------------------------------------------------------
;RendezvousFunnelProc (&WakeUpBuffer,MemAddress);
RendezvousFunnelProc PROC PUBLIC
RendezvousFunnelProcStart::
; At this point CS = 0x(vv00) and ip= 0x0.
db 8ch, 0c8h ; mov ax, cs
db 8eh, 0d8h ; mov ds, ax
db 8eh, 0c0h ; mov es, ax
db 8eh, 0d0h ; mov ss, ax
db 33h, 0c0h ; xor ax, ax
db 8eh, 0e0h ; mov fs, ax
db 8eh, 0e8h ; mov gs, ax
; Switch to flat mode.
db 0BEh
dw BufferStartLocation ; mov si, BufferStartLocation
db 66h, 8Bh, 14h ; mov edx,dword ptr [si] ; EDX is keeping the start address of wakeup buffer
db 0BEh
dw Cr3OffsetLocation ; mov si, Cr3Location
db 66h, 8Bh, 0Ch ; mov ecx,dword ptr [si] ; ECX is keeping the value of CR3
db 0BEh
dw GdtrLocation ; mov si, GdtrProfile
db 66h ; db 66h
db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si]
db 0BEh
dw IdtrLocation ; mov si, IdtrProfile
db 66h ; db 66h
db 2Eh, 0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]
db 33h, 0C0h ; xor ax, ax
db 8Eh, 0D8h ; mov ds, ax
db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0
db 66h, 83h, 0C8h, 01h ; or eax, 000000001h ; Set PE bit (bit #0)
db 0Fh, 22h, 0C0h ; mov cr0, eax
FLAT32_JUMP::
db 66h, 67h, 0EAh ; far jump
dd 0h ; 32-bit offset
dw 20h ; 16-bit selector
ProtectedModeStart::
db 66h, 0B8h, 18h, 00h ; mov ax, 18h
db 66h, 8Eh, 0D8h ; mov ds, ax
db 66h, 8Eh, 0C0h ; mov es, ax
db 66h, 8Eh, 0E0h ; mov fs, ax
db 66h, 8Eh, 0E8h ; mov gs, ax
db 66h, 8Eh, 0D0h ; mov ss, ax ; Flat mode setup.
db 0Fh, 20h, 0E0h ; mov eax, cr4
db 0Fh, 0BAh, 0E8h, 05h ; bts eax, 5
db 0Fh, 22h, 0E0h ; mov cr4, eax
db 0Fh, 22h, 0D9h ; mov cr3, ecx
db 8Bh, 0F2h ; mov esi, edx ; Save wakeup buffer address
db 0B9h
dd 0C0000080h ; mov ecx, 0c0000080h ; EFER MSR number.
db 0Fh, 32h ; rdmsr ; Read EFER.
db 0Fh, 0BAh, 0E8h, 08h ; bts eax, 8 ; Set LME=1.
db 0Fh, 30h ; wrmsr ; Write EFER.
db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Read CR0.
db 0Fh, 0BAh, 0E8h, 1Fh ; bts eax, 31 ; Set PG=1.
db 0Fh, 22h, 0C0h ; mov cr0, eax ; Write CR0.
LONG_JUMP::
db 67h, 0EAh ; far jump
dd 0h ; 32-bit offset
dw 38h ; 16-bit selector
LongModeStart::
mov ax, 30h
mov ds, ax
mov es, ax
mov ss, ax
;
; ProgramStack
;
mov ecx, 1bh ; Read IA32_APIC_BASE MSR
rdmsr
bt eax, 10 ; Check for x2apic mode
jnc LegacyApicMode
mov ecx, 802h ; Read APIC_ID
rdmsr
mov ebx, eax ; ebx == apicid
jmp GetCpuNumber
LegacyApicMode::
and eax, 0fffff000h
add eax, 20h
mov ebx, dword ptr [eax]
shr ebx, 24 ; ebx == apicid
GetCpuNumber::
xor rcx, rcx
mov edi, esi
add edi, ProcessorNumberLocation
mov ecx, dword ptr [edi + 4 * ebx] ; RCX = CpuNumber
mov edi, esi
add edi, StackSizeLocation
mov rax, qword ptr [edi]
inc rcx
mul rcx ; RAX = StackSize * (CpuNumber + 1)
mov edi, esi
add edi, StackStartAddressLocation
mov rbx, qword ptr [edi]
add rax, rbx ; RAX = StackStart + StackSize * (CpuNumber + 1)
mov rsp, rax
;
; Call C Function
;
mov edi, esi
add edi, CProcedureLocation
mov rax, qword ptr [edi]
test rax, rax
jz GoToSleep
sub rsp, 20h
call rax
add rsp, 20h
GoToSleep::
cli
hlt
jmp $-2
RendezvousFunnelProc ENDP
RendezvousFunnelProcEnd::
;-------------------------------------------------------------------------------------
; AsmGetAddressMap (&AddressMap);
;-------------------------------------------------------------------------------------
AsmGetAddressMap PROC
mov rax, offset RendezvousFunnelProcStart
mov qword ptr [rcx], rax
mov qword ptr [rcx+8h], ProtectedModeStart - RendezvousFunnelProcStart
mov qword ptr [rcx+10h], FLAT32_JUMP - RendezvousFunnelProcStart
mov qword ptr [rcx+18h], LongModeStart - RendezvousFunnelProcStart
mov qword ptr [rcx+20h], LONG_JUMP - RendezvousFunnelProcStart
mov qword ptr [rcx+28h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
ret
AsmGetAddressMap ENDP
END

View File

@@ -1,447 +0,0 @@
/** @file
Module produces PciCfgPpi2 on top of PciCfgPpi. It also updates the
PciCfg2Ppi pointer in the EFI_PEI_SERVICES upon a installation of
EcpPeiPciCfgPpi.
EcpPeiPciCfgPpi is installed by a framework module which
produce PciCfgPpi originally. Such framework module is updated based on the
following rule to install EcpPeiPciCfgPpi instead of updating the PciCfg pointer
in the Framework PeiServicesTable:
Search pattern:
PeiServices->PciCfg = <*>;
Replace pattern:
{
static EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEcpPeiPciCfgPpiGuid,
<*>
};
(**PeiServices).InstallPpi (PeiServices, gEcpPeiPciCfgPpiList);
}
In addition, the PeiServicesTable definition in PeiApi.h is updated to
struct _EFI_PEI_SERVICES {
EFI_TABLE_HEADER Hdr;
...
//
// Pointer to PPI interface
//
if (PI_SPECIFICATION_VERSION < 0x00010000)
PEI_CPU_IO_PPI *CpuIo;
ECP_PEI_PCI_CFG_PPI *PciCfg; //Changed.
else
...
endif
};
This change enable the detection of code segment which invokes PeiServices->PciCfg->Modify.
Such code causes a build break as ECP_PEI_PCI_CFG_PPI does not has "Modify" field.
This should be updated to a call to PeiLibPciCfgModify as shown below:
Search pattern:
*->Modify(<*>);
Replace pattern:
PeiLibPciCfgModify(<*>);
PIWG's PI specification replaces Inte's EFI Specification 1.10.
EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by
EFI_PEI_PCI_CFG2_PPI in PI 1.0.
This module produces PciCfgPpi on top of PciCfgPpi2. This module is used on platform when both of
these two conditions are true:
1) Framework module present that produces PCI CFG PPI AND
2) PI module that produces PCI CFG2 is not present
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include <PiPei.h>
#include <Ppi/PciCfg.h>
#include <Ppi/PciCfg2.h>
#include <Ppi/EcpPciCfg.h>
#include <Library/DebugLib.h>
//
// Function Prototypes
//
/**
Notification service to be called when gEcpPeiPciCfgPpiGuid is installed.
@param PeiServices Indirect reference to the PEI Services Table.
@param NotifyDescriptor Address of the notification descriptor data structure. Type
EFI_PEI_NOTIFY_DESCRIPTOR is defined above.
@param Ppi Address of the PPI that was installed.
@retval EFI_STATUS This function will install a PPI to PPI database. The status
code will be the code for (*PeiServices)->InstallPpi.
**/
EFI_STATUS
EFIAPI
EcpPciCfgPpiNotifyCallback (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
IN VOID *Ppi
);
//
// Function Prototypes
//
/**
Reads from a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data..
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
time.
**/
EFI_STATUS
EFIAPI
PciCfg2Read (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
);
/**
Write to a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data..
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this time.
**/
EFI_STATUS
EFIAPI
PciCfg2Write (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
);
/**
PCI read-modify-write operation.
@param PeiServices An indirect pointer to the PEI Services Table
published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes. Type
EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read().
@param Address The physical address of the access.
@param SetBits Points to value to bitwise-OR with the read configuration value.
The size of the value is determined by Width.
@param ClearBits Points to the value to negate and bitwise-AND with the read configuration value.
The size of the value is determined by Width.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting
the operation at this time.
**/
EFI_STATUS
EFIAPI
PciCfg2Modify (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN VOID *SetBits,
IN VOID *ClearBits
);
//
// Module globals
//
EFI_PEI_NOTIFY_DESCRIPTOR mNotifyOnEcpPciCfgList = {
(EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEcpPeiPciCfgPpiGuid,
EcpPciCfgPpiNotifyCallback
};
EFI_PEI_PCI_CFG2_PPI mPciCfg2Ppi = {
PciCfg2Read,
PciCfg2Write,
PciCfg2Modify,
0
};
EFI_PEI_PPI_DESCRIPTOR mPpiListPciCfg2 = {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEfiPciCfg2PpiGuid,
&mPciCfg2Ppi
};
/**
Standard PEIM entry point.
@param FileHandle Handle of the file being invoked.
@param PeiServices General purpose services available to every PEIM.
@retval EFI_SUCCESS The interface could be successfully installed.
**/
EFI_STATUS
EFIAPI
PeimInitializePciCfg2 (
IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
EFI_STATUS Status;
VOID *Ppi;
//
// Make sure no other module has install the first instance of gEfiPciCfg2PpiGuid.
//
Status = (*PeiServices)->LocatePpi (PeiServices, &gEfiPciCfg2PpiGuid, 0, NULL, &Ppi);
ASSERT (Status == EFI_NOT_FOUND);
//
// Register a notification for ECP PCI CFG PPI
//
Status = (*PeiServices)->NotifyPpi (PeiServices, &mNotifyOnEcpPciCfgList);
ASSERT_EFI_ERROR (Status);
return Status;
}
/**
Notification service to be called when gEcpPeiPciCfgPpiGuid is installed.
@param PeiServices Indirect reference to the PEI Services Table.
@param NotifyDescriptor Address of the notification descriptor data structure. Type
EFI_PEI_NOTIFY_DESCRIPTOR is defined above.
@param Ppi Address of the PPI that was installed.
@retval EFI_STATUS This function will install a PPI to PPI database. The status
code will be the code for (*PeiServices)->InstallPpi.
**/
EFI_STATUS
EFIAPI
EcpPciCfgPpiNotifyCallback (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
IN VOID *Ppi
)
{
//
// When ECP PCI CFG PPI is installed, publish the PCI CFG2 PPI in the
// PEI Services Table and the PPI database
//
(*PeiServices)->PciCfg = &mPciCfg2Ppi;
return (*PeiServices)->InstallPpi ((CONST EFI_PEI_SERVICES **)PeiServices, &mPpiListPciCfg2);
}
/**
Reads from a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data..
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
time.
**/
EFI_STATUS
EFIAPI
PciCfg2Read (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
)
{
EFI_STATUS Status;
EFI_PEI_PCI_CFG_PPI *PciCfg;
Status = (*PeiServices)->LocatePpi (
PeiServices,
&gEcpPeiPciCfgPpiGuid,
0,
NULL,
(VOID **)&PciCfg
);
ASSERT_EFI_ERROR (Status);
return PciCfg->Read ((EFI_PEI_SERVICES **)PeiServices, PciCfg, Width, Address, Buffer);
}
/**
Write to a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data..
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
time.
**/
EFI_STATUS
EFIAPI
PciCfg2Write (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
)
{
EFI_STATUS Status;
EFI_PEI_PCI_CFG_PPI *PciCfg;
Status = (*PeiServices)->LocatePpi (
PeiServices,
&gEcpPeiPciCfgPpiGuid,
0,
NULL,
(VOID **)&PciCfg
);
ASSERT_EFI_ERROR (Status);
return PciCfg->Write ((EFI_PEI_SERVICES **)PeiServices, PciCfg, Width, Address, Buffer);
}
/**
PCI read-modify-write operation.
@param PeiServices An indirect pointer to the PEI Services Table
published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes. Type
EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read().
@param Address The physical address of the access.
@param SetBits Points to value to bitwise-OR with the read configuration value.
The size of the value is determined by Width.
@param ClearBits Points to the value to negate and bitwise-AND with the read configuration value.
The size of the value is determined by Width.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting
the operation at this time.
**/
EFI_STATUS
EFIAPI
PciCfg2Modify (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_PCI_CFG2_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN VOID *SetBits,
IN VOID *ClearBits
)
{
EFI_STATUS Status;
EFI_PEI_PCI_CFG_PPI *PciCfg;
Status = (*PeiServices)->LocatePpi (
PeiServices,
&gEfiPciCfgPpiInServiceTableGuid,
0,
NULL,
(VOID **)&PciCfg
);
ASSERT_EFI_ERROR (Status);
return PciCfg->Modify ((EFI_PEI_SERVICES **)PeiServices, PciCfg, Width, Address, *(UINTN *)SetBits, *(UINTN *)ClearBits);
}

View File

@@ -1,105 +0,0 @@
## @file
# Module produces PciCfgPpi2 on top of PciCfgPpi. It also updates the
# PciCfg2Ppi pointer in the EFI_PEI_SERVICES upon a installation of
# EcpPeiPciCfgPpi.
#
# EcpPeiPciCfgPpi is installed by a framework module which
# produce PciCfgPpi originally. Such framework module is updated based on the
# following rule to install EcpPeiPciCfgPpi instead of updating the PciCfg pointer
# in the Framework PeiServicesTable:
#
# Search pattern:
# PeiServices->PciCfg = <*>;
# Replace pattern:
# {
# static EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = {
# (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
# &gEcpPeiPciCfgPpiGuid,
# <*>
# };
# (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList);
# }
#
# In addition, the PeiServicesTable definition in PeiApi.h is updated to
#
# struct _EFI_PEI_SERVICES {
# EFI_TABLE_HEADER Hdr;
# ...
#
# //
# // Pointer to PPI interface
# //
# #if (PI_SPECIFICATION_VERSION < 0x00010000)
#
# PEI_CPU_IO_PPI *CpuIo;
# ECP_PEI_PCI_CFG_PPI *PciCfg; //Changed.
# #else
# ...
# #endif
#
# };
#
# This change enable the detection of code segment which invokes PeiServices->PciCfg->Modify.
# Such code causes a build break as ECP_PEI_PCI_CFG_PPI does not has "Modify" field.
# This should be updated to a call to PeiLibPciCfgModify as shown below:
#
# Search pattern:
# *->Modify(<*>);
# Replace pattern:
# PeiLibPciCfgModify(<*>);
#
# PIWG's PI specification replaces Inte's EFI Specification 1.10.
# EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by
# EFI_PEI_PCI_CFG2_PPI in PI 1.0.
# This module produces PciCfgPpi on top of PciCfgPpi2. This module is used on platform when both of
# these two conditions are true:
# 1) Framework module present that produces PCI CFG PPI AND
# 2) PI module that produces PCI CFG2 is not present
#
#
# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = PciCfg2OnPciCfgThunk
FILE_GUID = 41401688-2862-431b-BAAC-6ECADAC384AB
MODULE_TYPE = PEIM
VERSION_STRING = 1.0
ENTRY_POINT = PeimInitializePciCfg2
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
PciCfg2OnPciCfgThunk.c
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
PeimEntryPoint
DebugLib
[Ppis]
gEfiPciCfgPpiInServiceTableGuid
gEfiPciCfg2PpiGuid
gEcpPeiPciCfgPpiGuid
[Depex]
TRUE

View File

@@ -1,309 +0,0 @@
/** @file
Module produce PciCfgPpi on top of PciCfgPpi2.
PIWG's PI specification replaces Inte's EFI Specification 1.10.
EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by
EFI_PEI_PCI_CFG2_PPI in PI 1.0.
This module produces PciCfgPpi on top of PciCfgPpi2. This module is used on platform when both of
these two conditions are true:
1) Framework module is present that consumes PCI CFG AND
2) PI module is present that produces PCI CFG2 but not PCI CFG
The Usage of this module is rare since EDK II module IntelFrameworkModulePkg\Universal\PcatSingleSegmentPciCfgPei\PcatSingleSegmentPciCfgPei.inf
that produce PCI CFG2 can also produce PCI CFG by setting Pcd Feature Flag gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfgDisable
to FALSE.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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:
**/
#include <PiPei.h>
#include <Ppi/PciCfg.h>
#include <Ppi/PciCfg2.h>
#include <Library/DebugLib.h>
//
// Function Prototypes
//
/**
Reads from a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data..
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
time.
**/
EFI_STATUS
EFIAPI
PciCfgRead (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_PCI_CFG_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
);
/**
Write to a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data..
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
time.
**/
EFI_STATUS
EFIAPI
PciCfgWrite (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_PCI_CFG_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
);
/**
PCI read-modify-write operation.
@param PeiServices An indirect pointer to the PEI Services Table
published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes. Type
EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read().
@param Address The physical address of the access.
@param SetBits Points to value to bitwise-OR with the read configuration value.
The size of the value is determined by Width.
@param ClearBits Points to the value to negate and bitwise-AND with the read configuration value.
The size of the value is determined by Width.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting
the operation at this time.
**/
EFI_STATUS
EFIAPI
PciCfgModify (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_PCI_CFG_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN UINTN SetBits,
IN UINTN ClearBits
);
//
// Module globals
//
EFI_PEI_PCI_CFG_PPI mPciCfgPpi = {
PciCfgRead,
PciCfgWrite,
PciCfgModify,
};
EFI_PEI_PPI_DESCRIPTOR mPpiListPciCfg = {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEfiPciCfgPpiInServiceTableGuid,
&mPciCfgPpi
};
/**
Standard PEIM entry point.
@param FileHandle Handle of the file being invoked.
@param PeiServices General purpose services available to every PEIM.
@retval EFI_SUCCESS The interface could be successfully installed.
**/
EFI_STATUS
EFIAPI
PeimInitializePciCfg (
IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
//
// Publish the PciCfgToPciCfg2 Thunk capability to other modules
//
return (*PeiServices)->InstallPpi (PeiServices, &mPpiListPciCfg);
}
/**
Reads from a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data..
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
time.
**/
EFI_STATUS
EFIAPI
PciCfgRead (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_PCI_CFG_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
)
{
EFI_PEI_PCI_CFG2_PPI *PciCfg2;
PciCfg2 = (*PeiServices)->PciCfg;
return PciCfg2->Read ((CONST EFI_PEI_SERVICES **)PeiServices, PciCfg2, Width, Address, Buffer);
}
/**
Write to a given location in the PCI configuration space.
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes.
See EFI_PEI_PCI_CFG_PPI_WIDTH above.
@param Address The physical address of the access. The format of
the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS.
@param Buffer A pointer to the buffer of data..
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this
time.
**/
EFI_STATUS
EFIAPI
PciCfgWrite (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_PCI_CFG_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN OUT VOID *Buffer
)
{
EFI_PEI_PCI_CFG2_PPI *PciCfg2;
PciCfg2 = (*PeiServices)->PciCfg;
return PciCfg2->Write ((CONST EFI_PEI_SERVICES **)PeiServices, PciCfg2, Width, Address, Buffer);
}
/**
PCI read-modify-write operation.
@param PeiServices An indirect pointer to the PEI Services Table
published by the PEI Foundation.
@param This Pointer to local data for the interface.
@param Width The width of the access. Enumerated in bytes. Type
EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read().
@param Address The physical address of the access.
@param SetBits Points to value to bitwise-OR with the read configuration value.
The size of the value is determined by Width.
@param ClearBits Points to the value to negate and bitwise-AND with the read configuration value.
The size of the value is determined by Width.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR There was a problem with the transaction.
@retval EFI_DEVICE_NOT_READY The device is not capable of supporting
the operation at this time.
**/
EFI_STATUS
EFIAPI
PciCfgModify (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_PCI_CFG_PPI *This,
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,
IN UINT64 Address,
IN UINTN SetBits,
IN UINTN ClearBits
)
{
EFI_PEI_PCI_CFG2_PPI *PciCfg2;
PciCfg2 = (*PeiServices)->PciCfg;
return PciCfg2->Modify ((CONST EFI_PEI_SERVICES **)PeiServices, PciCfg2, Width, Address, &SetBits, &ClearBits);
}

View File

@@ -1,60 +0,0 @@
## @file
# Module produce PciCfgPpi on top of PciCfgPpi2.
#
# PIWG's PI specification replaces Inte's EFI Specification 1.10.
# EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by
# EFI_PEI_PCI_CFG2_PPI in PI 1.0.
# This module produces PciCfgPpi on top of PciCfgPpi2. This module is used on platform when both of
# these two conditions are true:
# 1) Framework module is present that consumes PCI CFG AND
# 2) EDKII module is present that produces PCI CFG2 but not PCI CFG
#
# The Usage of this module is rare since EDK II module IntelFrameworkModulePkg\Universal\PcatSingleSegmentPciCfgPei\PcatSingleSegmentPciCfgPei.inf
# that produce PCI CFG2 can also produce PCI CFG by setting Pcd Feature Flag gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfgDisable
# to FALSE.
#
#
# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = PciCfgOnPciCfg2Thunk
FILE_GUID = 717886AB-C40A-44cf-9114-4119E84B0DC7
MODULE_TYPE = PEIM
VERSION_STRING = 1.0
ENTRY_POINT = PeimInitializePciCfg
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
PciCfgOnPciCfg2Thunk.c
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
[LibraryClasses]
PeimEntryPoint
DebugLib
[Ppis]
gEfiPciCfgPpiInServiceTableGuid
gEfiPciCfg2PpiGuid
[Depex]
gEfiPciCfg2PpiGuid

View File

@@ -1,829 +0,0 @@
/** @file
Common filling functions used in translating Datahub's record
to PI SMBIOS's record.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "Thunk.h"
/**
Field Filling Function for Cache SubClass record type 5&6 -- Cache SRAM type.
Offset is mandatory
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.
**/
EFI_STATUS
SmbiosFldCacheType5 (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_CACHE_SRAM_TYPE_DATA SramData;
UINT32 Temp;
SramData = *(EFI_CACHE_SRAM_TYPE_DATA*)RecordData;
//
// Swap two fields because of inconsistency between smbios and datahub specs
//
Temp = SramData.Asynchronous;
SramData.Asynchronous = SramData.Synchronous;
SramData.Synchronous = Temp;
//
// Truncate the data to word
//
CopyMem (
(UINT8 *) (StructureNode->Structure) + Offset,
(EFI_CACHE_SRAM_TYPE_DATA *) &SramData,
2
);
return EFI_SUCCESS;
}
/**
Field Filling Function for Cache SubClass record type 10 -- Cache Config.
Offset is mandatory
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.
**/
EFI_STATUS
SmbiosFldCacheType10 (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
UINT16 CacheConfig;
CopyMem (&CacheConfig, RecordData, 2);
if ((CacheConfig & 0x07) == 0) {
return EFI_INVALID_PARAMETER;
}
//
// Truncate the data to 2 bytes and make cache level zero-based.
//
CacheConfig--;
CopyMem (
(UINT8 *) (StructureNode->Structure) + Offset,
&CacheConfig,
2
);
return EFI_SUCCESS;
}
/**
Enlarge the structure buffer of a structure node in SMBIOS database.
The function maybe lead the structure pointer for SMBIOS record changed.
@param StructureNode The structure node whose structure buffer is to be enlarged.
@param NewLength The new length of SMBIOS record which does not include unformat area.
@param OldBufferSize The old size of SMBIOS record buffer.
@param NewBufferSize The new size is targeted for enlarged.
@retval EFI_OUT_OF_RESOURCES No more memory to allocate new record
@retval EFI_SUCCESS Success to enlarge the record buffer size.
**/
EFI_STATUS
SmbiosEnlargeStructureBuffer (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
UINT8 NewLength,
UINTN OldBufferSize,
UINTN NewBufferSize
)
{
EFI_SMBIOS_TABLE_HEADER *NewRecord;
EFI_SMBIOS_PROTOCOL *Smbios;
EFI_STATUS Status;
UINT8 CountOfString;
NewRecord = NULL;
Smbios = GetSmbiosProtocol();
ASSERT (Smbios != NULL);
NewRecord = (EFI_SMBIOS_TABLE_HEADER*) AllocateZeroPool (NewBufferSize);
if (NewRecord == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (NewRecord, StructureNode->Structure, OldBufferSize);
Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);
ASSERT_EFI_ERROR (Status);
//
// try to use original handle to enlarge the buffer.
//
NewRecord->Length = NewLength;
Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, NewRecord);
ASSERT_EFI_ERROR (Status);
FreePool (NewRecord);
StructureNode->Structure = GetSmbiosBufferFromHandle (
StructureNode->SmbiosHandle,
StructureNode->SmbiosType,
NULL
);
GetSmbiosStructureSize (
StructureNode->Structure,
&StructureNode->StructureSize,
&CountOfString
);
return EFI_SUCCESS;
}
/**
Update the structure buffer of a structure node in SMBIOS database.
The function lead the structure pointer for SMBIOS record changed.
@param StructureNode The structure node whose structure buffer is to be enlarged.
@param NewRecord The new SMBIOS record.
**/
VOID
SmbiosUpdateStructureBuffer (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN EFI_SMBIOS_TABLE_HEADER *NewRecord
)
{
EFI_SMBIOS_PROTOCOL *Smbios;
EFI_STATUS Status;
UINT8 CountOfString;
Smbios = GetSmbiosProtocol();
ASSERT (Smbios != NULL);
Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);
ASSERT_EFI_ERROR (Status);
//
// try to use original handle to enlarge the buffer.
//
Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, NewRecord);
ASSERT_EFI_ERROR (Status);
StructureNode->Structure = GetSmbiosBufferFromHandle (
StructureNode->SmbiosHandle,
StructureNode->SmbiosType,
NULL
);
GetSmbiosStructureSize (
StructureNode->Structure,
&StructureNode->StructureSize,
&CountOfString
);
return ;
}
/**
Fill a standard Smbios string field.
This function will convert the unicode string to single byte chars, and only
English language is supported.
This function changes the Structure pointer value of the structure node,
which should be noted by Caller.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_INVALID_PARAMETER RecordDataSize is too larger
@retval EFI_OUT_OF_RESOURCES No memory to allocate new buffer for string
@retval EFI_SUCCESS Sucess append string for a SMBIOS record.
**/
EFI_STATUS
SmbiosFldString (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_STATUS Status;
UINT16 *Data;
CHAR8 AsciiData[SMBIOS_STRING_MAX_LENGTH];
UINT8 CountOfStrings;
UINTN OrigStringNumber;
EFI_SMBIOS_PROTOCOL *Smbios;
EFI_SMBIOS_HANDLE SmbiosHandle;
UINT32 OrigStructureSize;
UINTN NewStructureSize;
EFI_SMBIOS_TABLE_HEADER *NewRecord;
UINT32 StringLength;
Status = EFI_SUCCESS;
OrigStringNumber = 0;
OrigStructureSize = 0;
//
// if we have a NULL token,
//
if (0 == *((STRING_REF *) RecordData)) {
*(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = 0;
return EFI_SUCCESS;
}
//
// Get the String from the Hii Database
//
Data = HiiGetPackageString (
&(StructureNode->ProducerName),
*((EFI_STRING_ID *) RecordData),
NULL
);
if (Data == NULL) {
return EFI_INVALID_PARAMETER;
}
StringLength = (UINT32)StrLen (Data);
//
// Count the string size including the terminating 0.
//
if (StringLength == 0) {
*(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = 0;
FreePool (Data);
return EFI_SUCCESS;
}
if (StringLength > SMBIOS_STRING_MAX_LENGTH) {
//
// Too long a string
//
FreePool (Data);
return EFI_INVALID_PARAMETER;
}
Smbios = GetSmbiosProtocol();
ASSERT (Smbios != NULL);
//
// Convert Unicode string to Ascii string which only supported by SMBIOS.
//
ZeroMem (AsciiData, SMBIOS_STRING_MAX_LENGTH);
UnicodeStrToAsciiStr (Data, AsciiData);
//
// if the field at offset is already filled with some value,
// find out the string it points to
//
OrigStringNumber = *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset);
if (OrigStringNumber != 0) {
DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Update %dth string for type[%d],offset[0x%x],handle[0x%x] to [%s]\n",
OrigStringNumber, StructureNode->SmbiosType, Offset, StructureNode->SmbiosHandle, AsciiData));
//
// If original string number is not zero, just update string
//
Status = Smbios->UpdateString (Smbios, &StructureNode->SmbiosHandle, &OrigStringNumber, AsciiData);
if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Fail to update %dth string in offset 0x%x for handle:0x%x type:0x%x\n",
OrigStringNumber, Offset, StructureNode->SmbiosHandle, StructureNode->SmbiosType));
ASSERT_EFI_ERROR (Status);
return Status;
}
} else {
//
// If the string has not been filled in SMBIOS database, remove it and add again
// with string appended.
//
Status = GetSmbiosStructureSize (StructureNode->Structure, &OrigStructureSize, &CountOfStrings);
ASSERT_EFI_ERROR (Status);
if (CountOfStrings == 0) {
NewStructureSize = OrigStructureSize + StringLength;
} else {
NewStructureSize = OrigStructureSize + StringLength + 1;
}
NewRecord = AllocateZeroPool (NewStructureSize);
if (NewRecord == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (NewRecord, StructureNode->Structure, OrigStructureSize);
//
// Copy new string into tail of original SMBIOS record buffer.
//
if (CountOfStrings == 0) {
AsciiStrCpy ((CHAR8 *)NewRecord + OrigStructureSize - 2, AsciiData);
} else {
AsciiStrCpy ((CHAR8 *)NewRecord + OrigStructureSize - 1, AsciiData);
}
DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Type(%d) offset(0x%x) StringNumber:%d\n",
StructureNode->SmbiosType, Offset, CountOfStrings + 1));
//
// Update string reference number
//
*(UINT8 *) ((UINT8 *) NewRecord + Offset) = (UINT8) (CountOfStrings + 1);
SmbiosHandle = StructureNode->SmbiosHandle;
//
// Remove original SMBIOS record and add new one
//
Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);
ASSERT_EFI_ERROR (Status);
//
// Add new SMBIOS record
//
Status = Smbios->Add (Smbios, NULL, &SmbiosHandle, NewRecord);
ASSERT_EFI_ERROR (Status);
StructureNode->SmbiosHandle = SmbiosHandle;
FreePool (NewRecord);
}
//
// The SMBIOS record buffer maybe re-allocated in SMBIOS database,
// so update cached buffer pointer in DataHub structure list.
//
StructureNode->Structure = GetSmbiosBufferFromHandle (
StructureNode->SmbiosHandle,
StructureNode->SmbiosType,
NULL
);
ASSERT (StructureNode->Structure != NULL);
//
// The string update action maybe lead the record is re-allocated in SMBIOS database
// so update cached record pointer
//
Status = GetSmbiosStructureSize (StructureNode->Structure, &StructureNode->StructureSize, &CountOfStrings);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}
/**
Find a handle that matches the Link Data and the target Smbios type.
@param TargetType the Smbios type
@param SubClass the SubClass
@param LinkData Specifies Instance, SubInstance and ProducerName
@param Handle the HandleNum found
@retval EFI_NOT_FOUND Can not find the record according to handle
@retval EFI_SUCCESS Success to find the handle
**/
EFI_STATUS
SmbiosFindHandle (
IN UINT8 TargetType,
IN EFI_GUID *SubClass,
IN EFI_INTER_LINK_DATA *LinkData,
IN OUT UINT16 *HandleNum
)
{
LIST_ENTRY *Link;
SMBIOS_STRUCTURE_NODE *StructureNode;
StructureNode = NULL;
//
// Find out the matching handle
//
for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {
StructureNode = CR (Link, SMBIOS_STRUCTURE_NODE, Link, SMBIOS_STRUCTURE_NODE_SIGNATURE);
if (StructureNode->Structure->Type == TargetType &&
CompareGuid (&(StructureNode->SubClass), SubClass) &&
StructureNode->Instance == LinkData->Instance &&
StructureNode->SubInstance == LinkData->SubInstance
) {
break;
}
}
if (Link == &mStructureList || StructureNode == NULL) {
return EFI_NOT_FOUND;
} else {
*HandleNum = StructureNode->Structure->Handle;
return EFI_SUCCESS;
}
}
/**
Fill the inter link field for a SMBIOS recorder.
Some SMBIOS recorder need to reference the handle of another SMBIOS record. But
maybe another SMBIOS record has not been added, so put the InterLink request into
a linked list and the interlink will be fixedup when a new SMBIOS record is added.
@param StructureNode Point to SMBIOS_STRUCTURE_NODE which reference another record's handle
@param LinkSmbiosNodeOffset The offset in this record for holding the handle of another SMBIOS record
@param LinkSmbiosType The type of SMBIOS record want to be linked.
@param InterLink Point to EFI_INTER_LINK_DATA will be put linked list.
@param SubClassGuid The guid of subclass for linked SMBIOS record.
@retval EFI_SUCESS The linked record is found and no need fixup in future.
@retval !EFI_SUCESS The linked record can not be found and InterLink is put a fixing-p linked list.
**/
EFI_STATUS
SmbiosFldInterLink (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT16 LinkSmbiosNodeOffset,
IN UINT8 LinkSmbiosType,
IN EFI_INTER_LINK_DATA *InterLink,
IN EFI_GUID *SubClassGuid
)
{
EFI_STATUS Status;
SMBIOS_LINK_DATA_FIXUP_NODE *LinkDataFixupNode;
UINT16 StructureHandle;
Status = EFI_SUCCESS;
LinkDataFixupNode = NULL;
Status = SmbiosFindHandle (
LinkSmbiosType, // Smbios type
SubClassGuid,
InterLink,
&StructureHandle
);
if (!EFI_ERROR (Status)) {
//
// Set the handle
//
CopyMem (
(UINT8 *) (StructureNode->Structure) + LinkSmbiosNodeOffset,
&StructureHandle,
sizeof (EFI_SMBIOS_HANDLE)
);
} else {
//
// Hang this in the link data fixup node
//
LinkDataFixupNode = AllocateZeroPool (sizeof (SMBIOS_LINK_DATA_FIXUP_NODE));
if (LinkDataFixupNode == NULL) {
return EFI_OUT_OF_RESOURCES;
}
LinkDataFixupNode->Signature = SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE;
LinkDataFixupNode->Offset = LinkSmbiosNodeOffset;
LinkDataFixupNode->TargetType = LinkSmbiosType;
CopyMem (
&LinkDataFixupNode->SubClass,
SubClassGuid,
sizeof (EFI_GUID)
);
CopyMem (
&LinkDataFixupNode->LinkData,
InterLink,
sizeof (EFI_INTER_LINK_DATA)
);
InsertTailList (
&StructureNode->LinkDataFixup,
&(LinkDataFixupNode->Link)
);
}
return Status;
}
/**
Field Filling Function. Transform an EFI_EXP_BASE10_DATA to a word, with 'Mega'
as the unit.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_INVALID_PARAMETER RecordDataSize is invalid.
@retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.
**/
EFI_STATUS
SmbiosFldBase10ToWordWithMega (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_EXP_BASE10_DATA *Base10Data;
INT16 Value;
INT16 Exponent;
if (RecordDataSize != sizeof (EFI_EXP_BASE10_DATA)) {
return EFI_INVALID_PARAMETER;
}
Base10Data = RecordData;
Value = Base10Data->Value;
Exponent = Base10Data->Exponent;
Exponent -= 6;
while (Exponent != 0) {
if (Exponent > 0) {
Value = (INT16) (Value * 10);
Exponent--;
} else {
Value = (INT16) (Value / 10);
Exponent++;
}
}
CopyMem (
(UINT8 *) (StructureNode->Structure) + Offset,
&Value,
2
);
return EFI_SUCCESS;
}
/**
Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a word, with 'Kilo'
as the unit. Granularity implemented for Cache Size.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_INVALID_PARAMETER RecordDataSize is invalid.
@retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.
**/
EFI_STATUS
SmbiosFldBase2ToWordWithKilo (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_EXP_BASE2_DATA *Base2Data;
UINT32 Value;
UINT16 Exponent;
if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {
return EFI_INVALID_PARAMETER;
}
Base2Data = RecordData;
Value = Base2Data->Value;
Exponent = Base2Data->Exponent;
Exponent -= 10;
Value <<= Exponent;
//
// Implement cache size granularity
//
if(Value >= 0x8000) {
Value >>= 6;
Value |= 0x8000;
}
CopyMem (
(UINT8 *) (StructureNode->Structure) + Offset,
&Value,
2
);
return EFI_SUCCESS;
}
/**
Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'
as the unit.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_INVALID_PARAMETER RecordDataSize is invalid.
@retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.
**/
EFI_STATUS
SmbiosFldBase2ToByteWith64K (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_EXP_BASE2_DATA *Base2Data;
UINT16 Value;
UINT16 Exponent;
if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {
return EFI_INVALID_PARAMETER;
}
Base2Data = RecordData;
Value = Base2Data->Value;
Exponent = Base2Data->Exponent;
Exponent -= 16;
Value <<= Exponent;
CopyMem (
(UINT8 *) (StructureNode->Structure) + Offset,
&Value,
1
);
return EFI_SUCCESS;
}
/**
Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a word, with 10exp-9
as the unit.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_INVALID_PARAMETER RecordDataSize is invalid.
@retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.
**/
EFI_STATUS
SmbiosFldBase10ToByteWithNano (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_EXP_BASE10_DATA *Base10Data;
INT16 Value;
INT16 Exponent;
if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {
return EFI_INVALID_PARAMETER;
}
Base10Data = RecordData;
Value = Base10Data->Value;
Exponent = Base10Data->Exponent;
Exponent += 9;
while (Exponent != 0) {
if (Exponent > 0) {
Value = (INT16) (Value * 10);
Exponent--;
} else {
Value = (INT16) (Value / 10);
Exponent++;
}
}
* (UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) Value;
return EFI_SUCCESS;
}
/**
Field Filling Function: truncate record data to byte and fill in the
field as indicated by Offset.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_INVALID_PARAMETER RecordDataSize is invalid.
@retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.
**/
EFI_STATUS
SmbiosFldTruncateToByte (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_STATUS Status;
Status = EFI_SUCCESS;
//
// Truncate the data to 8 bits
//
*(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) (*(UINT8 *) RecordData);
return Status;
}
/**
Field Filling Function: truncate record data to byte and fill in the
field as indicated by Offset.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_INVALID_PARAMETER RecordDataSize is invalid.
@retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.
**/
EFI_STATUS
SmbiosFldTruncateToWord (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_STATUS Status;
Status = EFI_SUCCESS;
//
// Truncate the data to 8 bits
//
CopyMem (
(UINT8 *) (StructureNode->Structure) + Offset,
RecordData,
2
);
return Status;
}
/**
Check if OEM structure has included 2 trailing 0s in data record.
@param RecordData Point to record data will be checked.
@param RecordDataSize The size of record data.
@retval 0 2 trailing 0s exist in unformatted section
@retval 1 1 trailing 0 exists at the end of unformatted section
@retval -1 There is no 0 at the end of unformatted section
**/
INT8
SmbiosCheckTrailingZero (
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
SMBIOS_STRUCTURE *Smbios;
CHAR8 *Start;
CHAR8 *End;
Smbios = (SMBIOS_STRUCTURE *) RecordData;
//
// Skip over formatted section
//
Start = (CHAR8 *) ((UINT8 *) Smbios + Smbios->Length);
End = (CHAR8 *) RecordData + RecordDataSize;
//
// Unformatted section exists
//
while (Start < End - 1) {
//
// Avoid unaligned issue on IPF
//
if ((*Start == 0) && (*(Start + 1) == 0)) {
//
// 2 trailing 0s exist in unformatted section
//
return 0;
}
Start++;
}
if (Start == End - 1) {
//
// Check if there has been already 1 trailing 0
//
if (*Start == 0) {
return 1;
}
}
//
// There is no 0 at the end of unformatted section
//
return -1;
}

View File

@@ -1,74 +0,0 @@
## @file
# This thunk driver register a filter for DataHub protocol, once a data hub record
# is added via EFI_DATA_HUB_PROTOCOL->LogData(), this filter will be invoked to
# translate the datahub's record to SMBIOS record.
#
# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = Datahub2SmbiosThunk
FILE_GUID = 9F8B12CF-E796-408f-9D59-3ACDDC0AFBE3
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = ThunkEntry
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
Thunk.c
Thunk.h
Translate.c
ConvLib.c
ConvTable.c
ProcessorConv.c
MemoryConv.c
MiscConv.c
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
UefiBootServicesTableLib
MemoryAllocationLib
UefiDriverEntryPoint
BaseMemoryLib
HiiLib
DebugLib
BaseLib
PcdLib
[Protocols]
gEfiDataHubProtocolGuid ## CONSUMES
gEfiSmbiosProtocolGuid ## CONSUMES
[Guids]
gEfiMemorySubClassGuid ## CONSUMES
gEfiMiscSubClassGuid ## CONSUMES
gEfiCacheSubClassGuid ## CONSUMES
gZeroGuid ## SOMETIMES_CONSUMES ## GUID
[FeaturePcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport
[Depex]
gEfiDataHubProtocolGuid AND gEfiSmbiosProtocolGuid

View File

@@ -1,164 +0,0 @@
/** @file
Routines that support Processor SubClass data records translation.
Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "Thunk.h"
/**
Field Filling Function for Processor SubClass record type 17 -- Cache association.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.
**/
EFI_STATUS
SmbiosFldProcessorType17 (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_SUBCLASS_TYPE1_HEADER *DataHeader;
EFI_INTER_LINK_DATA *LinkData;
UINT16 FieldOffset;
UINT8 *Pointer;
DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) RecordData;
LinkData = (EFI_INTER_LINK_DATA *) (DataHeader + 1);
if (RecordDataSize != sizeof (EFI_INTER_LINK_DATA) + sizeof (EFI_SUBCLASS_TYPE1_HEADER)) {
return EFI_INVALID_PARAMETER;
}
//
// Determine the cache level
//
Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle);
if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {
SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle), 2, 0xFF);
}
Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle);
if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {
SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle), 2, 0xFF);
}
Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle);
if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {
SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle), 2, 0xFF);
}
if (LinkData->SubInstance == 1) {
FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle);
} else if (LinkData->SubInstance == 2) {
FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle);
} else if (LinkData->SubInstance == 3) {
FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle);
} else {
return EFI_INVALID_PARAMETER;
}
return SmbiosFldInterLink (
StructureNode,
FieldOffset,
7, // Smbios type 7 -- Cache Information
LinkData,
&gEfiCacheSubClassGuid // gProcessorSubClassName
);
}
/**
Field Filling Function for Processor SubClass record type 6 -- ProcessorID.
Offset is mandatory.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.
**/
EFI_STATUS
SmbiosFldProcessorType6 (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_PROCESSOR_ID_DATA *ProcessorIdData;
ProcessorIdData = RecordData;
CopyMem (
(UINT8 *) (StructureNode->Structure) + Offset,
&(ProcessorIdData->Signature),
4
);
CopyMem (
(UINT8 *) (StructureNode->Structure) + Offset + 4,
&(ProcessorIdData->FeatureFlags),
4
);
return EFI_SUCCESS;
}
/**
Field Filling Function for Processor SubClass record type 9 -- Voltage.
Offset is mandatory.
@param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.
@param Offset Offset of SMBIOS record which RecordData will be filled.
@param RecordData RecordData buffer will be filled.
@param RecordDataSize The size of RecordData buffer.
@retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.
**/
EFI_STATUS
SmbiosFldProcessorType9 (
IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,
IN UINT32 Offset,
IN VOID *RecordData,
IN UINT32 RecordDataSize
)
{
EFI_EXP_BASE10_DATA *Base10Data;
INT16 Value;
INT16 Exponent;
if (RecordDataSize != sizeof (EFI_EXP_BASE10_DATA)) {
return EFI_INVALID_PARAMETER;
}
Base10Data = RecordData;
Value = Base10Data->Value;
Exponent = Base10Data->Exponent;
Exponent += 1;
while (Exponent != 0) {
if (Exponent > 0) {
Value = (INT16) (Value * 10);
Exponent--;
} else {
Value = (INT16) (Value / 10);
Exponent++;
}
}
* (UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) (Value | BIT7);
return EFI_SUCCESS;
}

View File

@@ -1,160 +0,0 @@
/** @file
Thunk driver's entry that install filter for DataRecord.
Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "Thunk.h"
//
// Global variables
//
LIST_ENTRY mStructureList;
/**
Entry Point of thunk driver.
@param[in] ImageHandle Image handle of this driver.
@param[in] SystemTable Pointer to EFI system table.
@retval EFI_SUCCESS The event handlers were registered.
@retval EFI_DEVICE_ERROR Failed to register the event handlers
**/
EFI_STATUS
EFIAPI
ThunkEntry (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_DATA_HUB_PROTOCOL *DataHub;
EFI_EVENT FilterEvent;
Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (VOID**) &DataHub);
ASSERT_EFI_ERROR (Status);
ASSERT (DataHub != NULL);
InitializeListHead (&mStructureList);
//
// Register SmBios Data Filter Function.
// This function is notified at TPL_CALLBACK.
//
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
SmbiosDataFilter,
NULL,
&FilterEvent
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = DataHub->RegisterFilterDriver (
DataHub,
FilterEvent,
TPL_APPLICATION,
EFI_DATA_RECORD_CLASS_DATA,
NULL
);
if (EFI_ERROR (Status)) {
gBS->CloseEvent (FilterEvent);
return Status;
}
return Status;
}
/**
Smbios data filter function. This function is invoked when there is data records
available in the Data Hub.
@param Event The event that is signaled.
@param Context not used here.
**/
VOID
EFIAPI
SmbiosDataFilter (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status;
EFI_DATA_HUB_PROTOCOL *DataHub;
EFI_HANDLE DataHubHandle;
UINTN HandleSize;
UINT64 MonotonicCount;
EFI_DATA_RECORD_HEADER *Record;
Status = EFI_SUCCESS;
DataHub = NULL;
//
// Get the Data Hub Protocol. Assume only one instance
// of Data Hub Protocol is available in the system.
//
HandleSize = sizeof (EFI_HANDLE);
Status = gBS->LocateHandle (
ByProtocol,
&gEfiDataHubProtocolGuid,
NULL,
&HandleSize,
&DataHubHandle
);
if (EFI_ERROR (Status)) {
goto Done;
}
Status = gBS->HandleProtocol (
DataHubHandle,
&gEfiDataHubProtocolGuid,
(VOID **) &DataHub
);
if (EFI_ERROR (Status)) {
goto Done;
}
//
// Get all available data records from data hub
//
MonotonicCount = 0;
Record = NULL;
do {
Status = DataHub->GetNextRecord (
DataHub,
&MonotonicCount,
&Event,
&Record
);
if (!EFI_ERROR (Status)) {
if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
//
// It's of expected Data Type. Process it.
//
SmbiosProcessDataRecord (Record);
}
}
} while (!EFI_ERROR (Status) && (MonotonicCount != 0));
Done:
return ;
}

View File

@@ -1,608 +0,0 @@
/** @file
Translate the DataHub records via EFI_DATA_HUB_PROTOCOL to Smbios recorders
via EFI_SMBIOS_PROTOCOL.
Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "Thunk.h"
EFI_SMBIOS_PROTOCOL *mSmbiosProtocol = NULL;
/**
Release the structure Node.
@param StructureNode Point to SMBIOS_STRUCTURE_NODE which will be removed.
**/
VOID
ReleaseStructureNode (
SMBIOS_STRUCTURE_NODE *StructureNode
)
{
EFI_SMBIOS_PROTOCOL *Smbios;
RemoveEntryList (&(StructureNode->Link));
Smbios = GetSmbiosProtocol();
ASSERT (Smbios != NULL);
Smbios->Remove (Smbios, StructureNode->SmbiosHandle);
gBS->FreePool (StructureNode);
}
/**
Process a datahub's record and find corresponding translation way to translate
to SMBIOS record.
@param Record Point to datahub record.
**/
VOID
SmbiosProcessDataRecord (
IN EFI_DATA_RECORD_HEADER *Record
)
{
EFI_DATA_RECORD_HEADER *RecordHeader;
EFI_SUBCLASS_TYPE1_HEADER *DataHeader;
UINTN Index;
SMBIOS_CONVERSION_TABLE_ENTRY *Conversion;
UINT8 *SrcData;
UINTN SrcDataSize;
LIST_ENTRY *Link;
SMBIOS_STRUCTURE_NODE *StructureNode;
BOOLEAN StructureCreated;
EFI_STATUS Status;
Conversion = NULL;
StructureNode = NULL;
StructureCreated = FALSE;
RecordHeader = Record;
DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);
SrcData = (UINT8 *) (DataHeader + 1);
SrcDataSize = RecordHeader->RecordSize - RecordHeader->HeaderSize - sizeof (EFI_SUBCLASS_TYPE1_HEADER);
if (DataHeader->HeaderSize != sizeof (EFI_SUBCLASS_TYPE1_HEADER) ||
DataHeader->Instance == EFI_SUBCLASS_INSTANCE_RESERVED ||
DataHeader->SubInstance == EFI_SUBCLASS_INSTANCE_RESERVED
) {
//
// Invalid Data Record
//
goto Done;
}
Index = 0;
while(TRUE) {
//
// Find a matching entry in the conversion table for this
// (SubClass, RecordNumber) pair
//
for (; !CompareGuid (&(mConversionTable[Index].SubClass), &gZeroGuid); Index++) {
if (CompareGuid (
&(mConversionTable[Index].SubClass),
&(RecordHeader->DataRecordGuid)
)) {
if (mConversionTable[Index].RecordType == DataHeader->RecordType) {
break;
}
}
}
if (CompareGuid (&(mConversionTable[Index].SubClass), &gZeroGuid)) {
//
// We cannot find a matching entry in conversion table,
// this means this data record cannot be used for SMBIOS.
// Just skip it.
//
goto Done;
}
Conversion = &mConversionTable[Index++];
//
// Find corresponding structure in the Structure List
//
for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {
StructureNode = CR (
Link,
SMBIOS_STRUCTURE_NODE,
Link,
SMBIOS_STRUCTURE_NODE_SIGNATURE
);
if (Conversion->StructureLocatingMethod == BySubclassInstanceSubinstanceProducer) {
//
// Look at SubClass, Instance, SubInstance and ProducerName for a matching
// node
//
if (CompareGuid (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid)) &&
StructureNode->Instance == DataHeader->Instance &&
StructureNode->SubInstance == DataHeader->SubInstance &&
CompareGuid (&(StructureNode->ProducerName), &(RecordHeader->ProducerName))
) {
if (Conversion->SmbiosType >= 0x80) {
if (StructureNode->SmbiosType == ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type) {
break;
}
} else if (StructureNode->SmbiosType == Conversion->SmbiosType) {
break;
}
}
} else if (Conversion->StructureLocatingMethod == BySubClassInstanceProducer) {
//
// Look at SubClass, Instance and ProducerName for a matching node
//
if (CompareGuid (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid)) &&
StructureNode->Instance == DataHeader->Instance &&
CompareGuid (&(StructureNode->ProducerName), &(RecordHeader->ProducerName))
) {
if (Conversion->SmbiosType >= 0x80) {
if (StructureNode->SmbiosType == ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type) {
break;
}
} else if (StructureNode->SmbiosType == Conversion->SmbiosType) {
break;
}
}
} else {
//
// Invalid conversion table entry
//
goto Done;
}
}
if (Link == &mStructureList || StructureNode == NULL) {
//
// Not found, create a new structure
//
StructureNode = AllocateZeroPool (sizeof (SMBIOS_STRUCTURE_NODE));
if (StructureNode == NULL) {
goto Done;
}
if (Conversion->StructureLocatingMethod == BySubclassInstanceSubinstanceProducer) {
//
// Fill in SubClass, Instance, SubInstance and ProducerName
//
CopyMem (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid), sizeof (EFI_GUID));
StructureNode->Instance = DataHeader->Instance;
StructureNode->SubInstance = DataHeader->SubInstance;
CopyMem (&(StructureNode->ProducerName), &(RecordHeader->ProducerName), sizeof (EFI_GUID));
} else if (Conversion->StructureLocatingMethod == BySubClassInstanceProducer) {
//
// Fill in at SubClass, Instance and ProducerName, mark SubInstance as Non
// Applicable
//
CopyMem (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid), sizeof (EFI_GUID));
StructureNode->Instance = DataHeader->Instance;
StructureNode->SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;
CopyMem (&(StructureNode->ProducerName), &(RecordHeader->ProducerName), sizeof (EFI_GUID));
}
//
// Allocate the structure instance
//
StructureNode->StructureSize = SmbiosGetTypeMinimalLength (Conversion->SmbiosType);
//
// StructureSize include the TWO trailing zero byte.
//
if (StructureNode->StructureSize < (sizeof(SMBIOS_STRUCTURE) + 2)) {
//
// Invalid Type
//
gBS->FreePool (StructureNode);
goto Done;
}
//
// Assign correct SmbiosType when OEM type and Non-OEM type
//
if (Conversion->SmbiosType >= 0x80) {
StructureNode->SmbiosType = ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type;
} else {
StructureNode->SmbiosType = Conversion->SmbiosType;
}
StructureNode->SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
Status = SmbiosProtocolCreateRecord (
NULL,
StructureNode
);
if (EFI_ERROR (Status)) {
goto Done;
}
//
// Temporary cache the structrue pointer to Smbios database.
//
StructureNode->Structure = GetSmbiosBufferFromHandle (StructureNode->SmbiosHandle, StructureNode->SmbiosType, NULL);
InitializeListHead (&StructureNode->LinkDataFixup);
//
// Insert the Structure Node into the Strucutre List
//
StructureNode->Signature = SMBIOS_STRUCTURE_NODE_SIGNATURE;
InsertTailList (&mStructureList, &(StructureNode->Link));
StructureCreated = TRUE;
}
//
// Re-calculate the structure pointer to Smbios database.
//
StructureNode->Structure = GetSmbiosBufferFromHandle (StructureNode->SmbiosHandle, StructureNode->SmbiosType, NULL);
//
// Fill the Structure's field corresponding to this data record
//
if (Conversion->FieldFillingMethod == RecordDataUnchangedOffsetSpecified) {
//
// Field data is just the record data without transforming and
// offset is specified directly in the conversion table entry
//
if (Conversion->FieldOffset + SrcDataSize > StructureNode->Structure->Length) {
//
// Invalid Conversion Table Entry
//
if (StructureCreated) {
ReleaseStructureNode (StructureNode);
}
goto Done;
}
CopyMem ((UINT8 *) (StructureNode->Structure) + Conversion->FieldOffset, SrcData, SrcDataSize);
} else if (Conversion->FieldFillingMethod == ByFunctionWithOffsetSpecified) {
//
// Field offfset is specified in the conversion table entry, but
// record data needs to be transformed to be filled into the field,
// so let the FieldFillingFunction do it.
//
if (Conversion->FieldFillingFunction == NULL) {
//
// Invalid Conversion Table Entry
//
if (StructureCreated) {
ReleaseStructureNode (StructureNode);
}
goto Done;
}
Status = Conversion->FieldFillingFunction (
StructureNode,
Conversion->FieldOffset,
SrcData,
(UINT32) SrcDataSize
);
if (EFI_ERROR (Status)) {
if (StructureCreated) {
ReleaseStructureNode (StructureNode);
}
goto Done;
}
} else if (Conversion->FieldFillingMethod == ByFunction) {
//
// Both field offset and field content are determined by
// FieldFillingFunction
//
if (Conversion->FieldFillingFunction == NULL) {
//
// Invalid Conversion Table Entry
//
if (StructureCreated) {
ReleaseStructureNode (StructureNode);
}
goto Done;
}
Status = Conversion->FieldFillingFunction (
StructureNode,
0,
SrcData,
(UINT32) SrcDataSize
);
if (EFI_ERROR (Status)) {
if (StructureCreated) {
ReleaseStructureNode (StructureNode);
}
goto Done;
}
} else if (Conversion->FieldFillingMethod == ByFunctionWithWholeDataRecord) {
//
// Both field offset and field content are determined by
// FieldFillingFunction and the function accepts the whole data record
// including the data header
//
if (Conversion->FieldFillingFunction == NULL) {
//
// Invalid Conversion Table Entry
//
if (StructureCreated) {
ReleaseStructureNode (StructureNode);
}
goto Done;
}
Status = Conversion->FieldFillingFunction (
StructureNode,
0,
DataHeader,
RecordHeader->RecordSize - RecordHeader->HeaderSize
);
if (EFI_ERROR (Status)) {
if (StructureCreated) {
ReleaseStructureNode (StructureNode);
}
goto Done;
}
} else {
//
// Invalid Conversion Table Entry
//
if (StructureCreated) {
ReleaseStructureNode (StructureNode);
}
goto Done;
}
//
// SmbiosEnlargeStructureBuffer is called to remove and add again
// this SMBIOS entry to reflash SMBIOS table in configuration table.
//
SmbiosEnlargeStructureBuffer (
StructureNode,
StructureNode->Structure->Length,
StructureNode->StructureSize,
StructureNode->StructureSize
);
}
Done:
return ;
}
/**
Calculate the minimal length for a SMBIOS type. This length maybe not equal
to sizeof (SMBIOS_RECORD_STRUCTURE), but defined in conformance chapter in SMBIOS specification.
@param Type SMBIOS's type.
@return the minimal length of a smbios record.
**/
UINT32
SmbiosGetTypeMinimalLength (
IN UINT8 Type
)
{
UINTN Index;
for (Index = 0; mTypeInfoTable[Index].MinLength != 0; Index++) {
if (mTypeInfoTable[Index].Type == Type) {
return mTypeInfoTable[Index].MinLength;
}
}
return 0;
}
/**
Get pointer of EFI_SMBIOS_PROTOCOL.
@return pointer of EFI_SMBIOS_PROTOCOL.
**/
EFI_SMBIOS_PROTOCOL*
GetSmbiosProtocol(
VOID
)
{
EFI_STATUS Status;
if (mSmbiosProtocol == NULL) {
Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID*) &mSmbiosProtocol);
ASSERT_EFI_ERROR (Status);
}
ASSERT (mSmbiosProtocol != NULL);
return mSmbiosProtocol;
}
/**
Create a blank smbios record. The datahub record is only a field of smbios record.
So before fill any field from datahub's record. A blank smbios record need to be
created.
@param ProducerHandle The produce handle for a datahub record
@param StructureNode Point to SMBIOS_STRUCTURE_NODE
@retval EFI_OUT_OF_RESOURCES Fail to allocate memory for new blank SMBIOS record.
@retval EFI_SUCCESS Success to create blank smbios record.
**/
EFI_STATUS
SmbiosProtocolCreateRecord (
IN EFI_HANDLE ProducerHandle, OPTIONAL
IN SMBIOS_STRUCTURE_NODE *StructureNode
)
{
EFI_SMBIOS_PROTOCOL *Smbios;
EFI_SMBIOS_TABLE_HEADER *BlankRecord;
EFI_STATUS Status;
SMBIOS_STRUCTURE_NODE *RefStructureNode;
LIST_ENTRY *Link;
LIST_ENTRY *Link1;
LIST_ENTRY *Link2;
SMBIOS_LINK_DATA_FIXUP_NODE *LinkDataFixupNode;
UINT8 *BufferPointer;
Smbios = GetSmbiosProtocol();
ASSERT (Smbios != NULL);
//
// Prepare a blank smbios record.
//
BlankRecord = (EFI_SMBIOS_TABLE_HEADER*) AllocateZeroPool (StructureNode->StructureSize);
if (BlankRecord == NULL) {
return EFI_OUT_OF_RESOURCES;
}
BlankRecord->Type = StructureNode->SmbiosType;
BlankRecord->Length = (UINT8) (StructureNode->StructureSize - 2);
//
// Add blank record into SMBIOS database.
//
Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, BlankRecord);
FreePool (BlankRecord);
//
// Fix up the InterLink node for new added smbios record if some other
// existing smbios record want to link this new record's handle.
//
for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {
RefStructureNode = CR (Link, SMBIOS_STRUCTURE_NODE, Link, SMBIOS_STRUCTURE_NODE_SIGNATURE);
for (Link1 = RefStructureNode->LinkDataFixup.ForwardLink; Link1 != &RefStructureNode->LinkDataFixup;) {
LinkDataFixupNode = CR (Link1, SMBIOS_LINK_DATA_FIXUP_NODE, Link, SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE);
Link2 = Link1;
Link1 = Link1->ForwardLink;
if ((StructureNode->SmbiosType != LinkDataFixupNode->TargetType) ||
!(CompareGuid (&StructureNode->SubClass, &LinkDataFixupNode->SubClass)) ||
(StructureNode->Instance != LinkDataFixupNode->LinkData.Instance) ||
(StructureNode->SubInstance != LinkDataFixupNode->LinkData.SubInstance)) {
continue;
}
//
// Fill the field with the handle found
//
BufferPointer = (UINT8 *) (RefStructureNode->Structure) + LinkDataFixupNode->Offset;
*BufferPointer = (UINT8) (StructureNode->SmbiosHandle & 0xFF);
*(BufferPointer + 1) = (UINT8) ((StructureNode->SmbiosHandle >> 8) & 0xFF);
BufferPointer = NULL;
RemoveEntryList (Link2);
FreePool (LinkDataFixupNode);
}
}
return Status;
}
/**
Get pointer of a SMBIOS record's buffer according to its handle.
@param Handle The handle of SMBIOS record want to be searched.
@param Type The type of SMBIOS record want to be searched.
@param ProducerHandle The producer handle of SMBIOS record.
@return EFI_SMBIOS_TABLE_HEADER Point to a SMBIOS record's buffer.
**/
EFI_SMBIOS_TABLE_HEADER*
GetSmbiosBufferFromHandle (
IN EFI_SMBIOS_HANDLE Handle,
IN EFI_SMBIOS_TYPE Type,
IN EFI_HANDLE ProducerHandle OPTIONAL
)
{
EFI_SMBIOS_PROTOCOL* Smbios;
EFI_SMBIOS_HANDLE SearchingHandle;
EFI_SMBIOS_TABLE_HEADER *RecordInSmbiosDatabase;
EFI_STATUS Status;
SearchingHandle = SMBIOS_HANDLE_PI_RESERVED;
Smbios = GetSmbiosProtocol();
ASSERT (Smbios != NULL);
do {
Status = Smbios->GetNext (Smbios, &SearchingHandle, &Type, &RecordInSmbiosDatabase, NULL);
} while ((SearchingHandle != Handle) && (Status != EFI_NOT_FOUND));
return RecordInSmbiosDatabase;
}
/**
Get the full size of smbios structure including optional strings that follow the formatted structure.
@param Head Pointer to the beginning of smbios structure.
@param Size The returned size.
@param NumberOfStrings The returned number of optional strings that follow the formatted structure.
@retval EFI_SUCCESS Size retured in Size.
@retval EFI_INVALID_PARAMETER Input smbios structure mal-formed or Size is NULL.
**/
EFI_STATUS
EFIAPI
GetSmbiosStructureSize (
IN EFI_SMBIOS_TABLE_HEADER *Head,
OUT UINT32 *Size,
OUT UINT8 *NumberOfStrings
)
{
UINT32 FullSize;
UINT8 StrLen;
INT8* CharInStr;
if (Size == NULL || NumberOfStrings == NULL) {
return EFI_INVALID_PARAMETER;
}
FullSize = Head->Length;
CharInStr = (INT8*)Head + Head->Length;
*Size = FullSize;
*NumberOfStrings = 0;
StrLen = 0;
//
// look for the two consecutive zeros, check the string limit by the way.
//
while (*CharInStr != 0 || *(CharInStr+1) != 0) {
if (*CharInStr == 0) {
*Size += 1;
CharInStr++;
}
for (StrLen = 0 ; StrLen < SMBIOS_STRING_MAX_LENGTH; StrLen++) {
if (*(CharInStr+StrLen) == 0) {
break;
}
}
if (StrLen == SMBIOS_STRING_MAX_LENGTH) {
return EFI_INVALID_PARAMETER;
}
//
// forward the pointer
//
CharInStr += StrLen;
*Size += StrLen;
*NumberOfStrings += 1;
}
//
// count ending two zeros.
//
*Size += 2;
return EFI_SUCCESS;
}

View File

@@ -1,294 +0,0 @@
/** @file
PI SMM Status Code Protocol on Framework SMM Status Code Protocol Thunk.
This thunk driver produces PI SMM Status Code Protocol and SMM Report Status Code Handler Protocol.
And it registers a status code handler within itself to route status codes into Framework SMM Status
Code Protocol.
Note that Framework SMM Status Code Protocol and PI SMM Status Code Protocol have identical protocol
GUID and interface structure, but they are in different handle databases.
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that 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.
**/
#include "PiSmmStatusCodeOnFrameworkSmmStatusCodeThunk.h"
LIST_ENTRY mCallbackListHead = INITIALIZE_LIST_HEAD_VARIABLE (mCallbackListHead);
//
// Report operation nest status.
// If it is set, then the report operation has nested.
//
UINT32 mStatusCodeNestStatus = 0;
EFI_SMM_STATUS_CODE_PROTOCOL mSmmStatusCodeProtocol = {
ReportDispatcher
};
EFI_SMM_RSC_HANDLER_PROTOCOL mSmmRscHandlerProtocol = {
Register,
Unregister
};
EFI_SMM_STATUS_CODE_PROTOCOL *mFrameworkSmmStatusCode;
/**
Register the callback function for ReportStatusCode() notification.
When this function is called the function pointer is added to an internal list and any future calls to
ReportStatusCode() will be forwarded to the Callback function.
@param[in] Callback A pointer to a function of type EFI_PEI_RSC_HANDLER_CALLBACK that is called
when a call to ReportStatusCode() occurs.
@retval EFI_SUCCESS Function was successfully registered.
@retval EFI_INVALID_PARAMETER The callback function was NULL.
@retval EFI_OUT_OF_RESOURCES The internal buffer ran out of space. No more functions can be
registered.
@retval EFI_ALREADY_STARTED The function was already registered. It can't be registered again.
**/
EFI_STATUS
EFIAPI
Register (
IN EFI_SMM_RSC_HANDLER_CALLBACK Callback
)
{
LIST_ENTRY *Link;
SMM_RSC_HANDLER_CALLBACK_ENTRY *CallbackEntry;
if (Callback == NULL) {
return EFI_INVALID_PARAMETER;
}
for (Link = GetFirstNode (&mCallbackListHead); !IsNull (&mCallbackListHead, Link); Link = GetNextNode (&mCallbackListHead, Link)) {
CallbackEntry = CR (Link, SMM_RSC_HANDLER_CALLBACK_ENTRY, Node, SMM_RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE);
if (CallbackEntry->RscHandlerCallback == Callback) {
//
// If the function was already registered. It can't be registered again.
//
return EFI_ALREADY_STARTED;
}
}
CallbackEntry = (SMM_RSC_HANDLER_CALLBACK_ENTRY *)AllocatePool (sizeof (SMM_RSC_HANDLER_CALLBACK_ENTRY));
ASSERT (CallbackEntry != NULL);
CallbackEntry->Signature = SMM_RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE;
CallbackEntry->RscHandlerCallback = Callback;
InsertTailList (&mCallbackListHead, &CallbackEntry->Node);
return EFI_SUCCESS;
}
/**
Remove a previously registered callback function from the notification list.
ReportStatusCode() messages will no longer be forwarded to the Callback function.
@param[in] Callback A pointer to a function of type EFI_PEI_RSC_HANDLER_CALLBACK that is to be
unregistered.
@retval EFI_SUCCESS The function was successfully unregistered.
@retval EFI_INVALID_PARAMETER The callback function was NULL.
@retval EFI_NOT_FOUND The callback function was not found to be unregistered.
**/
EFI_STATUS
EFIAPI
Unregister (
IN EFI_SMM_RSC_HANDLER_CALLBACK Callback
)
{
LIST_ENTRY *Link;
SMM_RSC_HANDLER_CALLBACK_ENTRY *CallbackEntry;
if (Callback == NULL) {
return EFI_INVALID_PARAMETER;
}
for (Link = GetFirstNode (&mCallbackListHead); !IsNull (&mCallbackListHead, Link); Link = GetNextNode (&mCallbackListHead, Link)) {
CallbackEntry = CR (Link, SMM_RSC_HANDLER_CALLBACK_ENTRY, Node, SMM_RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE);
if (CallbackEntry->RscHandlerCallback == Callback) {
//
// If the function is found in list, delete it and return.
//
RemoveEntryList (&CallbackEntry->Node);
FreePool (CallbackEntry);
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}
/**
Provides an interface that a software module can call to report a status code.
@param This EFI_SMM_STATUS_CODE_PROTOCOL instance.
@param Type Indicates the type of status code being reported.
@param Value Describes the current status of a hardware or software entity.
This included information about the class and subclass that is used to
classify the entity as well as an operation.
@param Instance The enumeration of a hardware or software entity within
the system. Valid instance numbers start with 1.
@param CallerId This optional parameter may be used to identify the caller.
This parameter allows the status code driver to apply different rules to
different callers.
@param Data This optional parameter may be used to pass additional data.
@retval EFI_SUCCESS The function completed successfully
@retval EFI_DEVICE_ERROR The function should not be completed due to a device error.
**/
EFI_STATUS
EFIAPI
ReportDispatcher (
IN CONST EFI_SMM_STATUS_CODE_PROTOCOL *This,
IN EFI_STATUS_CODE_TYPE Type,
IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance,
IN CONST EFI_GUID *CallerId OPTIONAL,
IN EFI_STATUS_CODE_DATA *Data OPTIONAL
)
{
LIST_ENTRY *Link;
SMM_RSC_HANDLER_CALLBACK_ENTRY *CallbackEntry;
//
// Use atom operation to avoid the reentant of report.
// If current status is not zero, then the function is reentrancy.
//
if (InterlockedCompareExchange32 (&mStatusCodeNestStatus, 0, 1) == 1) {
return EFI_DEVICE_ERROR;
}
for (Link = GetFirstNode (&mCallbackListHead); !IsNull (&mCallbackListHead, Link); Link = GetNextNode (&mCallbackListHead, Link)) {
CallbackEntry = CR (Link, SMM_RSC_HANDLER_CALLBACK_ENTRY, Node, SMM_RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE);
CallbackEntry->RscHandlerCallback (
Type,
Value,
Instance,
(EFI_GUID*)CallerId,
Data
);
}
//
// Restore the nest status of report
//
InterlockedCompareExchange32 (&mStatusCodeNestStatus, 1, 0);
return EFI_SUCCESS;
}
/**
This SMM Status Code Handler routes status codes to Framework SMM Status Code Protocol.
@param CodeType Indicates the type of status code being reported.
@param Value Describes the current status of a hardware or software entity.
This included information about the class and subclass that is used to
classify the entity as well as an operation.
@param Instance The enumeration of a hardware or software entity within
the system. Valid instance numbers start with 1.
@param CallerId This optional parameter may be used to identify the caller.
This parameter allows the status code driver to apply different rules to
different callers.
@param Data This optional parameter may be used to pass additional data.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_DEVICE_ERROR The function should not be completed due to a device error.
**/
EFI_STATUS
EFIAPI
SmmStatusCodeHandler (
IN EFI_STATUS_CODE_TYPE CodeType,
IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance,
IN EFI_GUID *CallerId,
IN EFI_STATUS_CODE_DATA *Data OPTIONAL
)
{
return mFrameworkSmmStatusCode->ReportStatusCode (
mFrameworkSmmStatusCode,
CodeType,
Value,
Instance,
CallerId,
Data
);
}
/**
Entry point of PI SMM Status Code Protocol on Framework SMM Status Code Protocol thunk driver.
@param ImageHandle The firmware allocated handle for the EFI image.
@param SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
**/
EFI_STATUS
EFIAPI
SmmStatusCodeThunkMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_HANDLE Handle;
//
// Locate Framework SMM Status Code Protocol in UEFI handle database.
//
Status = SystemTable->BootServices->LocateProtocol (
&gEfiSmmStatusCodeProtocolGuid,
NULL,
(VOID **)&mFrameworkSmmStatusCode
);
ASSERT_EFI_ERROR (Status);
//
// Registers status code handler to route status codes into Framework SMM Status Code Protocol.
//
Register (SmmStatusCodeHandler);
Handle = NULL;
//
// Install SmmRscHandler Protocol
//
Status = gSmst->SmmInstallProtocolInterface (
&Handle,
&gEfiSmmRscHandlerProtocolGuid,
EFI_NATIVE_INTERFACE,
&mSmmRscHandlerProtocol
);
ASSERT_EFI_ERROR (Status);
//
// Install SmmStatusCode Protocol
//
Status = gSmst->SmmInstallProtocolInterface (
&Handle,
&gEfiSmmStatusCodeProtocolGuid,
EFI_NATIVE_INTERFACE,
&mSmmStatusCodeProtocol
);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}

View File

@@ -1,108 +0,0 @@
/** @file
Include file for PI SMM Status Code Protocol on Framework SMM Status Code Protocol Thunk driver.
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that 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.
**/
#ifndef __PI_SMM_STATUS_CODE_ON_FRAMEWORK_SMM_STATUS_CODE_H__
#define __PI_SMM_STATUS_CODE_ON_FRAMEWORK_SMM_STATUS_CODE_H__
#include <Protocol/SmmReportStatusCodeHandler.h>
#include <Protocol/SmmStatusCode.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/SynchronizationLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/SmmServicesTableLib.h>
#include <Library/MemoryAllocationLib.h>
#define SMM_RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE SIGNATURE_32 ('s', 'h', 'c', 'e')
typedef struct {
UINTN Signature;
EFI_SMM_RSC_HANDLER_CALLBACK RscHandlerCallback;
LIST_ENTRY Node;
} SMM_RSC_HANDLER_CALLBACK_ENTRY;
/**
Register the callback function for ReportStatusCode() notification.
When this function is called the function pointer is added to an internal list and any future calls to
ReportStatusCode() will be forwarded to the Callback function.
@param[in] Callback A pointer to a function of type EFI_PEI_RSC_HANDLER_CALLBACK that is called
when a call to ReportStatusCode() occurs.
@retval EFI_SUCCESS Function was successfully registered.
@retval EFI_INVALID_PARAMETER The callback function was NULL.
@retval EFI_OUT_OF_RESOURCES The internal buffer ran out of space. No more functions can be
registered.
@retval EFI_ALREADY_STARTED The function was already registered. It can't be registered again.
**/
EFI_STATUS
EFIAPI
Register (
IN EFI_SMM_RSC_HANDLER_CALLBACK Callback
);
/**
Remove a previously registered callback function from the notification list.
ReportStatusCode() messages will no longer be forwarded to the Callback function.
@param[in] Callback A pointer to a function of type EFI_PEI_RSC_HANDLER_CALLBACK that is to be
unregistered.
@retval EFI_SUCCESS The function was successfully unregistered.
@retval EFI_INVALID_PARAMETER The callback function was NULL.
@retval EFI_NOT_FOUND The callback function was not found to be unregistered.
**/
EFI_STATUS
EFIAPI
Unregister (
IN EFI_SMM_RSC_HANDLER_CALLBACK Callback
);
/**
Provides an interface that a software module can call to report a status code.
@param This EFI_SMM_STATUS_CODE_PROTOCOL instance.
@param Type Indicates the type of status code being reported.
@param Value Describes the current status of a hardware or software entity.
This included information about the class and subclass that is used to
classify the entity as well as an operation.
@param Instance The enumeration of a hardware or software entity within
the system. Valid instance numbers start with 1.
@param CallerId This optional parameter may be used to identify the caller.
This parameter allows the status code driver to apply different rules to
different callers.
@param Data This optional parameter may be used to pass additional data.
@retval EFI_SUCCESS The function completed successfully
@retval EFI_DEVICE_ERROR The function should not be completed due to a device error.
**/
EFI_STATUS
EFIAPI
ReportDispatcher (
IN CONST EFI_SMM_STATUS_CODE_PROTOCOL *This,
IN EFI_STATUS_CODE_TYPE Type,
IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance,
IN CONST EFI_GUID *CallerId OPTIONAL,
IN EFI_STATUS_CODE_DATA *Data OPTIONAL
);
#endif

View File

@@ -1,52 +0,0 @@
## @file
# PI SMM Status Code Protocol on Framework SMM Status Code Protocol Thunk driver.
#
# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = PiSmmStatusCodeOnFrameworkSmmStatusCodeThunk
FILE_GUID = 14FF38A8-ACBA-4228-A7D7-A73260C7559B
MODULE_TYPE = DXE_SMM_DRIVER
PI_SPECIFICATION_VERSION = 0x0001000A
VERSION_STRING = 1.0
ENTRY_POINT = SmmStatusCodeThunkMain
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
PiSmmStatusCodeOnFrameworkSmmStatusCodeThunk.c
PiSmmStatusCodeOnFrameworkSmmStatusCodeThunk.h
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
SmmServicesTableLib
UefiDriverEntryPoint
DebugLib
BaseLib
SynchronizationLib
MemoryAllocationLib
[Protocols]
gEfiSmmRscHandlerProtocolGuid ## PRODUCES
gEfiSmmStatusCodeProtocolGuid ## PRODUCES/CONSUMES
[Depex]
gEfiSmmStatusCodeProtocolGuid

View File

@@ -1,68 +0,0 @@
/** @file
Module produces EDK gEfiPrintProtocolGuid for backward compatibility support.
EDK II retires old EDK Print Protocol and this module produces
gEfiPrintProtocolGuid based on PrintLib:
1) If it links against BasePrintLib in MdePkg, it produces gEfiPrintProtocolGuid
without any prerequisites.
2) If it links against DxePrintLibPrint2Protocol in MdeModulePkg, it produces
gEfiPrintProtocolGuid on top of gEfiPrint2ProtocolGuid.
Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
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:
**/
#include <PiDxe.h>
#include <Protocol/Print.h>
#include <Library/PrintLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/DebugLib.h>
EFI_HANDLE mPrintThunkHandle = NULL;
CONST EFI_PRINT_PROTOCOL mPrintProtocol = {
UnicodeVSPrint,
};
/**
The user Entry Point for Print thunk module.
This is the entry point for Print thunk DXE Driver. It installs the Print Protocol on
top of PrintLib class in MdePkg.
@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
@retval Others Some error occurs when executing this entry point.
**/
EFI_STATUS
EFIAPI
InitPrintThunk (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
Status = gBS->InstallMultipleProtocolInterfaces (
&mPrintThunkHandle,
&gEfiPrintProtocolGuid, &mPrintProtocol,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}

View File

@@ -1,55 +0,0 @@
## @file
# Module produces EDK gEfiPrintProtocolGuid for backward compatibility support.
#
# EDK II retires old EDK Print Protocol and this module produces
# gEfiPrintProtocolGuid based on PrintLib:
# 1) If it links against BasePrintLib in MdePkg, it produces gEfiPrintProtocolGuid
# without any prerequisites.
# 2) If it links against DxePrintLibPrint2Protocol in MdeModulePkg, it produces
# gEfiPrintProtocolGuid on top of gEfiPrint2ProtocolGuid.
#
# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = PrintThunk
FILE_GUID = 3792FF94-8614-45ed-902B-1207BF1490A8
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = InitPrintThunk
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
PrintThunk.c
[Packages]
MdePkg/MdePkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
DebugLib
UefiBootServicesTableLib
PrintLib
[Protocols]
gEfiPrintProtocolGuid ## PRODUCES
[Depex]
TRUE

View File

@@ -1,172 +0,0 @@
/** @file
Module produce EFI_PEI_READ_ONLY_VARIABLE2_PPI on top of EFI_PEI_READ_ONLY_VARIABLE_PPI.
UEFI PI Spec supersedes Intel's Framework Specs.
EFI_PEI_READ_ONLY_VARIABLE_PPI defined in Intel Framework Pkg is replaced by EFI_PEI_READ_ONLY_VARIABLE2_PPI
in MdePkg.
This module produces EFI_PEI_READ_ONLY_VARIABLE2_PPI on top of EFI_PEI_READ_ONLY_VARIABLE_PPI.
This module is used on platform when both of these two conditions are true:
1) Framework module produces EFI_PEI_READ_ONLY_VARIABLE_PPI is present.
2) The platform has PI modules that only consumes EFI_PEI_READ_ONLY_VARIABLE2_PPI.
This module can't be used together with ReadOnlyVariableToReadOnlyVariable2Thunk module.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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:
**/
#include <PiPei.h>
#include <Ppi/ReadOnlyVariable2.h>
#include <Ppi/ReadOnlyVariable.h>
#include <Library/DebugLib.h>
#include <Library/PeiServicesTablePointerLib.h>
#include <Library/PeiServicesLib.h>
/**
Provide the read variable functionality of the variable services.
@param This A pointer to this instance of the EFI_PEI_READ_ONLY_VARIABLE2_PPI.
@param VariableName A pointer to a null-terminated string that is the variable's name.
@param VariableGuid A pointer to an EFI_GUID that is the variable's GUID. The combination of
VariableGuid and VariableName must be unique.
@param Attributes If non-NULL, on return, points to the variable's attributes.
@param DataSize On entry, points to the size in bytes of the Data buffer.
On return, points to the size of the data returned in Data.
@param Data Points to the buffer which will hold the returned variable value.
@retval EFI_SUCCESS The interface could be successfully installed
@retval EFI_NOT_FOUND The variable could not be discovered
@retval EFI_BUFFER_TOO_SMALL The caller buffer is not large enough
**/
EFI_STATUS
EFIAPI
PeiGetVariable (
IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VariableGuid,
OUT UINT32 *Attributes,
IN OUT UINTN *DataSize,
OUT VOID *Data
)
{
EFI_STATUS Status;
EFI_PEI_READ_ONLY_VARIABLE_PPI *ReadOnlyVariable;
Status = PeiServicesLocatePpi (
&gEfiPeiReadOnlyVariablePpiGuid,
0,
NULL,
(VOID **)&ReadOnlyVariable
);
ASSERT_EFI_ERROR (Status);
return ReadOnlyVariable->PeiGetVariable (
(EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
(CHAR16 *)VariableName,
(EFI_GUID *)VariableGuid,
Attributes,
DataSize,
Data
);
}
/**
Provide the get next variable functionality of the variable services.
@param This A pointer to this instance of the EFI_PEI_READ_ONLY_VARIABLE2_PPI.
@param VariableNameSize On entry, points to the size of the buffer pointed to by VariableName.
@param VariableName On entry, a pointer to a null-terminated string that is the variable's name.
On return, points to the next variable's null-terminated name string.
@param VariableGuid On entry, a pointer to an EFI_GUID that is the variable's GUID.
On return, a pointer to the next variable's GUID.
@retval EFI_SUCCESS The interface could be successfully installed
@retval EFI_NOT_FOUND The variable could not be discovered
**/
EFI_STATUS
EFIAPI
PeiGetNextVariableName (
IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName,
IN OUT EFI_GUID *VariableGuid
)
{
EFI_STATUS Status;
EFI_PEI_READ_ONLY_VARIABLE_PPI *ReadOnlyVariable;
Status = PeiServicesLocatePpi (
&gEfiPeiReadOnlyVariablePpiGuid,
0,
NULL,
(VOID **)&ReadOnlyVariable
);
ASSERT_EFI_ERROR (Status);
return ReadOnlyVariable->PeiGetNextVariableName (
(EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
VariableNameSize,
VariableName,
VariableGuid
);
}
//
// Module globals
//
EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariablePpi = {
PeiGetVariable,
PeiGetNextVariableName
};
EFI_PEI_PPI_DESCRIPTOR mPpiListVariable = {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEfiPeiReadOnlyVariable2PpiGuid,
&mVariablePpi
};
/**
User entry for this PEIM driver.
@param FileHandle Handle of the file being invoked.
@param PeiServices Describes the list of possible PEI Services.
@retval EFI_SUCCESS ReadOnlyVariable2 PPI is successfully installed.
@return Others ReadOnlyVariable2 PPI is not successfully installed.
**/
EFI_STATUS
EFIAPI
PeimInitializeReadOnlyVariable2 (
IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
//
// This thunk module can only be used together with a PI PEI core, as we
// assume PeiServices Pointer Table can be located in a standard way defined
// in PI spec.
//
ASSERT ((*PeiServices)->Hdr.Revision >= 0x00010000);
//
// Developer should make sure ReadOnlyVariable2ToReadOnlyVariable module is not present. or else, the call chain will form a
// infinite loop: ReadOnlyVariable2 -> ReadOnlyVariable -> ReadOnlyVariable2 -> .....
//
//
// Publish the variable capability to other modules
//
return PeiServicesInstallPpi (&mPpiListVariable);
}

View File

@@ -1,61 +0,0 @@
## @file
# Module produce EFI_PEI_READ_ONLY_VARIABLE2_PPI on top of EFI_PEI_READ_ONLY_VARIABLE_PPI .
#
# UEFI PI Spec supersedes Intel's Framework Specs.
# EFI_PEI_READ_ONLY_VARIABLE_PPI defined in Intel Framework Pkg is replaced by EFI_PEI_READ_ONLY_VARIABLE2_PPI
# in MdePkg.
# This module produces EFI_PEI_READ_ONLY_VARIABLE2_PPI on top of EFI_PEI_READ_ONLY_VARIABLE_PPI .
# This module is used on platform when both of these two conditions are true:
# 1) Framework module produces EFI_PEI_READ_ONLY_VARIABLE_PPI is present.
# 2) The platform has PI modules that consumes EFI_PEI_READ_ONLY_VARIABLE2_PPI.
#
# This module can't be used together with ReadOnlyVariableOnReadOnlyVariable2Thunk module.
#
#
# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = ReadOnlyVariable2OnReadOnlyVariableThunk
FILE_GUID = 950216A2-A621-479c-A13D-2990617BDFE7
MODULE_TYPE = PEIM
VERSION_STRING = 1.0
ENTRY_POINT = PeimInitializeReadOnlyVariable2
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
ReadOnlyVariable2OnReadOnlyVariableThunk.c
[Packages]
MdePkg/MdePkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
[LibraryClasses]
PeimEntryPoint
PeiServicesLib
PeiServicesTablePointerLib
DebugLib
[Ppis]
gEfiPeiReadOnlyVariablePpiGuid # PPI ALWAYS_CONSUMED
gEfiPeiReadOnlyVariable2PpiGuid # PPI ALWAYS_PRODUCED
[Depex]
gEfiPeiReadOnlyVariablePpiGuid

View File

@@ -1,165 +0,0 @@
/** @file
Module produce EFI_PEI_READ_ONLY_VARIABLE_PPI on top of EFI_PEI_READ_ONLY_VARIABLE2_PPI.
UEFI PI Spec supersedes Intel's Framework Specs.
# EFI_PEI_READ_ONLY_VARIABLE_PPI defined in Intel Framework Pkg is replaced by EFI_PEI_READ_ONLY_VARIABLE2_PPI
# in MdePkg.
# This module produces EFI_PEI_READ_ONLY_VARIABLE_PPI on top of EFI_PEI_READ_ONLY_VARIABLE2_PPI.
# This module is used on platform when both of these two conditions are true:
# 1) Framework module consumes EFI_PEI_READ_ONLY_VARIABLE_PPI is present.
# 2) The platform has a PI module that only produces EFI_PEI_READ_ONLY_VARIABLE2_PPI.
This module can't be used together with ReadOnlyVariable2ToReadOnlyVariableThunk module.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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:
**/
#include <PiPei.h>
#include <Ppi/ReadOnlyVariable.h>
#include <Ppi/ReadOnlyVariable2.h>
#include <Library/DebugLib.h>
#include <Library/PeiServicesLib.h>
/**
Provide the read variable functionality of the variable services.
@param[in] PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param[in] VariableName A NULL-terminated Unicode string that is the name of the vendor's variable.
@param[in] VendorGuid A unique identifier for the vendor.
@param[out] Attributes This OPTIONAL parameter may be either NULL or
a pointer to the location in which to return
the attributes bitmask for the variable.
@param[in, out] DataSize On input, the size in bytes of the return Data buffer.
On output, the size of data returned in Data.
@param[out] Data The buffer to return the contents of the variable.
@retval EFI_SUCCESS The interface could be successfully installed
@retval EFI_NOT_FOUND The variable could not be discovered
@retval EFI_BUFFER_TOO_SMALL The caller buffer is not large enough
**/
EFI_STATUS
EFIAPI
PeiGetVariable (
IN EFI_PEI_SERVICES **PeiServices,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes OPTIONAL,
IN OUT UINTN *DataSize,
OUT VOID *Data
)
{
EFI_STATUS Status;
EFI_PEI_READ_ONLY_VARIABLE2_PPI *ReadOnlyVariable2;
Status = (*PeiServices)->LocatePpi (
(CONST EFI_PEI_SERVICES **)PeiServices,
&gEfiPeiReadOnlyVariable2PpiGuid,
0,
NULL,
(VOID **)&ReadOnlyVariable2
);
ASSERT_EFI_ERROR (Status);
return ReadOnlyVariable2->GetVariable (
ReadOnlyVariable2,
VariableName,
VendorGuid,
Attributes,
DataSize,
Data
);
}
/**
Provide the get next variable functionality of the variable services.
@param[in] PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation.
@param[in, out] VariableNameSize The size of the VariableName buffer.
@param[in, out] VariableName On input, supplies the last VariableName that was
returned by GetNextVariableName(). On output, returns the Null-terminated
Unicode string of the current variable.
@param[in, out] VendorGuid On input, supplies the last VendorGuid that was
returned by GetNextVariableName(). On output, returns the VendorGuid
of the current variable.
@retval EFI_SUCCESS The interface could be successfully installed
@retval EFI_NOT_FOUND The variable could not be discovered
**/
EFI_STATUS
EFIAPI
PeiGetNextVariableName (
IN EFI_PEI_SERVICES **PeiServices,
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName,
IN OUT EFI_GUID *VendorGuid
)
{
EFI_STATUS Status;
EFI_PEI_READ_ONLY_VARIABLE2_PPI *ReadOnlyVariable2;
Status = (*PeiServices)->LocatePpi (
(CONST EFI_PEI_SERVICES **)PeiServices,
&gEfiPeiReadOnlyVariable2PpiGuid,
0,
NULL,
(VOID **)&ReadOnlyVariable2
);
ASSERT_EFI_ERROR (Status);
return ReadOnlyVariable2->NextVariableName (
ReadOnlyVariable2,
VariableNameSize,
VariableName,
VendorGuid
);
}
//
// Module globals
//
EFI_PEI_READ_ONLY_VARIABLE_PPI mVariablePpi = {
PeiGetVariable,
PeiGetNextVariableName
};
EFI_PEI_PPI_DESCRIPTOR mPpiListVariable = {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEfiPeiReadOnlyVariablePpiGuid,
&mVariablePpi
};
/**
Standard entry point of a PEIM.
@param FileHandle Handle of the file being invoked.
@param PeiServices General purpose services available to every PEIM.
@retval EFI_SUCCESS If the gEfiPeiReadOnlyVariablePpiGuid interface could be successfully installed.
**/
EFI_STATUS
EFIAPI
PeimInitializeReadOnlyVariable (
IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
//
//Developer should make sure ReadOnlyVariableToReadOnlyVariable2 module is not present. If so, the call chain will form a
// infinite loop: ReadOnlyVariable -> ReadOnlyVariable2 -> ReadOnlyVariable -> ....
//
//
// Publish the variable capability to other modules
//
return (*PeiServices)->InstallPpi (PeiServices, &mPpiListVariable);
}

View File

@@ -1,59 +0,0 @@
## @file
# Module produce EFI_PEI_READ_ONLY_VARIABLE_PPI on top of EFI_PEI_READ_ONLY_VARIABLE2_PPI.
#
# UEFI PI Spec supersedes Intel's Framework Specs.
# EFI_PEI_READ_ONLY_VARIABLE_PPI defined in Intel Framework Pkg is replaced by EFI_PEI_READ_ONLY_VARIABLE2_PPI
# in MdePkg.
# This module produces EFI_PEI_READ_ONLY_VARIABLE_PPI on top of EFI_PEI_READ_ONLY_VARIABLE2_PPI.
# This module is used on platform when both of these two conditions are true:
# 1) Framework module consumes EFI_PEI_READ_ONLY_VARIABLE_PPI is present.
# 2) The platform has a PI module that only produces EFI_PEI_READ_ONLY_VARIABLE2_PPI.
# This module can't be used together with ReadOnlyVariable2OnReadOnlyVariableThunk module.
#
#
# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = ReadOnlyVariableOnReadOnlyVariable2Thunk
FILE_GUID = 0FDB764B-E669-4c69-83AC-5EDD99A2711E
MODULE_TYPE = PEIM
VERSION_STRING = 1.0
ENTRY_POINT = PeimInitializeReadOnlyVariable
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
ReadOnlyVariableOnReadOnlyVariable2Thunk.c
[Packages]
MdePkg/MdePkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
[LibraryClasses]
PeimEntryPoint
DebugLib
PeiServicesLib
[Ppis]
gEfiPeiReadOnlyVariable2PpiGuid # PPI ALWAYS_CONSUMED
gEfiPeiReadOnlyVariablePpiGuid # PPI ALWAYS_PRODUCED
[Depex]
gEfiPeiReadOnlyVariable2PpiGuid

View File

@@ -1,208 +0,0 @@
/** @file
SMM Access2 Protocol on SMM Access Protocol Thunk driver.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "SmmAccess2OnSmmAccessThunk.h"
EFI_SMM_ACCESS2_PROTOCOL gSmmAccess2 = {
SmmAccess2Open,
SmmAccess2Close,
SmmAccess2Lock,
SmmAccess2GetCapabilities,
FALSE,
FALSE
};
EFI_SMM_ACCESS_PROTOCOL *mSmmAccess;
UINTN mSmramRegionNumber;
/**
Opens the SMRAM area to be accessible by a boot-service driver.
This function "opens" SMRAM so that it is visible while not inside of SMM. The function should
return EFI_UNSUPPORTED if the hardware does not support hiding of SMRAM. The function
should return EFI_DEVICE_ERROR if the SMRAM configuration is locked.
@param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance.
@retval EFI_SUCCESS The operation was successful.
@retval EFI_UNSUPPORTED The system does not support opening and closing of SMRAM.
@retval EFI_DEVICE_ERROR SMRAM cannot be opened, perhaps because it is locked.
**/
EFI_STATUS
EFIAPI
SmmAccess2Open (
IN EFI_SMM_ACCESS2_PROTOCOL *This
)
{
EFI_STATUS Status;
UINTN DescriptorIndex;
///
/// Open all SMRAM regions via SMM Access Protocol
///
Status = EFI_SUCCESS;
for (DescriptorIndex = 0; DescriptorIndex < mSmramRegionNumber && !EFI_ERROR (Status); DescriptorIndex++) {
Status = mSmmAccess->Open (mSmmAccess, DescriptorIndex);
}
if (!EFI_ERROR (Status)) {
gSmmAccess2.OpenState = TRUE;
}
return Status;
}
/**
Inhibits access to the SMRAM.
This function "closes" SMRAM so that it is not visible while outside of SMM. The function should
return EFI_UNSUPPORTED if the hardware does not support hiding of SMRAM.
@param [in] This The EFI_SMM_ACCESS2_PROTOCOL instance.
@retval EFI_SUCCESS The operation was successful.
@retval EFI_UNSUPPORTED The system does not support opening and closing of SMRAM.
@retval EFI_DEVICE_ERROR SMRAM cannot be closed.
**/
EFI_STATUS
EFIAPI
SmmAccess2Close (
IN EFI_SMM_ACCESS2_PROTOCOL *This
)
{
EFI_STATUS Status;
UINTN DescriptorIndex;
///
/// Close all SMRAM regions via SMM Access Protocol
///
Status = EFI_SUCCESS;
for (DescriptorIndex = 0; DescriptorIndex < mSmramRegionNumber && !EFI_ERROR (Status); DescriptorIndex++) {
Status = mSmmAccess->Close (mSmmAccess, DescriptorIndex);
}
if (!EFI_ERROR (Status)) {
gSmmAccess2.OpenState = FALSE;
}
return Status;
}
/**
Inhibits access to the SMRAM.
This function prohibits access to the SMRAM region. This function is usually implemented such
that it is a write-once operation.
@param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance.
@retval EFI_SUCCESS The device was successfully locked.
@retval EFI_UNSUPPORTED The system does not support locking of SMRAM.
**/
EFI_STATUS
EFIAPI
SmmAccess2Lock (
IN EFI_SMM_ACCESS2_PROTOCOL *This
)
{
EFI_STATUS Status;
UINTN DescriptorIndex;
///
/// Lock all SMRAM regions via SMM Access Protocol
///
Status = EFI_SUCCESS;
for (DescriptorIndex = 0; DescriptorIndex < mSmramRegionNumber && !EFI_ERROR (Status); DescriptorIndex++) {
Status = mSmmAccess->Lock (mSmmAccess, DescriptorIndex);
}
if (!EFI_ERROR (Status)) {
gSmmAccess2.LockState = TRUE;
}
return Status;
}
/**
Queries the memory controller for the possible regions that will support SMRAM.
@param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance.
@param[in, out] SmramMapSize A pointer to the size, in bytes, of the SmramMemoryMap buffer.
@param[in, out] SmramMap A pointer to the buffer in which firmware places the current memory map.
@retval EFI_SUCCESS The chipset supported the given resource.
@retval EFI_BUFFER_TOO_SMALL The SmramMap parameter was too small. The current buffer size
needed to hold the memory map is returned in SmramMapSize.
**/
EFI_STATUS
EFIAPI
SmmAccess2GetCapabilities (
IN CONST EFI_SMM_ACCESS2_PROTOCOL *This,
IN OUT UINTN *SmramMapSize,
IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap
)
{
return mSmmAccess->GetCapabilities (mSmmAccess, SmramMapSize, SmramMap);
}
/**
Entry Point for SMM Access2 On SMM Access Thunk driver.
@param[in] ImageHandle Image handle of this driver.
@param[in] SystemTable A Pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
@retval other Some error occurred when executing this entry point.
**/
EFI_STATUS
EFIAPI
SmmAccess2ThunkMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
UINTN SmramMapSize;
///
/// Locate SMM Access Protocol
///
Status = gBS->LocateProtocol (&gEfiSmmAccessProtocolGuid, NULL, (VOID **)&mSmmAccess);
ASSERT_EFI_ERROR (Status);
///
/// Calculate number of SMRAM regions
///
SmramMapSize = 0;
Status = mSmmAccess->GetCapabilities (mSmmAccess, &SmramMapSize, NULL);
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
mSmramRegionNumber = SmramMapSize/sizeof (EFI_SMRAM_DESCRIPTOR);
ASSERT (mSmramRegionNumber > 0);
///
/// Assume all SMRAM regions have consistent OPEN and LOCK states
///
gSmmAccess2.OpenState = mSmmAccess->OpenState;
gSmmAccess2.LockState = mSmmAccess->LockState;
///
/// Publish PI SMM Access2 Protocol
///
Status = gBS->InstallProtocolInterface (
&ImageHandle,
&gEfiSmmAccess2ProtocolGuid,
EFI_NATIVE_INTERFACE,
&gSmmAccess2
);
return Status;
}

View File

@@ -1,99 +0,0 @@
/** @file
Include file for SMM Access2 Protocol on SMM Access Protocol Thunk driver.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
#ifndef _SMM_ACCESS2_ON_SMM_ACCESS_THUNK_H_
#define _SMM_ACCESS2_ON_SMM_ACCESS_THUNK_H_
#include <PiDxe.h>
#include <FrameworkSmm.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Protocol/SmmAccess2.h>
#include <Protocol/SmmAccess.h>
/**
Opens the SMRAM area to be accessible by a boot-service driver.
This function "opens" SMRAM so that it is visible while not inside of SMM. The function should
return EFI_UNSUPPORTED if the hardware does not support hiding of SMRAM. The function
should return EFI_DEVICE_ERROR if the SMRAM configuration is locked.
@param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance.
@retval EFI_SUCCESS The operation was successful.
@retval EFI_UNSUPPORTED The system does not support opening and closing of SMRAM.
@retval EFI_DEVICE_ERROR SMRAM cannot be opened, perhaps because it is locked.
**/
EFI_STATUS
EFIAPI
SmmAccess2Open (
IN EFI_SMM_ACCESS2_PROTOCOL *This
);
/**
Inhibits access to the SMRAM.
This function "closes" SMRAM so that it is not visible while outside of SMM. The function should
return EFI_UNSUPPORTED if the hardware does not support hiding of SMRAM.
@param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance.
@retval EFI_SUCCESS The operation was successful.
@retval EFI_UNSUPPORTED The system does not support opening and closing of SMRAM.
@retval EFI_DEVICE_ERROR SMRAM cannot be closed.
**/
EFI_STATUS
EFIAPI
SmmAccess2Close (
IN EFI_SMM_ACCESS2_PROTOCOL *This
);
/**
Inhibits access to the SMRAM.
This function prohibits access to the SMRAM region. This function is usually implemented such
that it is a write-once operation.
@param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance.
@retval EFI_SUCCESS The device was successfully locked.
@retval EFI_UNSUPPORTED The system does not support locking of SMRAM.
**/
EFI_STATUS
EFIAPI
SmmAccess2Lock (
IN EFI_SMM_ACCESS2_PROTOCOL *This
);
/**
Queries the memory controller for the possible regions that will support SMRAM.
@param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance.
@param[in, out] SmramMapSize A pointer to the size, in bytes, of the SmramMemoryMap buffer.
@param[in, out] SmramMap A pointer to the buffer in which firmware places the current memory map.
@retval EFI_SUCCESS The chipset supported the given resource.
@retval EFI_BUFFER_TOO_SMALL The SmramMap parameter was too small. The current buffer size
needed to hold the memory map is returned in SmramMapSize.
**/
EFI_STATUS
EFIAPI
SmmAccess2GetCapabilities (
IN CONST EFI_SMM_ACCESS2_PROTOCOL *This,
IN OUT UINTN *SmramMapSize,
IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap
);
#endif

View File

@@ -1,50 +0,0 @@
## @file
# Component description file for SMM Access2 Protocol on SMM Access Protocol Thunk driver.
#
# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = SmmAccess2OnSmmAccessThunk
FILE_GUID = 98BBCDA4-18B4-46d3-BD1F-6A3A52D44CF8
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = SmmAccess2ThunkMain
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
SmmAccess2OnSmmAccessThunk.c
SmmAccess2OnSmmAccessThunk.h
[Packages]
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
EdkCompatibilityPkg/EdkCompatibilityPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
UefiBootServicesTableLib
DebugLib
[Protocols]
gEfiSmmAccessProtocolGuid # PROTOCOL ALWAYS_CONSUMED
gEfiSmmAccess2ProtocolGuid # PROTOCOL ALWAYS_PRODUCED
[Depex]
gEfiSmmAccessProtocolGuid

View File

@@ -1,27 +0,0 @@
/** @file
Page fault handler that does nothing.
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
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.
**/
/**
The dummy handler that does nothing.
The function is only used by systems that don't use paging but need
build pass.
**/
VOID
PageFaultHandlerHook (
VOID
)
{
}

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More