EmulatorPkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the EmulatorPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
This commit is contained in:
committed by
mergify[bot]
parent
e7108d0e96
commit
a550d468a6
@ -17,8 +17,8 @@
|
|||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
#include <Protocol/ShellParameters.h>
|
#include <Protocol/ShellParameters.h>
|
||||||
|
|
||||||
UINTN Argc;
|
UINTN Argc;
|
||||||
CHAR16 **Argv;
|
CHAR16 **Argv;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -31,15 +31,15 @@ GetArg (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
|
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
|
||||||
|
|
||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
gImageHandle,
|
gImageHandle,
|
||||||
&gEfiShellParametersProtocolGuid,
|
&gEfiShellParametersProtocolGuid,
|
||||||
(VOID**)&ShellParameters
|
(VOID **)&ShellParameters
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,8 +84,8 @@ UefiMain (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
RETURN_STATUS ReturnStatus;
|
RETURN_STATUS ReturnStatus;
|
||||||
|
|
||||||
UINT8 HostIpAssignmentType;
|
UINT8 HostIpAssignmentType;
|
||||||
EFI_IPv4_ADDRESS HostIpAddress;
|
EFI_IPv4_ADDRESS HostIpAddress;
|
||||||
@ -94,8 +94,8 @@ UefiMain (
|
|||||||
EFI_IPv4_ADDRESS RedfishServiceIpMask;
|
EFI_IPv4_ADDRESS RedfishServiceIpMask;
|
||||||
UINTN RedfishServiceIpPort;
|
UINTN RedfishServiceIpPort;
|
||||||
|
|
||||||
Status = GetArg();
|
Status = GetArg ();
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,39 +104,41 @@ UefiMain (
|
|||||||
// RedfishPlatformConfig.efi -s HostIpAddress HostIpMask RedfishServiceIpAddress RedfishServiceIpMask RedfishServiceIpPort
|
// RedfishPlatformConfig.efi -s HostIpAddress HostIpMask RedfishServiceIpAddress RedfishServiceIpMask RedfishServiceIpPort
|
||||||
// RedfishPlatformConfig.efi -a RedfishServiceIpAddress RedfishServiceIpMask RedfishServiceIpPort
|
// RedfishPlatformConfig.efi -a RedfishServiceIpAddress RedfishServiceIpMask RedfishServiceIpPort
|
||||||
//
|
//
|
||||||
if (Argc != 7 && Argc != 5) {
|
if ((Argc != 7) && (Argc != 5)) {
|
||||||
|
PrintHelp ();
|
||||||
PrintHelp();
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StrCmp(Argv[1], L"-s") == 0) {
|
if (StrCmp (Argv[1], L"-s") == 0) {
|
||||||
|
|
||||||
HostIpAssignmentType = 1;
|
HostIpAssignmentType = 1;
|
||||||
|
|
||||||
Status = NetLibStrToIp4 (Argv[2], &HostIpAddress);
|
Status = NetLibStrToIp4 (Argv[2], &HostIpAddress);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PrintHelp();
|
PrintHelp ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = NetLibStrToIp4 (Argv[3], &HostIpMask);
|
Status = NetLibStrToIp4 (Argv[3], &HostIpMask);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PrintHelp();
|
PrintHelp ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = NetLibStrToIp4 (Argv[4], &RedfishServiceIpAddress);
|
Status = NetLibStrToIp4 (Argv[4], &RedfishServiceIpAddress);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PrintHelp();
|
PrintHelp ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = NetLibStrToIp4 (Argv[5], &RedfishServiceIpMask);
|
Status = NetLibStrToIp4 (Argv[5], &RedfishServiceIpMask);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PrintHelp();
|
PrintHelp ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnStatus = StrDecimalToUintnS (Argv[6], NULL, &RedfishServiceIpPort);
|
ReturnStatus = StrDecimalToUintnS (Argv[6], NULL, &RedfishServiceIpPort);
|
||||||
if (RETURN_ERROR (ReturnStatus)) {
|
if (RETURN_ERROR (ReturnStatus)) {
|
||||||
PrintHelp();
|
PrintHelp ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,24 +216,24 @@ UefiMain (
|
|||||||
Print (L"RedfishServiceIpMask: %s has been set Successfully!\n", Argv[5]);
|
Print (L"RedfishServiceIpMask: %s has been set Successfully!\n", Argv[5]);
|
||||||
Print (L"RedfishServiceIpPort: %s has been set Successfully!\n", Argv[6]);
|
Print (L"RedfishServiceIpPort: %s has been set Successfully!\n", Argv[6]);
|
||||||
Print (L"Please Restart!\n");
|
Print (L"Please Restart!\n");
|
||||||
|
} else if (StrCmp (Argv[1], L"-a") == 0) {
|
||||||
} else if (StrCmp(Argv[1], L"-a") == 0) {
|
|
||||||
|
|
||||||
HostIpAssignmentType = 3;
|
HostIpAssignmentType = 3;
|
||||||
|
|
||||||
Status = NetLibStrToIp4 (Argv[2], &RedfishServiceIpAddress);
|
Status = NetLibStrToIp4 (Argv[2], &RedfishServiceIpAddress);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PrintHelp();
|
PrintHelp ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = NetLibStrToIp4 (Argv[3], &RedfishServiceIpMask);
|
Status = NetLibStrToIp4 (Argv[3], &RedfishServiceIpMask);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PrintHelp();
|
PrintHelp ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnStatus = StrDecimalToUintnS (Argv[4], NULL, &RedfishServiceIpPort);
|
ReturnStatus = StrDecimalToUintnS (Argv[4], NULL, &RedfishServiceIpPort);
|
||||||
if (RETURN_ERROR (ReturnStatus)) {
|
if (RETURN_ERROR (ReturnStatus)) {
|
||||||
PrintHelp();
|
PrintHelp ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,12 +287,10 @@ UefiMain (
|
|||||||
Print (L"RedfishServiceIpMask: %s has been set Successfully!\n", Argv[3]);
|
Print (L"RedfishServiceIpMask: %s has been set Successfully!\n", Argv[3]);
|
||||||
Print (L"RedfishServiceIpPort: %s has been set Successfully!\n", Argv[4]);
|
Print (L"RedfishServiceIpPort: %s has been set Successfully!\n", Argv[4]);
|
||||||
Print (L"Please Restart!\n");
|
Print (L"Please Restart!\n");
|
||||||
} else if (StrCmp(Argv[1], L"-h") == 0 || StrCmp(Argv[1], L"-help") == 0) {
|
} else if ((StrCmp (Argv[1], L"-h") == 0) || (StrCmp (Argv[1], L"-help") == 0)) {
|
||||||
|
PrintHelp ();
|
||||||
PrintHelp();
|
|
||||||
} else {
|
} else {
|
||||||
|
PrintHelp ();
|
||||||
PrintHelp();
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,9 +21,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeimInitializeAutoScanPei (
|
PeimInitializeAutoScanPei (
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -38,14 +39,13 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
|
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
|
||||||
EMU_THUNK_PPI *Thunk;
|
EMU_THUNK_PPI *Thunk;
|
||||||
UINT64 MemorySize;
|
UINT64 MemorySize;
|
||||||
EFI_PHYSICAL_ADDRESS MemoryBase;
|
EFI_PHYSICAL_ADDRESS MemoryBase;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_RESOURCE_ATTRIBUTE_TYPE Attributes;
|
EFI_RESOURCE_ATTRIBUTE_TYPE Attributes;
|
||||||
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_ERROR, "Emu Autoscan PEIM Loaded\n"));
|
DEBUG ((DEBUG_ERROR, "Emu Autoscan PEIM Loaded\n"));
|
||||||
|
|
||||||
@ -66,12 +66,12 @@ Returns:
|
|||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Attributes =
|
Attributes =
|
||||||
(
|
(
|
||||||
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
||||||
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
||||||
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
||||||
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
||||||
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
||||||
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Index == 0) {
|
if (Index == 0) {
|
||||||
@ -91,6 +91,7 @@ Returns:
|
|||||||
MemorySize
|
MemorySize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Index++;
|
Index++;
|
||||||
} while (!EFI_ERROR (Status));
|
} while (!EFI_ERROR (Status));
|
||||||
|
|
||||||
|
@ -6,8 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// The package level header files this module uses
|
// The package level header files this module uses
|
||||||
//
|
//
|
||||||
@ -16,7 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/PeiServicesLib.h>
|
#include <Library/PeiServicesLib.h>
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// The protocols, PPI and GUID defintions for this module
|
// The protocols, PPI and GUID defintions for this module
|
||||||
//
|
//
|
||||||
@ -28,7 +25,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/PeimEntryPoint.h>
|
#include <Library/PeimEntryPoint.h>
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Module globals
|
// Module globals
|
||||||
//
|
//
|
||||||
@ -47,9 +43,10 @@ EFI_PEI_PPI_DESCRIPTOR mPpiListRecoveryBootMode = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeBootMode (
|
InitializeBootMode (
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -66,14 +63,14 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_BOOT_MODE BootMode;
|
EFI_BOOT_MODE BootMode;
|
||||||
|
|
||||||
DEBUG ((DEBUG_ERROR, "Emu Boot Mode PEIM Loaded\n"));
|
DEBUG ((DEBUG_ERROR, "Emu Boot Mode PEIM Loaded\n"));
|
||||||
|
|
||||||
BootMode = FixedPcdGet32 (PcdEmuBootMode);
|
BootMode = FixedPcdGet32 (PcdEmuBootMode);
|
||||||
|
|
||||||
Status = PeiServicesSetBootMode (BootMode);
|
Status = PeiServicesSetBootMode (BootMode);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
Status = PeiServicesInstallPpi (&mPpiListBootMode);
|
Status = PeiServicesInstallPpi (&mPpiListBootMode);
|
||||||
|
@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
UINT64 mTimerPeriod;
|
UINT64 mTimerPeriod;
|
||||||
|
|
||||||
CPU_ARCH_PROTOCOL_PRIVATE mCpuTemplate = {
|
CPU_ARCH_PROTOCOL_PRIVATE mCpuTemplate = {
|
||||||
CPU_ARCH_PROT_PRIVATE_SIGNATURE,
|
CPU_ARCH_PROT_PRIVATE_SIGNATURE,
|
||||||
NULL,
|
NULL,
|
||||||
{
|
{
|
||||||
@ -39,16 +39,16 @@ CPU_ARCH_PROTOCOL_PRIVATE mCpuTemplate = {
|
|||||||
TRUE
|
TRUE
|
||||||
};
|
};
|
||||||
|
|
||||||
#define EFI_CPU_DATA_MAXIMUM_LENGTH 0x100
|
#define EFI_CPU_DATA_MAXIMUM_LENGTH 0x100
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
|
SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
|
||||||
{ EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE4), 0},
|
{ EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE4), 0 },
|
||||||
1, // Socket String
|
1, // Socket String
|
||||||
ProcessorOther, // ProcessorType; ///< The enumeration value from PROCESSOR_TYPE_DATA.
|
ProcessorOther, // ProcessorType; ///< The enumeration value from PROCESSOR_TYPE_DATA.
|
||||||
ProcessorFamilyOther, // ProcessorFamily; ///< The enumeration value from PROCESSOR_FAMILY_DATA.
|
ProcessorFamilyOther, // ProcessorFamily; ///< The enumeration value from PROCESSOR_FAMILY_DATA.
|
||||||
2, // ProcessorManufacture String;
|
2, // ProcessorManufacture String;
|
||||||
{ // ProcessorId;
|
{ // ProcessorId;
|
||||||
{ // PROCESSOR_SIGNATURE
|
{ // PROCESSOR_SIGNATURE
|
||||||
0, // ProcessorSteppingId:4;
|
0, // ProcessorSteppingId:4;
|
||||||
0, // ProcessorModel: 4;
|
0, // ProcessorModel: 4;
|
||||||
0, // ProcessorFamily: 4;
|
0, // ProcessorFamily: 4;
|
||||||
@ -58,7 +58,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
|
|||||||
0, // ProcessorXFamily: 8;
|
0, // ProcessorXFamily: 8;
|
||||||
0, // ProcessorReserved2: 4;
|
0, // ProcessorReserved2: 4;
|
||||||
},
|
},
|
||||||
{ // PROCESSOR_FEATURE_FLAGS
|
{ // PROCESSOR_FEATURE_FLAGS
|
||||||
0, // ProcessorFpu :1;
|
0, // ProcessorFpu :1;
|
||||||
0, // ProcessorVme :1;
|
0, // ProcessorVme :1;
|
||||||
0, // ProcessorDe :1;
|
0, // ProcessorDe :1;
|
||||||
@ -93,7 +93,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
3, // ProcessorVersion String;
|
3, // ProcessorVersion String;
|
||||||
{ // Voltage;
|
{ // Voltage;
|
||||||
1, // ProcessorVoltageCapability5V :1;
|
1, // ProcessorVoltageCapability5V :1;
|
||||||
1, // ProcessorVoltageCapability3_3V :1;
|
1, // ProcessorVoltageCapability3_3V :1;
|
||||||
1, // ProcessorVoltageCapability2_9V :1;
|
1, // ProcessorVoltageCapability2_9V :1;
|
||||||
@ -119,7 +119,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
|
|||||||
0, // ProcessorFamily2;
|
0, // ProcessorFamily2;
|
||||||
};
|
};
|
||||||
|
|
||||||
CHAR8 *mCpuSmbiosType4Strings[] = {
|
CHAR8 *mCpuSmbiosType4Strings[] = {
|
||||||
"Socket",
|
"Socket",
|
||||||
"http://www.tianocore.org/edk2/",
|
"http://www.tianocore.org/edk2/",
|
||||||
"Emulated Processor",
|
"Emulated Processor",
|
||||||
@ -129,7 +129,6 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create SMBIOS record.
|
Create SMBIOS record.
|
||||||
|
|
||||||
@ -159,18 +158,18 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
LogSmbiosData (
|
LogSmbiosData (
|
||||||
IN EFI_SMBIOS_TABLE_HEADER *Template,
|
IN EFI_SMBIOS_TABLE_HEADER *Template,
|
||||||
IN CHAR8 **StringPack
|
IN CHAR8 **StringPack
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SMBIOS_PROTOCOL *Smbios;
|
EFI_SMBIOS_PROTOCOL *Smbios;
|
||||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN StringSize;
|
UINTN StringSize;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
CHAR8 *Str;
|
CHAR8 *Str;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Locate Smbios protocol.
|
// Locate Smbios protocol.
|
||||||
@ -188,12 +187,14 @@ LogSmbiosData (
|
|||||||
} else {
|
} else {
|
||||||
for (Index = 0; StringPack[Index] != NULL; Index++) {
|
for (Index = 0; StringPack[Index] != NULL; Index++) {
|
||||||
StringSize = AsciiStrSize (StringPack[Index]);
|
StringSize = AsciiStrSize (StringPack[Index]);
|
||||||
Size += StringSize;
|
Size += StringSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StringPack[0] == NULL) {
|
if (StringPack[0] == NULL) {
|
||||||
// At least a double null is required
|
// At least a double null is required
|
||||||
Size += 1;
|
Size += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't forget the terminating double null
|
// Don't forget the terminating double null
|
||||||
Size += 1;
|
Size += 1;
|
||||||
}
|
}
|
||||||
@ -203,6 +204,7 @@ LogSmbiosData (
|
|||||||
if (Record == NULL) {
|
if (Record == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (Record, Template, Template->Length);
|
CopyMem (Record, Template, Template->Length);
|
||||||
|
|
||||||
// Append string pack
|
// Append string pack
|
||||||
@ -212,32 +214,30 @@ LogSmbiosData (
|
|||||||
CopyMem (Str, StringPack[Index], StringSize);
|
CopyMem (Str, StringPack[Index], StringSize);
|
||||||
Str += StringSize;
|
Str += StringSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
*Str = 0;
|
*Str = 0;
|
||||||
|
|
||||||
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||||
Status = Smbios->Add (
|
Status = Smbios->Add (
|
||||||
Smbios,
|
Smbios,
|
||||||
gImageHandle,
|
gImageHandle,
|
||||||
&SmbiosHandle,
|
&SmbiosHandle,
|
||||||
Record
|
Record
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
FreePool (Record);
|
FreePool (Record);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
CpuUpdateSmbios (
|
CpuUpdateSmbios (
|
||||||
IN UINTN MaxCpus
|
IN UINTN MaxCpus
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
mCpuSmbiosType4.CoreCount = (UINT8) MaxCpus;
|
mCpuSmbiosType4.CoreCount = (UINT8)MaxCpus;
|
||||||
mCpuSmbiosType4.EnabledCoreCount = (UINT8) MaxCpus;
|
mCpuSmbiosType4.EnabledCoreCount = (UINT8)MaxCpus;
|
||||||
mCpuSmbiosType4.ThreadCount = (UINT8) MaxCpus;
|
mCpuSmbiosType4.ThreadCount = (UINT8)MaxCpus;
|
||||||
//
|
//
|
||||||
// The value of 1234 is fake value for CPU frequency
|
// The value of 1234 is fake value for CPU frequency
|
||||||
//
|
//
|
||||||
@ -245,7 +245,6 @@ CpuUpdateSmbios (
|
|||||||
LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mCpuSmbiosType4, mCpuSmbiosType4Strings);
|
LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mCpuSmbiosType4, mCpuSmbiosType4Strings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Service routines for the driver
|
// Service routines for the driver
|
||||||
//
|
//
|
||||||
@ -265,6 +264,7 @@ EmuFlushCpuDataCache (
|
|||||||
//
|
//
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Other flush types are not supported by Emu emulator
|
// Other flush types are not supported by Emu emulator
|
||||||
//
|
//
|
||||||
@ -277,7 +277,7 @@ EmuEnableInterrupt (
|
|||||||
IN EFI_CPU_ARCH_PROTOCOL *This
|
IN EFI_CPU_ARCH_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CPU_ARCH_PROTOCOL_PRIVATE *Private;
|
CPU_ARCH_PROTOCOL_PRIVATE *Private;
|
||||||
|
|
||||||
Private = CPU_ARCH_PROTOCOL_PRIVATE_DATA_FROM_THIS (This);
|
Private = CPU_ARCH_PROTOCOL_PRIVATE_DATA_FROM_THIS (This);
|
||||||
Private->InterruptState = TRUE;
|
Private->InterruptState = TRUE;
|
||||||
@ -291,7 +291,7 @@ EmuDisableInterrupt (
|
|||||||
IN EFI_CPU_ARCH_PROTOCOL *This
|
IN EFI_CPU_ARCH_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CPU_ARCH_PROTOCOL_PRIVATE *Private;
|
CPU_ARCH_PROTOCOL_PRIVATE *Private;
|
||||||
|
|
||||||
Private = CPU_ARCH_PROTOCOL_PRIVATE_DATA_FROM_THIS (This);
|
Private = CPU_ARCH_PROTOCOL_PRIVATE_DATA_FROM_THIS (This);
|
||||||
Private->InterruptState = FALSE;
|
Private->InterruptState = FALSE;
|
||||||
@ -306,7 +306,7 @@ EmuGetInterruptState (
|
|||||||
OUT BOOLEAN *State
|
OUT BOOLEAN *State
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CPU_ARCH_PROTOCOL_PRIVATE *Private;
|
CPU_ARCH_PROTOCOL_PRIVATE *Private;
|
||||||
|
|
||||||
if (State == NULL) {
|
if (State == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -338,9 +338,10 @@ EmuRegisterInterruptHandler (
|
|||||||
//
|
//
|
||||||
// Do parameter checking for EFI spec conformance
|
// Do parameter checking for EFI spec conformance
|
||||||
//
|
//
|
||||||
if (InterruptType < 0 || InterruptType > 0xff) {
|
if ((InterruptType < 0) || (InterruptType > 0xff)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Do nothing for Emu emulation
|
// Do nothing for Emu emulation
|
||||||
//
|
//
|
||||||
@ -350,10 +351,10 @@ EmuRegisterInterruptHandler (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGetTimerValue (
|
EmuGetTimerValue (
|
||||||
IN EFI_CPU_ARCH_PROTOCOL *This,
|
IN EFI_CPU_ARCH_PROTOCOL *This,
|
||||||
IN UINT32 TimerIndex,
|
IN UINT32 TimerIndex,
|
||||||
OUT UINT64 *TimerValue,
|
OUT UINT64 *TimerValue,
|
||||||
OUT UINT64 *TimerPeriod OPTIONAL
|
OUT UINT64 *TimerPeriod OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (TimerValue == NULL) {
|
if (TimerValue == NULL) {
|
||||||
@ -373,7 +374,6 @@ EmuGetTimerValue (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSetMemoryAttributes (
|
EmuSetMemoryAttributes (
|
||||||
@ -396,9 +396,6 @@ EmuSetMemoryAttributes (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Callback function for idle events.
|
Callback function for idle events.
|
||||||
|
|
||||||
@ -410,14 +407,13 @@ EmuSetMemoryAttributes (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IdleLoopEventCallback (
|
IdleLoopEventCallback (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
gEmuThunk->CpuSleep ();
|
gEmuThunk->CpuSleep ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeCpu (
|
InitializeCpu (
|
||||||
@ -425,10 +421,10 @@ InitializeCpu (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT64 Frequency;
|
UINT64 Frequency;
|
||||||
EFI_EVENT IdleLoopEvent;
|
EFI_EVENT IdleLoopEvent;
|
||||||
UINTN MaxCpu;
|
UINTN MaxCpu;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Retrieve the frequency of the performance counter in Hz.
|
// Retrieve the frequency of the performance counter in Hz.
|
||||||
@ -444,7 +440,6 @@ InitializeCpu (
|
|||||||
|
|
||||||
CpuUpdateSmbios (MaxCpu);
|
CpuUpdateSmbios (MaxCpu);
|
||||||
|
|
||||||
|
|
||||||
Status = gBS->CreateEventEx (
|
Status = gBS->CreateEventEx (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_NOTIFY,
|
TPL_NOTIFY,
|
||||||
@ -455,11 +450,12 @@ InitializeCpu (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&mCpuTemplate.Handle,
|
&mCpuTemplate.Handle,
|
||||||
&gEfiCpuArchProtocolGuid, &mCpuTemplate.Cpu,
|
&gEfiCpuArchProtocolGuid,
|
||||||
&gEfiCpuIo2ProtocolGuid, &mCpuTemplate.CpuIo,
|
&mCpuTemplate.Cpu,
|
||||||
|
&gEfiCpuIo2ProtocolGuid,
|
||||||
|
&mCpuTemplate.CpuIo,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _CPU_ARCHITECTURAL_PROTOCOL_DRIVER_H_
|
#ifndef _CPU_ARCHITECTURAL_PROTOCOL_DRIVER_H_
|
||||||
#define _CPU_ARCHITECTURAL_PROTOCOL_DRIVER_H_
|
#define _CPU_ARCHITECTURAL_PROTOCOL_DRIVER_H_
|
||||||
|
|
||||||
|
|
||||||
#include <PiDxe.h>
|
#include <PiDxe.h>
|
||||||
#include <IndustryStandard/SmBios.h>
|
#include <IndustryStandard/SmBios.h>
|
||||||
|
|
||||||
@ -32,25 +31,22 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Internal Data Structures
|
// Internal Data Structures
|
||||||
//
|
//
|
||||||
#define CPU_ARCH_PROT_PRIVATE_SIGNATURE SIGNATURE_32 ('c', 'a', 'p', 'd')
|
#define CPU_ARCH_PROT_PRIVATE_SIGNATURE SIGNATURE_32 ('c', 'a', 'p', 'd')
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
|
|
||||||
EFI_CPU_ARCH_PROTOCOL Cpu;
|
EFI_CPU_ARCH_PROTOCOL Cpu;
|
||||||
EFI_CPU_IO2_PROTOCOL CpuIo;
|
EFI_CPU_IO2_PROTOCOL CpuIo;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Local Data for CPU interface goes here
|
// Local Data for CPU interface goes here
|
||||||
//
|
//
|
||||||
BOOLEAN InterruptState;
|
BOOLEAN InterruptState;
|
||||||
|
|
||||||
} CPU_ARCH_PROTOCOL_PRIVATE;
|
} CPU_ARCH_PROTOCOL_PRIVATE;
|
||||||
|
|
||||||
#define CPU_ARCH_PROTOCOL_PRIVATE_DATA_FROM_THIS(a) \
|
#define CPU_ARCH_PROTOCOL_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
@ -60,8 +56,6 @@ typedef struct {
|
|||||||
CPU_ARCH_PROT_PRIVATE_SIGNATURE \
|
CPU_ARCH_PROT_PRIVATE_SIGNATURE \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CPU_STATE_IDLE,
|
CPU_STATE_IDLE,
|
||||||
CPU_STATE_BLOCKED,
|
CPU_STATE_BLOCKED,
|
||||||
@ -70,84 +64,78 @@ typedef enum {
|
|||||||
CPU_STATE_FINISHED
|
CPU_STATE_FINISHED
|
||||||
} PROCESSOR_STATE;
|
} PROCESSOR_STATE;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Define Individual Processor Data block.
|
// Define Individual Processor Data block.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_PROCESSOR_INFORMATION Info;
|
EFI_PROCESSOR_INFORMATION Info;
|
||||||
EFI_AP_PROCEDURE Procedure;
|
EFI_AP_PROCEDURE Procedure;
|
||||||
VOID *Parameter;
|
VOID *Parameter;
|
||||||
VOID *StateLock;
|
VOID *StateLock;
|
||||||
VOID *ProcedureLock;
|
VOID *ProcedureLock;
|
||||||
PROCESSOR_STATE State;
|
PROCESSOR_STATE State;
|
||||||
EFI_EVENT CheckThisAPEvent;
|
EFI_EVENT CheckThisAPEvent;
|
||||||
} PROCESSOR_DATA_BLOCK;
|
} PROCESSOR_DATA_BLOCK;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Define MP data block which consumes individual processor block.
|
// Define MP data block which consumes individual processor block.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN NumberOfProcessors;
|
UINTN NumberOfProcessors;
|
||||||
UINTN NumberOfEnabledProcessors;
|
UINTN NumberOfEnabledProcessors;
|
||||||
EFI_EVENT CheckAllAPsEvent;
|
EFI_EVENT CheckAllAPsEvent;
|
||||||
EFI_EVENT WaitEvent;
|
EFI_EVENT WaitEvent;
|
||||||
UINTN FinishCount;
|
UINTN FinishCount;
|
||||||
UINTN StartCount;
|
UINTN StartCount;
|
||||||
EFI_AP_PROCEDURE Procedure;
|
EFI_AP_PROCEDURE Procedure;
|
||||||
VOID *ProcedureArgument;
|
VOID *ProcedureArgument;
|
||||||
BOOLEAN SingleThread;
|
BOOLEAN SingleThread;
|
||||||
UINTN StartedNumber;
|
UINTN StartedNumber;
|
||||||
PROCESSOR_DATA_BLOCK *ProcessorData;
|
PROCESSOR_DATA_BLOCK *ProcessorData;
|
||||||
UINTN Timeout;
|
UINTN Timeout;
|
||||||
UINTN *FailedList;
|
UINTN *FailedList;
|
||||||
UINTN FailedListIndex;
|
UINTN FailedListIndex;
|
||||||
BOOLEAN TimeoutActive;
|
BOOLEAN TimeoutActive;
|
||||||
} MP_SYSTEM_DATA;
|
} MP_SYSTEM_DATA;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuMemoryServiceRead (
|
CpuMemoryServiceRead (
|
||||||
IN EFI_CPU_IO2_PROTOCOL *This,
|
IN EFI_CPU_IO2_PROTOCOL *This,
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 Address,
|
IN UINT64 Address,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN OUT VOID *Buffer
|
IN OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuMemoryServiceWrite (
|
CpuMemoryServiceWrite (
|
||||||
IN EFI_CPU_IO2_PROTOCOL *This,
|
IN EFI_CPU_IO2_PROTOCOL *This,
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 Address,
|
IN UINT64 Address,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN OUT VOID *Buffer
|
IN OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuIoServiceRead (
|
CpuIoServiceRead (
|
||||||
IN EFI_CPU_IO2_PROTOCOL *This,
|
IN EFI_CPU_IO2_PROTOCOL *This,
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 UserAddress,
|
IN UINT64 UserAddress,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN OUT VOID *UserBuffer
|
IN OUT VOID *UserBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuIoServiceWrite (
|
CpuIoServiceWrite (
|
||||||
IN EFI_CPU_IO2_PROTOCOL *This,
|
IN EFI_CPU_IO2_PROTOCOL *This,
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 UserAddress,
|
IN UINT64 UserAddress,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN OUT VOID *UserBuffer
|
IN OUT VOID *UserBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -203,10 +191,10 @@ EmuRegisterInterruptHandler (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGetTimerValue (
|
EmuGetTimerValue (
|
||||||
IN EFI_CPU_ARCH_PROTOCOL *This,
|
IN EFI_CPU_ARCH_PROTOCOL *This,
|
||||||
IN UINT32 TimerIndex,
|
IN UINT32 TimerIndex,
|
||||||
OUT UINT64 *TimerValue,
|
OUT UINT64 *TimerValue,
|
||||||
OUT UINT64 *TimerPeriod OPTIONAL
|
OUT UINT64 *TimerPeriod OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -220,7 +208,7 @@ EmuSetMemoryAttributes (
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
CpuMpServicesInit (
|
CpuMpServicesInit (
|
||||||
OUT UINTN *MaxCores
|
OUT UINTN *MaxCores
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -232,5 +220,4 @@ CpuMpServicesWhoAmI (
|
|||||||
|
|
||||||
extern EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate;
|
extern EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate;
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -31,22 +31,23 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
CpuIoCheckAddressRange (
|
CpuIoCheckAddressRange (
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 Address,
|
IN UINT64 Address,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN VOID *Buffer,
|
IN VOID *Buffer,
|
||||||
IN UINT64 Limit
|
IN UINT64 Limit
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuMemoryServiceRead (
|
CpuMemoryServiceRead (
|
||||||
IN EFI_CPU_IO2_PROTOCOL *This,
|
IN EFI_CPU_IO2_PROTOCOL *This,
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 Address,
|
IN UINT64 Address,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN OUT VOID *Buffer
|
IN OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -95,12 +96,13 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuMemoryServiceWrite (
|
CpuMemoryServiceWrite (
|
||||||
IN EFI_CPU_IO2_PROTOCOL *This,
|
IN EFI_CPU_IO2_PROTOCOL *This,
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 Address,
|
IN UINT64 Address,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN OUT VOID *Buffer
|
IN OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -148,12 +150,13 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuIoServiceRead (
|
CpuIoServiceRead (
|
||||||
IN EFI_CPU_IO2_PROTOCOL *This,
|
IN EFI_CPU_IO2_PROTOCOL *This,
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 UserAddress,
|
IN UINT64 UserAddress,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN OUT VOID *UserBuffer
|
IN OUT VOID *UserBuffer
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -186,7 +189,7 @@ Returns:
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Address = (UINTN) UserAddress;
|
Address = (UINTN)UserAddress;
|
||||||
|
|
||||||
if (Width >= EfiCpuIoWidthMaximum) {
|
if (Width >= EfiCpuIoWidthMaximum) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -206,12 +209,13 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuIoServiceWrite (
|
CpuIoServiceWrite (
|
||||||
IN EFI_CPU_IO2_PROTOCOL *This,
|
IN EFI_CPU_IO2_PROTOCOL *This,
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 UserAddress,
|
IN UINT64 UserAddress,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN OUT VOID *UserBuffer
|
IN OUT VOID *UserBuffer
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -248,7 +252,7 @@ Returns:
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Address = (UINTN) UserAddress;
|
Address = (UINTN)UserAddress;
|
||||||
|
|
||||||
if (Width >= EfiCpuIoWidthMaximum) {
|
if (Width >= EfiCpuIoWidthMaximum) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -265,7 +269,6 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -288,14 +291,14 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
CpuIoCheckAddressRange (
|
CpuIoCheckAddressRange (
|
||||||
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
||||||
IN UINT64 Address,
|
IN UINT64 Address,
|
||||||
IN UINTN Count,
|
IN UINTN Count,
|
||||||
IN VOID *Buffer,
|
IN VOID *Buffer,
|
||||||
IN UINT64 Limit
|
IN UINT64 Limit
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN AlignMask;
|
UINTN AlignMask;
|
||||||
|
|
||||||
if (Address > Limit) {
|
if (Address > Limit) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
@ -304,7 +307,7 @@ CpuIoCheckAddressRange (
|
|||||||
//
|
//
|
||||||
// For FiFo type, the target address won't increase during the access, so treat count as 1
|
// For FiFo type, the target address won't increase during the access, so treat count as 1
|
||||||
//
|
//
|
||||||
if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) {
|
if ((Width >= EfiCpuIoWidthFifoUint8) && (Width <= EfiCpuIoWidthFifoUint64)) {
|
||||||
Count = 1;
|
Count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,11 +317,9 @@ CpuIoCheckAddressRange (
|
|||||||
}
|
}
|
||||||
|
|
||||||
AlignMask = (1 << Width) - 1;
|
AlignMask = (1 << Width) - 1;
|
||||||
if ((UINTN) Buffer & AlignMask) {
|
if ((UINTN)Buffer & AlignMask) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,13 +37,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "CpuDriver.h"
|
#include "CpuDriver.h"
|
||||||
|
|
||||||
|
MP_SYSTEM_DATA gMPSystem;
|
||||||
MP_SYSTEM_DATA gMPSystem;
|
EMU_THREAD_THUNK_PROTOCOL *gThread = NULL;
|
||||||
EMU_THREAD_THUNK_PROTOCOL *gThread = NULL;
|
EFI_EVENT gReadToBootEvent;
|
||||||
EFI_EVENT gReadToBootEvent;
|
BOOLEAN gReadToBoot = FALSE;
|
||||||
BOOLEAN gReadToBoot = FALSE;
|
UINTN gPollInterval;
|
||||||
UINTN gPollInterval;
|
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IsBSP (
|
IsBSP (
|
||||||
@ -61,7 +59,6 @@ IsBSP (
|
|||||||
return (gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag & PROCESSOR_AS_BSP_BIT) != 0;
|
return (gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag & PROCESSOR_AS_BSP_BIT) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SetApProcedure (
|
SetApProcedure (
|
||||||
IN PROCESSOR_DATA_BLOCK *Processor,
|
IN PROCESSOR_DATA_BLOCK *Processor,
|
||||||
@ -70,15 +67,14 @@ SetApProcedure (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
gThread->MutexLock (Processor->ProcedureLock);
|
gThread->MutexLock (Processor->ProcedureLock);
|
||||||
Processor->Parameter = ProcedureArgument;
|
Processor->Parameter = ProcedureArgument;
|
||||||
Processor->Procedure = Procedure;
|
Processor->Procedure = Procedure;
|
||||||
gThread->MutexUnlock (Processor->ProcedureLock);
|
gThread->MutexUnlock (Processor->ProcedureLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetNextBlockedNumber (
|
GetNextBlockedNumber (
|
||||||
OUT UINTN *NextNumber
|
OUT UINTN *NextNumber
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Number;
|
UINTN Number;
|
||||||
@ -116,16 +112,17 @@ GetNextBlockedNumber (
|
|||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
CalculateAndStallInterval (
|
CalculateAndStallInterval (
|
||||||
IN UINTN Timeout
|
IN UINTN Timeout
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN StallTime;
|
UINTN StallTime;
|
||||||
|
|
||||||
if (Timeout < gPollInterval && Timeout != 0) {
|
if ((Timeout < gPollInterval) && (Timeout != 0)) {
|
||||||
StallTime = Timeout;
|
StallTime = Timeout;
|
||||||
} else {
|
} else {
|
||||||
StallTime = gPollInterval;
|
StallTime = gPollInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->Stall (StallTime);
|
gBS->Stall (StallTime);
|
||||||
|
|
||||||
return StallTime;
|
return StallTime;
|
||||||
@ -188,8 +185,6 @@ CpuMpServicesGetNumberOfProcessors (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Gets detailed MP-related information on the requested processor at the
|
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.
|
instant this call is made. This service may only be called from the BSP.
|
||||||
@ -240,7 +235,6 @@ CpuMpServicesGetProcessorInfo (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This service executes a caller provided function on all enabled APs. APs can
|
This service executes a caller provided function on all enabled APs. APs can
|
||||||
run either simultaneously or one at a time in sequence. This service supports
|
run either simultaneously or one at a time in sequence. This service supports
|
||||||
@ -397,7 +391,6 @@ CpuMpServicesStartupAllAps (
|
|||||||
PROCESSOR_STATE ProcessorState;
|
PROCESSOR_STATE ProcessorState;
|
||||||
UINTN Timeout;
|
UINTN Timeout;
|
||||||
|
|
||||||
|
|
||||||
if (!IsBSP ()) {
|
if (!IsBSP ()) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
@ -425,12 +418,14 @@ CpuMpServicesStartupAllAps (
|
|||||||
// Skip Disabled processors
|
// Skip Disabled processors
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
gThread->MutexLock(ProcessorData->StateLock);
|
|
||||||
|
gThread->MutexLock (ProcessorData->StateLock);
|
||||||
if (ProcessorData->State != CPU_STATE_IDLE) {
|
if (ProcessorData->State != CPU_STATE_IDLE) {
|
||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
return EFI_NOT_READY;
|
return EFI_NOT_READY;
|
||||||
}
|
}
|
||||||
gThread->MutexUnlock(ProcessorData->StateLock);
|
|
||||||
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FailedCpuList != NULL) {
|
if (FailedCpuList != NULL) {
|
||||||
@ -438,19 +433,20 @@ CpuMpServicesStartupAllAps (
|
|||||||
if (gMPSystem.FailedList == NULL) {
|
if (gMPSystem.FailedList == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetMemN (gMPSystem.FailedList, (gMPSystem.NumberOfProcessors + 1) * sizeof (UINTN), END_OF_CPU_LIST);
|
SetMemN (gMPSystem.FailedList, (gMPSystem.NumberOfProcessors + 1) * sizeof (UINTN), END_OF_CPU_LIST);
|
||||||
gMPSystem.FailedListIndex = 0;
|
gMPSystem.FailedListIndex = 0;
|
||||||
*FailedCpuList = gMPSystem.FailedList;
|
*FailedCpuList = gMPSystem.FailedList;
|
||||||
}
|
}
|
||||||
|
|
||||||
Timeout = TimeoutInMicroseconds;
|
Timeout = TimeoutInMicroseconds;
|
||||||
|
|
||||||
ProcessorData = NULL;
|
ProcessorData = NULL;
|
||||||
|
|
||||||
gMPSystem.FinishCount = 0;
|
gMPSystem.FinishCount = 0;
|
||||||
gMPSystem.StartCount = 0;
|
gMPSystem.StartCount = 0;
|
||||||
gMPSystem.SingleThread = SingleThread;
|
gMPSystem.SingleThread = SingleThread;
|
||||||
APInitialState = CPU_STATE_READY;
|
APInitialState = CPU_STATE_READY;
|
||||||
|
|
||||||
for (Number = 0; Number < gMPSystem.NumberOfProcessors; Number++) {
|
for (Number = 0; Number < gMPSystem.NumberOfProcessors; Number++) {
|
||||||
ProcessorData = &gMPSystem.ProcessorData[Number];
|
ProcessorData = &gMPSystem.ProcessorData[Number];
|
||||||
@ -472,7 +468,7 @@ CpuMpServicesStartupAllAps (
|
|||||||
// state 1 by 1, until the previous 1 finished its task
|
// state 1 by 1, until the previous 1 finished its task
|
||||||
// if not "SingleThread", all APs are put to ready state from the beginning
|
// if not "SingleThread", all APs are put to ready state from the beginning
|
||||||
//
|
//
|
||||||
gThread->MutexLock(ProcessorData->StateLock);
|
gThread->MutexLock (ProcessorData->StateLock);
|
||||||
ASSERT (ProcessorData->State == CPU_STATE_IDLE);
|
ASSERT (ProcessorData->State == CPU_STATE_IDLE);
|
||||||
ProcessorData->State = APInitialState;
|
ProcessorData->State = APInitialState;
|
||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
@ -487,7 +483,7 @@ CpuMpServicesStartupAllAps (
|
|||||||
for (Number = 0; Number < gMPSystem.NumberOfProcessors; Number++) {
|
for (Number = 0; Number < gMPSystem.NumberOfProcessors; Number++) {
|
||||||
ProcessorData = &gMPSystem.ProcessorData[Number];
|
ProcessorData = &gMPSystem.ProcessorData[Number];
|
||||||
if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
||||||
// Skip BSP
|
// Skip BSP
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,20 +509,19 @@ CpuMpServicesStartupAllAps (
|
|||||||
gMPSystem.WaitEvent = WaitEvent;
|
gMPSystem.WaitEvent = WaitEvent;
|
||||||
gMPSystem.Timeout = TimeoutInMicroseconds;
|
gMPSystem.Timeout = TimeoutInMicroseconds;
|
||||||
gMPSystem.TimeoutActive = (BOOLEAN)(TimeoutInMicroseconds != 0);
|
gMPSystem.TimeoutActive = (BOOLEAN)(TimeoutInMicroseconds != 0);
|
||||||
Status = gBS->SetTimer (
|
Status = gBS->SetTimer (
|
||||||
gMPSystem.CheckAllAPsEvent,
|
gMPSystem.CheckAllAPsEvent,
|
||||||
TimerPeriodic,
|
TimerPeriodic,
|
||||||
gPollInterval
|
gPollInterval
|
||||||
);
|
);
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
for (Number = 0; Number < gMPSystem.NumberOfProcessors; Number++) {
|
for (Number = 0; Number < gMPSystem.NumberOfProcessors; Number++) {
|
||||||
ProcessorData = &gMPSystem.ProcessorData[Number];
|
ProcessorData = &gMPSystem.ProcessorData[Number];
|
||||||
if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
||||||
// Skip BSP
|
// Skip BSP
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,29 +535,29 @@ CpuMpServicesStartupAllAps (
|
|||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
|
|
||||||
switch (ProcessorState) {
|
switch (ProcessorState) {
|
||||||
case CPU_STATE_READY:
|
case CPU_STATE_READY:
|
||||||
SetApProcedure (ProcessorData, Procedure, ProcedureArgument);
|
SetApProcedure (ProcessorData, Procedure, ProcedureArgument);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CPU_STATE_FINISHED:
|
case CPU_STATE_FINISHED:
|
||||||
gMPSystem.FinishCount++;
|
gMPSystem.FinishCount++;
|
||||||
if (SingleThread) {
|
if (SingleThread) {
|
||||||
Status = GetNextBlockedNumber (&NextNumber);
|
Status = GetNextBlockedNumber (&NextNumber);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
gThread->MutexLock (gMPSystem.ProcessorData[NextNumber].StateLock);
|
gThread->MutexLock (gMPSystem.ProcessorData[NextNumber].StateLock);
|
||||||
gMPSystem.ProcessorData[NextNumber].State = CPU_STATE_READY;
|
gMPSystem.ProcessorData[NextNumber].State = CPU_STATE_READY;
|
||||||
gThread->MutexUnlock (gMPSystem.ProcessorData[NextNumber].StateLock);
|
gThread->MutexUnlock (gMPSystem.ProcessorData[NextNumber].StateLock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
gThread->MutexLock (ProcessorData->StateLock);
|
gThread->MutexLock (ProcessorData->StateLock);
|
||||||
ProcessorData->State = CPU_STATE_IDLE;
|
ProcessorData->State = CPU_STATE_IDLE;
|
||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -590,7 +585,6 @@ Done:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This service lets the caller get one enabled AP to execute a caller-provided
|
This service lets the caller get one enabled AP to execute a caller-provided
|
||||||
function. The caller can request the BSP to either wait for the completion
|
function. The caller can request the BSP to either wait for the completion
|
||||||
@ -689,7 +683,7 @@ CpuMpServicesStartupThisAP (
|
|||||||
OUT BOOLEAN *Finished OPTIONAL
|
OUT BOOLEAN *Finished OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Timeout;
|
UINTN Timeout;
|
||||||
|
|
||||||
if (!IsBSP ()) {
|
if (!IsBSP ()) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
@ -711,12 +705,13 @@ CpuMpServicesStartupThisAP (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
gThread->MutexLock(gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
gThread->MutexLock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
||||||
if (gMPSystem.ProcessorData[ProcessorNumber].State != CPU_STATE_IDLE) {
|
if (gMPSystem.ProcessorData[ProcessorNumber].State != CPU_STATE_IDLE) {
|
||||||
gThread->MutexUnlock(gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
||||||
return EFI_NOT_READY;
|
return EFI_NOT_READY;
|
||||||
}
|
}
|
||||||
gThread->MutexUnlock(gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
|
||||||
|
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
||||||
|
|
||||||
if ((WaitEvent != NULL) && gReadToBoot) {
|
if ((WaitEvent != NULL) && gReadToBoot) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
@ -724,8 +719,8 @@ CpuMpServicesStartupThisAP (
|
|||||||
|
|
||||||
Timeout = TimeoutInMicroseconds;
|
Timeout = TimeoutInMicroseconds;
|
||||||
|
|
||||||
gMPSystem.StartCount = 1;
|
gMPSystem.StartCount = 1;
|
||||||
gMPSystem.FinishCount = 0;
|
gMPSystem.FinishCount = 0;
|
||||||
|
|
||||||
SetApProcedure (&gMPSystem.ProcessorData[ProcessorNumber], Procedure, ProcedureArgument);
|
SetApProcedure (&gMPSystem.ProcessorData[ProcessorNumber], Procedure, ProcedureArgument);
|
||||||
|
|
||||||
@ -759,10 +754,8 @@ CpuMpServicesStartupThisAP (
|
|||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This service switches the requested AP to be the BSP from that point onward.
|
This service switches the requested AP to be the BSP from that point onward.
|
||||||
This service changes the BSP for all purposes. This call can only be performed
|
This service changes the BSP for all purposes. This call can only be performed
|
||||||
@ -806,7 +799,7 @@ CpuMpServicesSwitchBSP (
|
|||||||
IN BOOLEAN EnableOldBSP
|
IN BOOLEAN EnableOldBSP
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
if (!IsBSP ()) {
|
if (!IsBSP ()) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
@ -829,6 +822,7 @@ CpuMpServicesSwitchBSP (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (Index != gMPSystem.NumberOfProcessors);
|
ASSERT (Index != gMPSystem.NumberOfProcessors);
|
||||||
|
|
||||||
gThread->MutexLock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
gThread->MutexLock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
||||||
@ -836,6 +830,7 @@ CpuMpServicesSwitchBSP (
|
|||||||
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
||||||
return EFI_NOT_READY;
|
return EFI_NOT_READY;
|
||||||
}
|
}
|
||||||
|
|
||||||
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
||||||
|
|
||||||
// Skip for now as we need switch a bunch of stack stuff around and it's complex
|
// Skip for now as we need switch a bunch of stack stuff around and it's complex
|
||||||
@ -843,7 +838,6 @@ CpuMpServicesSwitchBSP (
|
|||||||
return EFI_NOT_READY;
|
return EFI_NOT_READY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This service lets the caller enable or disable an AP from this point onward.
|
This service lets the caller enable or disable an AP from this point onward.
|
||||||
This service may only be called from the BSP.
|
This service may only be called from the BSP.
|
||||||
@ -911,17 +905,20 @@ CpuMpServicesEnableDisableAP (
|
|||||||
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
|
||||||
|
|
||||||
if (EnableAP) {
|
if (EnableAP) {
|
||||||
if ((gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag & PROCESSOR_ENABLED_BIT) == 0 ) {
|
if ((gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag & PROCESSOR_ENABLED_BIT) == 0 ) {
|
||||||
gMPSystem.NumberOfEnabledProcessors++;
|
gMPSystem.NumberOfEnabledProcessors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag |= PROCESSOR_ENABLED_BIT;
|
gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag |= PROCESSOR_ENABLED_BIT;
|
||||||
} else {
|
} else {
|
||||||
if ((gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag & PROCESSOR_ENABLED_BIT) == PROCESSOR_ENABLED_BIT ) {
|
if ((gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag & PROCESSOR_ENABLED_BIT) == PROCESSOR_ENABLED_BIT ) {
|
||||||
gMPSystem.NumberOfEnabledProcessors--;
|
gMPSystem.NumberOfEnabledProcessors--;
|
||||||
}
|
}
|
||||||
|
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag &= ~PROCESSOR_ENABLED_BIT;
|
gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag &= ~PROCESSOR_ENABLED_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,7 +930,6 @@ CpuMpServicesEnableDisableAP (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This return the handle number for the calling processor. This service may be
|
This return the handle number for the calling processor. This service may be
|
||||||
called from the BSP and APs.
|
called from the BSP and APs.
|
||||||
@ -983,8 +979,6 @@ CpuMpServicesWhoAmI (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {
|
EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {
|
||||||
CpuMpServicesGetNumberOfProcessors,
|
CpuMpServicesGetNumberOfProcessors,
|
||||||
CpuMpServicesGetProcessorInfo,
|
CpuMpServicesGetProcessorInfo,
|
||||||
@ -995,8 +989,6 @@ EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {
|
|||||||
CpuMpServicesWhoAmI
|
CpuMpServicesWhoAmI
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
If timeout occurs in StartupAllAps(), a timer is set, which invokes this
|
If timeout occurs in StartupAllAps(), a timer is set, which invokes this
|
||||||
procedure periodically to check whether all APs have finished.
|
procedure periodically to check whether all APs have finished.
|
||||||
@ -1006,8 +998,8 @@ EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuCheckAllAPsStatus (
|
CpuCheckAllAPsStatus (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN ProcessorNumber;
|
UINTN ProcessorNumber;
|
||||||
@ -1026,7 +1018,7 @@ CpuCheckAllAPsStatus (
|
|||||||
for (ProcessorNumber = 0; ProcessorNumber < gMPSystem.NumberOfProcessors; ProcessorNumber++) {
|
for (ProcessorNumber = 0; ProcessorNumber < gMPSystem.NumberOfProcessors; ProcessorNumber++) {
|
||||||
ProcessorData = &gMPSystem.ProcessorData[ProcessorNumber];
|
ProcessorData = &gMPSystem.ProcessorData[ProcessorNumber];
|
||||||
if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
||||||
// Skip BSP
|
// Skip BSP
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1041,39 +1033,40 @@ CpuCheckAllAPsStatus (
|
|||||||
// So, try lock it. If we can get it, cool, do our thing.
|
// So, try lock it. If we can get it, cool, do our thing.
|
||||||
// otherwise, just dump out & try again on the next iteration.
|
// otherwise, just dump out & try again on the next iteration.
|
||||||
Status = gThread->MutexTryLock (ProcessorData->StateLock);
|
Status = gThread->MutexTryLock (ProcessorData->StateLock);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessorState = ProcessorData->State;
|
ProcessorState = ProcessorData->State;
|
||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
|
|
||||||
switch (ProcessorState) {
|
switch (ProcessorState) {
|
||||||
case CPU_STATE_FINISHED:
|
case CPU_STATE_FINISHED:
|
||||||
if (gMPSystem.SingleThread) {
|
if (gMPSystem.SingleThread) {
|
||||||
Status = GetNextBlockedNumber (&NextNumber);
|
Status = GetNextBlockedNumber (&NextNumber);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
NextData = &gMPSystem.ProcessorData[NextNumber];
|
NextData = &gMPSystem.ProcessorData[NextNumber];
|
||||||
|
|
||||||
gThread->MutexLock (NextData->StateLock);
|
gThread->MutexLock (NextData->StateLock);
|
||||||
NextData->State = CPU_STATE_READY;
|
NextData->State = CPU_STATE_READY;
|
||||||
gThread->MutexUnlock (NextData->StateLock);
|
gThread->MutexUnlock (NextData->StateLock);
|
||||||
|
|
||||||
SetApProcedure (NextData, gMPSystem.Procedure, gMPSystem.ProcedureArgument);
|
SetApProcedure (NextData, gMPSystem.Procedure, gMPSystem.ProcedureArgument);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
gThread->MutexLock (ProcessorData->StateLock);
|
gThread->MutexLock (ProcessorData->StateLock);
|
||||||
ProcessorData->State = CPU_STATE_IDLE;
|
ProcessorData->State = CPU_STATE_IDLE;
|
||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
gMPSystem.FinishCount++;
|
gMPSystem.FinishCount++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gMPSystem.TimeoutActive && gMPSystem.Timeout == 0) {
|
if (gMPSystem.TimeoutActive && (gMPSystem.Timeout == 0)) {
|
||||||
//
|
//
|
||||||
// Timeout
|
// Timeout
|
||||||
//
|
//
|
||||||
@ -1081,7 +1074,7 @@ CpuCheckAllAPsStatus (
|
|||||||
for (ProcessorNumber = 0; ProcessorNumber < gMPSystem.NumberOfProcessors; ProcessorNumber++) {
|
for (ProcessorNumber = 0; ProcessorNumber < gMPSystem.NumberOfProcessors; ProcessorNumber++) {
|
||||||
ProcessorData = &gMPSystem.ProcessorData[ProcessorNumber];
|
ProcessorData = &gMPSystem.ProcessorData[ProcessorNumber];
|
||||||
if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
||||||
// Skip BSP
|
// Skip BSP
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1092,9 +1085,10 @@ CpuCheckAllAPsStatus (
|
|||||||
|
|
||||||
// Mark the
|
// Mark the
|
||||||
Status = gThread->MutexTryLock (ProcessorData->StateLock);
|
Status = gThread->MutexTryLock (ProcessorData->StateLock);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessorState = ProcessorData->State;
|
ProcessorState = ProcessorData->State;
|
||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
|
|
||||||
@ -1104,17 +1098,20 @@ CpuCheckAllAPsStatus (
|
|||||||
if (gMPSystem.FailedList[Cpu] == END_OF_CPU_LIST) {
|
if (gMPSystem.FailedList[Cpu] == END_OF_CPU_LIST) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gMPSystem.FailedList[ProcessorNumber] == Cpu) {
|
if (gMPSystem.FailedList[ProcessorNumber] == Cpu) {
|
||||||
Found = TRUE;
|
Found = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Found) {
|
if (!Found) {
|
||||||
gMPSystem.FailedList[gMPSystem.FailedListIndex++] = Cpu;
|
gMPSystem.FailedList[gMPSystem.FailedListIndex++] = Cpu;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force terminal exit
|
// Force terminal exit
|
||||||
gMPSystem.FinishCount = gMPSystem.StartCount;
|
gMPSystem.FinishCount = gMPSystem.StartCount;
|
||||||
}
|
}
|
||||||
@ -1138,21 +1135,21 @@ CpuCheckAllAPsStatus (
|
|||||||
|
|
||||||
Status = gBS->SignalEvent (gMPSystem.WaitEvent);
|
Status = gBS->SignalEvent (gMPSystem.WaitEvent);
|
||||||
|
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuCheckThisAPStatus (
|
CpuCheckThisAPStatus (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
PROCESSOR_DATA_BLOCK *ProcessorData;
|
PROCESSOR_DATA_BLOCK *ProcessorData;
|
||||||
PROCESSOR_STATE ProcessorState;
|
PROCESSOR_STATE ProcessorState;
|
||||||
|
|
||||||
ProcessorData = (PROCESSOR_DATA_BLOCK *) Context;
|
ProcessorData = (PROCESSOR_DATA_BLOCK *)Context;
|
||||||
|
|
||||||
//
|
//
|
||||||
// This is an Interrupt Service routine.
|
// This is an Interrupt Service routine.
|
||||||
@ -1162,9 +1159,10 @@ CpuCheckThisAPStatus (
|
|||||||
// otherwise, just dump out & try again on the next iteration.
|
// otherwise, just dump out & try again on the next iteration.
|
||||||
//
|
//
|
||||||
Status = gThread->MutexTryLock (ProcessorData->StateLock);
|
Status = gThread->MutexTryLock (ProcessorData->StateLock);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessorState = ProcessorData->State;
|
ProcessorState = ProcessorData->State;
|
||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
|
|
||||||
@ -1180,10 +1178,9 @@ CpuCheckThisAPStatus (
|
|||||||
gThread->MutexUnlock (ProcessorData->StateLock);
|
gThread->MutexUnlock (ProcessorData->StateLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
This function is called by all processors (both BSP and AP) once and collects MP related data
|
This function is called by all processors (both BSP and AP) once and collects MP related data
|
||||||
|
|
||||||
@ -1195,25 +1192,25 @@ CpuCheckThisAPStatus (
|
|||||||
--*/
|
--*/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FillInProcessorInformation (
|
FillInProcessorInformation (
|
||||||
IN BOOLEAN BSP,
|
IN BOOLEAN BSP,
|
||||||
IN UINTN ProcessorNumber
|
IN UINTN ProcessorNumber
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Info.ProcessorId = gThread->Self ();
|
gMPSystem.ProcessorData[ProcessorNumber].Info.ProcessorId = gThread->Self ();
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag = PROCESSOR_ENABLED_BIT | PROCESSOR_HEALTH_STATUS_BIT;
|
gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag = PROCESSOR_ENABLED_BIT | PROCESSOR_HEALTH_STATUS_BIT;
|
||||||
if (BSP) {
|
if (BSP) {
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag |= PROCESSOR_AS_BSP_BIT;
|
gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag |= PROCESSOR_AS_BSP_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Package = (UINT32) ProcessorNumber;
|
gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Package = (UINT32)ProcessorNumber;
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Core = 0;
|
gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Core = 0;
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Thread = 0;
|
gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Thread = 0;
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].State = BSP ? CPU_STATE_BUSY : CPU_STATE_IDLE;
|
gMPSystem.ProcessorData[ProcessorNumber].State = BSP ? CPU_STATE_BUSY : CPU_STATE_IDLE;
|
||||||
|
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Procedure = NULL;
|
gMPSystem.ProcessorData[ProcessorNumber].Procedure = NULL;
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].Parameter = NULL;
|
gMPSystem.ProcessorData[ProcessorNumber].Parameter = NULL;
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].StateLock = gThread->MutexInit ();
|
gMPSystem.ProcessorData[ProcessorNumber].StateLock = gThread->MutexInit ();
|
||||||
gMPSystem.ProcessorData[ProcessorNumber].ProcedureLock = gThread->MutexInit ();
|
gMPSystem.ProcessorData[ProcessorNumber].ProcedureLock = gThread->MutexInit ();
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -1230,7 +1227,7 @@ CpuDriverApIdolLoop (
|
|||||||
PROCESSOR_DATA_BLOCK *ProcessorData;
|
PROCESSOR_DATA_BLOCK *ProcessorData;
|
||||||
|
|
||||||
ProcessorNumber = (UINTN)Context;
|
ProcessorNumber = (UINTN)Context;
|
||||||
ProcessorData = &gMPSystem.ProcessorData[ProcessorNumber];
|
ProcessorData = &gMPSystem.ProcessorData[ProcessorNumber];
|
||||||
|
|
||||||
ProcessorData->Info.ProcessorId = gThread->Self ();
|
ProcessorData->Info.ProcessorId = gThread->Self ();
|
||||||
|
|
||||||
@ -1267,15 +1264,13 @@ CpuDriverApIdolLoop (
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
InitializeMpSystemData (
|
InitializeMpSystemData (
|
||||||
IN UINTN NumberOfProcessors
|
IN UINTN NumberOfProcessors
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Clear the data structure area first.
|
// Clear the data structure area first.
|
||||||
@ -1285,8 +1280,8 @@ InitializeMpSystemData (
|
|||||||
//
|
//
|
||||||
// First BSP fills and inits all known values, including it's own records.
|
// First BSP fills and inits all known values, including it's own records.
|
||||||
//
|
//
|
||||||
gMPSystem.NumberOfProcessors = NumberOfProcessors;
|
gMPSystem.NumberOfProcessors = NumberOfProcessors;
|
||||||
gMPSystem.NumberOfEnabledProcessors = NumberOfProcessors;
|
gMPSystem.NumberOfEnabledProcessors = NumberOfProcessors;
|
||||||
|
|
||||||
gMPSystem.ProcessorData = AllocateZeroPool (gMPSystem.NumberOfProcessors * sizeof (PROCESSOR_DATA_BLOCK));
|
gMPSystem.ProcessorData = AllocateZeroPool (gMPSystem.NumberOfProcessors * sizeof (PROCESSOR_DATA_BLOCK));
|
||||||
ASSERT (gMPSystem.ProcessorData != NULL);
|
ASSERT (gMPSystem.ProcessorData != NULL);
|
||||||
@ -1302,10 +1297,9 @@ InitializeMpSystemData (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
for (Index = 0; Index < gMPSystem.NumberOfProcessors; Index++) {
|
for (Index = 0; Index < gMPSystem.NumberOfProcessors; Index++) {
|
||||||
if ((gMPSystem.ProcessorData[Index].Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
if ((gMPSystem.ProcessorData[Index].Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {
|
||||||
// Skip BSP
|
// Skip BSP
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1318,21 +1312,18 @@ InitializeMpSystemData (
|
|||||||
(VOID *)Index
|
(VOID *)Index
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_TIMER | EVT_NOTIFY_SIGNAL,
|
EVT_TIMER | EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_CALLBACK,
|
||||||
CpuCheckThisAPStatus,
|
CpuCheckThisAPStatus,
|
||||||
(VOID *) &gMPSystem.ProcessorData[Index],
|
(VOID *)&gMPSystem.ProcessorData[Index],
|
||||||
&gMPSystem.ProcessorData[Index].CheckThisAPEvent
|
&gMPSystem.ProcessorData[Index].CheckThisAPEvent
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Invoke a notification event
|
Invoke a notification event
|
||||||
|
|
||||||
@ -1344,32 +1335,30 @@ InitializeMpSystemData (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuReadToBootFunction (
|
CpuReadToBootFunction (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
gReadToBoot = TRUE;
|
gReadToBoot = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
CpuMpServicesInit (
|
CpuMpServicesInit (
|
||||||
OUT UINTN *MaxCpus
|
OUT UINTN *MaxCpus
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
||||||
|
|
||||||
*MaxCpus = 1; // BSP
|
*MaxCpus = 1; // BSP
|
||||||
IoThunk = GetIoThunkInstance (&gEmuThreadThunkProtocolGuid, 0);
|
IoThunk = GetIoThunkInstance (&gEmuThreadThunkProtocolGuid, 0);
|
||||||
if (IoThunk != NULL) {
|
if (IoThunk != NULL) {
|
||||||
Status = IoThunk->Open (IoThunk);
|
Status = IoThunk->Open (IoThunk);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
if (IoThunk->ConfigString != NULL) {
|
if (IoThunk->ConfigString != NULL) {
|
||||||
*MaxCpus += StrDecimalToUintn (IoThunk->ConfigString);
|
*MaxCpus += StrDecimalToUintn (IoThunk->ConfigString);
|
||||||
gThread = IoThunk->Interface;
|
gThread = IoThunk->Interface;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1379,9 +1368,9 @@ CpuMpServicesInit (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
gPollInterval = (UINTN) PcdGet64 (PcdEmuMpServicesPollingInterval);
|
gPollInterval = (UINTN)PcdGet64 (PcdEmuMpServicesPollingInterval);
|
||||||
|
|
||||||
Status = InitializeMpSystemData (*MaxCpus);
|
Status = InitializeMpSystemData (*MaxCpus);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -1395,10 +1384,9 @@ CpuMpServicesInit (
|
|||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&Handle,
|
&Handle,
|
||||||
&gEfiMpServiceProtocolGuid, &mMpServicesTemplate,
|
&gEfiMpServiceProtocolGuid,
|
||||||
|
&mMpServicesTemplate,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ Abstract:
|
|||||||
//
|
//
|
||||||
// EFI Component Name Functions
|
// EFI Component Name Functions
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the driver.
|
Retrieves a Unicode string that is the user readable name of the driver.
|
||||||
|
|
||||||
@ -63,7 +64,6 @@ EmuBlockIoComponentNameGetDriverName (
|
|||||||
OUT CHAR16 **DriverName
|
OUT CHAR16 **DriverName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the controller
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
that is being managed by a driver.
|
that is being managed by a driver.
|
||||||
@ -135,17 +135,17 @@ EmuBlockIoComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoComponentNameGetControllerName (
|
EmuBlockIoComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Protocol
|
// EFI Component Name Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmuBlockIoComponentName = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmuBlockIoComponentName = {
|
||||||
EmuBlockIoComponentNameGetDriverName,
|
EmuBlockIoComponentNameGetDriverName,
|
||||||
EmuBlockIoComponentNameGetControllerName,
|
EmuBlockIoComponentNameGetControllerName,
|
||||||
"eng"
|
"eng"
|
||||||
@ -154,16 +154,15 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmuBlockIoCompon
|
|||||||
//
|
//
|
||||||
// EFI Component Name 2 Protocol
|
// EFI Component Name 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuBlockIoComponentName2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuBlockIoComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EmuBlockIoComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)EmuBlockIoComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EmuBlockIoComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)EmuBlockIoComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EFI_UNICODE_STRING_TABLE mEmuBlockIoDriverNameTable[] = {
|
||||||
EFI_UNICODE_STRING_TABLE mEmuBlockIoDriverNameTable[] = {
|
|
||||||
{ "eng;en", L"Emu Block I/O Driver" },
|
{ "eng;en", L"Emu Block I/O Driver" },
|
||||||
{ NULL , NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -214,12 +213,12 @@ EmuBlockIoComponentNameGetDriverName (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
return LookupUnicodeString2 (
|
return LookupUnicodeString2 (
|
||||||
Language,
|
Language,
|
||||||
This->SupportedLanguages,
|
This->SupportedLanguages,
|
||||||
mEmuBlockIoDriverNameTable,
|
mEmuBlockIoDriverNameTable,
|
||||||
DriverName,
|
DriverName,
|
||||||
(BOOLEAN)(This == &gEmuBlockIoComponentName)
|
(BOOLEAN)(This == &gEmuBlockIoComponentName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -293,16 +292,16 @@ EmuBlockIoComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoComponentNameGetControllerName (
|
EmuBlockIoComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
|
|
||||||
//
|
//
|
||||||
// This is a device driver, so ChildHandle must be NULL.
|
// This is a device driver, so ChildHandle must be NULL.
|
||||||
@ -310,6 +309,7 @@ EmuBlockIoComponentNameGetControllerName (
|
|||||||
if (ChildHandle != NULL) {
|
if (ChildHandle != NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make sure this driver is currently managing ControllerHandle
|
// Make sure this driver is currently managing ControllerHandle
|
||||||
//
|
//
|
||||||
@ -321,6 +321,7 @@ EmuBlockIoComponentNameGetControllerName (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get our context back
|
// Get our context back
|
||||||
//
|
//
|
||||||
@ -339,10 +340,10 @@ EmuBlockIoComponentNameGetControllerName (
|
|||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (BlockIo);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (BlockIo);
|
||||||
|
|
||||||
return LookupUnicodeString2 (
|
return LookupUnicodeString2 (
|
||||||
Language,
|
Language,
|
||||||
This->SupportedLanguages,
|
This->SupportedLanguages,
|
||||||
Private->ControllerNameTable,
|
Private->ControllerNameTable,
|
||||||
ControllerName,
|
ControllerName,
|
||||||
(BOOLEAN)(This == &gEmuBlockIoComponentName)
|
(BOOLEAN)(This == &gEmuBlockIoComponentName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -19,35 +19,35 @@ Abstract:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverConfigurationSetOptions (
|
EmuBlockIoDriverConfigurationSetOptions (
|
||||||
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired
|
OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverConfigurationOptionsValid (
|
EmuBlockIoDriverConfigurationOptionsValid (
|
||||||
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL
|
IN EFI_HANDLE ChildHandle OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverConfigurationForceDefaults (
|
EmuBlockIoDriverConfigurationForceDefaults (
|
||||||
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN UINT32 DefaultType,
|
IN UINT32 DefaultType,
|
||||||
OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired
|
OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Driver Configuration Protocol
|
// EFI Driver Configuration Protocol
|
||||||
//
|
//
|
||||||
EFI_DRIVER_CONFIGURATION_PROTOCOL gEmuBlockIoDriverConfiguration = {
|
EFI_DRIVER_CONFIGURATION_PROTOCOL gEmuBlockIoDriverConfiguration = {
|
||||||
EmuBlockIoDriverConfigurationSetOptions,
|
EmuBlockIoDriverConfigurationSetOptions,
|
||||||
EmuBlockIoDriverConfigurationOptionsValid,
|
EmuBlockIoDriverConfigurationOptionsValid,
|
||||||
EmuBlockIoDriverConfigurationForceDefaults,
|
EmuBlockIoDriverConfigurationForceDefaults,
|
||||||
@ -103,20 +103,20 @@ EFI_DRIVER_CONFIGURATION_PROTOCOL gEmuBlockIoDriverConfiguration = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverConfigurationSetOptions (
|
EmuBlockIoDriverConfigurationSetOptions (
|
||||||
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired
|
OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
CHAR8 *SupportedLanguage;
|
CHAR8 *SupportedLanguage;
|
||||||
|
|
||||||
SupportedLanguage = This->SupportedLanguages;
|
SupportedLanguage = This->SupportedLanguages;
|
||||||
|
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
while (*SupportedLanguage != 0) {
|
while (*SupportedLanguage != 0) {
|
||||||
if (AsciiStrnCmp (Language, SupportedLanguage, 3) == 0) {
|
if (AsciiStrnCmp (Language, SupportedLanguage, 3) == 0) {
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
@ -129,7 +129,7 @@ EmuBlockIoDriverConfigurationSetOptions (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ActionRequired == NULL || ControllerHandle == NULL) {
|
if ((ActionRequired == NULL) || (ControllerHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,11 +151,11 @@ EmuBlockIoDriverConfigurationSetOptions (
|
|||||||
|
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
gEmuBlockIoDriverBinding.DriverBindingHandle,
|
gEmuBlockIoDriverBinding.DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@ -206,13 +206,13 @@ EmuBlockIoDriverConfigurationSetOptions (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverConfigurationOptionsValid (
|
EmuBlockIoDriverConfigurationOptionsValid (
|
||||||
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL
|
IN EFI_HANDLE ChildHandle OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
|
|
||||||
if (ChildHandle != NULL) {
|
if (ChildHandle != NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
@ -236,11 +236,11 @@ EmuBlockIoDriverConfigurationOptionsValid (
|
|||||||
|
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
gEmuBlockIoDriverBinding.DriverBindingHandle,
|
gEmuBlockIoDriverBinding.DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@ -280,21 +280,21 @@ EmuBlockIoDriverConfigurationOptionsValid (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverConfigurationForceDefaults (
|
EmuBlockIoDriverConfigurationForceDefaults (
|
||||||
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN UINT32 DefaultType,
|
IN UINT32 DefaultType,
|
||||||
OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired
|
OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
|
|
||||||
if (ChildHandle != NULL) {
|
if (ChildHandle != NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ActionRequired == NULL || ControllerHandle == NULL) {
|
if ((ActionRequired == NULL) || (ControllerHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,11 +312,11 @@ EmuBlockIoDriverConfigurationForceDefaults (
|
|||||||
|
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
gEmuBlockIoDriverBinding.DriverBindingHandle,
|
gEmuBlockIoDriverBinding.DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -19,20 +19,20 @@ Abstract:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverDiagnosticsRunDiagnostics (
|
EmuBlockIoDriverDiagnosticsRunDiagnostics (
|
||||||
IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL *This,
|
IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType,
|
IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT EFI_GUID **ErrorType,
|
OUT EFI_GUID **ErrorType,
|
||||||
OUT UINTN *BufferSize,
|
OUT UINTN *BufferSize,
|
||||||
OUT CHAR16 **Buffer
|
OUT CHAR16 **Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Driver Diagnostics Protocol
|
// EFI Driver Diagnostics Protocol
|
||||||
//
|
//
|
||||||
EFI_DRIVER_DIAGNOSTICS_PROTOCOL gEmuBlockIoDriverDiagnostics = {
|
EFI_DRIVER_DIAGNOSTICS_PROTOCOL gEmuBlockIoDriverDiagnostics = {
|
||||||
EmuBlockIoDriverDiagnosticsRunDiagnostics,
|
EmuBlockIoDriverDiagnosticsRunDiagnostics,
|
||||||
"eng"
|
"eng"
|
||||||
};
|
};
|
||||||
@ -40,23 +40,24 @@ EFI_DRIVER_DIAGNOSTICS_PROTOCOL gEmuBlockIoDriverDiagnostics = {
|
|||||||
//
|
//
|
||||||
// EFI Driver Diagnostics 2 Protocol
|
// EFI Driver Diagnostics 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_DRIVER_DIAGNOSTICS2_PROTOCOL gEmuBlockIoDriverDiagnostics2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_DRIVER_DIAGNOSTICS2_PROTOCOL gEmuBlockIoDriverDiagnostics2 = {
|
||||||
(EFI_DRIVER_DIAGNOSTICS2_RUN_DIAGNOSTICS) EmuBlockIoDriverDiagnosticsRunDiagnostics,
|
(EFI_DRIVER_DIAGNOSTICS2_RUN_DIAGNOSTICS)EmuBlockIoDriverDiagnosticsRunDiagnostics,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverDiagnosticsRunDiagnostics (
|
EmuBlockIoDriverDiagnosticsRunDiagnostics (
|
||||||
IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL *This,
|
IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType,
|
IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT EFI_GUID **ErrorType,
|
OUT EFI_GUID **ErrorType,
|
||||||
OUT UINTN *BufferSize,
|
OUT UINTN *BufferSize,
|
||||||
OUT CHAR16 **Buffer
|
OUT CHAR16 **Buffer
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -117,24 +118,24 @@ EmuBlockIoDriverDiagnosticsRunDiagnostics (
|
|||||||
|
|
||||||
--*/
|
--*/
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
CHAR8 *SupportedLanguages;
|
CHAR8 *SupportedLanguages;
|
||||||
BOOLEAN Iso639Language;
|
BOOLEAN Iso639Language;
|
||||||
BOOLEAN Found;
|
BOOLEAN Found;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
if (Language == NULL ||
|
|
||||||
ErrorType == NULL ||
|
|
||||||
Buffer == NULL ||
|
|
||||||
ControllerHandle == NULL ||
|
|
||||||
BufferSize == NULL) {
|
|
||||||
|
|
||||||
|
if ((Language == NULL) ||
|
||||||
|
(ErrorType == NULL) ||
|
||||||
|
(Buffer == NULL) ||
|
||||||
|
(ControllerHandle == NULL) ||
|
||||||
|
(BufferSize == NULL))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
SupportedLanguages = This->SupportedLanguages;
|
SupportedLanguages = This->SupportedLanguages;
|
||||||
Iso639Language = (BOOLEAN)(This == &gEmuBlockIoDriverDiagnostics);
|
Iso639Language = (BOOLEAN)(This == &gEmuBlockIoDriverDiagnostics);
|
||||||
//
|
//
|
||||||
// Make sure Language is in the set of Supported Languages
|
// Make sure Language is in the set of Supported Languages
|
||||||
//
|
//
|
||||||
@ -143,19 +144,25 @@ EmuBlockIoDriverDiagnosticsRunDiagnostics (
|
|||||||
if (Iso639Language) {
|
if (Iso639Language) {
|
||||||
if (CompareMem (Language, SupportedLanguages, 3) == 0) {
|
if (CompareMem (Language, SupportedLanguages, 3) == 0) {
|
||||||
Found = TRUE;
|
Found = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SupportedLanguages += 3;
|
SupportedLanguages += 3;
|
||||||
} else {
|
} else {
|
||||||
for (Index = 0; SupportedLanguages[Index] != 0 && SupportedLanguages[Index] != ';'; Index++);
|
for (Index = 0; SupportedLanguages[Index] != 0 && SupportedLanguages[Index] != ';'; Index++) {
|
||||||
if ((AsciiStrnCmp(SupportedLanguages, Language, Index) == 0) && (Language[Index] == 0)) {
|
}
|
||||||
|
|
||||||
|
if ((AsciiStrnCmp (SupportedLanguages, Language, Index) == 0) && (Language[Index] == 0)) {
|
||||||
Found = TRUE;
|
Found = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SupportedLanguages += Index;
|
SupportedLanguages += Index;
|
||||||
for (; *SupportedLanguages != 0 && *SupportedLanguages == ';'; SupportedLanguages++);
|
for ( ; *SupportedLanguages != 0 && *SupportedLanguages == ';'; SupportedLanguages++) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If Language is not a member of SupportedLanguages, then return EFI_UNSUPPORTED
|
// If Language is not a member of SupportedLanguages, then return EFI_UNSUPPORTED
|
||||||
//
|
//
|
||||||
@ -168,7 +175,7 @@ EmuBlockIoDriverDiagnosticsRunDiagnostics (
|
|||||||
if (DiagnosticType != EfiDriverDiagnosticTypeStandard) {
|
if (DiagnosticType != EfiDriverDiagnosticTypeStandard) {
|
||||||
*ErrorType = &gEfiBlockIoProtocolGuid;
|
*ErrorType = &gEfiBlockIoProtocolGuid;
|
||||||
*BufferSize = 0x60;
|
*BufferSize = 0x60;
|
||||||
Buffer = AllocatePool ((UINTN) (*BufferSize));
|
Buffer = AllocatePool ((UINTN)(*BufferSize));
|
||||||
CopyMem (*Buffer, L"Windows Block I/O Driver Diagnostics Failed\n", *BufferSize);
|
CopyMem (*Buffer, L"Windows Block I/O Driver Diagnostics Failed\n", *BufferSize);
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
@ -194,11 +201,11 @@ EmuBlockIoDriverDiagnosticsRunDiagnostics (
|
|||||||
|
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
gEmuBlockIoDriverBinding.DriverBindingHandle,
|
gEmuBlockIoDriverBinding.DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@ bbe
|
|||||||
|
|
||||||
#include "EmuBlockIo.h"
|
#include "EmuBlockIo.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reset the block device hardware.
|
Reset the block device hardware.
|
||||||
|
|
||||||
@ -28,9 +27,9 @@ EmuBlockIo2Reset (
|
|||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -78,17 +77,17 @@ EmuBlockIo2Reset (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIo2ReadBlocksEx (
|
EmuBlockIo2ReadBlocksEx (
|
||||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||||
IN UINT32 MediaId,
|
IN UINT32 MediaId,
|
||||||
IN EFI_LBA LBA,
|
IN EFI_LBA LBA,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -100,7 +99,6 @@ EmuBlockIo2ReadBlocksEx (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Write BufferSize bytes from Lba into Buffer.
|
Write BufferSize bytes from Lba into Buffer.
|
||||||
|
|
||||||
@ -136,16 +134,16 @@ EFI_STATUS
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIo2WriteBlocksEx (
|
EmuBlockIo2WriteBlocksEx (
|
||||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||||
IN UINT32 MediaId,
|
IN UINT32 MediaId,
|
||||||
IN EFI_LBA LBA,
|
IN EFI_LBA LBA,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -157,8 +155,6 @@ EmuBlockIo2WriteBlocksEx (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Flush the Block Device.
|
Flush the Block Device.
|
||||||
|
|
||||||
@ -184,13 +180,13 @@ EmuBlockIo2WriteBlocksEx (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIo2Flush (
|
EmuBlockIo2Flush (
|
||||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -202,8 +198,6 @@ EmuBlockIo2Flush (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reset the Block Device.
|
Reset the Block Device.
|
||||||
|
|
||||||
@ -218,13 +212,13 @@ EmuBlockIo2Flush (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoReset (
|
EmuBlockIoReset (
|
||||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -236,7 +230,6 @@ EmuBlockIoReset (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Read BufferSize bytes from Lba into Buffer.
|
Read BufferSize bytes from Lba into Buffer.
|
||||||
|
|
||||||
@ -259,30 +252,29 @@ EmuBlockIoReset (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoReadBlocks (
|
EmuBlockIoReadBlocks (
|
||||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
IN UINT32 MediaId,
|
IN UINT32 MediaId,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_BLOCK_IO2_TOKEN Token;
|
EFI_BLOCK_IO2_TOKEN Token;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Token.Event = NULL;
|
Token.Event = NULL;
|
||||||
Status = Private->Io->ReadBlocks (Private->Io, MediaId, Lba, &Token, BufferSize, Buffer);
|
Status = Private->Io->ReadBlocks (Private->Io, MediaId, Lba, &Token, BufferSize, Buffer);
|
||||||
|
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Write BufferSize bytes from Lba into Buffer.
|
Write BufferSize bytes from Lba into Buffer.
|
||||||
|
|
||||||
@ -306,24 +298,24 @@ EmuBlockIoReadBlocks (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoWriteBlocks (
|
EmuBlockIoWriteBlocks (
|
||||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
IN UINT32 MediaId,
|
IN UINT32 MediaId,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_BLOCK_IO2_TOKEN Token;
|
EFI_BLOCK_IO2_TOKEN Token;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Token.Event = NULL;
|
Token.Event = NULL;
|
||||||
Status = Private->Io->WriteBlocks (Private->Io, MediaId, Lba, &Token, BufferSize, Buffer);
|
Status = Private->Io->WriteBlocks (Private->Io, MediaId, Lba, &Token, BufferSize, Buffer);
|
||||||
|
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
return Status;
|
return Status;
|
||||||
@ -345,24 +337,22 @@ EmuBlockIoFlushBlocks (
|
|||||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_BLOCK_IO2_TOKEN Token;
|
EFI_BLOCK_IO2_TOKEN Token;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Token.Event = NULL;
|
Token.Event = NULL;
|
||||||
Status = Private->Io->FlushBlocks (Private->Io, &Token);
|
Status = Private->Io->FlushBlocks (Private->Io, &Token);
|
||||||
|
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Tests to see if this driver supports a given controller. If a child device is provided,
|
Tests to see if this driver supports a given controller. If a child device is provided,
|
||||||
it further tests to see if this driver supports creating a handle for the specified child device.
|
it further tests to see if this driver supports creating a handle for the specified child device.
|
||||||
@ -413,8 +403,8 @@ EmuBlockIoDriverBindingSupported (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open the IO Abstraction(s) needed to perform the supported test
|
// Open the IO Abstraction(s) needed to perform the supported test
|
||||||
@ -443,15 +433,14 @@ EmuBlockIoDriverBindingSupported (
|
|||||||
// Close the I/O Abstraction(s) used to perform the supported test
|
// Close the I/O Abstraction(s) used to perform the supported test
|
||||||
//
|
//
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Handle,
|
Handle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
Handle
|
Handle
|
||||||
);
|
);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Starts a device controller or a bus controller.
|
Starts a device controller or a bus controller.
|
||||||
|
|
||||||
@ -490,14 +479,14 @@ EmuBlockIoDriverBindingSupported (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBlockIoDriverBindingStart (
|
EmuBlockIoDriverBindingStart (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE Handle,
|
IN EFI_HANDLE Handle,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private = NULL;
|
EMU_BLOCK_IO_PRIVATE *Private = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Grab the protocols we need
|
// Grab the protocols we need
|
||||||
@ -573,8 +562,10 @@ EmuBlockIoDriverBindingStart (
|
|||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&Handle,
|
&Handle,
|
||||||
&gEfiBlockIoProtocolGuid, &Private->BlockIo,
|
&gEfiBlockIoProtocolGuid,
|
||||||
&gEfiBlockIo2ProtocolGuid, &Private->BlockIo2,
|
&Private->BlockIo,
|
||||||
|
&gEfiBlockIo2ProtocolGuid,
|
||||||
|
&Private->BlockIo2,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -586,21 +577,19 @@ Done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
gBS->FreePool (Private);
|
gBS->FreePool (Private);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Handle,
|
Handle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
Handle
|
Handle
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stops a device controller or a bus controller.
|
Stops a device controller or a bus controller.
|
||||||
|
|
||||||
@ -636,9 +625,9 @@ EmuBlockIoDriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer
|
IN EFI_HANDLE *ChildHandleBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get our context back
|
// Get our context back
|
||||||
@ -659,8 +648,10 @@ EmuBlockIoDriverBindingStop (
|
|||||||
|
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
Private->EfiHandle,
|
Private->EfiHandle,
|
||||||
&gEfiBlockIoProtocolGuid, &Private->BlockIo,
|
&gEfiBlockIoProtocolGuid,
|
||||||
&gEfiBlockIo2ProtocolGuid, &Private->BlockIo2,
|
&Private->BlockIo,
|
||||||
|
&gEfiBlockIo2ProtocolGuid,
|
||||||
|
&Private->BlockIo2,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
@ -686,11 +677,7 @@ EmuBlockIoDriverBindingStop (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_DRIVER_BINDING_PROTOCOL gEmuBlockIoDriverBinding = {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gEmuBlockIoDriverBinding = {
|
|
||||||
EmuBlockIoDriverBindingSupported,
|
EmuBlockIoDriverBindingSupported,
|
||||||
EmuBlockIoDriverBindingStart,
|
EmuBlockIoDriverBindingStart,
|
||||||
EmuBlockIoDriverBindingStop,
|
EmuBlockIoDriverBindingStop,
|
||||||
@ -699,9 +686,6 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuBlockIoDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The user Entry Point for module EmuBlockIo . The user code starts with this function.
|
The user Entry Point for module EmuBlockIo . The user code starts with this function.
|
||||||
|
|
||||||
@ -715,11 +699,11 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuBlockIoDriverBinding = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeEmuBlockIo (
|
InitializeEmuBlockIo (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = EfiLibInstallAllDriverProtocols2 (
|
Status = EfiLibInstallAllDriverProtocols2 (
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
@ -735,9 +719,5 @@ InitializeEmuBlockIo (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,12 +38,11 @@ Abstract:
|
|||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Language supported for driverconfiguration protocol
|
// Language supported for driverconfiguration protocol
|
||||||
//
|
//
|
||||||
|
|
||||||
#define EMU_BLOCK_IO_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'b', 'k')
|
#define EMU_BLOCK_IO_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'b', 'k')
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
||||||
@ -55,7 +54,6 @@ typedef struct {
|
|||||||
EFI_BLOCK_IO_MEDIA Media;
|
EFI_BLOCK_IO_MEDIA Media;
|
||||||
|
|
||||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
|
|
||||||
} EMU_BLOCK_IO_PRIVATE;
|
} EMU_BLOCK_IO_PRIVATE;
|
||||||
|
|
||||||
#define EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS(a) \
|
#define EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
@ -64,7 +62,6 @@ typedef struct {
|
|||||||
#define EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS(a) \
|
#define EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
CR(a, EMU_BLOCK_IO_PRIVATE, BlockIo2, EMU_BLOCK_IO_PRIVATE_SIGNATURE)
|
CR(a, EMU_BLOCK_IO_PRIVATE, BlockIo2, EMU_BLOCK_IO_PRIVATE_SIGNATURE)
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Block I/O Global Variables
|
// Block I/O Global Variables
|
||||||
//
|
//
|
||||||
|
@ -21,17 +21,17 @@ EmuBusDriverComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBusDriverComponentNameGetControllerName (
|
EmuBusDriverComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Protocol
|
// EFI Component Name Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmuBusDriverComponentName = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmuBusDriverComponentName = {
|
||||||
EmuBusDriverComponentNameGetDriverName,
|
EmuBusDriverComponentNameGetDriverName,
|
||||||
EmuBusDriverComponentNameGetControllerName,
|
EmuBusDriverComponentNameGetControllerName,
|
||||||
"eng"
|
"eng"
|
||||||
@ -40,15 +40,15 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmuBusDriverCompo
|
|||||||
//
|
//
|
||||||
// EFI Component Name 2 Protocol
|
// EFI Component Name 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuBusDriverComponentName2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuBusDriverComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EmuBusDriverComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)EmuBusDriverComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EmuBusDriverComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)EmuBusDriverComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmuBusDriverNameTable[] = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmuBusDriverNameTable[] = {
|
||||||
{ "eng", L"Emu Bus Driver" },
|
{ "eng", L"Emu Bus Driver" },
|
||||||
{ NULL , NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -99,12 +99,12 @@ EmuBusDriverComponentNameGetDriverName (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
return LookupUnicodeString2 (
|
return LookupUnicodeString2 (
|
||||||
Language,
|
Language,
|
||||||
This->SupportedLanguages,
|
This->SupportedLanguages,
|
||||||
mEmuBusDriverNameTable,
|
mEmuBusDriverNameTable,
|
||||||
DriverName,
|
DriverName,
|
||||||
(BOOLEAN)(This == &gEmuBusDriverComponentName)
|
(BOOLEAN)(This == &gEmuBusDriverComponentName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -178,16 +178,16 @@ EmuBusDriverComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBusDriverComponentNameGetControllerName (
|
EmuBusDriverComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIo;
|
EMU_IO_THUNK_PROTOCOL *EmuIo;
|
||||||
EMU_IO_DEVICE *Private;
|
EMU_IO_DEVICE *Private;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make sure this driver is currently managing ControllHandle
|
// Make sure this driver is currently managing ControllHandle
|
||||||
@ -223,7 +223,7 @@ EmuBusDriverComponentNameGetControllerName (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
(VOID**)&EmuIo,
|
(VOID **)&EmuIo,
|
||||||
gEmuBusDriverBinding.DriverBindingHandle,
|
gEmuBusDriverBinding.DriverBindingHandle,
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -240,5 +240,5 @@ EmuBusDriverComponentNameGetControllerName (
|
|||||||
Private->ControllerNameTable,
|
Private->ControllerNameTable,
|
||||||
ControllerName,
|
ControllerName,
|
||||||
(BOOLEAN)(This == &gEmuBusDriverComponentName)
|
(BOOLEAN)(This == &gEmuBusDriverComponentName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -10,12 +10,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "EmuBusDriverDxe.h"
|
#include "EmuBusDriverDxe.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// DriverBinding protocol global
|
// DriverBinding protocol global
|
||||||
//
|
//
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gEmuBusDriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gEmuBusDriverBinding = {
|
||||||
EmuBusDriverBindingSupported,
|
EmuBusDriverBindingSupported,
|
||||||
EmuBusDriverBindingStart,
|
EmuBusDriverBindingStart,
|
||||||
EmuBusDriverBindingStop,
|
EmuBusDriverBindingStop,
|
||||||
@ -24,8 +22,6 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuBusDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBusDriverBindingSupported (
|
EmuBusDriverBindingSupported (
|
||||||
@ -52,9 +48,10 @@ EmuBusDriverBindingSupported (
|
|||||||
// If RemainingDevicePath isn't the End of Device Path Node,
|
// If RemainingDevicePath isn't the End of Device Path Node,
|
||||||
// check its validation
|
// check its validation
|
||||||
//
|
//
|
||||||
if (RemainingDevicePath->Type != HARDWARE_DEVICE_PATH ||
|
if ((RemainingDevicePath->Type != HARDWARE_DEVICE_PATH) ||
|
||||||
RemainingDevicePath->SubType != HW_VENDOR_DP ||
|
(RemainingDevicePath->SubType != HW_VENDOR_DP) ||
|
||||||
DevicePathNodeLength(RemainingDevicePath) != sizeof(EMU_VENDOR_DEVICE_PATH_NODE)) {
|
(DevicePathNodeLength (RemainingDevicePath) != sizeof (EMU_VENDOR_DEVICE_PATH_NODE)))
|
||||||
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -66,7 +63,7 @@ EmuBusDriverBindingSupported (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuThunkProtocolGuid,
|
&gEmuThunkProtocolGuid,
|
||||||
(VOID **)&EmuThunk ,
|
(VOID **)&EmuThunk,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -83,11 +80,11 @@ EmuBusDriverBindingSupported (
|
|||||||
// Close the I/O Abstraction(s) used to perform the supported test
|
// Close the I/O Abstraction(s) used to perform the supported test
|
||||||
//
|
//
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuThunkProtocolGuid,
|
&gEmuThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open the EFI Device Path protocol needed to perform the supported test
|
// Open the EFI Device Path protocol needed to perform the supported test
|
||||||
@ -108,21 +105,19 @@ EmuBusDriverBindingSupported (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Close protocol, don't use device path protocol in the Support() function
|
// Close protocol, don't use device path protocol in the Support() function
|
||||||
//
|
//
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBusDriverBindingStart (
|
EmuBusDriverBindingStart (
|
||||||
@ -131,19 +126,19 @@ EmuBusDriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_STATUS InstallStatus;
|
EFI_STATUS InstallStatus;
|
||||||
EMU_THUNK_PROTOCOL *EmuThunk;
|
EMU_THUNK_PROTOCOL *EmuThunk;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||||
EMU_IO_DEVICE *EmuDevice;
|
EMU_IO_DEVICE *EmuDevice;
|
||||||
EMU_BUS_DEVICE *EmuBusDevice;
|
EMU_BUS_DEVICE *EmuBusDevice;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
UINT16 ComponentName[512];
|
UINT16 ComponentName[512];
|
||||||
EMU_VENDOR_DEVICE_PATH_NODE *Node;
|
EMU_VENDOR_DEVICE_PATH_NODE *Node;
|
||||||
BOOLEAN CreateDevice;
|
BOOLEAN CreateDevice;
|
||||||
|
|
||||||
InstallStatus = EFI_UNSUPPORTED;
|
InstallStatus = EFI_UNSUPPORTED;
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Grab the protocols we need
|
// Grab the protocols we need
|
||||||
@ -156,7 +151,7 @@ EmuBusDriverBindingStart (
|
|||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
|
if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,7 +163,7 @@ EmuBusDriverBindingStart (
|
|||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
|
if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,10 +191,10 @@ EmuBusDriverBindingStart (
|
|||||||
FALSE
|
FALSE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&ControllerHandle,
|
&ControllerHandle,
|
||||||
&gEfiCallerIdGuid, EmuBusDevice,
|
&gEfiCallerIdGuid,
|
||||||
|
EmuBusDevice,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -209,7 +204,6 @@ EmuBusDriverBindingStart (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (Status = EFI_SUCCESS, EmuIoThunk = NULL; !EFI_ERROR (Status); ) {
|
for (Status = EFI_SUCCESS, EmuIoThunk = NULL; !EFI_ERROR (Status); ) {
|
||||||
Status = EmuThunk->GetNextProtocol (TRUE, &EmuIoThunk);
|
Status = EmuThunk->GetNextProtocol (TRUE, &EmuIoThunk);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -218,7 +212,7 @@ EmuBusDriverBindingStart (
|
|||||||
|
|
||||||
CreateDevice = TRUE;
|
CreateDevice = TRUE;
|
||||||
if (RemainingDevicePath != NULL) {
|
if (RemainingDevicePath != NULL) {
|
||||||
CreateDevice = FALSE;
|
CreateDevice = FALSE;
|
||||||
//
|
//
|
||||||
// Check if RemainingDevicePath is the End of Device Path Node,
|
// Check if RemainingDevicePath is the End of Device Path Node,
|
||||||
// if yes, don't create any child device
|
// if yes, don't create any child device
|
||||||
@ -228,12 +222,13 @@ EmuBusDriverBindingStart (
|
|||||||
// If RemainingDevicePath isn't the End of Device Path Node,
|
// If RemainingDevicePath isn't the End of Device Path Node,
|
||||||
// check its validation
|
// check its validation
|
||||||
//
|
//
|
||||||
Node = (EMU_VENDOR_DEVICE_PATH_NODE *) RemainingDevicePath;
|
Node = (EMU_VENDOR_DEVICE_PATH_NODE *)RemainingDevicePath;
|
||||||
if (Node->VendorDevicePath.Header.Type == HARDWARE_DEVICE_PATH &&
|
if ((Node->VendorDevicePath.Header.Type == HARDWARE_DEVICE_PATH) &&
|
||||||
Node->VendorDevicePath.Header.SubType == HW_VENDOR_DP &&
|
(Node->VendorDevicePath.Header.SubType == HW_VENDOR_DP) &&
|
||||||
DevicePathNodeLength (&Node->VendorDevicePath.Header) == sizeof (EMU_VENDOR_DEVICE_PATH_NODE)
|
(DevicePathNodeLength (&Node->VendorDevicePath.Header) == sizeof (EMU_VENDOR_DEVICE_PATH_NODE))
|
||||||
) {
|
)
|
||||||
if (CompareGuid (&Node->VendorDevicePath.Guid, EmuIoThunk->Protocol) && Node->Instance == EmuIoThunk->Instance) {
|
{
|
||||||
|
if (CompareGuid (&Node->VendorDevicePath.Guid, EmuIoThunk->Protocol) && (Node->Instance == EmuIoThunk->Instance)) {
|
||||||
CreateDevice = TRUE;
|
CreateDevice = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,9 +244,9 @@ EmuBusDriverBindingStart (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
EmuDevice->Handle = NULL;
|
EmuDevice->Handle = NULL;
|
||||||
EmuDevice->ControllerHandle = ControllerHandle;
|
EmuDevice->ControllerHandle = ControllerHandle;
|
||||||
EmuDevice->ParentDevicePath = ParentDevicePath;
|
EmuDevice->ParentDevicePath = ParentDevicePath;
|
||||||
CopyMem (&EmuDevice->EmuIoThunk, EmuIoThunk, sizeof (EMU_IO_THUNK_PROTOCOL));
|
CopyMem (&EmuDevice->EmuIoThunk, EmuIoThunk, sizeof (EMU_IO_THUNK_PROTOCOL));
|
||||||
|
|
||||||
EmuDevice->ControllerNameTable = NULL;
|
EmuDevice->ControllerNameTable = NULL;
|
||||||
@ -264,10 +259,10 @@ EmuBusDriverBindingStart (
|
|||||||
);
|
);
|
||||||
|
|
||||||
EmuDevice->DevicePath = EmuBusCreateDevicePath (
|
EmuDevice->DevicePath = EmuBusCreateDevicePath (
|
||||||
ParentDevicePath,
|
ParentDevicePath,
|
||||||
EmuIoThunk->Protocol,
|
EmuIoThunk->Protocol,
|
||||||
EmuIoThunk->Instance
|
EmuIoThunk->Instance
|
||||||
);
|
);
|
||||||
if (EmuDevice->DevicePath == NULL) {
|
if (EmuDevice->DevicePath == NULL) {
|
||||||
gBS->FreePool (EmuDevice);
|
gBS->FreePool (EmuDevice);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
@ -283,11 +278,13 @@ EmuBusDriverBindingStart (
|
|||||||
EmuDevice->Signature = EMU_IO_DEVICE_SIGNATURE;
|
EmuDevice->Signature = EMU_IO_DEVICE_SIGNATURE;
|
||||||
|
|
||||||
InstallStatus = gBS->InstallMultipleProtocolInterfaces (
|
InstallStatus = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&EmuDevice->Handle,
|
&EmuDevice->Handle,
|
||||||
&gEfiDevicePathProtocolGuid, EmuDevice->DevicePath,
|
&gEfiDevicePathProtocolGuid,
|
||||||
&gEmuIoThunkProtocolGuid, &EmuDevice->EmuIoThunk,
|
EmuDevice->DevicePath,
|
||||||
NULL
|
&gEmuIoThunkProtocolGuid,
|
||||||
);
|
&EmuDevice->EmuIoThunk,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
if (EFI_ERROR (InstallStatus)) {
|
if (EFI_ERROR (InstallStatus)) {
|
||||||
FreeUnicodeStringTable (EmuDevice->ControllerNameTable);
|
FreeUnicodeStringTable (EmuDevice->ControllerNameTable);
|
||||||
gBS->FreePool (EmuDevice);
|
gBS->FreePool (EmuDevice);
|
||||||
@ -298,7 +295,7 @@ EmuBusDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuThunkProtocolGuid,
|
&gEmuThunkProtocolGuid,
|
||||||
(VOID **)&EmuThunk ,
|
(VOID **)&EmuThunk,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
EmuDevice->Handle,
|
EmuDevice->Handle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -313,7 +310,6 @@ EmuBusDriverBindingStart (
|
|||||||
return InstallStatus;
|
return InstallStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBusDriverBindingStop (
|
EmuBusDriverBindingStop (
|
||||||
@ -323,13 +319,13 @@ EmuBusDriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer
|
IN EFI_HANDLE *ChildHandleBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
BOOLEAN AllChildrenStopped;
|
BOOLEAN AllChildrenStopped;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
EMU_BUS_DEVICE *EmuBusDevice;
|
EMU_BUS_DEVICE *EmuBusDevice;
|
||||||
EMU_IO_DEVICE *EmuDevice;
|
EMU_IO_DEVICE *EmuDevice;
|
||||||
EMU_THUNK_PROTOCOL *EmuThunk;
|
EMU_THUNK_PROTOCOL *EmuThunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Complete all outstanding transactions to Controller.
|
// Complete all outstanding transactions to Controller.
|
||||||
@ -353,35 +349,35 @@ EmuBusDriverBindingStop (
|
|||||||
}
|
}
|
||||||
|
|
||||||
gBS->UninstallMultipleProtocolInterfaces (
|
gBS->UninstallMultipleProtocolInterfaces (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiCallerIdGuid, EmuBusDevice,
|
&gEfiCallerIdGuid,
|
||||||
NULL
|
EmuBusDevice,
|
||||||
);
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
FreeUnicodeStringTable (EmuBusDevice->ControllerNameTable);
|
FreeUnicodeStringTable (EmuBusDevice->ControllerNameTable);
|
||||||
|
|
||||||
gBS->FreePool (EmuBusDevice);
|
gBS->FreePool (EmuBusDevice);
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuThunkProtocolGuid,
|
&gEmuThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
AllChildrenStopped = TRUE;
|
AllChildrenStopped = TRUE;
|
||||||
|
|
||||||
for (Index = 0; Index < NumberOfChildren; Index++) {
|
for (Index = 0; Index < NumberOfChildren; Index++) {
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandleBuffer[Index],
|
ChildHandleBuffer[Index],
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
@ -402,20 +398,22 @@ EmuBusDriverBindingStop (
|
|||||||
|
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
EmuDevice->Handle,
|
EmuDevice->Handle,
|
||||||
&gEfiDevicePathProtocolGuid, EmuDevice->DevicePath,
|
&gEfiDevicePathProtocolGuid,
|
||||||
&gEmuIoThunkProtocolGuid, &EmuDevice->EmuIoThunk,
|
EmuDevice->DevicePath,
|
||||||
|
&gEmuIoThunkProtocolGuid,
|
||||||
|
&EmuDevice->EmuIoThunk,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
gBS->OpenProtocol (
|
gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuThunkProtocolGuid,
|
&gEmuThunkProtocolGuid,
|
||||||
(VOID **) &EmuThunk ,
|
(VOID **)&EmuThunk,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
EmuDevice->Handle,
|
EmuDevice->Handle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// Close the child handle
|
// Close the child handle
|
||||||
@ -437,7 +435,6 @@ EmuBusDriverBindingStop (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -466,8 +463,8 @@ EmuBusCreateDevicePath (
|
|||||||
{
|
{
|
||||||
EMU_VENDOR_DEVICE_PATH_NODE DevicePath;
|
EMU_VENDOR_DEVICE_PATH_NODE DevicePath;
|
||||||
|
|
||||||
DevicePath.VendorDevicePath.Header.Type = HARDWARE_DEVICE_PATH;
|
DevicePath.VendorDevicePath.Header.Type = HARDWARE_DEVICE_PATH;
|
||||||
DevicePath.VendorDevicePath.Header.SubType = HW_VENDOR_DP;
|
DevicePath.VendorDevicePath.Header.SubType = HW_VENDOR_DP;
|
||||||
SetDevicePathNodeLength (&DevicePath.VendorDevicePath.Header, sizeof (EMU_VENDOR_DEVICE_PATH_NODE));
|
SetDevicePathNodeLength (&DevicePath.VendorDevicePath.Header, sizeof (EMU_VENDOR_DEVICE_PATH_NODE));
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -482,13 +479,11 @@ EmuBusCreateDevicePath (
|
|||||||
DevicePath.Instance = InstanceNumber;
|
DevicePath.Instance = InstanceNumber;
|
||||||
|
|
||||||
return AppendDevicePathNode (
|
return AppendDevicePathNode (
|
||||||
RootDevicePath,
|
RootDevicePath,
|
||||||
(EFI_DEVICE_PATH_PROTOCOL *) &DevicePath
|
(EFI_DEVICE_PATH_PROTOCOL *)&DevicePath
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The user Entry Point for module EmuBusDriver. The user code starts with this function.
|
The user Entry Point for module EmuBusDriver. The user code starts with this function.
|
||||||
|
|
||||||
@ -502,11 +497,11 @@ EmuBusCreateDevicePath (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeEmuBusDriver (
|
InitializeEmuBusDriver (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = EfiLibInstallAllDriverProtocols (
|
Status = EfiLibInstallAllDriverProtocols (
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
@ -519,10 +514,5 @@ InitializeEmuBusDriver (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,19 +25,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
#include <Library/DevicePathLib.h>
|
#include <Library/DevicePathLib.h>
|
||||||
|
|
||||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuBusDriverBinding;
|
extern EFI_DRIVER_BINDING_PROTOCOL gEmuBusDriverBinding;
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuBusDriverComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gEmuBusDriverComponentName;
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuBusDriverComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuBusDriverComponentName2;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Unix Bus Controller Structure
|
// Unix Bus Controller Structure
|
||||||
//
|
//
|
||||||
#define EMU_BUS_DEVICE_SIGNATURE SIGNATURE_32 ('L', 'X', 'B', 'D')
|
#define EMU_BUS_DEVICE_SIGNATURE SIGNATURE_32 ('L', 'X', 'B', 'D')
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 Signature;
|
UINT64 Signature;
|
||||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
} EMU_BUS_DEVICE;
|
} EMU_BUS_DEVICE;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -46,47 +45,42 @@ typedef struct {
|
|||||||
#define EMU_IO_DEVICE_SIGNATURE SIGNATURE_32 ('L', 'X', 'V', 'D')
|
#define EMU_IO_DEVICE_SIGNATURE SIGNATURE_32 ('L', 'X', 'V', 'D')
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 Signature;
|
UINT64 Signature;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
EMU_IO_THUNK_PROTOCOL EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL EmuIoThunk;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Private data about the parent
|
// Private data about the parent
|
||||||
//
|
//
|
||||||
EFI_HANDLE ControllerHandle;
|
EFI_HANDLE ControllerHandle;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||||
|
|
||||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
|
||||||
|
|
||||||
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
} EMU_IO_DEVICE;
|
} EMU_IO_DEVICE;
|
||||||
|
|
||||||
#define EMU_IO_DEVICE_FROM_THIS(a) \
|
#define EMU_IO_DEVICE_FROM_THIS(a) \
|
||||||
CR(a, EMU_IO_DEVICE, EmuIoThunk, EMU_IO_DEVICE_SIGNATURE)
|
CR(a, EMU_IO_DEVICE, EmuIoThunk, EMU_IO_DEVICE_SIGNATURE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Driver Binding Protocol function prototypes
|
// Driver Binding Protocol function prototypes
|
||||||
//
|
//
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBusDriverBindingSupported (
|
EmuBusDriverBindingSupported (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE Handle,
|
IN EFI_HANDLE Handle,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBusDriverBindingStart (
|
EmuBusDriverBindingStart (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ParentHandle,
|
IN EFI_HANDLE ParentHandle,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuBusDriverBindingStop (
|
EmuBusDriverBindingStop (
|
||||||
@ -106,5 +100,4 @@ EmuBusCreateDevicePath (
|
|||||||
IN UINT16 InstanceNumber
|
IN UINT16 InstanceNumber
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -28,17 +28,17 @@ EmuGopComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopComponentNameGetControllerName (
|
EmuGopComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Protocol
|
// EFI Component Name Protocol
|
||||||
//
|
//
|
||||||
EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName = {
|
EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName = {
|
||||||
EmuGopComponentNameGetDriverName,
|
EmuGopComponentNameGetDriverName,
|
||||||
EmuGopComponentNameGetControllerName,
|
EmuGopComponentNameGetControllerName,
|
||||||
"eng"
|
"eng"
|
||||||
@ -47,19 +47,17 @@ EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName = {
|
|||||||
//
|
//
|
||||||
// EFI Component Name 2 Protocol
|
// EFI Component Name 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EmuGopComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)EmuGopComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EmuGopComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)EmuGopComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EFI_UNICODE_STRING_TABLE mEmuGopDriverNameTable[] = {
|
||||||
EFI_UNICODE_STRING_TABLE mEmuGopDriverNameTable[] = {
|
|
||||||
{ "eng", L"Emulator GOP Driver" },
|
{ "eng", L"Emulator GOP Driver" },
|
||||||
{ NULL , NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the driver.
|
Retrieves a Unicode string that is the user readable name of the driver.
|
||||||
|
|
||||||
@ -116,7 +114,6 @@ EmuGopComponentNameGetDriverName (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the controller
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
that is being managed by a driver.
|
that is being managed by a driver.
|
||||||
@ -188,11 +185,11 @@ EmuGopComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopComponentNameGetControllerName (
|
EmuGopComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -217,6 +214,7 @@ EmuGopComponentNameGetControllerName (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get our context back
|
// Get our context back
|
||||||
//
|
//
|
||||||
|
@ -29,78 +29,73 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
#include <Library/KeyMapLib.h>
|
#include <Library/KeyMapLib.h>
|
||||||
|
|
||||||
|
#define MAX_Q 256
|
||||||
#define MAX_Q 256
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Front;
|
UINTN Front;
|
||||||
UINTN Rear;
|
UINTN Rear;
|
||||||
UINTN Count;
|
UINTN Count;
|
||||||
EFI_INPUT_KEY Q[MAX_Q];
|
EFI_INPUT_KEY Q[MAX_Q];
|
||||||
} GOP_QUEUE_FIXED;
|
} GOP_QUEUE_FIXED;
|
||||||
|
|
||||||
#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')
|
#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')
|
||||||
typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
|
typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
EFI_HANDLE NotifyHandle;
|
EFI_HANDLE NotifyHandle;
|
||||||
EFI_KEY_DATA KeyData;
|
EFI_KEY_DATA KeyData;
|
||||||
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
||||||
EFI_EVENT Event;
|
EFI_EVENT Event;
|
||||||
LIST_ENTRY NotifyEntry;
|
LIST_ENTRY NotifyEntry;
|
||||||
} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
|
} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
|
||||||
|
|
||||||
#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
|
#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 HorizontalResolution;
|
UINT32 HorizontalResolution;
|
||||||
UINT32 VerticalResolution;
|
UINT32 VerticalResolution;
|
||||||
UINT32 ColorDepth;
|
UINT32 ColorDepth;
|
||||||
UINT32 RefreshRate;
|
UINT32 RefreshRate;
|
||||||
} GOP_MODE_DATA;
|
} GOP_MODE_DATA;
|
||||||
|
|
||||||
|
extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
|
||||||
|
extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
|
||||||
|
|
||||||
|
#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
|
||||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
|
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
|
|
||||||
|
|
||||||
#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
|
|
||||||
|
|
||||||
#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
|
#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 Signature;
|
UINT64 Signature;
|
||||||
|
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
|
EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
|
||||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
|
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
|
||||||
EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
|
EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
|
||||||
|
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
|
EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
|
||||||
|
|
||||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
|
|
||||||
EFI_SIMPLE_POINTER_MODE PointerMode;
|
EFI_SIMPLE_POINTER_MODE PointerMode;
|
||||||
//
|
//
|
||||||
// GOP Private Data for QueryMode ()
|
// GOP Private Data for QueryMode ()
|
||||||
//
|
//
|
||||||
GOP_MODE_DATA *ModeData;
|
GOP_MODE_DATA *ModeData;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// UGA Private Data knowing when to start hardware
|
// UGA Private Data knowing when to start hardware
|
||||||
//
|
//
|
||||||
BOOLEAN HardwareNeedsStarting;
|
BOOLEAN HardwareNeedsStarting;
|
||||||
|
|
||||||
CHAR16 *WindowName;
|
CHAR16 *WindowName;
|
||||||
|
|
||||||
GOP_QUEUE_FIXED Queue;
|
GOP_QUEUE_FIXED Queue;
|
||||||
|
|
||||||
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
|
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
|
||||||
EFI_KEY_STATE KeyState;
|
EFI_KEY_STATE KeyState;
|
||||||
LIST_ENTRY NotifyList;
|
LIST_ENTRY NotifyList;
|
||||||
} GOP_PRIVATE_DATA;
|
} GOP_PRIVATE_DATA;
|
||||||
|
|
||||||
|
|
||||||
#define GOP_PRIVATE_DATA_FROM_THIS(a) \
|
#define GOP_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
|
CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
|
||||||
|
|
||||||
@ -113,13 +108,12 @@ typedef struct {
|
|||||||
#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
|
#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
|
||||||
CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)
|
CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global Protocol Variables
|
// Global Protocol Variables
|
||||||
//
|
//
|
||||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
|
extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Gop Hardware abstraction internal worker functions
|
// Gop Hardware abstraction internal worker functions
|
||||||
@ -131,38 +125,37 @@ EmuGopSupported (
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopConstructor (
|
EmuGopConstructor (
|
||||||
IN GOP_PRIVATE_DATA *Private
|
IN GOP_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopDestructor (
|
EmuGopDestructor (
|
||||||
IN GOP_PRIVATE_DATA *Private
|
IN GOP_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GopPrivateAddQ (
|
GopPrivateAddQ (
|
||||||
IN GOP_PRIVATE_DATA *Private,
|
IN GOP_PRIVATE_DATA *Private,
|
||||||
IN EFI_INPUT_KEY Key
|
IN EFI_INPUT_KEY Key
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopInitializeSimpleTextInForWindow (
|
EmuGopInitializeSimpleTextInForWindow (
|
||||||
IN GOP_PRIVATE_DATA *Private
|
IN GOP_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopInitializeSimplePointerForWindow (
|
EmuGopInitializeSimplePointerForWindow (
|
||||||
IN GOP_PRIVATE_DATA *Private
|
IN GOP_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopStartWindow (
|
EmuGopStartWindow (
|
||||||
IN GOP_PRIVATE_DATA *Private,
|
IN GOP_PRIVATE_DATA *Private,
|
||||||
IN UINT32 HorizontalResolution,
|
IN UINT32 HorizontalResolution,
|
||||||
IN UINT32 VerticalResolution,
|
IN UINT32 VerticalResolution,
|
||||||
IN UINT32 ColorDepth,
|
IN UINT32 ColorDepth,
|
||||||
IN UINT32 RefreshRate
|
IN UINT32 RefreshRate
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
@ -175,15 +168,15 @@ ShutdownGopEvent (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GopPrivateMakeCallbackFunction (
|
GopPrivateMakeCallbackFunction (
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GopPrivateBreakCallbackFunction (
|
GopPrivateBreakCallbackFunction (
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,11 +9,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "Gop.h"
|
#include "Gop.h"
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FreeNotifyList (
|
FreeNotifyList (
|
||||||
IN OUT LIST_ENTRY *ListHead
|
IN OUT LIST_ENTRY *ListHead
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -29,11 +29,12 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NotifyNode;
|
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NotifyNode;
|
||||||
|
|
||||||
if (ListHead == NULL) {
|
if (ListHead == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!IsListEmpty (ListHead)) {
|
while (!IsListEmpty (ListHead)) {
|
||||||
NotifyNode = CR (
|
NotifyNode = CR (
|
||||||
ListHead->ForwardLink,
|
ListHead->ForwardLink,
|
||||||
@ -48,7 +49,6 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Tests to see if this driver supports a given controller. If a child device is provided,
|
Tests to see if this driver supports a given controller. If a child device is provided,
|
||||||
it further tests to see if this driver supports creating a handle for the specified child device.
|
it further tests to see if this driver supports creating a handle for the specified child device.
|
||||||
@ -94,13 +94,13 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopDriverBindingSupported (
|
EmuGopDriverBindingSupported (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE Handle,
|
IN EFI_HANDLE Handle,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open the IO Abstraction(s) needed to perform the supported test
|
// Open the IO Abstraction(s) needed to perform the supported test
|
||||||
@ -123,16 +123,15 @@ EmuGopDriverBindingSupported (
|
|||||||
// Close the I/O Abstraction(s) used to perform the supported test
|
// Close the I/O Abstraction(s) used to perform the supported test
|
||||||
//
|
//
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Handle,
|
Handle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
Handle
|
Handle
|
||||||
);
|
);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Starts a device controller or a bus controller.
|
Starts a device controller or a bus controller.
|
||||||
|
|
||||||
@ -171,14 +170,14 @@ EmuGopDriverBindingSupported (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopDriverBindingStart (
|
EmuGopDriverBindingStart (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE Handle,
|
IN EFI_HANDLE Handle,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Grab the protocols we need
|
// Grab the protocols we need
|
||||||
@ -199,14 +198,15 @@ EmuGopDriverBindingStart (
|
|||||||
// Allocate Private context data for SGO inteface.
|
// Allocate Private context data for SGO inteface.
|
||||||
//
|
//
|
||||||
Private = NULL;
|
Private = NULL;
|
||||||
Status = gBS->AllocatePool (
|
Status = gBS->AllocatePool (
|
||||||
EfiBootServicesData,
|
EfiBootServicesData,
|
||||||
sizeof (GOP_PRIVATE_DATA),
|
sizeof (GOP_PRIVATE_DATA),
|
||||||
(VOID **)&Private
|
(VOID **)&Private
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set up context record
|
// Set up context record
|
||||||
//
|
//
|
||||||
@ -234,27 +234,31 @@ EmuGopDriverBindingStart (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Publish the Gop interface to the world
|
// Publish the Gop interface to the world
|
||||||
//
|
//
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&Private->Handle,
|
&Private->Handle,
|
||||||
&gEfiGraphicsOutputProtocolGuid, &Private->GraphicsOutput,
|
&gEfiGraphicsOutputProtocolGuid,
|
||||||
&gEfiSimpleTextInProtocolGuid, &Private->SimpleTextIn,
|
&Private->GraphicsOutput,
|
||||||
&gEfiSimplePointerProtocolGuid, &Private->SimplePointer,
|
&gEfiSimpleTextInProtocolGuid,
|
||||||
&gEfiSimpleTextInputExProtocolGuid, &Private->SimpleTextInEx,
|
&Private->SimpleTextIn,
|
||||||
|
&gEfiSimplePointerProtocolGuid,
|
||||||
|
&Private->SimplePointer,
|
||||||
|
&gEfiSimpleTextInputExProtocolGuid,
|
||||||
|
&Private->SimpleTextInEx,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
Done:
|
Done:
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Handle,
|
Handle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
Handle
|
Handle
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Private != NULL) {
|
if (Private != NULL) {
|
||||||
//
|
//
|
||||||
@ -263,12 +267,15 @@ Done:
|
|||||||
if (Private->ControllerNameTable != NULL) {
|
if (Private->ControllerNameTable != NULL) {
|
||||||
FreeUnicodeStringTable (Private->ControllerNameTable);
|
FreeUnicodeStringTable (Private->ControllerNameTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Private->SimpleTextIn.WaitForKey != NULL) {
|
if (Private->SimpleTextIn.WaitForKey != NULL) {
|
||||||
gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);
|
gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Private->SimpleTextInEx.WaitForKeyEx != NULL) {
|
if (Private->SimpleTextInEx.WaitForKeyEx != NULL) {
|
||||||
gBS->CloseEvent (Private->SimpleTextInEx.WaitForKeyEx);
|
gBS->CloseEvent (Private->SimpleTextInEx.WaitForKeyEx);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreeNotifyList (&Private->NotifyList);
|
FreeNotifyList (&Private->NotifyList);
|
||||||
|
|
||||||
gBS->FreePool (Private);
|
gBS->FreePool (Private);
|
||||||
@ -278,8 +285,6 @@ Done:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stops a device controller or a bus controller.
|
Stops a device controller or a bus controller.
|
||||||
|
|
||||||
@ -315,9 +320,9 @@ EmuGopDriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer
|
IN EFI_HANDLE *ChildHandleBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Handle,
|
Handle,
|
||||||
@ -344,10 +349,14 @@ EmuGopDriverBindingStop (
|
|||||||
//
|
//
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
Private->Handle,
|
Private->Handle,
|
||||||
&gEfiGraphicsOutputProtocolGuid, &Private->GraphicsOutput,
|
&gEfiGraphicsOutputProtocolGuid,
|
||||||
&gEfiSimpleTextInProtocolGuid, &Private->SimpleTextIn,
|
&Private->GraphicsOutput,
|
||||||
&gEfiSimplePointerProtocolGuid, &Private->SimplePointer,
|
&gEfiSimpleTextInProtocolGuid,
|
||||||
&gEfiSimpleTextInputExProtocolGuid, &Private->SimpleTextInEx,
|
&Private->SimpleTextIn,
|
||||||
|
&gEfiSimplePointerProtocolGuid,
|
||||||
|
&Private->SimplePointer,
|
||||||
|
&gEfiSimpleTextInputExProtocolGuid,
|
||||||
|
&Private->SimpleTextInEx,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
@ -360,11 +369,11 @@ EmuGopDriverBindingStop (
|
|||||||
}
|
}
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Handle,
|
Handle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
Handle
|
Handle
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Free our instance data
|
// Free our instance data
|
||||||
@ -380,18 +389,16 @@ EmuGopDriverBindingStop (
|
|||||||
FreeNotifyList (&Private->NotifyList);
|
FreeNotifyList (&Private->NotifyList);
|
||||||
|
|
||||||
gBS->FreePool (Private);
|
gBS->FreePool (Private);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// This protocol provides the services required to determine if a driver supports a given controller.
|
/// This protocol provides the services required to determine if a driver supports a given controller.
|
||||||
/// If a controller is supported, then it also provides routines to start and stop the controller.
|
/// If a controller is supported, then it also provides routines to start and stop the controller.
|
||||||
///
|
///
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding = {
|
||||||
EmuGopDriverBindingSupported,
|
EmuGopDriverBindingSupported,
|
||||||
EmuGopDriverBindingStart,
|
EmuGopDriverBindingStart,
|
||||||
EmuGopDriverBindingStop,
|
EmuGopDriverBindingStop,
|
||||||
@ -400,8 +407,6 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The user Entry Point for module EmuGop. The user code starts with this function.
|
The user Entry Point for module EmuGop. The user code starts with this function.
|
||||||
|
|
||||||
@ -415,11 +420,11 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeEmuGop (
|
InitializeEmuGop (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = EfiLibInstallDriverBindingComponentName2 (
|
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
@ -431,7 +436,5 @@ InitializeEmuGop (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,12 +9,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "Gop.h"
|
#include "Gop.h"
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
GopPrivateIsKeyRegistered (
|
GopPrivateIsKeyRegistered (
|
||||||
IN EFI_KEY_DATA *RegsiteredData,
|
IN EFI_KEY_DATA *RegsiteredData,
|
||||||
IN EFI_KEY_DATA *InputData
|
IN EFI_KEY_DATA *InputData
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -35,37 +35,39 @@ Returns:
|
|||||||
ASSERT (RegsiteredData != NULL && InputData != NULL);
|
ASSERT (RegsiteredData != NULL && InputData != NULL);
|
||||||
|
|
||||||
if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
|
if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
|
||||||
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
|
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar))
|
||||||
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
|
// Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
|
||||||
//
|
//
|
||||||
if (RegsiteredData->KeyState.KeyShiftState != 0 &&
|
if ((RegsiteredData->KeyState.KeyShiftState != 0) &&
|
||||||
RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {
|
(RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState))
|
||||||
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (RegsiteredData->KeyState.KeyToggleState != 0 &&
|
|
||||||
RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {
|
if ((RegsiteredData->KeyState.KeyToggleState != 0) &&
|
||||||
|
(RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState))
|
||||||
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GopPrivateMakeCallbackFunction (
|
GopPrivateMakeCallbackFunction (
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
|
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
|
||||||
GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;
|
GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;
|
||||||
|
|
||||||
KeyMapMake (KeyData);
|
KeyMapMake (KeyData);
|
||||||
|
|
||||||
@ -84,19 +86,16 @@ GopPrivateMakeCallbackFunction (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GopPrivateBreakCallbackFunction (
|
GopPrivateBreakCallbackFunction (
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
KeyMapBreak (KeyData);
|
KeyMapBreak (KeyData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Simple Text In implementation.
|
// Simple Text In implementation.
|
||||||
//
|
//
|
||||||
@ -114,8 +113,8 @@ GopPrivateBreakCallbackFunction (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopSimpleTextInReset (
|
EmuGopSimpleTextInReset (
|
||||||
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
|
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
@ -135,8 +134,8 @@ EmuGopSimpleTextInReset (
|
|||||||
//
|
//
|
||||||
// A reset is draining the Queue
|
// A reset is draining the Queue
|
||||||
//
|
//
|
||||||
while (Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
|
while (Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData) == EFI_SUCCESS) {
|
||||||
;
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Leave critical section and return
|
// Leave critical section and return
|
||||||
@ -145,7 +144,6 @@ EmuGopSimpleTextInReset (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reads the next keystroke from the input device. The WaitForKey Event can
|
Reads the next keystroke from the input device. The WaitForKey Event can
|
||||||
be used to test for existence of a keystroke via WaitForEvent () call.
|
be used to test for existence of a keystroke via WaitForEvent () call.
|
||||||
@ -163,8 +161,8 @@ EmuGopSimpleTextInReset (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopSimpleTextInReadKeyStroke (
|
EmuGopSimpleTextInReadKeyStroke (
|
||||||
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
|
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
|
||||||
OUT EFI_INPUT_KEY *Key
|
OUT EFI_INPUT_KEY *Key
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
@ -180,9 +178,9 @@ EmuGopSimpleTextInReadKeyStroke (
|
|||||||
//
|
//
|
||||||
// Enter critical section
|
// Enter critical section
|
||||||
//
|
//
|
||||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
|
|
||||||
Status = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData);
|
Status = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
|
if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
|
||||||
// Modifier key was pressed
|
// Modifier key was pressed
|
||||||
@ -200,8 +198,6 @@ EmuGopSimpleTextInReadKeyStroke (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
SimpleTextIn and SimpleTextInEx Notify Wait Event
|
SimpleTextIn and SimpleTextInEx Notify Wait Event
|
||||||
|
|
||||||
@ -212,15 +208,15 @@ EmuGopSimpleTextInReadKeyStroke (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopSimpleTextInWaitForKey (
|
EmuGopSimpleTextInWaitForKey (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = (GOP_PRIVATE_DATA *) Context;
|
Private = (GOP_PRIVATE_DATA *)Context;
|
||||||
if (Private->EmuGraphicsWindow == NULL) {
|
if (Private->EmuGraphicsWindow == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -228,27 +224,26 @@ EmuGopSimpleTextInWaitForKey (
|
|||||||
//
|
//
|
||||||
// Enter critical section
|
// Enter critical section
|
||||||
//
|
//
|
||||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
|
|
||||||
Status = Private->EmuGraphicsWindow->CheckKey (Private->EmuGraphicsWindow);
|
Status = Private->EmuGraphicsWindow->CheckKey (Private->EmuGraphicsWindow);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// If a there is a key in the queue signal our event.
|
// If a there is a key in the queue signal our event.
|
||||||
//
|
//
|
||||||
gBS->SignalEvent (Event);
|
gBS->SignalEvent (Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Leave critical section and return
|
// Leave critical section and return
|
||||||
//
|
//
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Simple Text Input Ex protocol functions
|
// Simple Text Input Ex protocol functions
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The Reset() function resets the input device hardware. As part
|
The Reset() function resets the input device hardware. As part
|
||||||
of initialization process, the firmware/device will make a quick
|
of initialization process, the firmware/device will make a quick
|
||||||
@ -280,6 +275,7 @@ EmuGopSimpleTextInExResetEx (
|
|||||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -297,8 +293,6 @@ EmuGopSimpleTextInExResetEx (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The function reads the next keystroke from the input device. If
|
The function reads the next keystroke from the input device. If
|
||||||
there is no pending keystroke the function returns
|
there is no pending keystroke the function returns
|
||||||
@ -351,9 +345,10 @@ EmuGopSimpleTextInExResetEx (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopSimpleTextInExReadKeyStrokeEx (
|
EmuGopSimpleTextInExReadKeyStrokeEx (
|
||||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||||
OUT EFI_KEY_DATA *KeyData
|
OUT EFI_KEY_DATA *KeyData
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -378,7 +373,6 @@ EmuGopSimpleTextInExReadKeyStrokeEx (
|
|||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
|
|
||||||
if (KeyData == NULL) {
|
if (KeyData == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
@ -391,9 +385,9 @@ EmuGopSimpleTextInExReadKeyStrokeEx (
|
|||||||
//
|
//
|
||||||
// Enter critical section
|
// Enter critical section
|
||||||
//
|
//
|
||||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
|
|
||||||
Status = Private->EmuGraphicsWindow->GetKey(Private->EmuGraphicsWindow, KeyData);
|
Status = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, KeyData);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Leave critical section and return
|
// Leave critical section and return
|
||||||
@ -403,8 +397,6 @@ EmuGopSimpleTextInExReadKeyStrokeEx (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The SetState() function allows the input device hardware to
|
The SetState() function allows the input device hardware to
|
||||||
have state settings adjusted.
|
have state settings adjusted.
|
||||||
@ -446,16 +438,17 @@ EmuGopSimpleTextInExSetState (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (((Private->KeyState.KeyToggleState & EFI_TOGGLE_STATE_VALID) != EFI_TOGGLE_STATE_VALID) ||
|
if (((Private->KeyState.KeyToggleState & EFI_TOGGLE_STATE_VALID) != EFI_TOGGLE_STATE_VALID) ||
|
||||||
((*KeyToggleState & EFI_TOGGLE_STATE_VALID) != EFI_TOGGLE_STATE_VALID)) {
|
((*KeyToggleState & EFI_TOGGLE_STATE_VALID) != EFI_TOGGLE_STATE_VALID))
|
||||||
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Enter critical section
|
// Enter critical section
|
||||||
//
|
//
|
||||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
|
|
||||||
Status = Private->EmuGraphicsWindow->KeySetState (Private->EmuGraphicsWindow, KeyToggleState);
|
Status = Private->EmuGraphicsWindow->KeySetState (Private->EmuGraphicsWindow, KeyToggleState);
|
||||||
//
|
//
|
||||||
// Leave critical section and return
|
// Leave critical section and return
|
||||||
//
|
//
|
||||||
@ -464,7 +457,6 @@ EmuGopSimpleTextInExSetState (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
SimpleTextIn and SimpleTextInEx Notify Wait Event
|
SimpleTextIn and SimpleTextInEx Notify Wait Event
|
||||||
|
|
||||||
@ -475,17 +467,15 @@ EmuGopSimpleTextInExSetState (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopRegisterKeyCallback (
|
EmuGopRegisterKeyCallback (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
|
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
|
||||||
|
|
||||||
ExNotify->KeyNotificationFn (&ExNotify->KeyData);
|
ExNotify->KeyNotificationFn (&ExNotify->KeyData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The RegisterKeystrokeNotify() function registers a function
|
The RegisterKeystrokeNotify() function registers a function
|
||||||
which will be called when a specified keystroke will occur.
|
which will be called when a specified keystroke will occur.
|
||||||
@ -520,13 +510,13 @@ EmuGopSimpleTextInExRegisterKeyNotify (
|
|||||||
OUT VOID **NotifyHandle
|
OUT VOID **NotifyHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
|
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;
|
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;
|
||||||
|
|
||||||
if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle == NULL) {
|
if ((KeyData == NULL) || (KeyNotificationFunction == NULL) || (NotifyHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,14 +543,14 @@ EmuGopSimpleTextInExRegisterKeyNotify (
|
|||||||
//
|
//
|
||||||
// Allocate resource to save the notification function
|
// Allocate resource to save the notification function
|
||||||
//
|
//
|
||||||
NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
|
NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)AllocateZeroPool (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
|
||||||
if (NewNotify == NULL) {
|
if (NewNotify == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
NewNotify->Signature = EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
|
NewNotify->Signature = EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
|
||||||
NewNotify->KeyNotificationFn = KeyNotificationFunction;
|
NewNotify->KeyNotificationFn = KeyNotificationFunction;
|
||||||
NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;
|
NewNotify->NotifyHandle = (EFI_HANDLE)NewNotify;
|
||||||
CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
|
CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
|
||||||
InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
|
InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
|
||||||
|
|
||||||
@ -573,14 +563,11 @@ EmuGopSimpleTextInExRegisterKeyNotify (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
*NotifyHandle = NewNotify->NotifyHandle;
|
*NotifyHandle = NewNotify->NotifyHandle;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The UnregisterKeystrokeNotify() function removes the
|
The UnregisterKeystrokeNotify() function removes the
|
||||||
notification which was previously registered.
|
notification which was previously registered.
|
||||||
@ -602,6 +589,7 @@ EmuGopSimpleTextInExUnregisterKeyNotify (
|
|||||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||||
IN VOID *NotificationHandle
|
IN VOID *NotificationHandle
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -617,15 +605,15 @@ EmuGopSimpleTextInExUnregisterKeyNotify (
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
|
EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
|
||||||
|
|
||||||
if (NotificationHandle == NULL) {
|
if (NotificationHandle == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)->Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
|
if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)NotificationHandle)->Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -657,8 +645,6 @@ EmuGopSimpleTextInExUnregisterKeyNotify (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
|
Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
|
||||||
context structure.
|
context structure.
|
||||||
@ -670,7 +656,7 @@ EmuGopSimpleTextInExUnregisterKeyNotify (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopInitializeSimpleTextInForWindow (
|
EmuGopInitializeSimpleTextInForWindow (
|
||||||
IN GOP_PRIVATE_DATA *Private
|
IN GOP_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -690,7 +676,6 @@ EmuGopInitializeSimpleTextInForWindow (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize Simple Text In Ex
|
// Initialize Simple Text In Ex
|
||||||
//
|
//
|
||||||
@ -714,21 +699,13 @@ EmuGopInitializeSimpleTextInForWindow (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Simple Pointer implementation.
|
// Simple Pointer implementation.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resets the pointer device hardware.
|
Resets the pointer device hardware.
|
||||||
|
|
||||||
@ -744,13 +721,13 @@ EmuGopInitializeSimpleTextInForWindow (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopSimplePointerReset (
|
EmuGopSimplePointerReset (
|
||||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
EFI_SIMPLE_POINTER_STATE State;
|
EFI_SIMPLE_POINTER_STATE State;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
|
Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
|
||||||
if (Private->EmuGraphicsWindow == NULL) {
|
if (Private->EmuGraphicsWindow == NULL) {
|
||||||
@ -765,8 +742,8 @@ EmuGopSimplePointerReset (
|
|||||||
//
|
//
|
||||||
// A reset is draining the Queue
|
// A reset is draining the Queue
|
||||||
//
|
//
|
||||||
while (Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, &State) == EFI_SUCCESS)
|
while (Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, &State) == EFI_SUCCESS) {
|
||||||
;
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Leave critical section and return
|
// Leave critical section and return
|
||||||
@ -775,7 +752,6 @@ EmuGopSimplePointerReset (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves the current state of a pointer device.
|
Retrieves the current state of a pointer device.
|
||||||
|
|
||||||
@ -793,8 +769,8 @@ EmuGopSimplePointerReset (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopSimplePointerGetState (
|
EmuGopSimplePointerGetState (
|
||||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||||
IN OUT EFI_SIMPLE_POINTER_STATE *State
|
IN OUT EFI_SIMPLE_POINTER_STATE *State
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
@ -809,9 +785,9 @@ EmuGopSimplePointerGetState (
|
|||||||
//
|
//
|
||||||
// Enter critical section
|
// Enter critical section
|
||||||
//
|
//
|
||||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
|
|
||||||
Status = Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, State);
|
Status = Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, State);
|
||||||
//
|
//
|
||||||
// Leave critical section and return
|
// Leave critical section and return
|
||||||
//
|
//
|
||||||
@ -820,7 +796,6 @@ EmuGopSimplePointerGetState (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
SimplePointer Notify Wait Event
|
SimplePointer Notify Wait Event
|
||||||
|
|
||||||
@ -831,15 +806,15 @@ EmuGopSimplePointerGetState (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopSimplePointerWaitForInput (
|
EmuGopSimplePointerWaitForInput (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = (GOP_PRIVATE_DATA *) Context;
|
Private = (GOP_PRIVATE_DATA *)Context;
|
||||||
if (Private->EmuGraphicsWindow == NULL) {
|
if (Private->EmuGraphicsWindow == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -847,22 +822,22 @@ EmuGopSimplePointerWaitForInput (
|
|||||||
//
|
//
|
||||||
// Enter critical section
|
// Enter critical section
|
||||||
//
|
//
|
||||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
|
|
||||||
Status = Private->EmuGraphicsWindow->CheckPointer (Private->EmuGraphicsWindow);
|
Status = Private->EmuGraphicsWindow->CheckPointer (Private->EmuGraphicsWindow);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// If the pointer state has changed, signal our event.
|
// If the pointer state has changed, signal our event.
|
||||||
//
|
//
|
||||||
gBS->SignalEvent (Event);
|
gBS->SignalEvent (Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Leave critical section and return
|
// Leave critical section and return
|
||||||
//
|
//
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
SimplePointer constructor
|
SimplePointer constructor
|
||||||
|
|
||||||
@ -873,7 +848,7 @@ EmuGopSimplePointerWaitForInput (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopInitializeSimplePointerForWindow (
|
EmuGopInitializeSimplePointerForWindow (
|
||||||
IN GOP_PRIVATE_DATA *Private
|
IN GOP_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -887,9 +862,9 @@ EmuGopInitializeSimplePointerForWindow (
|
|||||||
Private->PointerMode.LeftButton = TRUE;
|
Private->PointerMode.LeftButton = TRUE;
|
||||||
Private->PointerMode.RightButton = TRUE;
|
Private->PointerMode.RightButton = TRUE;
|
||||||
|
|
||||||
Private->SimplePointer.Reset = EmuGopSimplePointerReset;
|
Private->SimplePointer.Reset = EmuGopSimplePointerReset;
|
||||||
Private->SimplePointer.GetState = EmuGopSimplePointerGetState;
|
Private->SimplePointer.GetState = EmuGopSimplePointerGetState;
|
||||||
Private->SimplePointer.Mode = &Private->PointerMode;
|
Private->SimplePointer.Mode = &Private->PointerMode;
|
||||||
|
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_WAIT,
|
EVT_NOTIFY_WAIT,
|
||||||
|
@ -18,17 +18,15 @@ Abstract:
|
|||||||
|
|
||||||
#include "Gop.h"
|
#include "Gop.h"
|
||||||
|
|
||||||
|
EFI_EVENT mGopScreenExitBootServicesEvent;
|
||||||
|
|
||||||
EFI_EVENT mGopScreenExitBootServicesEvent;
|
GOP_MODE_DATA mGopModeData[] = {
|
||||||
|
{ 800, 600, 0, 0 },
|
||||||
GOP_MODE_DATA mGopModeData[] = {
|
{ 640, 480, 0, 0 },
|
||||||
{ 800, 600, 0, 0 },
|
{ 720, 400, 0, 0 },
|
||||||
{ 640, 480, 0, 0 },
|
{ 1024, 768, 0, 0 },
|
||||||
{ 720, 400, 0, 0 },
|
{ 1280, 1024, 0, 0 }
|
||||||
{1024, 768, 0, 0 },
|
};
|
||||||
{1280, 1024, 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns information for an available graphics mode that the graphics device
|
Returns information for an available graphics mode that the graphics device
|
||||||
@ -59,7 +57,7 @@ EmuGopQuerytMode (
|
|||||||
|
|
||||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {
|
if ((Info == NULL) || (SizeOfInfo == NULL) || ((UINTN)ModeNumber >= This->Mode->MaxMode)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,17 +68,15 @@ EmuGopQuerytMode (
|
|||||||
|
|
||||||
*SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
*SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
||||||
|
|
||||||
(*Info)->Version = 0;
|
(*Info)->Version = 0;
|
||||||
(*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
|
(*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
|
||||||
(*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;
|
(*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;
|
||||||
(*Info)->PixelFormat = PixelBltOnly;
|
(*Info)->PixelFormat = PixelBltOnly;
|
||||||
(*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
|
(*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set the video device into the specified mode and clears the visible portions of
|
Set the video device into the specified mode and clears the visible portions of
|
||||||
the output display to black.
|
the output display to black.
|
||||||
@ -100,10 +96,10 @@ EmuGopSetMode (
|
|||||||
IN UINT32 ModeNumber
|
IN UINT32 ModeNumber
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
GOP_MODE_DATA *ModeData;
|
GOP_MODE_DATA *ModeData;
|
||||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
|
||||||
|
|
||||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -111,20 +107,20 @@ EmuGopSetMode (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ModeData = &Private->ModeData[ModeNumber];
|
ModeData = &Private->ModeData[ModeNumber];
|
||||||
This->Mode->Mode = ModeNumber;
|
This->Mode->Mode = ModeNumber;
|
||||||
Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
|
Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
|
||||||
Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
|
Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
|
||||||
Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
|
Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
|
||||||
|
|
||||||
if (Private->HardwareNeedsStarting) {
|
if (Private->HardwareNeedsStarting) {
|
||||||
Status = EmuGopStartWindow (
|
Status = EmuGopStartWindow (
|
||||||
Private,
|
Private,
|
||||||
ModeData->HorizontalResolution,
|
ModeData->HorizontalResolution,
|
||||||
ModeData->VerticalResolution,
|
ModeData->VerticalResolution,
|
||||||
ModeData->ColorDepth,
|
ModeData->ColorDepth,
|
||||||
ModeData->RefreshRate
|
ModeData->RefreshRate
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
@ -132,13 +128,11 @@ EmuGopSetMode (
|
|||||||
Private->HardwareNeedsStarting = FALSE;
|
Private->HardwareNeedsStarting = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Status = Private->EmuGraphicsWindow->Size (
|
||||||
Status = Private->EmuGraphicsWindow->Size(
|
Private->EmuGraphicsWindow,
|
||||||
Private->EmuGraphicsWindow,
|
ModeData->HorizontalResolution,
|
||||||
ModeData->HorizontalResolution,
|
ModeData->VerticalResolution
|
||||||
ModeData->VerticalResolution
|
);
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Fill.Red = 0;
|
Fill.Red = 0;
|
||||||
Fill.Green = 0;
|
Fill.Green = 0;
|
||||||
@ -158,8 +152,6 @@ EmuGopSetMode (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
|
Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
|
||||||
|
|
||||||
@ -183,22 +175,22 @@ EmuGopSetMode (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGopBlt (
|
EmuGopBlt (
|
||||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||||
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL,
|
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL,
|
||||||
IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
|
IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
|
||||||
IN UINTN SourceX,
|
IN UINTN SourceX,
|
||||||
IN UINTN SourceY,
|
IN UINTN SourceY,
|
||||||
IN UINTN DestinationX,
|
IN UINTN DestinationX,
|
||||||
IN UINTN DestinationY,
|
IN UINTN DestinationY,
|
||||||
IN UINTN Width,
|
IN UINTN Width,
|
||||||
IN UINTN Height,
|
IN UINTN Height,
|
||||||
IN UINTN Delta OPTIONAL
|
IN UINTN Delta OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
GOP_PRIVATE_DATA *Private;
|
GOP_PRIVATE_DATA *Private;
|
||||||
EFI_TPL OriginalTPL;
|
EFI_TPL OriginalTPL;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
|
EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
|
||||||
|
|
||||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -206,9 +198,10 @@ EmuGopBlt (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Width == 0 || Height == 0) {
|
if ((Width == 0) || (Height == 0)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If Delta is zero, then the entire BltBuffer is being used, so Delta
|
// If Delta is zero, then the entire BltBuffer is being used, so Delta
|
||||||
// is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
|
// is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
|
||||||
@ -236,19 +229,18 @@ EmuGopBlt (
|
|||||||
GopBltArgs.SourceX = SourceX;
|
GopBltArgs.SourceX = SourceX;
|
||||||
GopBltArgs.SourceY = SourceY;
|
GopBltArgs.SourceY = SourceY;
|
||||||
GopBltArgs.Delta = Delta;
|
GopBltArgs.Delta = Delta;
|
||||||
Status = Private->EmuGraphicsWindow->Blt (
|
Status = Private->EmuGraphicsWindow->Blt (
|
||||||
Private->EmuGraphicsWindow,
|
Private->EmuGraphicsWindow,
|
||||||
(EFI_UGA_PIXEL *)BltBuffer,
|
(EFI_UGA_PIXEL *)BltBuffer,
|
||||||
(EFI_UGA_BLT_OPERATION)BltOperation,
|
(EFI_UGA_BLT_OPERATION)BltOperation,
|
||||||
&GopBltArgs
|
&GopBltArgs
|
||||||
);
|
);
|
||||||
|
|
||||||
gBS->RestoreTPL (OriginalTPL);
|
gBS->RestoreTPL (OriginalTPL);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Construction and Destruction functions
|
// Construction and Destruction functions
|
||||||
//
|
//
|
||||||
@ -270,17 +262,16 @@ EmuGopSupported (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopStartWindow (
|
EmuGopStartWindow (
|
||||||
IN GOP_PRIVATE_DATA *Private,
|
IN GOP_PRIVATE_DATA *Private,
|
||||||
IN UINT32 HorizontalResolution,
|
IN UINT32 HorizontalResolution,
|
||||||
IN UINT32 VerticalResolution,
|
IN UINT32 VerticalResolution,
|
||||||
IN UINT32 ColorDepth,
|
IN UINT32 ColorDepth,
|
||||||
IN UINT32 RefreshRate
|
IN UINT32 RefreshRate
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register to be notified on exit boot services so we can destroy the window.
|
// Register to be notified on exit boot services so we can destroy the window.
|
||||||
@ -298,27 +289,28 @@ EmuGopStartWindow (
|
|||||||
Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
|
Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
|
||||||
|
|
||||||
// Register callback to support RegisterKeyNotify()
|
// Register callback to support RegisterKeyNotify()
|
||||||
Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
|
Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
|
||||||
Private->EmuGraphicsWindow,
|
Private->EmuGraphicsWindow,
|
||||||
GopPrivateMakeCallbackFunction,
|
GopPrivateMakeCallbackFunction,
|
||||||
GopPrivateBreakCallbackFunction,
|
GopPrivateBreakCallbackFunction,
|
||||||
Private
|
Private
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopConstructor (
|
EmuGopConstructor (
|
||||||
GOP_PRIVATE_DATA *Private
|
GOP_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Private->ModeData = mGopModeData;
|
Private->ModeData = mGopModeData;
|
||||||
|
|
||||||
Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
|
Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
|
||||||
Private->GraphicsOutput.SetMode = EmuGopSetMode;
|
Private->GraphicsOutput.SetMode = EmuGopSetMode;
|
||||||
Private->GraphicsOutput.Blt = EmuGopBlt;
|
Private->GraphicsOutput.Blt = EmuGopBlt;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Allocate buffer for Graphics Output Protocol mode information
|
// Allocate buffer for Graphics Output Protocol mode information
|
||||||
@ -327,26 +319,27 @@ EmuGopConstructor (
|
|||||||
if (Private->GraphicsOutput.Mode == NULL) {
|
if (Private->GraphicsOutput.Mode == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
|
Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
|
||||||
if (Private->GraphicsOutput.Mode->Info == NULL) {
|
if (Private->GraphicsOutput.Mode->Info == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);
|
Private->GraphicsOutput.Mode->MaxMode = sizeof (mGopModeData) / sizeof (GOP_MODE_DATA);
|
||||||
//
|
//
|
||||||
// Till now, we have no idea about the window size.
|
// Till now, we have no idea about the window size.
|
||||||
//
|
//
|
||||||
Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
|
Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
|
||||||
Private->GraphicsOutput.Mode->Info->Version = 0;
|
Private->GraphicsOutput.Mode->Info->Version = 0;
|
||||||
Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
|
Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
|
||||||
Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
|
Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
|
||||||
Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
|
Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
|
||||||
Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
||||||
Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
|
Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS)(UINTN)NULL;
|
||||||
Private->GraphicsOutput.Mode->FrameBufferSize = 0;
|
Private->GraphicsOutput.Mode->FrameBufferSize = 0;
|
||||||
|
|
||||||
Private->HardwareNeedsStarting = TRUE;
|
Private->HardwareNeedsStarting = TRUE;
|
||||||
Private->EmuGraphicsWindow = NULL;
|
Private->EmuGraphicsWindow = NULL;
|
||||||
|
|
||||||
EmuGopInitializeSimpleTextInForWindow (Private);
|
EmuGopInitializeSimpleTextInForWindow (Private);
|
||||||
|
|
||||||
@ -355,11 +348,9 @@ EmuGopConstructor (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuGopDestructor (
|
EmuGopDestructor (
|
||||||
GOP_PRIVATE_DATA *Private
|
GOP_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (!Private->HardwareNeedsStarting) {
|
if (!Private->HardwareNeedsStarting) {
|
||||||
@ -374,19 +365,20 @@ EmuGopDestructor (
|
|||||||
if (Private->GraphicsOutput.Mode->Info != NULL) {
|
if (Private->GraphicsOutput.Mode->Info != NULL) {
|
||||||
FreePool (Private->GraphicsOutput.Mode->Info);
|
FreePool (Private->GraphicsOutput.Mode->Info);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Private->GraphicsOutput.Mode);
|
FreePool (Private->GraphicsOutput.Mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ShutdownGopEvent (
|
ShutdownGopEvent (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
@ -21,11 +21,11 @@ EmuSimpleFileSystemComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSimpleFileSystemComponentNameGetControllerName (
|
EmuSimpleFileSystemComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -43,7 +43,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuSimpleFileSystem
|
|||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_UNICODE_STRING_TABLE mEmuSimpleFileSystemDriverNameTable[] = {
|
EFI_UNICODE_STRING_TABLE mEmuSimpleFileSystemDriverNameTable[] = {
|
||||||
{
|
{
|
||||||
"eng;en",
|
"eng;en",
|
||||||
L"Emu Simple File System Driver"
|
L"Emu Simple File System Driver"
|
||||||
@ -102,15 +102,14 @@ EmuSimpleFileSystemComponentNameGetDriverName (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
return LookupUnicodeString2 (
|
return LookupUnicodeString2 (
|
||||||
Language,
|
Language,
|
||||||
This->SupportedLanguages,
|
This->SupportedLanguages,
|
||||||
mEmuSimpleFileSystemDriverNameTable,
|
mEmuSimpleFileSystemDriverNameTable,
|
||||||
DriverName,
|
DriverName,
|
||||||
(BOOLEAN)(This == &gEmuSimpleFileSystemComponentName)
|
(BOOLEAN)(This == &gEmuSimpleFileSystemComponentName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the controller
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
that is being managed by a driver.
|
that is being managed by a driver.
|
||||||
@ -182,16 +181,16 @@ EmuSimpleFileSystemComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSimpleFileSystemComponentNameGetControllerName (
|
EmuSimpleFileSystemComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
|
||||||
EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
|
EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
|
||||||
|
|
||||||
//
|
//
|
||||||
// This is a device driver, so ChildHandle must be NULL.
|
// This is a device driver, so ChildHandle must be NULL.
|
||||||
@ -211,13 +210,14 @@ EmuSimpleFileSystemComponentNameGetControllerName (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get our context back
|
// Get our context back
|
||||||
//
|
//
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiSimpleFileSystemProtocolGuid,
|
&gEfiSimpleFileSystemProtocolGuid,
|
||||||
(VOID**)&SimpleFileSystem,
|
(VOID **)&SimpleFileSystem,
|
||||||
gEmuSimpleFileSystemDriverBinding.DriverBindingHandle,
|
gEmuSimpleFileSystemDriverBinding.DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -229,10 +229,10 @@ EmuSimpleFileSystemComponentNameGetControllerName (
|
|||||||
Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (SimpleFileSystem);
|
Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (SimpleFileSystem);
|
||||||
|
|
||||||
return LookupUnicodeString2 (
|
return LookupUnicodeString2 (
|
||||||
Language,
|
Language,
|
||||||
This->SupportedLanguages,
|
This->SupportedLanguages,
|
||||||
Private->ControllerNameTable,
|
Private->ControllerNameTable,
|
||||||
ControllerName,
|
ControllerName,
|
||||||
(BOOLEAN)(This == &gEmuSimpleFileSystemComponentName)
|
(BOOLEAN)(This == &gEmuSimpleFileSystemComponentName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -12,9 +12,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "EmuSimpleFileSystem.h"
|
#include "EmuSimpleFileSystem.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Opens a new file relative to the source file's location.
|
Opens a new file relative to the source file's location.
|
||||||
|
|
||||||
@ -38,44 +35,44 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSimpleFileSystemOpen (
|
EmuSimpleFileSystemOpen (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
OUT EFI_FILE_PROTOCOL **NewHandle,
|
OUT EFI_FILE_PROTOCOL **NewHandle,
|
||||||
IN CHAR16 *FileName,
|
IN CHAR16 *FileName,
|
||||||
IN UINT64 OpenMode,
|
IN UINT64 OpenMode,
|
||||||
IN UINT64 Attributes
|
IN UINT64 Attributes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EMU_EFI_FILE_PRIVATE *NewPrivateFile;
|
EMU_EFI_FILE_PRIVATE *NewPrivateFile;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check for obvious invalid parameters.
|
// Check for obvious invalid parameters.
|
||||||
//
|
//
|
||||||
if (This == NULL || NewHandle == NULL || FileName == NULL) {
|
if ((This == NULL) || (NewHandle == NULL) || (FileName == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (OpenMode) {
|
switch (OpenMode) {
|
||||||
case EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:
|
case EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:
|
||||||
if (Attributes &~EFI_FILE_VALID_ATTR) {
|
if (Attributes &~EFI_FILE_VALID_ATTR) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Attributes & EFI_FILE_READ_ONLY) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// fall through
|
||||||
|
//
|
||||||
|
case EFI_FILE_MODE_READ:
|
||||||
|
case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
|
||||||
|
|
||||||
if (Attributes & EFI_FILE_READ_ONLY) {
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// fall through
|
|
||||||
//
|
|
||||||
case EFI_FILE_MODE_READ:
|
|
||||||
case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
@ -88,7 +85,6 @@ EmuSimpleFileSystemOpen (
|
|||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Status = PrivateFile->Io->Open (PrivateFile->Io, &NewPrivateFile->Io, FileName, OpenMode, Attributes);
|
Status = PrivateFile->Io->Open (PrivateFile->Io, &NewPrivateFile->Io, FileName, OpenMode, Attributes);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
*NewHandle = &NewPrivateFile->EfiFile;
|
*NewHandle = &NewPrivateFile->EfiFile;
|
||||||
@ -103,8 +99,6 @@ Done:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Close the file handle
|
Close the file handle
|
||||||
|
|
||||||
@ -119,9 +113,9 @@ EmuSimpleFileSystemClose (
|
|||||||
IN EFI_FILE_PROTOCOL *This
|
IN EFI_FILE_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -141,7 +135,6 @@ EmuSimpleFileSystemClose (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Close and delete the file handle.
|
Close and delete the file handle.
|
||||||
|
|
||||||
@ -157,9 +150,9 @@ EmuSimpleFileSystemDelete (
|
|||||||
IN EFI_FILE_PROTOCOL *This
|
IN EFI_FILE_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -179,7 +172,6 @@ EmuSimpleFileSystemDelete (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Read data from the file.
|
Read data from the file.
|
||||||
|
|
||||||
@ -202,11 +194,11 @@ EmuSimpleFileSystemRead (
|
|||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL || BufferSize == NULL) {
|
if ((This == NULL) || (BufferSize == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,7 +217,6 @@ EmuSimpleFileSystemRead (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Write data to a file.
|
Write data to a file.
|
||||||
|
|
||||||
@ -253,10 +244,10 @@ EmuSimpleFileSystemWrite (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL || BufferSize == NULL || Buffer == NULL) {
|
if ((This == NULL) || (BufferSize == NULL) || (Buffer == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,7 +261,6 @@ EmuSimpleFileSystemWrite (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get a file's current position
|
Get a file's current position
|
||||||
|
|
||||||
@ -284,21 +274,21 @@ EmuSimpleFileSystemWrite (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSimpleFileSystemGetPosition (
|
EmuSimpleFileSystemGetPosition (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
OUT UINT64 *Position
|
OUT UINT64 *Position
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL || Position == NULL) {
|
if ((This == NULL) || (Position == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
|
PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
Status = PrivateFile->Io->GetPosition (PrivateFile->Io, Position);
|
Status = PrivateFile->Io->GetPosition (PrivateFile->Io, Position);
|
||||||
|
|
||||||
@ -306,8 +296,6 @@ EmuSimpleFileSystemGetPosition (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set file's current position
|
Set file's current position
|
||||||
|
|
||||||
@ -325,9 +313,9 @@ EmuSimpleFileSystemSetPosition (
|
|||||||
IN UINT64 Position
|
IN UINT64 Position
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -343,7 +331,6 @@ EmuSimpleFileSystemSetPosition (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get information about a file.
|
Get information about a file.
|
||||||
|
|
||||||
@ -371,11 +358,11 @@ EmuSimpleFileSystemGetInfo (
|
|||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL || InformationType == NULL || BufferSize == NULL) {
|
if ((This == NULL) || (InformationType == NULL) || (BufferSize == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -389,7 +376,6 @@ EmuSimpleFileSystemGetInfo (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set information about a file
|
Set information about a file
|
||||||
|
|
||||||
@ -410,26 +396,26 @@ EmuSimpleFileSystemGetInfo (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSimpleFileSystemSetInfo (
|
EmuSimpleFileSystemSetInfo (
|
||||||
IN EFI_FILE_PROTOCOL*This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
IN EFI_GUID *InformationType,
|
IN EFI_GUID *InformationType,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check for invalid parameters.
|
// Check for invalid parameters.
|
||||||
//
|
//
|
||||||
if (This == NULL || InformationType == NULL || BufferSize == 0 || Buffer == NULL) {
|
if ((This == NULL) || (InformationType == NULL) || (BufferSize == 0) || (Buffer == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
|
PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
Status = PrivateFile->Io->SetInfo (PrivateFile->Io, InformationType, BufferSize, Buffer);
|
Status = PrivateFile->Io->SetInfo (PrivateFile->Io, InformationType, BufferSize, Buffer);
|
||||||
|
|
||||||
@ -437,7 +423,6 @@ EmuSimpleFileSystemSetInfo (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Flush data back for the file handle.
|
Flush data back for the file handle.
|
||||||
|
|
||||||
@ -459,9 +444,9 @@ EmuSimpleFileSystemFlush (
|
|||||||
IN EFI_FILE_PROTOCOL *This
|
IN EFI_FILE_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -477,8 +462,6 @@ EmuSimpleFileSystemFlush (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Open the root directory on a volume.
|
Open the root directory on a volume.
|
||||||
|
|
||||||
@ -501,14 +484,14 @@ EmuSimpleFileSystemOpenVolume (
|
|||||||
OUT EFI_FILE_PROTOCOL **Root
|
OUT EFI_FILE_PROTOCOL **Root
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
|
EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
|
||||||
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
EMU_EFI_FILE_PRIVATE *PrivateFile;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
|
|
||||||
if (This == NULL || Root == NULL) {
|
if ((This == NULL) || (Root == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -522,22 +505,22 @@ EmuSimpleFileSystemOpenVolume (
|
|||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;
|
PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;
|
||||||
PrivateFile->IoThunk = Private->IoThunk;
|
PrivateFile->IoThunk = Private->IoThunk;
|
||||||
PrivateFile->SimpleFileSystem = This;
|
PrivateFile->SimpleFileSystem = This;
|
||||||
|
|
||||||
ZeroMem (&PrivateFile->EfiFile, sizeof (PrivateFile->EfiFile));
|
ZeroMem (&PrivateFile->EfiFile, sizeof (PrivateFile->EfiFile));
|
||||||
PrivateFile->EfiFile.Revision = EFI_FILE_PROTOCOL_REVISION;
|
PrivateFile->EfiFile.Revision = EFI_FILE_PROTOCOL_REVISION;
|
||||||
PrivateFile->EfiFile.Open = EmuSimpleFileSystemOpen;
|
PrivateFile->EfiFile.Open = EmuSimpleFileSystemOpen;
|
||||||
PrivateFile->EfiFile.Close = EmuSimpleFileSystemClose;
|
PrivateFile->EfiFile.Close = EmuSimpleFileSystemClose;
|
||||||
PrivateFile->EfiFile.Delete = EmuSimpleFileSystemDelete;
|
PrivateFile->EfiFile.Delete = EmuSimpleFileSystemDelete;
|
||||||
PrivateFile->EfiFile.Read = EmuSimpleFileSystemRead;
|
PrivateFile->EfiFile.Read = EmuSimpleFileSystemRead;
|
||||||
PrivateFile->EfiFile.Write = EmuSimpleFileSystemWrite;
|
PrivateFile->EfiFile.Write = EmuSimpleFileSystemWrite;
|
||||||
PrivateFile->EfiFile.GetPosition = EmuSimpleFileSystemGetPosition;
|
PrivateFile->EfiFile.GetPosition = EmuSimpleFileSystemGetPosition;
|
||||||
PrivateFile->EfiFile.SetPosition = EmuSimpleFileSystemSetPosition;
|
PrivateFile->EfiFile.SetPosition = EmuSimpleFileSystemSetPosition;
|
||||||
PrivateFile->EfiFile.GetInfo = EmuSimpleFileSystemGetInfo;
|
PrivateFile->EfiFile.GetInfo = EmuSimpleFileSystemGetInfo;
|
||||||
PrivateFile->EfiFile.SetInfo = EmuSimpleFileSystemSetInfo;
|
PrivateFile->EfiFile.SetInfo = EmuSimpleFileSystemSetInfo;
|
||||||
PrivateFile->EfiFile.Flush = EmuSimpleFileSystemFlush;
|
PrivateFile->EfiFile.Flush = EmuSimpleFileSystemFlush;
|
||||||
|
|
||||||
*Root = &PrivateFile->EfiFile;
|
*Root = &PrivateFile->EfiFile;
|
||||||
|
|
||||||
@ -562,7 +545,6 @@ EmuSimpleFileSystemOpenVolume (
|
|||||||
FALSE
|
FALSE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
Done:
|
Done:
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
if (PrivateFile) {
|
if (PrivateFile) {
|
||||||
@ -627,7 +609,7 @@ EmuSimpleFileSystemDriverBindingSupported (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -657,17 +639,15 @@ EmuSimpleFileSystemDriverBindingSupported (
|
|||||||
// Close the I/O Abstraction(s) used to perform the supported test
|
// Close the I/O Abstraction(s) used to perform the supported test
|
||||||
//
|
//
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Starts a device controller or a bus controller.
|
Starts a device controller or a bus controller.
|
||||||
|
|
||||||
@ -706,14 +686,14 @@ EmuSimpleFileSystemDriverBindingSupported (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSimpleFileSystemDriverBindingStart (
|
EmuSimpleFileSystemDriverBindingStart (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
|
EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
|
||||||
|
|
||||||
Private = NULL;
|
Private = NULL;
|
||||||
|
|
||||||
@ -755,8 +735,8 @@ EmuSimpleFileSystemDriverBindingStart (
|
|||||||
Private->IoThunk = EmuIoThunk;
|
Private->IoThunk = EmuIoThunk;
|
||||||
Private->Io = EmuIoThunk->Interface;
|
Private->Io = EmuIoThunk->Interface;
|
||||||
|
|
||||||
Private->SimpleFileSystem.Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION;
|
Private->SimpleFileSystem.Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION;
|
||||||
Private->SimpleFileSystem.OpenVolume = EmuSimpleFileSystemOpenVolume;
|
Private->SimpleFileSystem.OpenVolume = EmuSimpleFileSystemOpenVolume;
|
||||||
|
|
||||||
Private->ControllerNameTable = NULL;
|
Private->ControllerNameTable = NULL;
|
||||||
|
|
||||||
@ -778,7 +758,8 @@ EmuSimpleFileSystemDriverBindingStart (
|
|||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&ControllerHandle,
|
&ControllerHandle,
|
||||||
&gEfiSimpleFileSystemProtocolGuid, &Private->SimpleFileSystem,
|
&gEfiSimpleFileSystemProtocolGuid,
|
||||||
|
&Private->SimpleFileSystem,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -790,21 +771,19 @@ Done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
gBS->FreePool (Private);
|
gBS->FreePool (Private);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stops a device controller or a bus controller.
|
Stops a device controller or a bus controller.
|
||||||
|
|
||||||
@ -840,9 +819,9 @@ EmuSimpleFileSystemDriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer
|
IN EFI_HANDLE *ChildHandleBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
|
||||||
EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
|
EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get our context back
|
// Get our context back
|
||||||
@ -866,7 +845,8 @@ EmuSimpleFileSystemDriverBindingStop (
|
|||||||
//
|
//
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiSimpleFileSystemProtocolGuid, &Private->SimpleFileSystem,
|
&gEfiSimpleFileSystemProtocolGuid,
|
||||||
|
&Private->SimpleFileSystem,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
@ -892,8 +872,7 @@ EmuSimpleFileSystemDriverBindingStop (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_DRIVER_BINDING_PROTOCOL gEmuSimpleFileSystemDriverBinding = {
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gEmuSimpleFileSystemDriverBinding = {
|
|
||||||
EmuSimpleFileSystemDriverBindingSupported,
|
EmuSimpleFileSystemDriverBindingSupported,
|
||||||
EmuSimpleFileSystemDriverBindingStart,
|
EmuSimpleFileSystemDriverBindingStart,
|
||||||
EmuSimpleFileSystemDriverBindingStop,
|
EmuSimpleFileSystemDriverBindingStop,
|
||||||
@ -902,9 +881,6 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuSimpleFileSystemDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The user Entry Point for module EmuSimpleFileSystem. The user code starts with this function.
|
The user Entry Point for module EmuSimpleFileSystem. The user code starts with this function.
|
||||||
|
|
||||||
@ -917,12 +893,12 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuSimpleFileSystemDriverBinding = {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeEmuSimpleFileSystem(
|
InitializeEmuSimpleFileSystem (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = EfiLibInstallDriverBindingComponentName2 (
|
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
|
@ -30,19 +30,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
|
||||||
|
extern EFI_DRIVER_BINDING_PROTOCOL gEmuSimpleFileSystemDriverBinding;
|
||||||
|
extern EFI_COMPONENT_NAME_PROTOCOL gEmuSimpleFileSystemComponentName;
|
||||||
|
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuSimpleFileSystemComponentName2;
|
||||||
|
|
||||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuSimpleFileSystemDriverBinding;
|
#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'f', 's')
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuSimpleFileSystemComponentName;
|
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuSimpleFileSystemComponentName2;
|
|
||||||
|
|
||||||
#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'f', 's')
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
|
||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Io;
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Io;
|
||||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
|
} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
|
||||||
|
|
||||||
#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
|
#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
@ -52,14 +51,14 @@ typedef struct {
|
|||||||
EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
|
EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
|
||||||
)
|
)
|
||||||
|
|
||||||
#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('e', 'm', 'f', 's')
|
#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('e', 'm', 'f', 's')
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
|
||||||
EFI_FILE_PROTOCOL EfiFile;
|
EFI_FILE_PROTOCOL EfiFile;
|
||||||
EFI_FILE_PROTOCOL *Io;
|
EFI_FILE_PROTOCOL *Io;
|
||||||
} EMU_EFI_FILE_PRIVATE;
|
} EMU_EFI_FILE_PRIVATE;
|
||||||
|
|
||||||
#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
|
#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
@ -69,6 +68,4 @@ typedef struct {
|
|||||||
EMU_EFI_FILE_PRIVATE_SIGNATURE \
|
EMU_EFI_FILE_PRIVATE_SIGNATURE \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -17,6 +17,7 @@ Abstract:
|
|||||||
//
|
//
|
||||||
// EFI Component Name Functions
|
// EFI Component Name Functions
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the driver.
|
Retrieves a Unicode string that is the user readable name of the driver.
|
||||||
|
|
||||||
@ -64,7 +65,6 @@ EmuSnpDriverComponentNameGetDriverName (
|
|||||||
OUT CHAR16 **DriverName
|
OUT CHAR16 **DriverName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the controller
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
that is being managed by a driver.
|
that is being managed by a driver.
|
||||||
@ -136,14 +136,13 @@ EmuSnpDriverComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpDriverComponentNameGetControllerName (
|
EmuSnpDriverComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Protocol
|
// EFI Component Name Protocol
|
||||||
//
|
//
|
||||||
@ -156,14 +155,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmuSnpDriverComponen
|
|||||||
//
|
//
|
||||||
// EFI Component Name 2 Protocol
|
// EFI Component Name 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuSnpDriverComponentName2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuSnpDriverComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EmuSnpDriverComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)EmuSnpDriverComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EmuSnpDriverComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)EmuSnpDriverComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmuSnpDriverNameTable[] = {
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmuSnpDriverNameTable[] = {
|
|
||||||
{
|
{
|
||||||
"eng;en",
|
"eng;en",
|
||||||
L"Emu SNP Driver"
|
L"Emu SNP Driver"
|
||||||
@ -301,11 +299,11 @@ EmuSnpDriverComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpDriverComponentNameGetControllerName (
|
EmuSnpDriverComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
|
@ -15,9 +15,7 @@ Abstract:
|
|||||||
|
|
||||||
#include "EmuSnpDxe.h"
|
#include "EmuSnpDxe.h"
|
||||||
|
|
||||||
|
EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
|
||||||
|
|
||||||
EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
|
|
||||||
EFI_SIMPLE_NETWORK_PROTOCOL_REVISION,
|
EFI_SIMPLE_NETWORK_PROTOCOL_REVISION,
|
||||||
EmuSnpStart,
|
EmuSnpStart,
|
||||||
EmuSnpStop,
|
EmuSnpStop,
|
||||||
@ -34,9 +32,9 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
|
|||||||
EmuSnpReceive,
|
EmuSnpReceive,
|
||||||
NULL, // WaitForPacket
|
NULL, // WaitForPacket
|
||||||
NULL // Mode
|
NULL // Mode
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
|
EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
|
||||||
EfiSimpleNetworkStopped, // State
|
EfiSimpleNetworkStopped, // State
|
||||||
NET_ETHER_ADDR_LEN, // HwAddressSize
|
NET_ETHER_ADDR_LEN, // HwAddressSize
|
||||||
NET_ETHER_HEADER_SIZE, // MediaHeaderSize
|
NET_ETHER_HEADER_SIZE, // MediaHeaderSize
|
||||||
@ -48,7 +46,9 @@ EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
|
|||||||
MAX_MCAST_FILTER_CNT, // MaxMCastFilterCount
|
MAX_MCAST_FILTER_CNT, // MaxMCastFilterCount
|
||||||
0, // MCastFilterCount
|
0, // MCastFilterCount
|
||||||
{
|
{
|
||||||
{ { 0 } }
|
{
|
||||||
|
{ 0 }
|
||||||
|
}
|
||||||
}, // MCastFilter
|
}, // MCastFilter
|
||||||
{
|
{
|
||||||
{ 0 }
|
{ 0 }
|
||||||
@ -66,7 +66,6 @@ EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
|
|||||||
TRUE // MediaPresent
|
TRUE // MediaPresent
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Changes the state of a network interface from "stopped" to "started".
|
Changes the state of a network interface from "stopped" to "started".
|
||||||
|
|
||||||
@ -77,12 +76,12 @@ EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpStart(
|
EmuSnpStart (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -90,7 +89,6 @@ EmuSnpStart(
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Changes the state of a network interface from "started" to "stopped".
|
Changes the state of a network interface from "started" to "stopped".
|
||||||
|
|
||||||
@ -102,11 +100,11 @@ EmuSnpStart(
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpStop (
|
EmuSnpStop (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -114,7 +112,6 @@ EmuSnpStop (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resets a network adapter and allocates the transmit and receive buffers
|
Resets a network adapter and allocates the transmit and receive buffers
|
||||||
required by the network interface; optionally, also requests allocation
|
required by the network interface; optionally, also requests allocation
|
||||||
@ -138,13 +135,13 @@ EmuSnpStop (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpInitialize (
|
EmuSnpInitialize (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -167,12 +164,12 @@ EmuSnpInitialize (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpReset (
|
EmuSnpReset (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -192,11 +189,11 @@ EmuSnpReset (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpShutdown (
|
EmuSnpShutdown (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -228,16 +225,16 @@ EmuSnpShutdown (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpReceiveFilters (
|
EmuSnpReceiveFilters (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN UINT32 EnableBits,
|
IN UINT32 EnableBits,
|
||||||
IN UINT32 DisableBits,
|
IN UINT32 DisableBits,
|
||||||
IN BOOLEAN ResetMcastFilter,
|
IN BOOLEAN ResetMcastFilter,
|
||||||
IN UINTN McastFilterCount OPTIONAL,
|
IN UINTN McastFilterCount OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS *McastFilter OPTIONAL
|
IN EFI_MAC_ADDRESS *McastFilter OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -266,13 +263,13 @@ EmuSnpReceiveFilters (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpStationAddress (
|
EmuSnpStationAddress (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN EFI_MAC_ADDRESS *NewMacAddr OPTIONAL
|
IN EFI_MAC_ADDRESS *NewMacAddr OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -302,14 +299,14 @@ EmuSnpStationAddress (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpStatistics (
|
EmuSnpStatistics (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -339,14 +336,14 @@ EmuSnpStatistics (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpMcastIptoMac (
|
EmuSnpMcastIptoMac (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN Ipv6,
|
IN BOOLEAN Ipv6,
|
||||||
IN EFI_IP_ADDRESS *Ip,
|
IN EFI_IP_ADDRESS *Ip,
|
||||||
OUT EFI_MAC_ADDRESS *Mac
|
OUT EFI_MAC_ADDRESS *Mac
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -354,7 +351,6 @@ EmuSnpMcastIptoMac (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Performs read and write operations on the NVRAM device attached to a
|
Performs read and write operations on the NVRAM device attached to a
|
||||||
network interface.
|
network interface.
|
||||||
@ -374,15 +370,15 @@ EmuSnpMcastIptoMac (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpNvdata (
|
EmuSnpNvdata (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN ReadOrWrite,
|
IN BOOLEAN ReadOrWrite,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN OUT VOID *Buffer
|
IN OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -390,7 +386,6 @@ EmuSnpNvdata (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reads the current interrupt status and recycled transmit buffer status from
|
Reads the current interrupt status and recycled transmit buffer status from
|
||||||
a network interface.
|
a network interface.
|
||||||
@ -415,13 +410,13 @@ EmuSnpNvdata (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpGetStatus (
|
EmuSnpGetStatus (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
OUT UINT32 *InterruptStatus,
|
OUT UINT32 *InterruptStatus,
|
||||||
OUT VOID **TxBuffer
|
OUT VOID **TxBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -429,7 +424,6 @@ EmuSnpGetStatus (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Places a packet in the transmit queue of a network interface.
|
Places a packet in the transmit queue of a network interface.
|
||||||
|
|
||||||
@ -463,17 +457,17 @@ EmuSnpGetStatus (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpTransmit (
|
EmuSnpTransmit (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN UINTN HeaderSize,
|
IN UINTN HeaderSize,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID* Buffer,
|
IN VOID *Buffer,
|
||||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
IN UINT16 *Protocol OPTIONAL
|
IN UINT16 *Protocol OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -522,17 +516,17 @@ EmuSnpTransmit (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpReceive (
|
EmuSnpReceive (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
OUT UINTN *HeaderSize OPTIONAL,
|
OUT UINTN *HeaderSize OPTIONAL,
|
||||||
IN OUT UINTN *BuffSize,
|
IN OUT UINTN *BuffSize,
|
||||||
OUT VOID *Buffer,
|
OUT VOID *Buffer,
|
||||||
OUT EFI_MAC_ADDRESS *SourceAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *SourceAddr OPTIONAL,
|
||||||
OUT EFI_MAC_ADDRESS *DestinationAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *DestinationAddr OPTIONAL,
|
||||||
OUT UINT16 *Protocol OPTIONAL
|
OUT UINT16 *Protocol OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
|
||||||
|
|
||||||
@ -548,8 +542,6 @@ EmuSnpReceive (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Test to see if this driver supports ControllerHandle. This service
|
Test to see if this driver supports ControllerHandle. This service
|
||||||
is called by the EFI boot service ConnectController(). In
|
is called by the EFI boot service ConnectController(). In
|
||||||
@ -583,15 +575,15 @@ EmuSnpDriverBindingSupported (
|
|||||||
if (RemainingDevicePath != NULL) {
|
if (RemainingDevicePath != NULL) {
|
||||||
if (!IsDevicePathEnd (RemainingDevicePath)) {
|
if (!IsDevicePathEnd (RemainingDevicePath)) {
|
||||||
Node = (MAC_ADDR_DEVICE_PATH *)RemainingDevicePath;
|
Node = (MAC_ADDR_DEVICE_PATH *)RemainingDevicePath;
|
||||||
if (Node->Header.Type != MESSAGING_DEVICE_PATH ||
|
if ((Node->Header.Type != MESSAGING_DEVICE_PATH) ||
|
||||||
Node->Header.SubType != MSG_MAC_ADDR_DP) {
|
(Node->Header.SubType != MSG_MAC_ADDR_DP))
|
||||||
|
{
|
||||||
// If the remaining device path does not match we don't support the request
|
// If the remaining device path does not match we don't support the request
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open the IO Abstraction(s) needed to perform the supported test
|
// Open the IO Abstraction(s) needed to perform the supported test
|
||||||
//
|
//
|
||||||
@ -611,12 +603,11 @@ EmuSnpDriverBindingSupported (
|
|||||||
// Close the I/O Abstraction(s) used to perform the supported test
|
// Close the I/O Abstraction(s) used to perform the supported test
|
||||||
//
|
//
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open the EFI Device Path protocol needed to perform the supported test
|
// Open the EFI Device Path protocol needed to perform the supported test
|
||||||
@ -624,7 +615,7 @@ EmuSnpDriverBindingSupported (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
(VOID **) &ParentDevicePath,
|
(VOID **)&ParentDevicePath,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -649,16 +640,15 @@ EmuSnpDriverBindingSupported (
|
|||||||
// Close protocol, don't use device path protocol in the Support() function
|
// Close protocol, don't use device path protocol in the Support() function
|
||||||
//
|
//
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Start this driver on ControllerHandle. This service is called by the
|
Start this driver on ControllerHandle. This service is called by the
|
||||||
EFI boot service ConnectController(). In order to make
|
EFI boot service ConnectController(). In order to make
|
||||||
@ -683,21 +673,21 @@ EmuSnpDriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
EMU_SNP_PRIVATE_DATA *Private;
|
EMU_SNP_PRIVATE_DATA *Private;
|
||||||
MAC_ADDR_DEVICE_PATH Node;
|
MAC_ADDR_DEVICE_PATH Node;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||||
|
|
||||||
Private = NULL;
|
Private = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Grab the protocols we need
|
// Grab the protocols we need
|
||||||
//
|
//
|
||||||
Status = gBS->OpenProtocol(
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
( VOID ** ) &ParentDevicePath,
|
(VOID **)&ParentDevicePath,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -739,15 +729,14 @@ EmuSnpDriverBindingStart (
|
|||||||
CopyMem (&Private->Snp, &gEmuSnpTemplate, sizeof (EFI_SIMPLE_NETWORK_PROTOCOL));
|
CopyMem (&Private->Snp, &gEmuSnpTemplate, sizeof (EFI_SIMPLE_NETWORK_PROTOCOL));
|
||||||
CopyMem (&Private->Mode, &gEmuSnpModeTemplate, sizeof (EFI_SIMPLE_NETWORK_MODE));
|
CopyMem (&Private->Mode, &gEmuSnpModeTemplate, sizeof (EFI_SIMPLE_NETWORK_MODE));
|
||||||
|
|
||||||
Private->Signature = EMU_SNP_PRIVATE_DATA_SIGNATURE;
|
Private->Signature = EMU_SNP_PRIVATE_DATA_SIGNATURE;
|
||||||
Private->IoThunk = EmuIoThunk;
|
Private->IoThunk = EmuIoThunk;
|
||||||
Private->Io = EmuIoThunk->Interface;
|
Private->Io = EmuIoThunk->Interface;
|
||||||
Private->EfiHandle = ControllerHandle;
|
Private->EfiHandle = ControllerHandle;
|
||||||
Private->DeviceHandle = NULL;
|
Private->DeviceHandle = NULL;
|
||||||
Private->Snp.Mode = &Private->Mode;
|
Private->Snp.Mode = &Private->Mode;
|
||||||
Private->ControllerNameTable = NULL;
|
Private->ControllerNameTable = NULL;
|
||||||
|
|
||||||
|
|
||||||
Status = Private->Io->CreateMapping (Private->Io, &Private->Mode);
|
Status = Private->Io->CreateMapping (Private->Io, &Private->Mode);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Done;
|
goto Done;
|
||||||
@ -759,11 +748,11 @@ EmuSnpDriverBindingStart (
|
|||||||
//
|
//
|
||||||
ZeroMem (&Node, sizeof (MAC_ADDR_DEVICE_PATH));
|
ZeroMem (&Node, sizeof (MAC_ADDR_DEVICE_PATH));
|
||||||
|
|
||||||
Node.Header.Type = MESSAGING_DEVICE_PATH;
|
Node.Header.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node.Header.SubType = MSG_MAC_ADDR_DP;
|
Node.Header.SubType = MSG_MAC_ADDR_DP;
|
||||||
Node.IfType = Private->Mode.IfType;
|
Node.IfType = Private->Mode.IfType;
|
||||||
|
|
||||||
SetDevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL * )&Node, sizeof (MAC_ADDR_DEVICE_PATH));
|
SetDevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *)&Node, sizeof (MAC_ADDR_DEVICE_PATH));
|
||||||
|
|
||||||
CopyMem (&Node.MacAddress, &Private->Mode.CurrentAddress, sizeof (EFI_MAC_ADDRESS));
|
CopyMem (&Node.MacAddress, &Private->Mode.CurrentAddress, sizeof (EFI_MAC_ADDRESS));
|
||||||
|
|
||||||
@ -795,10 +784,12 @@ EmuSnpDriverBindingStart (
|
|||||||
//
|
//
|
||||||
// Create Child Handle
|
// Create Child Handle
|
||||||
//
|
//
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces(
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&Private->DeviceHandle,
|
&Private->DeviceHandle,
|
||||||
&gEfiSimpleNetworkProtocolGuid, &Private->Snp,
|
&gEfiSimpleNetworkProtocolGuid,
|
||||||
&gEfiDevicePathProtocolGuid, Private->DevicePath,
|
&Private->Snp,
|
||||||
|
&gEfiDevicePathProtocolGuid,
|
||||||
|
Private->DevicePath,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -822,13 +813,14 @@ Done:
|
|||||||
if (Private != NULL) {
|
if (Private != NULL) {
|
||||||
FreePool (Private);
|
FreePool (Private);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ParentDevicePath != NULL) {
|
if (ParentDevicePath != NULL) {
|
||||||
gBS->CloseProtocol(
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle
|
ControllerHandle
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -855,16 +847,16 @@ Done:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpDriverBindingStop (
|
EmuSnpDriverBindingStop (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN UINTN NumberOfChildren,
|
IN UINTN NumberOfChildren,
|
||||||
IN EFI_HANDLE *ChildHandleBuffer
|
IN EFI_HANDLE *ChildHandleBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE_DATA *Private = NULL;
|
EMU_SNP_PRIVATE_DATA *Private = NULL;
|
||||||
EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
|
EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
|
||||||
VOID *EmuIoThunk;
|
VOID *EmuIoThunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Complete all outstanding transactions to Controller.
|
// Complete all outstanding transactions to Controller.
|
||||||
@ -892,14 +884,13 @@ EmuSnpDriverBindingStop (
|
|||||||
|
|
||||||
ASSERT (NumberOfChildren == 1);
|
ASSERT (NumberOfChildren == 1);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get our context back.
|
// Get our context back.
|
||||||
//
|
//
|
||||||
Status = gBS->OpenProtocol(
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandleBuffer[0],
|
ChildHandleBuffer[0],
|
||||||
&gEfiSimpleNetworkProtocolGuid,
|
&gEfiSimpleNetworkProtocolGuid,
|
||||||
( VOID ** ) &Snp,
|
(VOID **)&Snp,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -912,7 +903,7 @@ EmuSnpDriverBindingStop (
|
|||||||
ASSERT (Private->DeviceHandle == ChildHandleBuffer[0]);
|
ASSERT (Private->DeviceHandle == ChildHandleBuffer[0]);
|
||||||
ASSERT (Private->EfiHandle == ControllerHandle);
|
ASSERT (Private->EfiHandle == ControllerHandle);
|
||||||
|
|
||||||
Status = gBS->CloseProtocol(
|
Status = gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEmuIoThunkProtocolGuid,
|
&gEmuIoThunkProtocolGuid,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
@ -920,10 +911,12 @@ EmuSnpDriverBindingStop (
|
|||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces(
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
Private->DeviceHandle,
|
Private->DeviceHandle,
|
||||||
&gEfiSimpleNetworkProtocolGuid, &Private->Snp,
|
&gEfiSimpleNetworkProtocolGuid,
|
||||||
&gEfiDevicePathProtocolGuid, Private->DevicePath,
|
&Private->Snp,
|
||||||
|
&gEfiDevicePathProtocolGuid,
|
||||||
|
Private->DevicePath,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -947,8 +940,7 @@ EmuSnpDriverBindingStop (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_DRIVER_BINDING_PROTOCOL gEmuSnpDriverBinding = {
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gEmuSnpDriverBinding = {
|
|
||||||
EmuSnpDriverBindingSupported,
|
EmuSnpDriverBindingSupported,
|
||||||
EmuSnpDriverBindingStart,
|
EmuSnpDriverBindingStart,
|
||||||
EmuSnpDriverBindingStop,
|
EmuSnpDriverBindingStop,
|
||||||
@ -957,8 +949,6 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuSnpDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This is the declaration of an EFI image entry point. This entry point is
|
This is the declaration of an EFI image entry point. This entry point is
|
||||||
the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
|
the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
|
||||||
@ -975,22 +965,22 @@ EFI_STATUS
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeEmuSnpDriver (
|
InitializeEmuSnpDriver (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Install the Driver Protocols
|
// Install the Driver Protocols
|
||||||
//
|
//
|
||||||
Status = EfiLibInstallDriverBindingComponentName2(
|
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
SystemTable,
|
SystemTable,
|
||||||
&gEmuSnpDriverBinding,
|
&gEmuSnpDriverBinding,
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
&gEmuSnpDriverComponentName,
|
&gEmuSnpDriverComponentName,
|
||||||
&gEmuSnpDriverComponentName2
|
&gEmuSnpDriverComponentName2
|
||||||
);
|
);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ Abstract:
|
|||||||
#include <Protocol/EmuIoThunk.h>
|
#include <Protocol/EmuIoThunk.h>
|
||||||
#include <Protocol/EmuSnp.h>
|
#include <Protocol/EmuSnp.h>
|
||||||
|
|
||||||
|
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
@ -32,35 +31,34 @@ Abstract:
|
|||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/NetLib.h>
|
#include <Library/NetLib.h>
|
||||||
|
|
||||||
#define NET_ETHER_HEADER_SIZE 14
|
#define NET_ETHER_HEADER_SIZE 14
|
||||||
|
|
||||||
//
|
//
|
||||||
// Private data for driver.
|
// Private data for driver.
|
||||||
//
|
//
|
||||||
#define EMU_SNP_PRIVATE_DATA_SIGNATURE SIGNATURE_32( 'U', 'S', 'N', 'P' )
|
#define EMU_SNP_PRIVATE_DATA_SIGNATURE SIGNATURE_32( 'U', 'S', 'N', 'P' )
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
EMU_IO_THUNK_PROTOCOL *IoThunk;
|
||||||
EMU_SNP_PROTOCOL *Io;
|
EMU_SNP_PROTOCOL *Io;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
|
|
||||||
EFI_HANDLE EfiHandle;
|
EFI_HANDLE EfiHandle;
|
||||||
EFI_HANDLE DeviceHandle;
|
EFI_HANDLE DeviceHandle;
|
||||||
|
|
||||||
EFI_SIMPLE_NETWORK_PROTOCOL Snp;
|
EFI_SIMPLE_NETWORK_PROTOCOL Snp;
|
||||||
EFI_SIMPLE_NETWORK_MODE Mode;
|
EFI_SIMPLE_NETWORK_MODE Mode;
|
||||||
|
|
||||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
|
||||||
|
|
||||||
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
} EMU_SNP_PRIVATE_DATA;
|
} EMU_SNP_PRIVATE_DATA;
|
||||||
|
|
||||||
#define EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS(a) \
|
#define EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS(a) \
|
||||||
CR( a, EMU_SNP_PRIVATE_DATA, Snp, EMU_SNP_PRIVATE_DATA_SIGNATURE )
|
CR( a, EMU_SNP_PRIVATE_DATA, Snp, EMU_SNP_PRIVATE_DATA_SIGNATURE )
|
||||||
|
|
||||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuSnpDriverBinding;
|
extern EFI_DRIVER_BINDING_PROTOCOL gEmuSnpDriverBinding;
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuSnpDriverComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gEmuSnpDriverComponentName;
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuSnpDriverComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuSnpDriverComponentName2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Test to see if this driver supports ControllerHandle. This service
|
Test to see if this driver supports ControllerHandle. This service
|
||||||
@ -82,9 +80,9 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gEmuSnpDriverComponentName2;
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpDriverBindingSupported (
|
EmuSnpDriverBindingSupported (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL * This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -106,9 +104,9 @@ EmuSnpDriverBindingSupported (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpDriverBindingStart (
|
EmuSnpDriverBindingStart (
|
||||||
IN EFI_DRIVER_BINDING_PROTOCOL * This,
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -147,8 +145,8 @@ EmuSnpDriverBindingStop (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpStart(
|
EmuSnpStart (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -161,8 +159,8 @@ EmuSnpStart(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpStop(
|
EmuSnpStop (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,10 +185,10 @@ EmuSnpStop(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpInitialize(
|
EmuSnpInitialize (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -207,9 +205,9 @@ EmuSnpInitialize(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpReset(
|
EmuSnpReset (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -223,8 +221,8 @@ EmuSnpReset(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpShutdown(
|
EmuSnpShutdown (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -250,13 +248,13 @@ EmuSnpShutdown(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpReceiveFilters(
|
EmuSnpReceiveFilters (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN UINT32 EnableBits,
|
IN UINT32 EnableBits,
|
||||||
IN UINT32 DisableBits,
|
IN UINT32 DisableBits,
|
||||||
IN BOOLEAN ResetMcastFilter,
|
IN BOOLEAN ResetMcastFilter,
|
||||||
IN UINTN McastFilterCount OPTIONAL,
|
IN UINTN McastFilterCount OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS* McastFilter OPTIONAL
|
IN EFI_MAC_ADDRESS *McastFilter OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -272,10 +270,10 @@ EmuSnpReceiveFilters(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpStationAddress(
|
EmuSnpStationAddress (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN EFI_MAC_ADDRESS* NewMacAddr OPTIONAL
|
IN EFI_MAC_ADDRESS *NewMacAddr OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -299,11 +297,11 @@ EmuSnpStationAddress(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpStatistics(
|
EmuSnpStatistics (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN OUT UINTN* StatisticsSize OPTIONAL,
|
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||||
OUT EFI_NETWORK_STATISTICS* StatisticsTable OPTIONAL
|
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -327,11 +325,11 @@ EmuSnpStatistics(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpMcastIptoMac(
|
EmuSnpMcastIptoMac (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN Ipv6,
|
IN BOOLEAN Ipv6,
|
||||||
IN EFI_IP_ADDRESS* Ip,
|
IN EFI_IP_ADDRESS *Ip,
|
||||||
OUT EFI_MAC_ADDRESS* Mac
|
OUT EFI_MAC_ADDRESS *Mac
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -352,12 +350,12 @@ EmuSnpMcastIptoMac(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpNvdata(
|
EmuSnpNvdata (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN BOOLEAN ReadOrWrite,
|
IN BOOLEAN ReadOrWrite,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN OUT VOID* Buffer
|
IN OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -383,10 +381,10 @@ EmuSnpNvdata(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpGetStatus(
|
EmuSnpGetStatus (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
OUT UINT32* InterruptStatus,
|
OUT UINT32 *InterruptStatus,
|
||||||
OUT VOID** TxBuffer
|
OUT VOID **TxBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -420,14 +418,14 @@ EmuSnpGetStatus(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpTransmit(
|
EmuSnpTransmit (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
IN UINTN HeaderSize,
|
IN UINTN HeaderSize,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID* Buffer,
|
IN VOID *Buffer,
|
||||||
IN EFI_MAC_ADDRESS* SrcAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS* DestAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
IN UINT16* Protocol OPTIONAL
|
IN UINT16 *Protocol OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -462,21 +460,21 @@ EmuSnpTransmit(
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpReceive(
|
EmuSnpReceive (
|
||||||
IN EFI_SIMPLE_NETWORK_PROTOCOL* This,
|
IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
OUT UINTN* HeaderSize OPTIONAL,
|
OUT UINTN *HeaderSize OPTIONAL,
|
||||||
IN OUT UINTN* BuffSize,
|
IN OUT UINTN *BuffSize,
|
||||||
OUT VOID* Buffer,
|
OUT VOID *Buffer,
|
||||||
OUT EFI_MAC_ADDRESS* SourceAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *SourceAddr OPTIONAL,
|
||||||
OUT EFI_MAC_ADDRESS* DestinationAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *DestinationAddr OPTIONAL,
|
||||||
OUT UINT16* Protocol OPTIONAL
|
OUT UINT16 *Protocol OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSnpWaitForPacketNotify(
|
EmuSnpWaitForPacketNotify (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID* Private
|
IN VOID *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // _EMU_SNP_H_
|
#endif // _EMU_SNP_H_
|
||||||
|
@ -22,15 +22,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// EmuThunk Device Path Protocol Instance
|
// EmuThunk Device Path Protocol Instance
|
||||||
//
|
//
|
||||||
EMU_THUNK_DEVICE_PATH mEmuThunkDevicePath = {
|
EMU_THUNK_DEVICE_PATH mEmuThunkDevicePath = {
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
HARDWARE_DEVICE_PATH,
|
HARDWARE_DEVICE_PATH,
|
||||||
HW_VENDOR_DP,
|
HW_VENDOR_DP,
|
||||||
{
|
{
|
||||||
(UINT8) (sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
(UINT8)(sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
||||||
(UINT8) ((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
(UINT8)((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
EMU_THUNK_PROTOCOL_GUID
|
EMU_THUNK_PROTOCOL_GUID
|
||||||
@ -47,13 +47,13 @@ EMU_THUNK_DEVICE_PATH mEmuThunkDevicePath = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeEmuThunk (
|
InitializeEmuThunk (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -74,8 +74,10 @@ Returns:
|
|||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&Handle,
|
&Handle,
|
||||||
&gEmuThunkProtocolGuid, gEmuThunk,
|
&gEmuThunkProtocolGuid,
|
||||||
&gEfiDevicePathProtocolGuid, &mEmuThunkDevicePath,
|
gEmuThunk,
|
||||||
|
&gEfiDevicePathProtocolGuid,
|
||||||
|
&mEmuThunkDevicePath,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -18,9 +18,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeimInitializeFirmwareVolumePei (
|
PeimInitializeFirmwareVolumePei (
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -50,11 +51,11 @@ Returns:
|
|||||||
// Get the Fwh Information PPI
|
// Get the Fwh Information PPI
|
||||||
//
|
//
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid, // GUID
|
&gEmuThunkPpiGuid, // GUID
|
||||||
0, // INSTANCE
|
0, // INSTANCE
|
||||||
&PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR
|
&PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR
|
||||||
(VOID **)&Thunk // PPI
|
(VOID **)&Thunk // PPI
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
Index = 0;
|
Index = 0;
|
||||||
@ -67,7 +68,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Assume the FD starts with an FV header
|
// Assume the FD starts with an FV header
|
||||||
//
|
//
|
||||||
FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FdBase;
|
FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FdBase;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make an FV Hob for the first FV in the FD
|
// Make an FV Hob for the first FV in the FD
|
||||||
@ -85,19 +86,19 @@ Returns:
|
|||||||
(EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),
|
(EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),
|
||||||
FdBase,
|
FdBase,
|
||||||
(
|
(
|
||||||
FvHeader->FvLength +
|
FvHeader->FvLength +
|
||||||
PcdGet32 (PcdFlashNvStorageVariableSize) +
|
PcdGet32 (PcdFlashNvStorageVariableSize) +
|
||||||
PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
|
PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
|
||||||
PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
|
PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
|
||||||
PcdGet32 (PcdEmuFlashNvStorageEventLogSize)
|
PcdGet32 (PcdEmuFlashNvStorageEventLogSize)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Hard code the address of the spare block and variable services.
|
// Hard code the address of the spare block and variable services.
|
||||||
// Assume it's a hard coded offset from FV0 in FD0.
|
// Assume it's a hard coded offset from FV0 in FD0.
|
||||||
//
|
//
|
||||||
FdSize =
|
FdSize =
|
||||||
PcdGet32 (PcdFlashNvStorageVariableSize) +
|
PcdGet32 (PcdFlashNvStorageVariableSize) +
|
||||||
PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
|
PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
|
||||||
PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
|
PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
|
||||||
|
@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include "PiPei.h"
|
#include "PiPei.h"
|
||||||
|
|
||||||
#include <Guid/SystemNvDataGuid.h>
|
#include <Guid/SystemNvDataGuid.h>
|
||||||
@ -24,9 +23,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeimInitializeFlashMap (
|
PeimInitializeFlashMap (
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -54,11 +54,11 @@ Returns:
|
|||||||
// Get the Fwh Information PPI
|
// Get the Fwh Information PPI
|
||||||
//
|
//
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid, // GUID
|
&gEmuThunkPpiGuid, // GUID
|
||||||
0, // INSTANCE
|
0, // INSTANCE
|
||||||
&PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR
|
&PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR
|
||||||
(VOID **)&Thunk // PPI
|
(VOID **)&Thunk // PPI
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -25,11 +25,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "FwBlockService.h"
|
#include "FwBlockService.h"
|
||||||
|
|
||||||
ESAL_FWB_GLOBAL *mFvbModuleGlobal;
|
ESAL_FWB_GLOBAL *mFvbModuleGlobal;
|
||||||
|
|
||||||
#define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
|
#define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
|
||||||
|
|
||||||
EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate = {
|
EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate = {
|
||||||
FVB_DEVICE_SIGNATURE,
|
FVB_DEVICE_SIGNATURE,
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -67,14 +67,13 @@ EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbVirtualddressChangeEvent (
|
FvbVirtualddressChangeEvent (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -97,10 +96,10 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_INSTANCE *FwhInstance;
|
EFI_FW_VOL_INSTANCE *FwhInstance;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
EfiConvertPointer (0x0, (VOID **) &mFvbModuleGlobal->FvInstance[FVB_VIRTUAL]);
|
EfiConvertPointer (0x0, (VOID **)&mFvbModuleGlobal->FvInstance[FVB_VIRTUAL]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Convert the base address of all the instances
|
// Convert the base address of all the instances
|
||||||
@ -108,25 +107,26 @@ Returns:
|
|||||||
Index = 0;
|
Index = 0;
|
||||||
FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];
|
FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];
|
||||||
while (Index < mFvbModuleGlobal->NumFv) {
|
while (Index < mFvbModuleGlobal->NumFv) {
|
||||||
EfiConvertPointer (0x0, (VOID **) &FwhInstance->FvBase[FVB_VIRTUAL]);
|
EfiConvertPointer (0x0, (VOID **)&FwhInstance->FvBase[FVB_VIRTUAL]);
|
||||||
FwhInstance = (EFI_FW_VOL_INSTANCE *)
|
FwhInstance = (EFI_FW_VOL_INSTANCE *)
|
||||||
(
|
(
|
||||||
(UINTN) ((UINT8 *) FwhInstance) + FwhInstance->VolumeHeader.HeaderLength +
|
(UINTN)((UINT8 *)FwhInstance) + FwhInstance->VolumeHeader.HeaderLength +
|
||||||
(sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))
|
(sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))
|
||||||
);
|
);
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
EfiConvertPointer (0x0, (VOID **) &mFvbModuleGlobal);
|
EfiConvertPointer (0x0, (VOID **)&mFvbModuleGlobal);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetFvbInstance (
|
GetFvbInstance (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
OUT EFI_FW_VOL_INSTANCE **FwhInstance,
|
OUT EFI_FW_VOL_INSTANCE **FwhInstance,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -146,21 +146,22 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_INSTANCE *FwhRecord;
|
EFI_FW_VOL_INSTANCE *FwhRecord;
|
||||||
|
|
||||||
if (Instance >= Global->NumFv) {
|
if (Instance >= Global->NumFv) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find the right instance of the FVB private data
|
// Find the right instance of the FVB private data
|
||||||
//
|
//
|
||||||
FwhRecord = Global->FvInstance[Virtual];
|
FwhRecord = Global->FvInstance[Virtual];
|
||||||
while (Instance > 0) {
|
while (Instance > 0) {
|
||||||
FwhRecord = (EFI_FW_VOL_INSTANCE *)
|
FwhRecord = (EFI_FW_VOL_INSTANCE *)
|
||||||
(
|
(
|
||||||
(UINTN) ((UINT8 *) FwhRecord) + FwhRecord->VolumeHeader.HeaderLength +
|
(UINTN)((UINT8 *)FwhRecord) + FwhRecord->VolumeHeader.HeaderLength +
|
||||||
(sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))
|
(sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))
|
||||||
);
|
);
|
||||||
Instance--;
|
Instance--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,11 +172,12 @@ Returns:
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbGetPhysicalAddress (
|
FvbGetPhysicalAddress (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *Address,
|
OUT EFI_PHYSICAL_ADDRESS *Address,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -197,8 +199,8 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
|
EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find the right instance of the FVB private data
|
// Find the right instance of the FVB private data
|
||||||
@ -212,11 +214,12 @@ Returns:
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbGetVolumeAttributes (
|
FvbGetVolumeAttributes (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
|
OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -237,8 +240,8 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
|
EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find the right instance of the FVB private data
|
// Find the right instance of the FVB private data
|
||||||
@ -252,14 +255,15 @@ Returns:
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbGetLbaAddress (
|
FvbGetLbaAddress (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
OUT UINTN *LbaAddress,
|
OUT UINTN *LbaAddress,
|
||||||
OUT UINTN *LbaLength,
|
OUT UINTN *LbaLength,
|
||||||
OUT UINTN *NumOfBlocks,
|
OUT UINTN *NumOfBlocks,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -300,9 +304,9 @@ Returns:
|
|||||||
Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
|
Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
StartLba = 0;
|
StartLba = 0;
|
||||||
Offset = 0;
|
Offset = 0;
|
||||||
BlockMap = &(FwhInstance->VolumeHeader.BlockMap[0]);
|
BlockMap = &(FwhInstance->VolumeHeader.BlockMap[0]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Parse the blockmap of the FV to find which map entry the Lba belongs to
|
// Parse the blockmap of the FV to find which map entry the Lba belongs to
|
||||||
@ -311,7 +315,7 @@ Returns:
|
|||||||
NumBlocks = BlockMap->NumBlocks;
|
NumBlocks = BlockMap->NumBlocks;
|
||||||
BlockLength = BlockMap->Length;
|
BlockLength = BlockMap->Length;
|
||||||
|
|
||||||
if (NumBlocks == 0 || BlockLength == 0) {
|
if ((NumBlocks == 0) || (BlockLength == 0)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,8 +324,8 @@ Returns:
|
|||||||
//
|
//
|
||||||
// The map entry found
|
// The map entry found
|
||||||
//
|
//
|
||||||
if (Lba >= StartLba && Lba < NextLba) {
|
if ((Lba >= StartLba) && (Lba < NextLba)) {
|
||||||
Offset = Offset + (UINTN) MultU64x32 ((Lba - StartLba), BlockLength);
|
Offset = Offset + (UINTN)MultU64x32 ((Lba - StartLba), BlockLength);
|
||||||
if (LbaAddress != NULL) {
|
if (LbaAddress != NULL) {
|
||||||
*LbaAddress = FwhInstance->FvBase[Virtual] + Offset;
|
*LbaAddress = FwhInstance->FvBase[Virtual] + Offset;
|
||||||
}
|
}
|
||||||
@ -331,28 +335,29 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (NumOfBlocks != NULL) {
|
if (NumOfBlocks != NULL) {
|
||||||
*NumOfBlocks = (UINTN) (NextLba - Lba);
|
*NumOfBlocks = (UINTN)(NextLba - Lba);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
StartLba = NextLba;
|
StartLba = NextLba;
|
||||||
Offset = Offset + NumBlocks * BlockLength;
|
Offset = Offset + NumBlocks * BlockLength;
|
||||||
BlockMap++;
|
BlockMap++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbReadBlock (
|
FvbReadBlock (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN BlockOffset,
|
IN UINTN BlockOffset,
|
||||||
IN OUT UINTN *NumBytes,
|
IN OUT UINTN *NumBytes,
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -385,9 +390,9 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FVB_ATTRIBUTES_2 Attributes;
|
EFI_FVB_ATTRIBUTES_2 Attributes;
|
||||||
UINTN LbaAddress;
|
UINTN LbaAddress;
|
||||||
UINTN LbaLength;
|
UINTN LbaLength;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check for invalid conditions
|
// Check for invalid conditions
|
||||||
@ -404,6 +409,7 @@ Returns:
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check if the FV is read enabled
|
// Check if the FV is read enabled
|
||||||
//
|
//
|
||||||
@ -412,6 +418,7 @@ Returns:
|
|||||||
if ((Attributes & EFI_FVB2_READ_STATUS) == 0) {
|
if ((Attributes & EFI_FVB2_READ_STATUS) == 0) {
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Perform boundary checks and adjust NumBytes
|
// Perform boundary checks and adjust NumBytes
|
||||||
//
|
//
|
||||||
@ -420,25 +427,26 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (LbaLength < (*NumBytes + BlockOffset)) {
|
if (LbaLength < (*NumBytes + BlockOffset)) {
|
||||||
*NumBytes = (UINT32) (LbaLength - BlockOffset);
|
*NumBytes = (UINT32)(LbaLength - BlockOffset);
|
||||||
Status = EFI_BAD_BUFFER_SIZE;
|
Status = EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (Buffer, (UINT8 *) (LbaAddress + BlockOffset), (UINTN) (*NumBytes));
|
CopyMem (Buffer, (UINT8 *)(LbaAddress + BlockOffset), (UINTN)(*NumBytes));
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbWriteBlock (
|
FvbWriteBlock (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN BlockOffset,
|
IN UINTN BlockOffset,
|
||||||
IN OUT UINTN *NumBytes,
|
IN OUT UINTN *NumBytes,
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -470,9 +478,9 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FVB_ATTRIBUTES_2 Attributes;
|
EFI_FVB_ATTRIBUTES_2 Attributes;
|
||||||
UINTN LbaAddress;
|
UINTN LbaAddress;
|
||||||
UINTN LbaLength;
|
UINTN LbaLength;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check for invalid conditions
|
// Check for invalid conditions
|
||||||
@ -489,6 +497,7 @@ Returns:
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check if the FV is write enabled
|
// Check if the FV is write enabled
|
||||||
//
|
//
|
||||||
@ -497,6 +506,7 @@ Returns:
|
|||||||
if ((Attributes & EFI_FVB2_WRITE_STATUS) == 0) {
|
if ((Attributes & EFI_FVB2_WRITE_STATUS) == 0) {
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Perform boundary checks and adjust NumBytes
|
// Perform boundary checks and adjust NumBytes
|
||||||
//
|
//
|
||||||
@ -505,24 +515,26 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (LbaLength < (*NumBytes + BlockOffset)) {
|
if (LbaLength < (*NumBytes + BlockOffset)) {
|
||||||
*NumBytes = (UINT32) (LbaLength - BlockOffset);
|
*NumBytes = (UINT32)(LbaLength - BlockOffset);
|
||||||
Status = EFI_BAD_BUFFER_SIZE;
|
Status = EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Write data
|
// Write data
|
||||||
//
|
//
|
||||||
CopyMem ((UINT8 *) (LbaAddress + BlockOffset), Buffer, (UINTN) (*NumBytes));
|
CopyMem ((UINT8 *)(LbaAddress + BlockOffset), Buffer, (UINTN)(*NumBytes));
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbEraseBlock (
|
FvbEraseBlock (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -545,7 +557,6 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
|
|
||||||
EFI_FVB_ATTRIBUTES_2 Attributes;
|
EFI_FVB_ATTRIBUTES_2 Attributes;
|
||||||
UINTN LbaAddress;
|
UINTN LbaAddress;
|
||||||
UINTN LbaLength;
|
UINTN LbaLength;
|
||||||
@ -560,6 +571,7 @@ Returns:
|
|||||||
if ((Attributes & EFI_FVB2_WRITE_STATUS) == 0) {
|
if ((Attributes & EFI_FVB2_WRITE_STATUS) == 0) {
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the starting address of the block for erase.
|
// Get the starting address of the block for erase.
|
||||||
//
|
//
|
||||||
@ -575,18 +587,19 @@ Returns:
|
|||||||
Data = 0x0;
|
Data = 0x0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetMem ((UINT8 *) LbaAddress, LbaLength, Data);
|
SetMem ((UINT8 *)LbaAddress, LbaLength, Data);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbSetVolumeAttributes (
|
FvbSetVolumeAttributes (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
|
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -622,14 +635,13 @@ Returns:
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_FVB_ATTRIBUTES_2 UnchangedAttributes;
|
EFI_FVB_ATTRIBUTES_2 UnchangedAttributes;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find the right instance of the FVB private data
|
// Find the right instance of the FVB private data
|
||||||
//
|
//
|
||||||
Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
|
Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
AttribPtr = (EFI_FVB_ATTRIBUTES_2 *) &(FwhInstance->VolumeHeader.Attributes);
|
AttribPtr = (EFI_FVB_ATTRIBUTES_2 *)&(FwhInstance->VolumeHeader.Attributes);
|
||||||
OldAttributes = *AttribPtr;
|
OldAttributes = *AttribPtr;
|
||||||
Capabilities = OldAttributes & (EFI_FVB2_READ_DISABLED_CAP | \
|
Capabilities = OldAttributes & (EFI_FVB2_READ_DISABLED_CAP | \
|
||||||
EFI_FVB2_READ_ENABLED_CAP | \
|
EFI_FVB2_READ_ENABLED_CAP | \
|
||||||
@ -638,8 +650,8 @@ Returns:
|
|||||||
EFI_FVB2_LOCK_CAP \
|
EFI_FVB2_LOCK_CAP \
|
||||||
);
|
);
|
||||||
|
|
||||||
OldStatus = OldAttributes & EFI_FVB2_STATUS;
|
OldStatus = OldAttributes & EFI_FVB2_STATUS;
|
||||||
NewStatus = *Attributes & EFI_FVB2_STATUS;
|
NewStatus = *Attributes & EFI_FVB2_STATUS;
|
||||||
UnchangedAttributes = EFI_FVB2_READ_DISABLED_CAP | \
|
UnchangedAttributes = EFI_FVB2_READ_DISABLED_CAP | \
|
||||||
EFI_FVB2_READ_ENABLED_CAP | \
|
EFI_FVB2_READ_ENABLED_CAP | \
|
||||||
EFI_FVB2_WRITE_DISABLED_CAP | \
|
EFI_FVB2_WRITE_DISABLED_CAP | \
|
||||||
@ -667,6 +679,7 @@ Returns:
|
|||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test read disable
|
// Test read disable
|
||||||
//
|
//
|
||||||
@ -675,6 +688,7 @@ Returns:
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test read enable
|
// Test read enable
|
||||||
//
|
//
|
||||||
@ -683,6 +697,7 @@ Returns:
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test write disable
|
// Test write disable
|
||||||
//
|
//
|
||||||
@ -691,6 +706,7 @@ Returns:
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test write enable
|
// Test write enable
|
||||||
//
|
//
|
||||||
@ -699,6 +715,7 @@ Returns:
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test lock
|
// Test lock
|
||||||
//
|
//
|
||||||
@ -714,15 +731,17 @@ Returns:
|
|||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// FVB protocol APIs
|
// FVB protocol APIs
|
||||||
//
|
//
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolGetPhysicalAddress (
|
FvbProtocolGetPhysicalAddress (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *Address
|
OUT EFI_PHYSICAL_ADDRESS *Address
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -741,7 +760,7 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||||
|
|
||||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||||
|
|
||||||
@ -751,11 +770,12 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolGetBlockSize (
|
FvbProtocolGetBlockSize (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
OUT UINTN *BlockSize,
|
OUT UINTN *BlockSize,
|
||||||
OUT UINTN *NumOfBlocks
|
OUT UINTN *NumOfBlocks
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -777,27 +797,28 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||||
|
|
||||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||||
|
|
||||||
return FvbGetLbaAddress (
|
return FvbGetLbaAddress (
|
||||||
FvbDevice->Instance,
|
FvbDevice->Instance,
|
||||||
Lba,
|
Lba,
|
||||||
NULL,
|
NULL,
|
||||||
BlockSize,
|
BlockSize,
|
||||||
NumOfBlocks,
|
NumOfBlocks,
|
||||||
mFvbModuleGlobal,
|
mFvbModuleGlobal,
|
||||||
EfiGoneVirtual ()
|
EfiGoneVirtual ()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolGetAttributes (
|
FvbProtocolGetAttributes (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -812,7 +833,7 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||||
|
|
||||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||||
|
|
||||||
@ -822,9 +843,10 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolSetAttributes (
|
FvbProtocolSetAttributes (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -839,7 +861,7 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||||
|
|
||||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||||
|
|
||||||
@ -849,9 +871,10 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolEraseBlocks (
|
FvbProtocolEraseBlocks (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
...
|
...
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -877,17 +900,17 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||||
EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
|
EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
|
||||||
UINTN NumOfBlocks;
|
UINTN NumOfBlocks;
|
||||||
VA_LIST args;
|
VA_LIST args;
|
||||||
EFI_LBA StartingLba;
|
EFI_LBA StartingLba;
|
||||||
UINTN NumOfLba;
|
UINTN NumOfLba;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||||
|
|
||||||
Status = GetFvbInstance (FvbDevice->Instance, mFvbModuleGlobal, &FwhInstance, EfiGoneVirtual ());
|
Status = GetFvbInstance (FvbDevice->Instance, mFvbModuleGlobal, &FwhInstance, EfiGoneVirtual ());
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
NumOfBlocks = FwhInstance->NumOfBlocks;
|
NumOfBlocks = FwhInstance->NumOfBlocks;
|
||||||
@ -905,7 +928,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Check input parameters
|
// Check input parameters
|
||||||
//
|
//
|
||||||
if (NumOfLba == 0 || (StartingLba + NumOfLba) > NumOfBlocks) {
|
if ((NumOfLba == 0) || ((StartingLba + NumOfLba) > NumOfBlocks)) {
|
||||||
VA_END (args);
|
VA_END (args);
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
@ -932,7 +955,6 @@ Returns:
|
|||||||
StartingLba++;
|
StartingLba++;
|
||||||
NumOfLba--;
|
NumOfLba--;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
VA_END (args);
|
VA_END (args);
|
||||||
@ -943,12 +965,13 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolWrite (
|
FvbProtocolWrite (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN OUT UINTN *NumBytes,
|
IN OUT UINTN *NumBytes,
|
||||||
IN UINT8 *Buffer
|
IN UINT8 *Buffer
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -980,8 +1003,7 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
|
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
|
||||||
|
|
||||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||||
|
|
||||||
@ -991,12 +1013,13 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolRead (
|
FvbProtocolRead (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN OUT UINTN *NumBytes,
|
IN OUT UINTN *NumBytes,
|
||||||
IN UINT8 *Buffer
|
IN UINT8 *Buffer
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -1029,17 +1052,18 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
|
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
|
||||||
|
|
||||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||||
|
|
||||||
return FvbReadBlock (FvbDevice->Instance, Lba, Offset, NumBytes, Buffer, mFvbModuleGlobal, EfiGoneVirtual ());
|
return FvbReadBlock (FvbDevice->Instance, Lba, Offset, NumBytes, Buffer, mFvbModuleGlobal, EfiGoneVirtual ());
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ValidateFvHeader (
|
ValidateFvHeader (
|
||||||
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -1065,17 +1089,19 @@ Returns:
|
|||||||
//
|
//
|
||||||
if ((FwVolHeader->Revision != EFI_FVH_REVISION) ||
|
if ((FwVolHeader->Revision != EFI_FVH_REVISION) ||
|
||||||
(FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||
|
(FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||
|
||||||
(FwVolHeader->FvLength == ((UINTN) -1)) ||
|
(FwVolHeader->FvLength == ((UINTN)-1)) ||
|
||||||
((FwVolHeader->HeaderLength & 0x01) != 0)
|
((FwVolHeader->HeaderLength & 0x01) != 0)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verify the header checksum
|
// Verify the header checksum
|
||||||
//
|
//
|
||||||
HeaderLength = (UINT16) (FwVolHeader->HeaderLength / 2);
|
HeaderLength = (UINT16)(FwVolHeader->HeaderLength / 2);
|
||||||
Ptr = (UINT16 *) FwVolHeader;
|
Ptr = (UINT16 *)FwVolHeader;
|
||||||
Checksum = 0;
|
Checksum = 0;
|
||||||
while (HeaderLength > 0) {
|
while (HeaderLength > 0) {
|
||||||
Checksum = Checksum + (*Ptr);
|
Checksum = Checksum + (*Ptr);
|
||||||
HeaderLength--;
|
HeaderLength--;
|
||||||
@ -1092,9 +1118,10 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbInitialize (
|
FvbInitialize (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -1124,7 +1151,7 @@ Returns:
|
|||||||
UINTN NumOfBlocks;
|
UINTN NumOfBlocks;
|
||||||
EFI_PEI_HOB_POINTERS FvHob;
|
EFI_PEI_HOB_POINTERS FvHob;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the DXE services table
|
// Get the DXE services table
|
||||||
//
|
//
|
||||||
DxeServices = gDS;
|
DxeServices = gDS;
|
||||||
@ -1136,14 +1163,14 @@ Returns:
|
|||||||
Status = gBS->AllocatePool (
|
Status = gBS->AllocatePool (
|
||||||
EfiRuntimeServicesData,
|
EfiRuntimeServicesData,
|
||||||
sizeof (ESAL_FWB_GLOBAL),
|
sizeof (ESAL_FWB_GLOBAL),
|
||||||
(VOID**) &mFvbModuleGlobal
|
(VOID **)&mFvbModuleGlobal
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Calculate the total size for all firmware volume block instances
|
// Calculate the total size for all firmware volume block instances
|
||||||
//
|
//
|
||||||
BufferSize = 0;
|
BufferSize = 0;
|
||||||
|
|
||||||
FvHob.Raw = GetHobList ();
|
FvHob.Raw = GetHobList ();
|
||||||
while ((FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, FvHob.Raw)) != NULL) {
|
while ((FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, FvHob.Raw)) != NULL) {
|
||||||
@ -1165,7 +1192,7 @@ Returns:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) BaseAddress;
|
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)BaseAddress;
|
||||||
Status = ValidateFvHeader (FwVolHeader);
|
Status = ValidateFvHeader (FwVolHeader);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
@ -1179,7 +1206,7 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
BufferSize += (sizeof (EFI_FW_VOL_INSTANCE) + FwVolHeader->HeaderLength - sizeof (EFI_FIRMWARE_VOLUME_HEADER));
|
BufferSize += (sizeof (EFI_FW_VOL_INSTANCE) + FwVolHeader->HeaderLength - sizeof (EFI_FIRMWARE_VOLUME_HEADER));
|
||||||
FvHob.Raw = GET_NEXT_HOB (FvHob);
|
FvHob.Raw = GET_NEXT_HOB (FvHob);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1190,18 +1217,18 @@ Returns:
|
|||||||
Status = gBS->AllocatePool (
|
Status = gBS->AllocatePool (
|
||||||
EfiRuntimeServicesData,
|
EfiRuntimeServicesData,
|
||||||
BufferSize,
|
BufferSize,
|
||||||
(VOID**) &mFvbModuleGlobal->FvInstance[FVB_PHYSICAL]
|
(VOID **)&mFvbModuleGlobal->FvInstance[FVB_PHYSICAL]
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make a virtual copy of the FvInstance pointer.
|
// Make a virtual copy of the FvInstance pointer.
|
||||||
//
|
//
|
||||||
FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];
|
FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];
|
||||||
mFvbModuleGlobal->FvInstance[FVB_VIRTUAL] = FwhInstance;
|
mFvbModuleGlobal->FvInstance[FVB_VIRTUAL] = FwhInstance;
|
||||||
|
|
||||||
mFvbModuleGlobal->NumFv = 0;
|
mFvbModuleGlobal->NumFv = 0;
|
||||||
MaxLbaSize = 0;
|
MaxLbaSize = 0;
|
||||||
|
|
||||||
FvHob.Raw = GetHobList ();
|
FvHob.Raw = GetHobList ();
|
||||||
while (NULL != (FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, FvHob.Raw))) {
|
while (NULL != (FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, FvHob.Raw))) {
|
||||||
@ -1223,7 +1250,7 @@ Returns:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) BaseAddress;
|
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)BaseAddress;
|
||||||
Status = ValidateFvHeader (FwVolHeader);
|
Status = ValidateFvHeader (FwVolHeader);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
@ -1234,20 +1261,21 @@ Returns:
|
|||||||
FvHob.Raw = GET_NEXT_HOB (FvHob);
|
FvHob.Raw = GET_NEXT_HOB (FvHob);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Write healthy FV header back.
|
// Write healthy FV header back.
|
||||||
//
|
//
|
||||||
CopyMem (
|
CopyMem (
|
||||||
(VOID *) (UINTN) BaseAddress,
|
(VOID *)(UINTN)BaseAddress,
|
||||||
(VOID *) FwVolHeader,
|
(VOID *)FwVolHeader,
|
||||||
FwVolHeader->HeaderLength
|
FwVolHeader->HeaderLength
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
FwhInstance->FvBase[FVB_PHYSICAL] = (UINTN) BaseAddress;
|
FwhInstance->FvBase[FVB_PHYSICAL] = (UINTN)BaseAddress;
|
||||||
FwhInstance->FvBase[FVB_VIRTUAL] = (UINTN) BaseAddress;
|
FwhInstance->FvBase[FVB_VIRTUAL] = (UINTN)BaseAddress;
|
||||||
|
|
||||||
CopyMem ((UINTN *) &(FwhInstance->VolumeHeader), (UINTN *) FwVolHeader, FwVolHeader->HeaderLength);
|
CopyMem ((UINTN *)&(FwhInstance->VolumeHeader), (UINTN *)FwVolHeader, FwVolHeader->HeaderLength);
|
||||||
FwVolHeader = &(FwhInstance->VolumeHeader);
|
FwVolHeader = &(FwhInstance->VolumeHeader);
|
||||||
EfiInitializeLock (&(FwhInstance->FvbDevLock), TPL_HIGH_LEVEL);
|
EfiInitializeLock (&(FwhInstance->FvbDevLock), TPL_HIGH_LEVEL);
|
||||||
|
|
||||||
@ -1265,6 +1293,7 @@ Returns:
|
|||||||
|
|
||||||
NumOfBlocks = NumOfBlocks + PtrBlockMapEntry->NumBlocks;
|
NumOfBlocks = NumOfBlocks + PtrBlockMapEntry->NumBlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// The total number of blocks in the FV.
|
// The total number of blocks in the FV.
|
||||||
//
|
//
|
||||||
@ -1276,7 +1305,7 @@ Returns:
|
|||||||
Status = gBS->AllocatePool (
|
Status = gBS->AllocatePool (
|
||||||
EfiRuntimeServicesData,
|
EfiRuntimeServicesData,
|
||||||
sizeof (EFI_FW_VOL_BLOCK_DEVICE),
|
sizeof (EFI_FW_VOL_BLOCK_DEVICE),
|
||||||
(VOID**) &FvbDevice
|
(VOID **)&FvbDevice
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
@ -1294,7 +1323,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Find a handle with a matching device path that has supports FW Block protocol
|
// Find a handle with a matching device path that has supports FW Block protocol
|
||||||
//
|
//
|
||||||
TempFwbDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) &TempFvbDevicePathData;
|
TempFwbDevicePath = (EFI_DEVICE_PATH_PROTOCOL *)&TempFvbDevicePathData;
|
||||||
CopyMem (TempFwbDevicePath, &FvbDevice->DevicePath, sizeof (FV_DEVICE_PATH));
|
CopyMem (TempFwbDevicePath, &FvbDevice->DevicePath, sizeof (FV_DEVICE_PATH));
|
||||||
Status = gBS->LocateDevicePath (&gEfiFirmwareVolumeBlockProtocolGuid, &TempFwbDevicePath, &FwbHandle);
|
Status = gBS->LocateDevicePath (&gEfiFirmwareVolumeBlockProtocolGuid, &TempFwbDevicePath, &FwbHandle);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -1302,14 +1331,14 @@ Returns:
|
|||||||
// LocateDevicePath fails so install a new interface and device path
|
// LocateDevicePath fails so install a new interface and device path
|
||||||
//
|
//
|
||||||
FwbHandle = NULL;
|
FwbHandle = NULL;
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&FwbHandle,
|
&FwbHandle,
|
||||||
&gEfiFirmwareVolumeBlockProtocolGuid,
|
&gEfiFirmwareVolumeBlockProtocolGuid,
|
||||||
&FvbDevice->FwVolBlockInstance,
|
&FvbDevice->FwVolBlockInstance,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
&FvbDevice->DevicePath,
|
&FvbDevice->DevicePath,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
} else if (IsDevicePathEnd (TempFwbDevicePath)) {
|
} else if (IsDevicePathEnd (TempFwbDevicePath)) {
|
||||||
//
|
//
|
||||||
@ -1318,7 +1347,7 @@ Returns:
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
FwbHandle,
|
FwbHandle,
|
||||||
&gEfiFirmwareVolumeBlockProtocolGuid,
|
&gEfiFirmwareVolumeBlockProtocolGuid,
|
||||||
(VOID**)&OldFwbInterface
|
(VOID **)&OldFwbInterface
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
@ -1329,7 +1358,6 @@ Returns:
|
|||||||
&FvbDevice->FwVolBlockInstance
|
&FvbDevice->FwVolBlockInstance
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// There was a FVB protocol on an End Device Path node
|
// There was a FVB protocol on an End Device Path node
|
||||||
@ -1338,10 +1366,10 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
FwhInstance = (EFI_FW_VOL_INSTANCE *)
|
FwhInstance = (EFI_FW_VOL_INSTANCE *)
|
||||||
(
|
(
|
||||||
(UINTN) ((UINT8 *) FwhInstance) + FwVolHeader->HeaderLength +
|
(UINTN)((UINT8 *)FwhInstance) + FwVolHeader->HeaderLength +
|
||||||
(sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))
|
(sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))
|
||||||
);
|
);
|
||||||
|
|
||||||
FvHob.Raw = GET_NEXT_HOB (FvHob);
|
FvHob.Raw = GET_NEXT_HOB (FvHob);
|
||||||
}
|
}
|
||||||
|
@ -31,14 +31,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/DevicePathLib.h>
|
#include <Library/DevicePathLib.h>
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 FvLength;
|
UINT64 FvLength;
|
||||||
EFI_FIRMWARE_VOLUME_HEADER FvbInfo;
|
EFI_FIRMWARE_VOLUME_HEADER FvbInfo;
|
||||||
//
|
//
|
||||||
// EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0
|
// EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0
|
||||||
//
|
//
|
||||||
EFI_FV_BLOCK_MAP_ENTRY End[1];
|
EFI_FV_BLOCK_MAP_ENTRY End[1];
|
||||||
} EFI_FVB_MEDIA_INFO;
|
} EFI_FVB_MEDIA_INFO;
|
||||||
|
|
||||||
EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
|
EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
|
||||||
@ -55,10 +54,10 @@ EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
|
|||||||
FixedPcdGet32 (PcdEmuFlashFvRecoverySize),
|
FixedPcdGet32 (PcdEmuFlashFvRecoverySize),
|
||||||
EFI_FVH_SIGNATURE,
|
EFI_FVH_SIGNATURE,
|
||||||
EFI_FVB2_READ_ENABLED_CAP |
|
EFI_FVB2_READ_ENABLED_CAP |
|
||||||
EFI_FVB2_READ_STATUS |
|
EFI_FVB2_READ_STATUS |
|
||||||
EFI_FVB2_WRITE_ENABLED_CAP |
|
EFI_FVB2_WRITE_ENABLED_CAP |
|
||||||
EFI_FVB2_WRITE_STATUS |
|
EFI_FVB2_WRITE_STATUS |
|
||||||
EFI_FVB2_ERASE_POLARITY,
|
EFI_FVB2_ERASE_POLARITY,
|
||||||
sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
|
sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
|
||||||
0, // CheckSum
|
0, // CheckSum
|
||||||
0, // ExtHeaderOffset
|
0, // ExtHeaderOffset
|
||||||
@ -99,10 +98,10 @@ EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
|
|||||||
FixedPcdGet32 (PcdEmuFlashNvStorageEventLogSize),
|
FixedPcdGet32 (PcdEmuFlashNvStorageEventLogSize),
|
||||||
EFI_FVH_SIGNATURE,
|
EFI_FVH_SIGNATURE,
|
||||||
EFI_FVB2_READ_ENABLED_CAP |
|
EFI_FVB2_READ_ENABLED_CAP |
|
||||||
EFI_FVB2_READ_STATUS |
|
EFI_FVB2_READ_STATUS |
|
||||||
EFI_FVB2_WRITE_ENABLED_CAP |
|
EFI_FVB2_WRITE_ENABLED_CAP |
|
||||||
EFI_FVB2_WRITE_STATUS |
|
EFI_FVB2_WRITE_STATUS |
|
||||||
EFI_FVB2_ERASE_POLARITY,
|
EFI_FVB2_ERASE_POLARITY,
|
||||||
sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
|
sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
|
||||||
0, // CheckSum
|
0, // CheckSum
|
||||||
0, // ExtHeaderOffset
|
0, // ExtHeaderOffset
|
||||||
@ -113,9 +112,9 @@ EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
(FixedPcdGet32 (PcdFlashNvStorageVariableSize) + \
|
(FixedPcdGet32 (PcdFlashNvStorageVariableSize) + \
|
||||||
FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) + \
|
FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) + \
|
||||||
FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) + \
|
FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) + \
|
||||||
FixedPcdGet32 (PcdEmuFlashNvStorageEventLogSize)) / FixedPcdGet32 (PcdEmuFirmwareBlockSize),
|
FixedPcdGet32 (PcdEmuFlashNvStorageEventLogSize)) / FixedPcdGet32 (PcdEmuFirmwareBlockSize),
|
||||||
FixedPcdGet32 (PcdEmuFirmwareBlockSize),
|
FixedPcdGet32 (PcdEmuFirmwareBlockSize),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,11 +130,11 @@ EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetFvbInfo (
|
GetFvbInfo (
|
||||||
IN UINT64 FvLength,
|
IN UINT64 FvLength,
|
||||||
OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
|
OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
for (Index = 0; Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO); Index += 1) {
|
for (Index = 0; Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO); Index += 1) {
|
||||||
if (mPlatformFvbMediaInfo[Index].FvLength == FvLength) {
|
if (mPlatformFvbMediaInfo[Index].FvLength == FvLength) {
|
||||||
|
@ -17,15 +17,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define FVB_VIRTUAL 1
|
#define FVB_VIRTUAL 1
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_LOCK FvbDevLock;
|
EFI_LOCK FvbDevLock;
|
||||||
UINTN FvBase[2];
|
UINTN FvBase[2];
|
||||||
UINTN NumOfBlocks;
|
UINTN NumOfBlocks;
|
||||||
EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;
|
EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;
|
||||||
} EFI_FW_VOL_INSTANCE;
|
} EFI_FW_VOL_INSTANCE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 NumFv;
|
UINT32 NumFv;
|
||||||
EFI_FW_VOL_INSTANCE *FvInstance[2];
|
EFI_FW_VOL_INSTANCE *FvInstance[2];
|
||||||
} ESAL_FWB_GLOBAL;
|
} ESAL_FWB_GLOBAL;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -33,113 +33,112 @@ typedef struct {
|
|||||||
//
|
//
|
||||||
#define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
|
#define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
|
||||||
#define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
|
#define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
|
||||||
#define FVB_DEVICE_SIGNATURE SIGNATURE_32 ('F', 'V', 'B', 'N')
|
#define FVB_DEVICE_SIGNATURE SIGNATURE_32 ('F', 'V', 'B', 'N')
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
MEMMAP_DEVICE_PATH MemMapDevPath;
|
MEMMAP_DEVICE_PATH MemMapDevPath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL EndDevPath;
|
EFI_DEVICE_PATH_PROTOCOL EndDevPath;
|
||||||
} FV_DEVICE_PATH;
|
} FV_DEVICE_PATH;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
FV_DEVICE_PATH DevicePath;
|
FV_DEVICE_PATH DevicePath;
|
||||||
UINTN Instance;
|
UINTN Instance;
|
||||||
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
|
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
|
||||||
} EFI_FW_VOL_BLOCK_DEVICE;
|
} EFI_FW_VOL_BLOCK_DEVICE;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetFvbInfo (
|
GetFvbInfo (
|
||||||
IN UINT64 FvLength,
|
IN UINT64 FvLength,
|
||||||
OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
|
OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbReadBlock (
|
FvbReadBlock (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN BlockOffset,
|
IN UINTN BlockOffset,
|
||||||
IN OUT UINTN *NumBytes,
|
IN OUT UINTN *NumBytes,
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbWriteBlock (
|
FvbWriteBlock (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN BlockOffset,
|
IN UINTN BlockOffset,
|
||||||
IN OUT UINTN *NumBytes,
|
IN OUT UINTN *NumBytes,
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbEraseBlock (
|
FvbEraseBlock (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbSetVolumeAttributes (
|
FvbSetVolumeAttributes (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
|
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbGetVolumeAttributes (
|
FvbGetVolumeAttributes (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
|
OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbGetPhysicalAddress (
|
FvbGetPhysicalAddress (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *Address,
|
OUT EFI_PHYSICAL_ADDRESS *Address,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbInitialize (
|
FvbInitialize (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbClassAddressChangeEvent (
|
FvbClassAddressChangeEvent (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
FvbGetLbaAddress (
|
FvbGetLbaAddress (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
OUT UINTN *LbaAddress,
|
OUT UINTN *LbaAddress,
|
||||||
OUT UINTN *LbaLength,
|
OUT UINTN *LbaLength,
|
||||||
OUT UINTN *NumOfBlocks,
|
OUT UINTN *NumOfBlocks,
|
||||||
IN ESAL_FWB_GLOBAL *Global,
|
IN ESAL_FWB_GLOBAL *Global,
|
||||||
IN BOOLEAN Virtual
|
IN BOOLEAN Virtual
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -149,63 +148,63 @@ FvbGetLbaAddress (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolGetAttributes (
|
FvbProtocolGetAttributes (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolSetAttributes (
|
FvbProtocolSetAttributes (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolGetPhysicalAddress (
|
FvbProtocolGetPhysicalAddress (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *Address
|
OUT EFI_PHYSICAL_ADDRESS *Address
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolGetBlockSize (
|
FvbProtocolGetBlockSize (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
OUT UINTN *BlockSize,
|
OUT UINTN *BlockSize,
|
||||||
OUT UINTN *NumOfBlocks
|
OUT UINTN *NumOfBlocks
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolRead (
|
FvbProtocolRead (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN OUT UINTN *NumBytes,
|
IN OUT UINTN *NumBytes,
|
||||||
IN UINT8 *Buffer
|
IN UINT8 *Buffer
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolWrite (
|
FvbProtocolWrite (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN OUT UINTN *NumBytes,
|
IN OUT UINTN *NumBytes,
|
||||||
IN UINT8 *Buffer
|
IN UINT8 *Buffer
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FvbProtocolEraseBlocks (
|
FvbProtocolEraseBlocks (
|
||||||
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
|
||||||
...
|
...
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
@ -13,6 +13,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define EFI_EMU_PHYSICAL_DISK_GUID \
|
#define EFI_EMU_PHYSICAL_DISK_GUID \
|
||||||
{ 0xf2ba331a, 0x8985, 0x11db, { 0xa4, 0x06, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } }
|
{ 0xf2ba331a, 0x8985, 0x11db, { 0xa4, 0x06, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } }
|
||||||
|
|
||||||
extern EFI_GUID gEmuPhysicalDisksGuid;
|
extern EFI_GUID gEmuPhysicalDisksGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -13,18 +13,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define EFI_EMU_SYSTEM_CONFIG_GUID \
|
#define EFI_EMU_SYSTEM_CONFIG_GUID \
|
||||||
{ 0x9C4FB516, 0x3A1E, 0xD847, { 0xA1, 0xA1, 0x70, 0x58, 0xB6, 0x98, 0x67, 0x32 } }
|
{ 0x9C4FB516, 0x3A1E, 0xD847, { 0xA1, 0xA1, 0x70, 0x58, 0xB6, 0x98, 0x67, 0x32 } }
|
||||||
|
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
//
|
//
|
||||||
// Console output mode
|
// Console output mode
|
||||||
//
|
//
|
||||||
UINT32 ConOutColumn;
|
UINT32 ConOutColumn;
|
||||||
UINT32 ConOutRow;
|
UINT32 ConOutRow;
|
||||||
} EMU_SYSTEM_CONFIGURATION;
|
} EMU_SYSTEM_CONFIGURATION;
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
extern EFI_GUID gEmuSystemConfigGuid;
|
||||||
extern EFI_GUID gEmuSystemConfigGuid;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -13,6 +13,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define EFI_EMU_VIRTUAL_DISK_GUID \
|
#define EFI_EMU_VIRTUAL_DISK_GUID \
|
||||||
{ 0xf2ba331a, 0x8985, 0x11db, { 0xa4, 0x06, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } }
|
{ 0xf2ba331a, 0x8985, 0x11db, { 0xa4, 0x06, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } }
|
||||||
|
|
||||||
extern EFI_GUID gEmuVirtualDisksGuid;
|
extern EFI_GUID gEmuVirtualDisksGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,15 +18,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
// Used by PEI Core and PEIMs to store the PEI Services pointer.
|
// Used by PEI Core and PEIMs to store the PEI Services pointer.
|
||||||
// Privilege issues prevent using the PI mechanism in the emulator.
|
// Privilege issues prevent using the PI mechanism in the emulator.
|
||||||
CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
|
CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
|
||||||
|
|
||||||
// Used by SecPeiServicesLib
|
// Used by SecPeiServicesLib
|
||||||
EFI_PEI_PPI_DESCRIPTOR *PpiList;
|
EFI_PEI_PPI_DESCRIPTOR *PpiList;
|
||||||
|
|
||||||
// Needed by PEI PEI PeCoffLoaderExtraActionLib
|
// Needed by PEI PEI PeCoffLoaderExtraActionLib
|
||||||
EMU_THUNK_PROTOCOL *Thunk;
|
EMU_THUNK_PROTOCOL *Thunk;
|
||||||
} EMU_MAGIC_PAGE_LAYOUT;
|
} EMU_MAGIC_PAGE_LAYOUT;
|
||||||
|
|
||||||
#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
|
#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,9 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <Protocol/EmuThunk.h>
|
#include <Protocol/EmuThunk.h>
|
||||||
|
|
||||||
|
extern EMU_THUNK_PROTOCOL *gEmuThunk;
|
||||||
extern EMU_THUNK_PROTOCOL *gEmuThunk;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Serach the EMU IO Thunk database for a matching EMU IO Thunk
|
Serach the EMU IO Thunk database for a matching EMU IO Thunk
|
||||||
@ -32,5 +30,4 @@ GetIoThunkInstance (
|
|||||||
IN UINTN Instance
|
IN UINTN Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <Protocol/SimpleTextInEx.h>
|
#include <Protocol/SimpleTextInEx.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
KeyMapMake gets called on key presses.
|
KeyMapMake gets called on key presses.
|
||||||
|
|
||||||
@ -19,7 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
KeyMapMake (
|
KeyMapMake (
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -33,5 +32,5 @@ KeyMapMake (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
KeyMapBreak (
|
KeyMapBreak (
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
|
@ -8,8 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef __PPI_LIST_LIB_H__
|
#ifndef __PPI_LIST_LIB_H__
|
||||||
#define __PPI_LIST_LIB_H__
|
#define __PPI_LIST_LIB_H__
|
||||||
|
|
||||||
|
|
||||||
extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
|
extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,12 +15,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <IndustryStandard/SmBios.h>
|
#include <IndustryStandard/SmBios.h>
|
||||||
#include <Protocol/Smbios.h>
|
#include <Protocol/Smbios.h>
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Cache copy of the SMBIOS Protocol pointer
|
/// Cache copy of the SMBIOS Protocol pointer
|
||||||
///
|
///
|
||||||
extern EFI_SMBIOS_PROTOCOL *gSmbios;
|
extern EFI_SMBIOS_PROTOCOL *gSmbios;
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Template for SMBIOS table initialization.
|
/// Template for SMBIOS table initialization.
|
||||||
@ -38,7 +36,6 @@ typedef struct {
|
|||||||
CHAR8 **StringArray;
|
CHAR8 **StringArray;
|
||||||
} SMBIOS_TEMPLATE_ENTRY;
|
} SMBIOS_TEMPLATE_ENTRY;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
|
Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
|
||||||
entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
|
entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
|
||||||
@ -51,11 +48,9 @@ typedef struct {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibInitializeFromTemplate (
|
SmbiosLibInitializeFromTemplate (
|
||||||
IN SMBIOS_TEMPLATE_ENTRY *Template
|
IN SMBIOS_TEMPLATE_ENTRY *Template
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create SMBIOS record.
|
Create SMBIOS record.
|
||||||
|
|
||||||
@ -88,11 +83,10 @@ SmbiosLibInitializeFromTemplate (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibCreateEntry (
|
SmbiosLibCreateEntry (
|
||||||
IN SMBIOS_STRUCTURE *SmbiosEntry,
|
IN SMBIOS_STRUCTURE *SmbiosEntry,
|
||||||
IN CHAR8 **StringArray
|
IN CHAR8 **StringArray
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Update the string associated with an existing SMBIOS record.
|
Update the string associated with an existing SMBIOS record.
|
||||||
|
|
||||||
@ -111,9 +105,9 @@ SmbiosLibCreateEntry (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibUpdateString (
|
SmbiosLibUpdateString (
|
||||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||||
IN SMBIOS_TABLE_STRING StringNumber,
|
IN SMBIOS_TABLE_STRING StringNumber,
|
||||||
IN CHAR8 *String
|
IN CHAR8 *String
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -134,9 +128,9 @@ SmbiosLibUpdateString (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibUpdateUnicodeString (
|
SmbiosLibUpdateUnicodeString (
|
||||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||||
IN SMBIOS_TABLE_STRING StringNumber,
|
IN SMBIOS_TABLE_STRING StringNumber,
|
||||||
IN CHAR16 *String
|
IN CHAR16 *String
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,7 +149,6 @@ SmbiosLibReadString (
|
|||||||
IN EFI_SMBIOS_STRING StringNumber
|
IN EFI_SMBIOS_STRING StringNumber
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
|
Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
|
||||||
|
|
||||||
@ -169,9 +162,9 @@ SmbiosLibReadString (
|
|||||||
SMBIOS_STRUCTURE *
|
SMBIOS_STRUCTURE *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibGetRecord (
|
SmbiosLibGetRecord (
|
||||||
IN EFI_SMBIOS_TYPE Type,
|
IN EFI_SMBIOS_TYPE Type,
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
OUT EFI_SMBIOS_HANDLE *SmbiosHandle
|
OUT EFI_SMBIOS_HANDLE *SmbiosHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,10 +180,7 @@ SmbiosLibGetRecord (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibRemove (
|
SmbiosLibRemove (
|
||||||
OUT EFI_SMBIOS_HANDLE SmbiosHandle
|
OUT EFI_SMBIOS_HANDLE SmbiosHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,13 +9,11 @@
|
|||||||
|
|
||||||
#include <PiPei.h>
|
#include <PiPei.h>
|
||||||
|
|
||||||
|
|
||||||
EFI_PEI_PPI_DESCRIPTOR *
|
EFI_PEI_PPI_DESCRIPTOR *
|
||||||
GetThunkPpiList (
|
GetThunkPpiList (
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
AddThunkPpi (
|
AddThunkPpi (
|
||||||
@ -23,5 +21,3 @@ AddThunkPpi (
|
|||||||
IN EFI_GUID *Guid,
|
IN EFI_GUID *Guid,
|
||||||
IN VOID *Ppi
|
IN VOID *Ppi
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,20 +10,17 @@
|
|||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
#include <Protocol/EmuIoThunk.h>
|
#include <Protocol/EmuIoThunk.h>
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
AddThunkProtocol (
|
AddThunkProtocol (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *ThunkIo,
|
IN EMU_IO_THUNK_PROTOCOL *ThunkIo,
|
||||||
IN CHAR16 *ConfigString,
|
IN CHAR16 *ConfigString,
|
||||||
IN BOOLEAN EmuBusDriver
|
IN BOOLEAN EmuBusDriver
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetNextThunkProtocol (
|
GetNextThunkProtocol (
|
||||||
IN BOOLEAN EmuBusDriver,
|
IN BOOLEAN EmuBusDriver,
|
||||||
OUT EMU_IO_THUNK_PROTOCOL **Instance
|
OUT EMU_IO_THUNK_PROTOCOL **Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,8 +13,6 @@
|
|||||||
#define EMU_THUNK_PPI_GUID \
|
#define EMU_THUNK_PPI_GUID \
|
||||||
{ 0xB958B78C, 0x1D3E, 0xEE40, { 0x8B, 0xF4, 0xF0, 0x63, 0x2D, 0x06, 0x39, 0x16 } }
|
{ 0xB958B78C, 0x1D3E, 0xEE40, { 0x8B, 0xF4, 0xF0, 0x63, 0x2D, 0x06, 0x39, 0x16 } }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -33,13 +31,12 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_PEI_AUTOSCAN) (
|
(EFIAPI *EMU_PEI_AUTOSCAN)(
|
||||||
IN UINTN Index,
|
IN UINTN Index,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *MemoryBase,
|
OUT EFI_PHYSICAL_ADDRESS *MemoryBase,
|
||||||
OUT UINT64 *MemorySize
|
OUT UINT64 *MemorySize
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -59,14 +56,13 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_PEI_FD_INFORMATION) (
|
(EFIAPI *EMU_PEI_FD_INFORMATION)(
|
||||||
IN UINTN Index,
|
IN UINTN Index,
|
||||||
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
|
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
|
||||||
IN OUT UINT64 *FdSize,
|
IN OUT UINT64 *FdSize,
|
||||||
IN OUT EFI_PHYSICAL_ADDRESS *FixUp
|
IN OUT EFI_PHYSICAL_ADDRESS *FixUp
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -78,12 +74,10 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
VOID *
|
VOID *
|
||||||
(EFIAPI *EMU_PEI_THUNK_INTERFACE) (
|
(EFIAPI *EMU_PEI_THUNK_INTERFACE)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -102,20 +96,19 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_PEI_LOAD_FILE) (
|
(EFIAPI *EMU_PEI_LOAD_FILE)(
|
||||||
VOID *Pe32Data,
|
VOID *Pe32Data,
|
||||||
EFI_PHYSICAL_ADDRESS *ImageAddress,
|
EFI_PHYSICAL_ADDRESS *ImageAddress,
|
||||||
UINT64 *ImageSize,
|
UINT64 *ImageSize,
|
||||||
EFI_PHYSICAL_ADDRESS *EntryPoint
|
EFI_PHYSICAL_ADDRESS *EntryPoint
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EMU_PEI_AUTOSCAN MemoryAutoScan;
|
EMU_PEI_AUTOSCAN MemoryAutoScan;
|
||||||
EMU_PEI_FD_INFORMATION FirmwareDevices;
|
EMU_PEI_FD_INFORMATION FirmwareDevices;
|
||||||
EMU_PEI_THUNK_INTERFACE Thunk;
|
EMU_PEI_THUNK_INTERFACE Thunk;
|
||||||
} EMU_THUNK_PPI;
|
} EMU_THUNK_PPI;
|
||||||
|
|
||||||
extern EFI_GUID gEmuThunkPpiGuid;
|
extern EFI_GUID gEmuThunkPpiGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,9 +19,7 @@
|
|||||||
#define EMU_BLOCK_IO_PROTOCOL_GUID \
|
#define EMU_BLOCK_IO_PROTOCOL_GUID \
|
||||||
{ 0x6888A4AE, 0xAFCE, 0xE84B, { 0x91, 0x02, 0xF7, 0xB9, 0xDA, 0xE6, 0xA0, 0x30 } }
|
{ 0x6888A4AE, 0xAFCE, 0xE84B, { 0x91, 0x02, 0xF7, 0xB9, 0xDA, 0xE6, 0xA0, 0x30 } }
|
||||||
|
|
||||||
typedef struct _EMU_BLOCK_IO_PROTOCOL EMU_BLOCK_IO_PROTOCOL;
|
typedef struct _EMU_BLOCK_IO_PROTOCOL EMU_BLOCK_IO_PROTOCOL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reset the block device hardware.
|
Reset the block device hardware.
|
||||||
@ -38,7 +36,7 @@ typedef struct _EMU_BLOCK_IO_PROTOCOL EMU_BLOCK_IO_PROTOCOL;
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_BLOCK_RESET) (
|
(EFIAPI *EMU_BLOCK_RESET)(
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
);
|
);
|
||||||
@ -78,13 +76,13 @@ EFI_STATUS
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_BLOCK_READ) (
|
(EFIAPI *EMU_BLOCK_READ)(
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN UINT32 MediaId,
|
IN UINT32 MediaId,
|
||||||
IN EFI_LBA LBA,
|
IN EFI_LBA LBA,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -120,7 +118,7 @@ EFI_STATUS
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_BLOCK_WRITE) (
|
(EFIAPI *EMU_BLOCK_WRITE)(
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN UINT32 MediaId,
|
IN UINT32 MediaId,
|
||||||
IN EFI_LBA LBA,
|
IN EFI_LBA LBA,
|
||||||
@ -153,34 +151,31 @@ EFI_STATUS
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_BLOCK_FLUSH) (
|
(EFIAPI *EMU_BLOCK_FLUSH)(
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_BLOCK_CREATE_MAPPING) (
|
(EFIAPI *EMU_BLOCK_CREATE_MAPPING)(
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN EFI_BLOCK_IO_MEDIA *Media
|
IN EFI_BLOCK_IO_MEDIA *Media
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// The Block I/O2 protocol defines an extension to the Block I/O protocol which
|
/// The Block I/O2 protocol defines an extension to the Block I/O protocol which
|
||||||
/// enables the ability to read and write data at a block level in a non-blocking
|
/// enables the ability to read and write data at a block level in a non-blocking
|
||||||
// manner.
|
// manner.
|
||||||
///
|
///
|
||||||
struct _EMU_BLOCK_IO_PROTOCOL {
|
struct _EMU_BLOCK_IO_PROTOCOL {
|
||||||
EMU_BLOCK_RESET Reset;
|
EMU_BLOCK_RESET Reset;
|
||||||
EMU_BLOCK_READ ReadBlocks;
|
EMU_BLOCK_READ ReadBlocks;
|
||||||
EMU_BLOCK_WRITE WriteBlocks;
|
EMU_BLOCK_WRITE WriteBlocks;
|
||||||
EMU_BLOCK_FLUSH FlushBlocks;
|
EMU_BLOCK_FLUSH FlushBlocks;
|
||||||
EMU_BLOCK_CREATE_MAPPING CreateMapping;
|
EMU_BLOCK_CREATE_MAPPING CreateMapping;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern EFI_GUID gEmuBlockIoProtocolGuid;
|
extern EFI_GUID gEmuBlockIoProtocolGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -55,36 +55,34 @@ EFI_STATUS
|
|||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
|
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE)(
|
||||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||||
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
|
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK)(
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
|
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY)(
|
||||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
|
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN SourceX;
|
UINTN SourceX;
|
||||||
UINTN SourceY;
|
UINTN SourceY;
|
||||||
UINTN DestinationX;
|
UINTN DestinationX;
|
||||||
UINTN DestinationY;
|
UINTN DestinationY;
|
||||||
UINTN Width;
|
UINTN Width;
|
||||||
UINTN Height;
|
UINTN Height;
|
||||||
UINTN Delta;
|
UINTN Delta;
|
||||||
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
|
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
@ -98,7 +96,7 @@ EFI_STATUS
|
|||||||
|
|
||||||
typedef
|
typedef
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
|
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED)(
|
||||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
@ -117,18 +115,17 @@ EFI_STATUS
|
|||||||
);
|
);
|
||||||
|
|
||||||
struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
|
struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
|
||||||
EMU_GRAPHICS_WINDOWS_SIZE Size;
|
EMU_GRAPHICS_WINDOWS_SIZE Size;
|
||||||
EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
|
EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
|
||||||
EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
|
EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
|
||||||
EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
|
EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
|
||||||
EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
|
EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
|
||||||
EMU_GRAPHICS_WINDOWS_BLT Blt;
|
EMU_GRAPHICS_WINDOWS_BLT Blt;
|
||||||
EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
|
EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
|
||||||
EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
|
EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
|
||||||
EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
|
EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
|
||||||
extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -48,37 +48,35 @@ EFI_STATUS
|
|||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
|
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE)(
|
||||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||||
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
|
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK)(
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
|
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY)(
|
||||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
|
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
|
||||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
|
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN SourceX;
|
UINTN SourceX;
|
||||||
UINTN SourceY;
|
UINTN SourceY;
|
||||||
UINTN DestinationX;
|
UINTN DestinationX;
|
||||||
UINTN DestinationY;
|
UINTN DestinationY;
|
||||||
UINTN Width;
|
UINTN Width;
|
||||||
UINTN Height;
|
UINTN Height;
|
||||||
UINTN Delta;
|
UINTN Delta;
|
||||||
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
|
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
@ -92,7 +90,7 @@ EFI_STATUS
|
|||||||
|
|
||||||
typedef
|
typedef
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
|
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED)(
|
||||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
@ -111,18 +109,17 @@ EFI_STATUS
|
|||||||
);
|
);
|
||||||
|
|
||||||
struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
|
struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
|
||||||
EMU_GRAPHICS_WINDOWS_SIZE Size;
|
EMU_GRAPHICS_WINDOWS_SIZE Size;
|
||||||
EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
|
EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
|
||||||
EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
|
EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
|
||||||
EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
|
EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
|
||||||
EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
|
EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
|
||||||
EMU_GRAPHICS_WINDOWS_BLT Blt;
|
EMU_GRAPHICS_WINDOWS_BLT Blt;
|
||||||
EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
|
EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
|
||||||
EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
|
EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
|
||||||
EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
|
EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
|
||||||
extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,36 +10,33 @@
|
|||||||
#ifndef __EMU_IO_THUNK__
|
#ifndef __EMU_IO_THUNK__
|
||||||
#define __EMU_IO_THUNK__
|
#define __EMU_IO_THUNK__
|
||||||
|
|
||||||
|
|
||||||
#define EMU_IO_THUNK_PROTOCO_GUID \
|
#define EMU_IO_THUNK_PROTOCO_GUID \
|
||||||
{ 0x453368F6, 0x7C85, 0x434A, { 0xA9, 0x8A, 0x72, 0xD1, 0xB7, 0xFF, 0xA9, 0x26 } }
|
{ 0x453368F6, 0x7C85, 0x434A, { 0xA9, 0x8A, 0x72, 0xD1, 0xB7, 0xFF, 0xA9, 0x26 } }
|
||||||
|
|
||||||
|
typedef struct _EMU_IO_THUNK_PROTOCOL EMU_IO_THUNK_PROTOCOL;
|
||||||
typedef struct _EMU_IO_THUNK_PROTOCOL EMU_IO_THUNK_PROTOCOL;
|
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_IO_THUNK_PROTOCOL_CLOSE_OPEN) (
|
(EFIAPI *EMU_IO_THUNK_PROTOCOL_CLOSE_OPEN)(
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_IO_THUNK_PROTOCOL_CLOSE_CLOSE) (
|
(EFIAPI *EMU_IO_THUNK_PROTOCOL_CLOSE_CLOSE)(
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
struct _EMU_IO_THUNK_PROTOCOL {
|
struct _EMU_IO_THUNK_PROTOCOL {
|
||||||
EFI_GUID *Protocol;
|
EFI_GUID *Protocol;
|
||||||
VOID *Interface; /// Only be valid after Open() is called
|
VOID *Interface; /// Only be valid after Open() is called
|
||||||
CHAR16 *ConfigString;
|
CHAR16 *ConfigString;
|
||||||
UINT16 Instance;
|
UINT16 Instance;
|
||||||
EMU_IO_THUNK_PROTOCOL_CLOSE_OPEN Open;
|
EMU_IO_THUNK_PROTOCOL_CLOSE_OPEN Open;
|
||||||
EMU_IO_THUNK_PROTOCOL_CLOSE_CLOSE Close;
|
EMU_IO_THUNK_PROTOCOL_CLOSE_CLOSE Close;
|
||||||
VOID *Private; /// Used by implementation
|
VOID *Private; /// Used by implementation
|
||||||
};
|
};
|
||||||
|
|
||||||
extern EFI_GUID gEmuIoThunkProtocolGuid;
|
extern EFI_GUID gEmuIoThunkProtocolGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -17,8 +17,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define EMU_SNP_PROTOCOL_GUID \
|
#define EMU_SNP_PROTOCOL_GUID \
|
||||||
{ 0xFD5FBE54, 0x8C35, 0xB345, { 0x8A, 0x0F, 0x7A, 0xC8, 0xA5, 0xFD, 0x05, 0x21 } }
|
{ 0xFD5FBE54, 0x8C35, 0xB345, { 0x8A, 0x0F, 0x7A, 0xC8, 0xA5, 0xFD, 0x05, 0x21 } }
|
||||||
|
|
||||||
typedef struct _EMU_SNP_PROTOCOL EMU_SNP_PROTOCOL;
|
typedef struct _EMU_SNP_PROTOCOL EMU_SNP_PROTOCOL;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Register storage for SNP Mode.
|
Register storage for SNP Mode.
|
||||||
@ -37,7 +36,6 @@ EFI_STATUS
|
|||||||
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Changes the state of a network interface from "stopped" to "started".
|
Changes the state of a network interface from "stopped" to "started".
|
||||||
|
|
||||||
@ -425,29 +423,29 @@ EFI_STATUS
|
|||||||
//
|
//
|
||||||
// Revision defined in EFI1.1
|
// Revision defined in EFI1.1
|
||||||
//
|
//
|
||||||
#define EMU_SNP_INTERFACE_REVISION EMU_SNP_PROTOCOL_REVISION
|
#define EMU_SNP_INTERFACE_REVISION EMU_SNP_PROTOCOL_REVISION
|
||||||
|
|
||||||
///
|
///
|
||||||
/// The EMU_SNP_PROTOCOL protocol abstracts OS network sercices
|
/// The EMU_SNP_PROTOCOL protocol abstracts OS network sercices
|
||||||
/// from the EFI driver that produces EFI Simple Network Protocol.
|
/// from the EFI driver that produces EFI Simple Network Protocol.
|
||||||
///
|
///
|
||||||
struct _EMU_SNP_PROTOCOL {
|
struct _EMU_SNP_PROTOCOL {
|
||||||
EMU_SNP_CREATE_MAPPING CreateMapping;
|
EMU_SNP_CREATE_MAPPING CreateMapping;
|
||||||
EMU_SNP_START Start;
|
EMU_SNP_START Start;
|
||||||
EMU_SNP_STOP Stop;
|
EMU_SNP_STOP Stop;
|
||||||
EMU_SNP_INITIALIZE Initialize;
|
EMU_SNP_INITIALIZE Initialize;
|
||||||
EMU_SNP_RESET Reset;
|
EMU_SNP_RESET Reset;
|
||||||
EMU_SNP_SHUTDOWN Shutdown;
|
EMU_SNP_SHUTDOWN Shutdown;
|
||||||
EMU_SNP_RECEIVE_FILTERS ReceiveFilters;
|
EMU_SNP_RECEIVE_FILTERS ReceiveFilters;
|
||||||
EMU_SNP_STATION_ADDRESS StationAddress;
|
EMU_SNP_STATION_ADDRESS StationAddress;
|
||||||
EMU_SNP_STATISTICS Statistics;
|
EMU_SNP_STATISTICS Statistics;
|
||||||
EMU_SNP_MCAST_IP_TO_MAC MCastIpToMac;
|
EMU_SNP_MCAST_IP_TO_MAC MCastIpToMac;
|
||||||
EMU_SNP_NVDATA NvData;
|
EMU_SNP_NVDATA NvData;
|
||||||
EMU_SNP_GET_STATUS GetStatus;
|
EMU_SNP_GET_STATUS GetStatus;
|
||||||
EMU_SNP_TRANSMIT Transmit;
|
EMU_SNP_TRANSMIT Transmit;
|
||||||
EMU_SNP_RECEIVE Receive;
|
EMU_SNP_RECEIVE Receive;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern EFI_GUID gEmuSnpProtocolGuid;
|
extern EFI_GUID gEmuSnpProtocolGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,55 +11,47 @@
|
|||||||
#ifndef __EMU_THREAD_THUNK__
|
#ifndef __EMU_THREAD_THUNK__
|
||||||
#define __EMU_THREAD_THUNK__
|
#define __EMU_THREAD_THUNK__
|
||||||
|
|
||||||
|
typedef struct _EMU_THREAD_THUNK_PROTOCOL EMU_THREAD_THUNK_PROTOCOL;
|
||||||
typedef struct _EMU_THREAD_THUNK_PROTOCOL EMU_THREAD_THUNK_PROTOCOL;
|
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *THREAD_THUNK_MUTEX_LOCK) (
|
(EFIAPI *THREAD_THUNK_MUTEX_LOCK)(
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *THREAD_THUNK_MUTEX_UNLOCK) (
|
(EFIAPI *THREAD_THUNK_MUTEX_UNLOCK)(
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *THREAD_THUNK_MUTEX_TRY_LOCK) (
|
(EFIAPI *THREAD_THUNK_MUTEX_TRY_LOCK)(
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID *
|
VOID *
|
||||||
(EFIAPI *THREAD_THUNK_MUTEX_INIT) (
|
(EFIAPI *THREAD_THUNK_MUTEX_INIT)(
|
||||||
IN VOID
|
IN VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *THREAD_THUNK_MUTEX_DISTROY) (
|
(EFIAPI *THREAD_THUNK_MUTEX_DISTROY)(
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID *
|
VOID *
|
||||||
(EFIAPI *THREAD_THUNK_THREAD_ENTRY) (
|
(EFIAPI *THREAD_THUNK_THREAD_ENTRY)(
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *THREAD_THUNK_CREATE_THREAD) (
|
(EFIAPI *THREAD_THUNK_CREATE_THREAD)(
|
||||||
IN VOID *Thread,
|
IN VOID *Thread,
|
||||||
IN VOID *Attribute,
|
IN VOID *Attribute,
|
||||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||||
@ -68,30 +60,27 @@ UINTN
|
|||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *THREAD_THUNK_EXIT_THREAD) (
|
(EFIAPI *THREAD_THUNK_EXIT_THREAD)(
|
||||||
IN VOID *ValuePtr
|
IN VOID *ValuePtr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *THREAD_THUNK_SELF) (
|
(EFIAPI *THREAD_THUNK_SELF)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
struct _EMU_THREAD_THUNK_PROTOCOL {
|
struct _EMU_THREAD_THUNK_PROTOCOL {
|
||||||
THREAD_THUNK_MUTEX_LOCK MutexLock;
|
THREAD_THUNK_MUTEX_LOCK MutexLock;
|
||||||
THREAD_THUNK_MUTEX_UNLOCK MutexUnlock;
|
THREAD_THUNK_MUTEX_UNLOCK MutexUnlock;
|
||||||
THREAD_THUNK_MUTEX_TRY_LOCK MutexTryLock;
|
THREAD_THUNK_MUTEX_TRY_LOCK MutexTryLock;
|
||||||
THREAD_THUNK_MUTEX_INIT MutexInit;
|
THREAD_THUNK_MUTEX_INIT MutexInit;
|
||||||
THREAD_THUNK_MUTEX_DISTROY MutexDistroy;
|
THREAD_THUNK_MUTEX_DISTROY MutexDistroy;
|
||||||
THREAD_THUNK_CREATE_THREAD CreateThread;
|
THREAD_THUNK_CREATE_THREAD CreateThread;
|
||||||
THREAD_THUNK_EXIT_THREAD ExitThread;
|
THREAD_THUNK_EXIT_THREAD ExitThread;
|
||||||
THREAD_THUNK_SELF Self;
|
THREAD_THUNK_SELF Self;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern EFI_GUID gEmuThreadThunkProtocolGuid;
|
extern EFI_GUID gEmuThreadThunkProtocolGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -21,166 +21,156 @@
|
|||||||
#include <Protocol/EmuIoThunk.h>
|
#include <Protocol/EmuIoThunk.h>
|
||||||
#include <Protocol/DevicePath.h>
|
#include <Protocol/DevicePath.h>
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
VENDOR_DEVICE_PATH VendorDevicePath;
|
VENDOR_DEVICE_PATH VendorDevicePath;
|
||||||
UINT32 Instance;
|
UINT32 Instance;
|
||||||
} EMU_VENDOR_DEVICE_PATH_NODE;
|
} EMU_VENDOR_DEVICE_PATH_NODE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EMU_VENDOR_DEVICE_PATH_NODE Vendor;
|
EMU_VENDOR_DEVICE_PATH_NODE Vendor;
|
||||||
EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
|
||||||
} EMU_THUNK_DEVICE_PATH;
|
} EMU_THUNK_DEVICE_PATH;
|
||||||
|
|
||||||
|
typedef struct _EMU_THUNK_PROTOCOL EMU_THUNK_PROTOCOL;
|
||||||
|
|
||||||
typedef struct _EMU_THUNK_PROTOCOL EMU_THUNK_PROTOCOL;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *EMU_WRITE_STD_ERROR) (
|
(EFIAPI *EMU_WRITE_STD_ERROR)(
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_CONFIG_STD_IN) (
|
(EFIAPI *EMU_CONFIG_STD_IN)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *EMU_WRITE_STD_OUT) (
|
(EFIAPI *EMU_WRITE_STD_OUT)(
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *EMU_READ_STD_IN) (
|
(EFIAPI *EMU_READ_STD_IN)(
|
||||||
OUT UINT8 *Buffer,
|
OUT UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
(EFIAPI *EMU_POLL_STD_IN) (
|
(EFIAPI *EMU_POLL_STD_IN)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID *
|
VOID *
|
||||||
(EFIAPI *EMU_OS_MALLOC) (
|
(EFIAPI *EMU_OS_MALLOC)(
|
||||||
IN UINTN Size
|
IN UINTN Size
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID *
|
VOID *
|
||||||
(EFIAPI *EMU_OS_VMALLOC) (
|
(EFIAPI *EMU_OS_VMALLOC)(
|
||||||
IN UINTN Size
|
IN UINTN Size
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
(EFIAPI *EMU_OS_FREE) (
|
(EFIAPI *EMU_OS_FREE)(
|
||||||
IN VOID *Ptr
|
IN VOID *Ptr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_PE_COFF_GET_ENTRY_POINT) (
|
(EFIAPI *EMU_PE_COFF_GET_ENTRY_POINT)(
|
||||||
IN VOID *Pe32Data,
|
IN VOID *Pe32Data,
|
||||||
IN OUT VOID **EntryPoint
|
IN OUT VOID **EntryPoint
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_PE_COFF_RELOCATE_EXTRA_ACTION) (
|
(EFIAPI *EMU_PE_COFF_RELOCATE_EXTRA_ACTION)(
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_PE_COFF_UNLOAD_EXTRA_ACTION) (
|
(EFIAPI *EMU_PE_COFF_UNLOAD_EXTRA_ACTION)(
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_ENABLE_INERRUPTS) (
|
(EFIAPI *EMU_ENABLE_INERRUPTS)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_DISABLE_INERRUPTS) (
|
(EFIAPI *EMU_DISABLE_INERRUPTS)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINT64
|
UINT64
|
||||||
(EFIAPI *EMU_QUERY_PERFORMANCE_FREQENCY) (
|
(EFIAPI *EMU_QUERY_PERFORMANCE_FREQENCY)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
UINT64
|
UINT64
|
||||||
(EFIAPI *EMU_QUERY_PERFORMANCE_COUNTER) (
|
(EFIAPI *EMU_QUERY_PERFORMANCE_COUNTER)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_SLEEP) (
|
(EFIAPI *EMU_SLEEP)(
|
||||||
IN UINT64 Milliseconds
|
IN UINT64 Milliseconds
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_CPU_SLEEP) (
|
(EFIAPI *EMU_CPU_SLEEP)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_EXIT) (
|
(EFIAPI *EMU_EXIT)(
|
||||||
IN UINTN Status
|
IN UINTN Status
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_GET_TIME) (
|
(EFIAPI *EMU_GET_TIME)(
|
||||||
OUT EFI_TIME *Time,
|
OUT EFI_TIME *Time,
|
||||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_SET_TIME) (
|
(EFIAPI *EMU_SET_TIME)(
|
||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI EMU_SET_TIMER_CALLBACK) (
|
(EFIAPI EMU_SET_TIMER_CALLBACK)(
|
||||||
IN UINT64 DeltaMs
|
IN UINT64 DeltaMs
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(EFIAPI *EMU_SET_TIMER) (
|
(EFIAPI *EMU_SET_TIMER)(
|
||||||
IN UINT64 PeriodMs,
|
IN UINT64 PeriodMs,
|
||||||
IN EMU_SET_TIMER_CALLBACK CallBack
|
IN EMU_SET_TIMER_CALLBACK CallBack
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Enumerates the current set of protocol instances that abstract OS services from EFI.
|
Enumerates the current set of protocol instances that abstract OS services from EFI.
|
||||||
|
|
||||||
@ -203,56 +193,54 @@ VOID
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *EMU_GET_NEXT_PROTOCOL) (
|
(EFIAPI *EMU_GET_NEXT_PROTOCOL)(
|
||||||
IN BOOLEAN EmuBusDriver,
|
IN BOOLEAN EmuBusDriver,
|
||||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
struct _EMU_THUNK_PROTOCOL {
|
struct _EMU_THUNK_PROTOCOL {
|
||||||
// Used for early debug printing
|
// Used for early debug printing
|
||||||
EMU_WRITE_STD_ERROR WriteStdErr;
|
EMU_WRITE_STD_ERROR WriteStdErr;
|
||||||
EMU_CONFIG_STD_IN ConfigStdIn;
|
EMU_CONFIG_STD_IN ConfigStdIn;
|
||||||
EMU_WRITE_STD_OUT WriteStdOut;
|
EMU_WRITE_STD_OUT WriteStdOut;
|
||||||
EMU_READ_STD_IN ReadStdIn;
|
EMU_READ_STD_IN ReadStdIn;
|
||||||
EMU_POLL_STD_IN PollStdIn;
|
EMU_POLL_STD_IN PollStdIn;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Map OS malloc/free so we can use OS based guard malloc
|
// Map OS malloc/free so we can use OS based guard malloc
|
||||||
//
|
//
|
||||||
EMU_OS_MALLOC Malloc;
|
EMU_OS_MALLOC Malloc;
|
||||||
EMU_OS_VMALLOC Valloc;
|
EMU_OS_VMALLOC Valloc;
|
||||||
EMU_OS_FREE Free;
|
EMU_OS_FREE Free;
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// PE/COFF loader hooks to get symbols loaded
|
/// PE/COFF loader hooks to get symbols loaded
|
||||||
///
|
///
|
||||||
EMU_PE_COFF_GET_ENTRY_POINT PeCoffGetEntryPoint;
|
EMU_PE_COFF_GET_ENTRY_POINT PeCoffGetEntryPoint;
|
||||||
EMU_PE_COFF_RELOCATE_EXTRA_ACTION PeCoffRelocateImageExtraAction;
|
EMU_PE_COFF_RELOCATE_EXTRA_ACTION PeCoffRelocateImageExtraAction;
|
||||||
EMU_PE_COFF_UNLOAD_EXTRA_ACTION PeCoffUnloadImageExtraAction;
|
EMU_PE_COFF_UNLOAD_EXTRA_ACTION PeCoffUnloadImageExtraAction;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// DXE Architecture Protocol Services
|
/// DXE Architecture Protocol Services
|
||||||
///
|
///
|
||||||
EMU_ENABLE_INERRUPTS EnableInterrupt;
|
EMU_ENABLE_INERRUPTS EnableInterrupt;
|
||||||
EMU_DISABLE_INERRUPTS DisableInterrupt;
|
EMU_DISABLE_INERRUPTS DisableInterrupt;
|
||||||
EMU_QUERY_PERFORMANCE_FREQENCY QueryPerformanceFrequency;
|
EMU_QUERY_PERFORMANCE_FREQENCY QueryPerformanceFrequency;
|
||||||
EMU_QUERY_PERFORMANCE_COUNTER QueryPerformanceCounter;
|
EMU_QUERY_PERFORMANCE_COUNTER QueryPerformanceCounter;
|
||||||
|
|
||||||
EMU_SLEEP Sleep;
|
EMU_SLEEP Sleep;
|
||||||
EMU_CPU_SLEEP CpuSleep;
|
EMU_CPU_SLEEP CpuSleep;
|
||||||
EMU_EXIT Exit;
|
EMU_EXIT Exit;
|
||||||
EMU_GET_TIME GetTime;
|
EMU_GET_TIME GetTime;
|
||||||
EMU_SET_TIME SetTime;
|
EMU_SET_TIME SetTime;
|
||||||
EMU_SET_TIMER SetTimer;
|
EMU_SET_TIMER SetTimer;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Generic System Services
|
/// Generic System Services
|
||||||
///
|
///
|
||||||
EMU_GET_NEXT_PROTOCOL GetNextProtocol;
|
EMU_GET_NEXT_PROTOCOL GetNextProtocol;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern EFI_GUID gEmuThunkProtocolGuid;
|
extern EFI_GUID gEmuThunkProtocolGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/DevicePathLib.h>
|
#include <Library/DevicePathLib.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Converts a Vendor device path structure to its string representative.
|
Converts a Vendor device path structure to its string representative.
|
||||||
|
|
||||||
@ -52,18 +51,22 @@ DevPathToTextVendorLib (
|
|||||||
CatPrint (Str, L"EmuThunk()");
|
CatPrint (Str, L"EmuThunk()");
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CompareGuid (&Vendor->VendorDevicePath.Guid, &gEmuGraphicsWindowProtocolGuid)) {
|
if (CompareGuid (&Vendor->VendorDevicePath.Guid, &gEmuGraphicsWindowProtocolGuid)) {
|
||||||
CatPrint (Str, L"EmuGraphics(%d)", Vendor->Instance);
|
CatPrint (Str, L"EmuGraphics(%d)", Vendor->Instance);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CompareGuid (&Vendor->VendorDevicePath.Guid, &gEfiSimpleFileSystemProtocolGuid)) {
|
if (CompareGuid (&Vendor->VendorDevicePath.Guid, &gEfiSimpleFileSystemProtocolGuid)) {
|
||||||
CatPrint (Str, L"EmuFs(%d)", Vendor->Instance);
|
CatPrint (Str, L"EmuFs(%d)", Vendor->Instance);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CompareGuid (&Vendor->VendorDevicePath.Guid, &gEmuBlockIoProtocolGuid)) {
|
if (CompareGuid (&Vendor->VendorDevicePath.Guid, &gEmuBlockIoProtocolGuid)) {
|
||||||
CatPrint (Str, L"EmuBlk(%d)", Vendor->Instance);
|
CatPrint (Str, L"EmuBlk(%d)", Vendor->Instance);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CompareGuid (&Vendor->VendorDevicePath.Guid, &gEmuThreadThunkProtocolGuid)) {
|
if (CompareGuid (&Vendor->VendorDevicePath.Guid, &gEmuThreadThunkProtocolGuid)) {
|
||||||
CatPrint (Str, L"EmuThread()");
|
CatPrint (Str, L"EmuThread()");
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -82,20 +85,20 @@ DevPathToTextVendorLib (
|
|||||||
**/
|
**/
|
||||||
EFI_DEVICE_PATH_PROTOCOL *
|
EFI_DEVICE_PATH_PROTOCOL *
|
||||||
DevPathFromTextEmuThunk (
|
DevPathFromTextEmuThunk (
|
||||||
IN CHAR16 *TextDeviceNode
|
IN CHAR16 *TextDeviceNode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *Str;
|
CHAR16 *Str;
|
||||||
VENDOR_DEVICE_PATH *Vendor;
|
VENDOR_DEVICE_PATH *Vendor;
|
||||||
|
|
||||||
Str = GetNextParamStr (&TextDeviceNode);
|
Str = GetNextParamStr (&TextDeviceNode);
|
||||||
Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
|
Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
|
||||||
HARDWARE_DEVICE_PATH,
|
HARDWARE_DEVICE_PATH,
|
||||||
HW_VENDOR_DP,
|
HW_VENDOR_DP,
|
||||||
(UINT16) sizeof (VENDOR_DEVICE_PATH)
|
(UINT16)sizeof (VENDOR_DEVICE_PATH)
|
||||||
);
|
);
|
||||||
CopyGuid (&Vendor->Guid, &gEmuThunkProtocolGuid);
|
CopyGuid (&Vendor->Guid, &gEmuThunkProtocolGuid);
|
||||||
return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
|
return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -108,20 +111,20 @@ DevPathFromTextEmuThunk (
|
|||||||
**/
|
**/
|
||||||
EFI_DEVICE_PATH_PROTOCOL *
|
EFI_DEVICE_PATH_PROTOCOL *
|
||||||
DevPathFromTextEmuThread (
|
DevPathFromTextEmuThread (
|
||||||
IN CHAR16 *TextDeviceNode
|
IN CHAR16 *TextDeviceNode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *Str;
|
CHAR16 *Str;
|
||||||
VENDOR_DEVICE_PATH *Vendor;
|
VENDOR_DEVICE_PATH *Vendor;
|
||||||
|
|
||||||
Str = GetNextParamStr (&TextDeviceNode);
|
Str = GetNextParamStr (&TextDeviceNode);
|
||||||
Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
|
Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
|
||||||
HARDWARE_DEVICE_PATH,
|
HARDWARE_DEVICE_PATH,
|
||||||
HW_VENDOR_DP,
|
HW_VENDOR_DP,
|
||||||
(UINT16) sizeof (VENDOR_DEVICE_PATH)
|
(UINT16)sizeof (VENDOR_DEVICE_PATH)
|
||||||
);
|
);
|
||||||
CopyGuid (&Vendor->Guid, &gEmuThreadThunkProtocolGuid);
|
CopyGuid (&Vendor->Guid, &gEmuThreadThunkProtocolGuid);
|
||||||
return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
|
return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -134,22 +137,22 @@ DevPathFromTextEmuThread (
|
|||||||
**/
|
**/
|
||||||
EFI_DEVICE_PATH_PROTOCOL *
|
EFI_DEVICE_PATH_PROTOCOL *
|
||||||
DevPathFromTextEmuFs (
|
DevPathFromTextEmuFs (
|
||||||
IN CHAR16 *TextDeviceNode
|
IN CHAR16 *TextDeviceNode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *Str;
|
CHAR16 *Str;
|
||||||
EMU_VENDOR_DEVICE_PATH_NODE *Vendor;
|
EMU_VENDOR_DEVICE_PATH_NODE *Vendor;
|
||||||
|
|
||||||
Str = GetNextParamStr (&TextDeviceNode);
|
Str = GetNextParamStr (&TextDeviceNode);
|
||||||
Vendor = (EMU_VENDOR_DEVICE_PATH_NODE *) CreateDeviceNode (
|
Vendor = (EMU_VENDOR_DEVICE_PATH_NODE *)CreateDeviceNode (
|
||||||
HARDWARE_DEVICE_PATH,
|
HARDWARE_DEVICE_PATH,
|
||||||
HW_VENDOR_DP,
|
HW_VENDOR_DP,
|
||||||
(UINT16) sizeof (EMU_VENDOR_DEVICE_PATH_NODE)
|
(UINT16)sizeof (EMU_VENDOR_DEVICE_PATH_NODE)
|
||||||
);
|
);
|
||||||
CopyGuid (&Vendor->VendorDevicePath.Guid, &gEfiSimpleFileSystemProtocolGuid);
|
CopyGuid (&Vendor->VendorDevicePath.Guid, &gEfiSimpleFileSystemProtocolGuid);
|
||||||
Vendor->Instance = (UINT32) StrDecimalToUintn (Str);
|
Vendor->Instance = (UINT32)StrDecimalToUintn (Str);
|
||||||
|
|
||||||
return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
|
return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
#include <Protocol/Timer.h>
|
#include <Protocol/Timer.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stalls the CPU for at least the given number of microseconds.
|
Stalls the CPU for at least the given number of microseconds.
|
||||||
|
|
||||||
@ -31,13 +29,12 @@
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MicroSecondDelay (
|
MicroSecondDelay (
|
||||||
IN UINTN MicroSeconds
|
IN UINTN MicroSeconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return NanoSecondDelay (MicroSeconds * 1000);
|
return NanoSecondDelay (MicroSeconds * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stalls the CPU for at least the given number of nanoseconds.
|
Stalls the CPU for at least the given number of nanoseconds.
|
||||||
|
|
||||||
@ -51,14 +48,13 @@ MicroSecondDelay (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
NanoSecondDelay (
|
NanoSecondDelay (
|
||||||
IN UINTN NanoSeconds
|
IN UINTN NanoSeconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
gEmuThunk->Sleep (NanoSeconds);
|
gEmuThunk->Sleep (NanoSeconds);
|
||||||
return NanoSeconds;
|
return NanoSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves the current value of a 64-bit free running performance counter.
|
Retrieves the current value of a 64-bit free running performance counter.
|
||||||
|
|
||||||
@ -105,14 +101,14 @@ GetPerformanceCounter (
|
|||||||
UINT64
|
UINT64
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetPerformanceCounterProperties (
|
GetPerformanceCounterProperties (
|
||||||
OUT UINT64 *StartValue OPTIONAL,
|
OUT UINT64 *StartValue OPTIONAL,
|
||||||
OUT UINT64 *EndValue OPTIONAL
|
OUT UINT64 *EndValue OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (StartValue != NULL) {
|
if (StartValue != NULL) {
|
||||||
*StartValue = 0ULL;
|
*StartValue = 0ULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EndValue != NULL) {
|
if (EndValue != NULL) {
|
||||||
*EndValue = (UINT64)-1LL;
|
*EndValue = (UINT64)-1LL;
|
||||||
}
|
}
|
||||||
@ -156,9 +152,9 @@ GetTimeInNanoSecond (
|
|||||||
// Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,
|
// Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,
|
||||||
// i.e. highest bit set in Remainder should <= 33.
|
// i.e. highest bit set in Remainder should <= 33.
|
||||||
//
|
//
|
||||||
Shift = MAX (0, HighBitSet64 (Remainder) - 33);
|
Shift = MAX (0, HighBitSet64 (Remainder) - 33);
|
||||||
Remainder = RShiftU64 (Remainder, (UINTN) Shift);
|
Remainder = RShiftU64 (Remainder, (UINTN)Shift);
|
||||||
Frequency = RShiftU64 (Frequency, (UINTN) Shift);
|
Frequency = RShiftU64 (Frequency, (UINTN)Shift);
|
||||||
NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);
|
NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);
|
||||||
|
|
||||||
return NanoSeconds;
|
return NanoSeconds;
|
||||||
|
@ -13,8 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/EmuThunkLib.h>
|
#include <Library/EmuThunkLib.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
|
||||||
EMU_THUNK_PROTOCOL *gEmuThunk = NULL;
|
EMU_THUNK_PROTOCOL *gEmuThunk = NULL;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The constructor function caches the pointer of EMU Thunk protocol.
|
The constructor function caches the pointer of EMU Thunk protocol.
|
||||||
@ -32,7 +31,7 @@ DxeEmuLibConstructor (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_GUID_TYPE *GuidHob;
|
EFI_HOB_GUID_TYPE *GuidHob;
|
||||||
|
|
||||||
GuidHob = GetFirstGuidHob (&gEmuThunkProtocolGuid);
|
GuidHob = GetFirstGuidHob (&gEmuThunkProtocolGuid);
|
||||||
ASSERT (GuidHob != NULL);
|
ASSERT (GuidHob != NULL);
|
||||||
@ -43,7 +42,6 @@ DxeEmuLibConstructor (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Serach the EMU IO Thunk database for a matching EMU IO Thunk
|
Serach the EMU IO Thunk database for a matching EMU IO Thunk
|
||||||
Protocol instance.
|
Protocol instance.
|
||||||
@ -62,8 +60,8 @@ GetIoThunkInstance (
|
|||||||
IN UINTN Instance
|
IN UINTN Instance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||||
|
|
||||||
for (Status = EFI_SUCCESS, EmuIoThunk = NULL; !EFI_ERROR (Status); ) {
|
for (Status = EFI_SUCCESS, EmuIoThunk = NULL; !EFI_ERROR (Status); ) {
|
||||||
Status = gEmuThunk->GetNextProtocol (FALSE, &EmuIoThunk);
|
Status = gEmuThunk->GetNextProtocol (FALSE, &EmuIoThunk);
|
||||||
|
@ -23,8 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Cache of UnixThunk protocol
|
// Cache of UnixThunk protocol
|
||||||
//
|
//
|
||||||
EMU_THUNK_PROTOCOL *mThunk = NULL;
|
EMU_THUNK_PROTOCOL *mThunk = NULL;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The constructor function gets the pointer of the WinNT thunk functions
|
The constructor function gets the pointer of the WinNT thunk functions
|
||||||
@ -40,7 +39,7 @@ DxeEmuPeCoffLibExtraActionConstructor (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_GUID_TYPE *GuidHob;
|
EFI_HOB_GUID_TYPE *GuidHob;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Retrieve EmuThunkProtocol from GUID'ed HOB
|
// Retrieve EmuThunkProtocol from GUID'ed HOB
|
||||||
@ -73,8 +72,6 @@ PeCoffLoaderRelocateImageExtraAction (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Performs additional actions just before a PE/COFF image is unloaded. Any resources
|
Performs additional actions just before a PE/COFF image is unloaded. Any resources
|
||||||
that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed.
|
that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed.
|
||||||
|
@ -8,14 +8,10 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiDxe.h>
|
#include <PiDxe.h>
|
||||||
#include <Library/SerialPortLib.h>
|
#include <Library/SerialPortLib.h>
|
||||||
#include <Library/EmuThunkLib.h>
|
#include <Library/EmuThunkLib.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the serial device hardware.
|
Initialize the serial device hardware.
|
||||||
|
|
||||||
@ -56,14 +52,13 @@ SerialPortInitialize (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortWrite (
|
SerialPortWrite (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return gEmuThunk->WriteStdOut (Buffer, NumberOfBytes);
|
return gEmuThunk->WriteStdOut (Buffer, NumberOfBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Read data from serial device and save the datas in buffer.
|
Read data from serial device and save the datas in buffer.
|
||||||
|
|
||||||
@ -83,8 +78,8 @@ SerialPortWrite (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortRead (
|
SerialPortRead (
|
||||||
OUT UINT8 *Buffer,
|
OUT UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return gEmuThunk->ReadStdIn (Buffer, NumberOfBytes);
|
return gEmuThunk->ReadStdIn (Buffer, NumberOfBytes);
|
||||||
@ -123,7 +118,7 @@ SerialPortPoll (
|
|||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortSetControl (
|
SerialPortSetControl (
|
||||||
IN UINT32 Control
|
IN UINT32 Control
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return RETURN_UNSUPPORTED;
|
return RETURN_UNSUPPORTED;
|
||||||
@ -142,13 +137,14 @@ SerialPortSetControl (
|
|||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortGetControl (
|
SerialPortGetControl (
|
||||||
OUT UINT32 *Control
|
OUT UINT32 *Control
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
*Control = 0;
|
*Control = 0;
|
||||||
if (!SerialPortPoll ()) {
|
if (!SerialPortPoll ()) {
|
||||||
*Control = EFI_SERIAL_INPUT_BUFFER_EMPTY;
|
*Control = EFI_SERIAL_INPUT_BUFFER_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
return RETURN_SUCCESS;
|
return RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,14 +184,13 @@ SerialPortGetControl (
|
|||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortSetAttributes (
|
SerialPortSetAttributes (
|
||||||
IN OUT UINT64 *BaudRate,
|
IN OUT UINT64 *BaudRate,
|
||||||
IN OUT UINT32 *ReceiveFifoDepth,
|
IN OUT UINT32 *ReceiveFifoDepth,
|
||||||
IN OUT UINT32 *Timeout,
|
IN OUT UINT32 *Timeout,
|
||||||
IN OUT EFI_PARITY_TYPE *Parity,
|
IN OUT EFI_PARITY_TYPE *Parity,
|
||||||
IN OUT UINT8 *DataBits,
|
IN OUT UINT8 *DataBits,
|
||||||
IN OUT EFI_STOP_BITS_TYPE *StopBits
|
IN OUT EFI_STOP_BITS_TYPE *StopBits
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return RETURN_UNSUPPORTED;
|
return RETURN_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,14 +8,10 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiDxe.h>
|
#include <PiDxe.h>
|
||||||
#include <Library/SerialPortLib.h>
|
#include <Library/SerialPortLib.h>
|
||||||
#include <Library/EmuThunkLib.h>
|
#include <Library/EmuThunkLib.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the serial device hardware.
|
Initialize the serial device hardware.
|
||||||
|
|
||||||
@ -56,8 +52,8 @@ SerialPortInitialize (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortWrite (
|
SerialPortWrite (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (gEmuThunk == NULL) {
|
if (gEmuThunk == NULL) {
|
||||||
@ -67,7 +63,6 @@ SerialPortWrite (
|
|||||||
return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);
|
return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Read data from serial device and save the datas in buffer.
|
Read data from serial device and save the datas in buffer.
|
||||||
|
|
||||||
@ -87,8 +82,8 @@ SerialPortWrite (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortRead (
|
SerialPortRead (
|
||||||
OUT UINT8 *Buffer,
|
OUT UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -113,5 +108,3 @@ SerialPortPoll (
|
|||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,17 +16,16 @@
|
|||||||
|
|
||||||
#include <Protocol/Timer.h>
|
#include <Protocol/Timer.h>
|
||||||
|
|
||||||
|
STATIC UINT64 gTimerPeriod = 0;
|
||||||
STATIC UINT64 gTimerPeriod = 0;
|
STATIC EFI_TIMER_ARCH_PROTOCOL *gTimerAp = NULL;
|
||||||
STATIC EFI_TIMER_ARCH_PROTOCOL *gTimerAp = NULL;
|
STATIC EFI_EVENT gTimerEvent = NULL;
|
||||||
STATIC EFI_EVENT gTimerEvent = NULL;
|
STATIC VOID *gRegistration = NULL;
|
||||||
STATIC VOID *gRegistration = NULL;
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterTimerArchProtocol (
|
RegisterTimerArchProtocol (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -46,8 +45,6 @@ RegisterTimerArchProtocol (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stalls the CPU for at least the given number of microseconds.
|
Stalls the CPU for at least the given number of microseconds.
|
||||||
|
|
||||||
@ -61,13 +58,12 @@ RegisterTimerArchProtocol (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MicroSecondDelay (
|
MicroSecondDelay (
|
||||||
IN UINTN MicroSeconds
|
IN UINTN MicroSeconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return NanoSecondDelay (MicroSeconds * 1000);
|
return NanoSecondDelay (MicroSeconds * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stalls the CPU for at least the given number of nanoseconds.
|
Stalls the CPU for at least the given number of nanoseconds.
|
||||||
|
|
||||||
@ -81,7 +77,7 @@ MicroSecondDelay (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
NanoSecondDelay (
|
NanoSecondDelay (
|
||||||
IN UINTN NanoSeconds
|
IN UINTN NanoSeconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -90,25 +86,25 @@ NanoSecondDelay (
|
|||||||
|
|
||||||
if ((gTimerPeriod != 0) &&
|
if ((gTimerPeriod != 0) &&
|
||||||
((UINT64)NanoSeconds > gTimerPeriod) &&
|
((UINT64)NanoSeconds > gTimerPeriod) &&
|
||||||
(EfiGetCurrentTpl () == TPL_APPLICATION)) {
|
(EfiGetCurrentTpl () == TPL_APPLICATION))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// This stall is long, so use gBS->WaitForEvent () to yield CPU to DXE Core
|
// This stall is long, so use gBS->WaitForEvent () to yield CPU to DXE Core
|
||||||
//
|
//
|
||||||
|
|
||||||
HundredNanoseconds = DivU64x32 (NanoSeconds, 100);
|
HundredNanoseconds = DivU64x32 (NanoSeconds, 100);
|
||||||
Status = gBS->SetTimer (gTimerEvent, TimerRelative, HundredNanoseconds);
|
Status = gBS->SetTimer (gTimerEvent, TimerRelative, HundredNanoseconds);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
Status = gBS->WaitForEvent (sizeof (gTimerEvent)/sizeof (EFI_EVENT), &gTimerEvent, &Index);
|
Status = gBS->WaitForEvent (sizeof (gTimerEvent)/sizeof (EFI_EVENT), &gTimerEvent, &Index);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
gEmuThunk->Sleep (NanoSeconds);
|
gEmuThunk->Sleep (NanoSeconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NanoSeconds;
|
return NanoSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves the current value of a 64-bit free running performance counter.
|
Retrieves the current value of a 64-bit free running performance counter.
|
||||||
|
|
||||||
@ -155,14 +151,14 @@ GetPerformanceCounter (
|
|||||||
UINT64
|
UINT64
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetPerformanceCounterProperties (
|
GetPerformanceCounterProperties (
|
||||||
OUT UINT64 *StartValue OPTIONAL,
|
OUT UINT64 *StartValue OPTIONAL,
|
||||||
OUT UINT64 *EndValue OPTIONAL
|
OUT UINT64 *EndValue OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (StartValue != NULL) {
|
if (StartValue != NULL) {
|
||||||
*StartValue = 0ULL;
|
*StartValue = 0ULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EndValue != NULL) {
|
if (EndValue != NULL) {
|
||||||
*EndValue = (UINT64)-1LL;
|
*EndValue = (UINT64)-1LL;
|
||||||
}
|
}
|
||||||
@ -170,7 +166,6 @@ GetPerformanceCounterProperties (
|
|||||||
return gEmuThunk->QueryPerformanceFrequency ();
|
return gEmuThunk->QueryPerformanceFrequency ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Register for the Timer AP protocol.
|
Register for the Timer AP protocol.
|
||||||
|
|
||||||
@ -234,9 +229,9 @@ GetTimeInNanoSecond (
|
|||||||
// Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,
|
// Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,
|
||||||
// i.e. highest bit set in Remainder should <= 33.
|
// i.e. highest bit set in Remainder should <= 33.
|
||||||
//
|
//
|
||||||
Shift = MAX (0, HighBitSet64 (Remainder) - 33);
|
Shift = MAX (0, HighBitSet64 (Remainder) - 33);
|
||||||
Remainder = RShiftU64 (Remainder, (UINTN) Shift);
|
Remainder = RShiftU64 (Remainder, (UINTN)Shift);
|
||||||
Frequency = RShiftU64 (Frequency, (UINTN) Shift);
|
Frequency = RShiftU64 (Frequency, (UINTN)Shift);
|
||||||
NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);
|
NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);
|
||||||
|
|
||||||
return NanoSeconds;
|
return NanoSeconds;
|
||||||
|
@ -15,10 +15,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
|
||||||
|
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
@ -144,14 +142,14 @@ FreePages (
|
|||||||
IN UINTN Pages
|
IN UINTN Pages
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ASSERT (Pages != 0);
|
ASSERT (Pages != 0);
|
||||||
if (!gEmuThunk->Free (Buffer)) {
|
if (!gEmuThunk->Free (Buffer)) {
|
||||||
// The Free thunk will not free memory allocated in emulated EFI memory.
|
// The Free thunk will not free memory allocated in emulated EFI memory.
|
||||||
// The assmuption is this was allocated directly by EFI. We need this as some
|
// The assmuption is this was allocated directly by EFI. We need this as some
|
||||||
// times protocols or EFI BootServices can return dynamically allocated buffers.
|
// times protocols or EFI BootServices can return dynamically allocated buffers.
|
||||||
Status = gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, Pages);
|
Status = gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)Buffer, Pages);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,12 +178,12 @@ InternalAllocateAlignedPages (
|
|||||||
IN UINTN Alignment
|
IN UINTN Alignment
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
VOID *Memory;
|
VOID *Memory;
|
||||||
UINTN AlignedMemory;
|
UINTN AlignedMemory;
|
||||||
UINTN AlignmentMask;
|
UINTN AlignmentMask;
|
||||||
UINTN UnalignedPages;
|
UINTN UnalignedPages;
|
||||||
UINTN RealPages;
|
UINTN RealPages;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Alignment must be a power of two or zero.
|
// Alignment must be a power of two or zero.
|
||||||
@ -195,12 +193,13 @@ InternalAllocateAlignedPages (
|
|||||||
if (Pages == 0) {
|
if (Pages == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Alignment > EFI_PAGE_SIZE) {
|
if (Alignment > EFI_PAGE_SIZE) {
|
||||||
//
|
//
|
||||||
// Caculate the total number of pages since alignment is larger than page size.
|
// Caculate the total number of pages since alignment is larger than page size.
|
||||||
//
|
//
|
||||||
AlignmentMask = Alignment - 1;
|
AlignmentMask = Alignment - 1;
|
||||||
RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment);
|
RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment);
|
||||||
//
|
//
|
||||||
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
|
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
|
||||||
//
|
//
|
||||||
@ -210,15 +209,17 @@ InternalAllocateAlignedPages (
|
|||||||
if (Memory != NULL) {
|
if (Memory != NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
AlignedMemory = ((UINTN) Memory + AlignmentMask) & ~AlignmentMask;
|
|
||||||
UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN) Memory);
|
AlignedMemory = ((UINTN)Memory + AlignmentMask) & ~AlignmentMask;
|
||||||
|
UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN)Memory);
|
||||||
if (UnalignedPages > 0) {
|
if (UnalignedPages > 0) {
|
||||||
//
|
//
|
||||||
// Free first unaligned page(s).
|
// Free first unaligned page(s).
|
||||||
//
|
//
|
||||||
FreePages (Memory, UnalignedPages);
|
FreePages (Memory, UnalignedPages);
|
||||||
}
|
}
|
||||||
Memory = (VOID *) (AlignedMemory + EFI_PAGES_TO_SIZE (Pages));
|
|
||||||
|
Memory = (VOID *)(AlignedMemory + EFI_PAGES_TO_SIZE (Pages));
|
||||||
UnalignedPages = RealPages - Pages - UnalignedPages;
|
UnalignedPages = RealPages - Pages - UnalignedPages;
|
||||||
if (UnalignedPages > 0) {
|
if (UnalignedPages > 0) {
|
||||||
//
|
//
|
||||||
@ -234,9 +235,11 @@ InternalAllocateAlignedPages (
|
|||||||
if (Memory != NULL) {
|
if (Memory != NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
AlignedMemory = (UINTN) Memory;
|
|
||||||
|
AlignedMemory = (UINTN)Memory;
|
||||||
}
|
}
|
||||||
return (VOID *) AlignedMemory;
|
|
||||||
|
return (VOID *)AlignedMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -458,6 +461,7 @@ InternalAllocateZeroPool (
|
|||||||
if (Memory != NULL) {
|
if (Memory != NULL) {
|
||||||
Memory = ZeroMem (Memory, AllocationSize);
|
Memory = ZeroMem (Memory, AllocationSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Memory;
|
return Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -554,12 +558,13 @@ InternalAllocateCopyPool (
|
|||||||
VOID *Memory;
|
VOID *Memory;
|
||||||
|
|
||||||
ASSERT (Buffer != NULL);
|
ASSERT (Buffer != NULL);
|
||||||
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1));
|
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN)Buffer + 1));
|
||||||
|
|
||||||
Memory = InternalAllocatePool (PoolType, AllocationSize);
|
Memory = InternalAllocatePool (PoolType, AllocationSize);
|
||||||
if (Memory != NULL) {
|
if (Memory != NULL) {
|
||||||
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Memory;
|
return Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -677,10 +682,11 @@ InternalReallocatePool (
|
|||||||
VOID *NewBuffer;
|
VOID *NewBuffer;
|
||||||
|
|
||||||
NewBuffer = InternalAllocateZeroPool (PoolType, NewSize);
|
NewBuffer = InternalAllocateZeroPool (PoolType, NewSize);
|
||||||
if (NewBuffer != NULL && OldBuffer != NULL) {
|
if ((NewBuffer != NULL) && (OldBuffer != NULL)) {
|
||||||
CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize));
|
CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize));
|
||||||
FreePool (OldBuffer);
|
FreePool (OldBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewBuffer;
|
return NewBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -797,10 +803,10 @@ ReallocateReservedPool (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FreePool (
|
FreePool (
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
if (!gEmuThunk->Free (Buffer)) {
|
if (!gEmuThunk->Free (Buffer)) {
|
||||||
// The Free thunk will not free memory allocated in emulated EFI memory.
|
// The Free thunk will not free memory allocated in emulated EFI memory.
|
||||||
@ -810,4 +816,3 @@ FreePool (
|
|||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
#include <Protocol/SimpleTextInEx.h>
|
#include <Protocol/SimpleTextInEx.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
KeyMapMake gets called on key presses.
|
KeyMapMake gets called on key presses.
|
||||||
|
|
||||||
@ -20,7 +19,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
KeyMapMake (
|
KeyMapMake (
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -37,7 +36,7 @@ KeyMapMake (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
KeyMapBreak (
|
KeyMapBreak (
|
||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
@ -29,7 +29,7 @@ CONST EFI_PEI_SERVICES **gPeiServices;
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SetPeiServicesTablePointer (
|
SetPeiServicesTablePointer (
|
||||||
IN CONST EFI_PEI_SERVICES ** PeiServicesTablePointer
|
IN CONST EFI_PEI_SERVICES **PeiServicesTablePointer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (PeiServicesTablePointer != NULL);
|
ASSERT (PeiServicesTablePointer != NULL);
|
||||||
@ -58,7 +58,6 @@ GetPeiServicesTablePointer (
|
|||||||
return gPeiServices;
|
return gPeiServices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The constructor function caches the pointer to PEI services.
|
The constructor function caches the pointer to PEI services.
|
||||||
|
|
||||||
@ -74,8 +73,8 @@ GetPeiServicesTablePointer (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesTablePointerLibConstructor (
|
PeiServicesTablePointerLibConstructor (
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
gPeiServices = PeiServices;
|
gPeiServices = PeiServices;
|
||||||
@ -108,4 +107,3 @@ MigratePeiServicesTablePointer (
|
|||||||
//
|
//
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Cache of UnixThunk protocol
|
// Cache of UnixThunk protocol
|
||||||
//
|
//
|
||||||
EMU_THUNK_PROTOCOL *mThunk = NULL;
|
EMU_THUNK_PROTOCOL *mThunk = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The function caches the pointer of the Unix thunk functions
|
The function caches the pointer of the Unix thunk functions
|
||||||
@ -36,22 +36,21 @@ EFIAPI
|
|||||||
EmuPeCoffGetThunkStucture (
|
EmuPeCoffGetThunkStucture (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_THUNK_PPI *ThunkPpi;
|
EMU_THUNK_PPI *ThunkPpi;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Locate Unix ThunkPpi for retrieving standard output handle
|
// Locate Unix ThunkPpi for retrieving standard output handle
|
||||||
//
|
//
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid,
|
&gEmuThunkPpiGuid,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &ThunkPpi
|
(VOID **)&ThunkPpi
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
EMU_MAGIC_PAGE()->Thunk = (EMU_THUNK_PROTOCOL *) ThunkPpi->Thunk ();
|
EMU_MAGIC_PAGE ()->Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -71,12 +70,12 @@ PeCoffLoaderRelocateImageExtraAction (
|
|||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (EMU_MAGIC_PAGE()->Thunk == NULL) {
|
if (EMU_MAGIC_PAGE ()->Thunk == NULL) {
|
||||||
EmuPeCoffGetThunkStucture ();
|
EmuPeCoffGetThunkStucture ();
|
||||||
}
|
}
|
||||||
EMU_MAGIC_PAGE()->Thunk->PeCoffRelocateImageExtraAction (ImageContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
EMU_MAGIC_PAGE ()->Thunk->PeCoffRelocateImageExtraAction (ImageContext);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Performs additional actions just before a PE/COFF image is unloaded. Any resources
|
Performs additional actions just before a PE/COFF image is unloaded. Any resources
|
||||||
@ -94,8 +93,9 @@ PeCoffLoaderUnloadImageExtraAction (
|
|||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (EMU_MAGIC_PAGE()->Thunk == NULL) {
|
if (EMU_MAGIC_PAGE ()->Thunk == NULL) {
|
||||||
EmuPeCoffGetThunkStucture ();
|
EmuPeCoffGetThunkStucture ();
|
||||||
}
|
}
|
||||||
EMU_MAGIC_PAGE()->Thunk->PeCoffUnloadImageExtraAction (ImageContext);
|
|
||||||
|
EMU_MAGIC_PAGE ()->Thunk->PeCoffUnloadImageExtraAction (ImageContext);
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Ppi/EmuThunk.h>
|
#include <Ppi/EmuThunk.h>
|
||||||
#include <Protocol/EmuThunk.h>
|
#include <Protocol/EmuThunk.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves and returns a pointer to the entry point to a PE/COFF image that has been loaded
|
Retrieves and returns a pointer to the entry point to a PE/COFF image that has been loaded
|
||||||
into system memory with the PE/COFF Loader Library functions.
|
into system memory with the PE/COFF Loader Library functions.
|
||||||
@ -41,22 +39,22 @@ PeCoffLoaderGetEntryPoint (
|
|||||||
IN OUT VOID **EntryPoint
|
IN OUT VOID **EntryPoint
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_THUNK_PPI *ThunkPpi;
|
EMU_THUNK_PPI *ThunkPpi;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_THUNK_PROTOCOL *Thunk;
|
EMU_THUNK_PROTOCOL *Thunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Locate EmuThunkPpi for retrieving standard output handle
|
// Locate EmuThunkPpi for retrieving standard output handle
|
||||||
//
|
//
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid,
|
&gEmuThunkPpiGuid,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &ThunkPpi
|
(VOID **)&ThunkPpi
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
||||||
|
|
||||||
return Thunk->PeCoffGetEntryPoint (Pe32Data, EntryPoint);
|
return Thunk->PeCoffGetEntryPoint (Pe32Data, EntryPoint);
|
||||||
}
|
}
|
||||||
@ -86,15 +84,14 @@ PeCoffLoaderGetMachineType (
|
|||||||
|
|
||||||
DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;
|
DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;
|
||||||
if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {
|
if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {
|
||||||
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));
|
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHdr->e_lfanew) & 0x0ffff));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)(Pe32Data);
|
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)(Pe32Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
|
if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
|
||||||
return Hdr.Te->Machine;
|
return Hdr.Te->Machine;
|
||||||
} else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
|
} else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
|
||||||
return Hdr.Pe32->FileHeader.Machine;
|
return Hdr.Pe32->FileHeader.Machine;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,15 +123,15 @@ PeCoffLoaderGetPdbPointer (
|
|||||||
IN VOID *Pe32Data
|
IN VOID *Pe32Data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IMAGE_DOS_HEADER *DosHdr;
|
EFI_IMAGE_DOS_HEADER *DosHdr;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
|
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
|
||||||
EFI_IMAGE_DATA_DIRECTORY *DirectoryEntry;
|
EFI_IMAGE_DATA_DIRECTORY *DirectoryEntry;
|
||||||
EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;
|
EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;
|
||||||
UINTN DirCount;
|
UINTN DirCount;
|
||||||
VOID *CodeViewEntryPointer;
|
VOID *CodeViewEntryPointer;
|
||||||
INTN TEImageAdjust;
|
INTN TEImageAdjust;
|
||||||
UINT32 NumberOfRvaAndSizes;
|
UINT32 NumberOfRvaAndSizes;
|
||||||
UINT16 Magic;
|
UINT16 Magic;
|
||||||
|
|
||||||
ASSERT (Pe32Data != NULL);
|
ASSERT (Pe32Data != NULL);
|
||||||
|
|
||||||
@ -148,7 +145,7 @@ PeCoffLoaderGetPdbPointer (
|
|||||||
//
|
//
|
||||||
// DOS image header is present, so read the PE header after the DOS image header.
|
// DOS image header is present, so read the PE header after the DOS image header.
|
||||||
//
|
//
|
||||||
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));
|
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHdr->e_lfanew) & 0x0ffff));
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// DOS image header is not present, so PE header is at the image base.
|
// DOS image header is not present, so PE header is at the image base.
|
||||||
@ -158,11 +155,11 @@ PeCoffLoaderGetPdbPointer (
|
|||||||
|
|
||||||
if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
|
if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
|
||||||
if (Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress != 0) {
|
if (Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress != 0) {
|
||||||
DirectoryEntry = &Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG];
|
DirectoryEntry = &Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG];
|
||||||
TEImageAdjust = sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize;
|
TEImageAdjust = sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize;
|
||||||
DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN) Hdr.Te +
|
DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN)Hdr.Te +
|
||||||
Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress +
|
Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress +
|
||||||
TEImageAdjust);
|
TEImageAdjust);
|
||||||
}
|
}
|
||||||
} else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
|
} else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
|
||||||
//
|
//
|
||||||
@ -171,24 +168,24 @@ PeCoffLoaderGetPdbPointer (
|
|||||||
// generate PE32+ image with PE32 Magic.
|
// generate PE32+ image with PE32 Magic.
|
||||||
//
|
//
|
||||||
switch (Hdr.Pe32->FileHeader.Machine) {
|
switch (Hdr.Pe32->FileHeader.Machine) {
|
||||||
case EFI_IMAGE_MACHINE_IA32:
|
case EFI_IMAGE_MACHINE_IA32:
|
||||||
//
|
//
|
||||||
// Assume PE32 image with IA32 Machine field.
|
// Assume PE32 image with IA32 Machine field.
|
||||||
//
|
//
|
||||||
Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC;
|
Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC;
|
||||||
break;
|
break;
|
||||||
case EFI_IMAGE_MACHINE_X64:
|
case EFI_IMAGE_MACHINE_X64:
|
||||||
case EFI_IMAGE_MACHINE_IA64:
|
case EFI_IMAGE_MACHINE_IA64:
|
||||||
//
|
//
|
||||||
// Assume PE32+ image with X64 or IA64 Machine field
|
// Assume PE32+ image with X64 or IA64 Machine field
|
||||||
//
|
//
|
||||||
Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;
|
Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
//
|
//
|
||||||
// For unknow Machine field, use Magic in optional Header
|
// For unknow Machine field, use Magic in optional Header
|
||||||
//
|
//
|
||||||
Magic = Hdr.Pe32->OptionalHeader.Magic;
|
Magic = Hdr.Pe32->OptionalHeader.Magic;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
|
if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
|
||||||
@ -196,42 +193,42 @@ PeCoffLoaderGetPdbPointer (
|
|||||||
// Use PE32 offset get Debug Directory Entry
|
// Use PE32 offset get Debug Directory Entry
|
||||||
//
|
//
|
||||||
NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;
|
NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;
|
||||||
DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);
|
DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);
|
||||||
DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) Pe32Data + DirectoryEntry->VirtualAddress);
|
DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN)Pe32Data + DirectoryEntry->VirtualAddress);
|
||||||
} else if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
|
} else if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
|
||||||
//
|
//
|
||||||
// Use PE32+ offset get Debug Directory Entry
|
// Use PE32+ offset get Debug Directory Entry
|
||||||
//
|
//
|
||||||
NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;
|
NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;
|
||||||
DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);
|
DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);
|
||||||
DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) Pe32Data + DirectoryEntry->VirtualAddress);
|
DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN)Pe32Data + DirectoryEntry->VirtualAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {
|
if (NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {
|
||||||
DirectoryEntry = NULL;
|
DirectoryEntry = NULL;
|
||||||
DebugEntry = NULL;
|
DebugEntry = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DebugEntry == NULL || DirectoryEntry == NULL) {
|
if ((DebugEntry == NULL) || (DirectoryEntry == NULL)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (DirCount = 0; DirCount < DirectoryEntry->Size; DirCount += sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY), DebugEntry++) {
|
for (DirCount = 0; DirCount < DirectoryEntry->Size; DirCount += sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY), DebugEntry++) {
|
||||||
if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {
|
if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {
|
||||||
if (DebugEntry->SizeOfData > 0) {
|
if (DebugEntry->SizeOfData > 0) {
|
||||||
CodeViewEntryPointer = (VOID *) ((UINTN) DebugEntry->RVA + ((UINTN)Pe32Data) + (UINTN)TEImageAdjust);
|
CodeViewEntryPointer = (VOID *)((UINTN)DebugEntry->RVA + ((UINTN)Pe32Data) + (UINTN)TEImageAdjust);
|
||||||
switch (* (UINT32 *) CodeViewEntryPointer) {
|
switch (*(UINT32 *)CodeViewEntryPointer) {
|
||||||
case CODEVIEW_SIGNATURE_NB10:
|
case CODEVIEW_SIGNATURE_NB10:
|
||||||
return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY));
|
return (VOID *)((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY));
|
||||||
case CODEVIEW_SIGNATURE_RSDS:
|
case CODEVIEW_SIGNATURE_RSDS:
|
||||||
return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY));
|
return (VOID *)((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY));
|
||||||
case CODEVIEW_SIGNATURE_MTOC:
|
case CODEVIEW_SIGNATURE_MTOC:
|
||||||
return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY));
|
return (VOID *)((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY));
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,7 +237,6 @@ PeCoffLoaderGetPdbPointer (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the size of the PE/COFF headers
|
Returns the size of the PE/COFF headers
|
||||||
|
|
||||||
@ -256,12 +252,12 @@ PeCoffLoaderGetPdbPointer (
|
|||||||
UINT32
|
UINT32
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeCoffGetSizeOfHeaders (
|
PeCoffGetSizeOfHeaders (
|
||||||
IN VOID *Pe32Data
|
IN VOID *Pe32Data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IMAGE_DOS_HEADER *DosHdr;
|
EFI_IMAGE_DOS_HEADER *DosHdr;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
|
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
|
||||||
UINTN SizeOfHeaders;
|
UINTN SizeOfHeaders;
|
||||||
|
|
||||||
ASSERT (Pe32Data != NULL);
|
ASSERT (Pe32Data != NULL);
|
||||||
|
|
||||||
@ -270,7 +266,7 @@ PeCoffGetSizeOfHeaders (
|
|||||||
//
|
//
|
||||||
// DOS image header is present, so read the PE header after the DOS image header.
|
// DOS image header is present, so read the PE header after the DOS image header.
|
||||||
//
|
//
|
||||||
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));
|
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHdr->e_lfanew) & 0x0ffff));
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// DOS image header is not present, so PE header is at the image base.
|
// DOS image header is not present, so PE header is at the image base.
|
||||||
@ -286,6 +282,5 @@ PeCoffGetSizeOfHeaders (
|
|||||||
SizeOfHeaders = 0;
|
SizeOfHeaders = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (UINT32) SizeOfHeaders;
|
return (UINT32)SizeOfHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiPei.h>
|
#include <PiPei.h>
|
||||||
#include <Library/SerialPortLib.h>
|
#include <Library/SerialPortLib.h>
|
||||||
#include <Library/PeiServicesLib.h>
|
#include <Library/PeiServicesLib.h>
|
||||||
@ -17,8 +16,6 @@
|
|||||||
#include <Ppi/EmuThunk.h>
|
#include <Ppi/EmuThunk.h>
|
||||||
#include <Protocol/EmuThunk.h>
|
#include <Protocol/EmuThunk.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the serial device hardware.
|
Initialize the serial device hardware.
|
||||||
|
|
||||||
@ -59,32 +56,31 @@ SerialPortInitialize (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortWrite (
|
SerialPortWrite (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_THUNK_PPI *ThunkPpi;
|
EMU_THUNK_PPI *ThunkPpi;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_THUNK_PROTOCOL *Thunk;
|
EMU_THUNK_PROTOCOL *Thunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Locate EmuThunkPpi for retrieving standard output handle
|
// Locate EmuThunkPpi for retrieving standard output handle
|
||||||
//
|
//
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid,
|
&gEmuThunkPpiGuid,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &ThunkPpi
|
(VOID **)&ThunkPpi
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
||||||
return Thunk->WriteStdErr (Buffer, NumberOfBytes);
|
return Thunk->WriteStdErr (Buffer, NumberOfBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Read data from serial device and save the datas in buffer.
|
Read data from serial device and save the datas in buffer.
|
||||||
|
|
||||||
@ -104,8 +100,8 @@ SerialPortWrite (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SerialPortRead (
|
SerialPortRead (
|
||||||
OUT UINT8 *Buffer,
|
OUT UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -130,4 +126,3 @@ SerialPortPoll (
|
|||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
#include <Ppi/MemoryDiscovered.h>
|
#include <Ppi/MemoryDiscovered.h>
|
||||||
|
|
||||||
|
|
||||||
CONST EFI_PEI_SERVICES **gPeiServices = NULL;
|
CONST EFI_PEI_SERVICES **gPeiServices = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -33,7 +32,7 @@ CONST EFI_PEI_SERVICES **gPeiServices = NULL;
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SetPeiServicesTablePointer (
|
SetPeiServicesTablePointer (
|
||||||
IN CONST EFI_PEI_SERVICES ** PeiServicesTablePointer
|
IN CONST EFI_PEI_SERVICES **PeiServicesTablePointer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (PeiServicesTablePointer != NULL);
|
ASSERT (PeiServicesTablePointer != NULL);
|
||||||
@ -64,8 +63,6 @@ GetPeiServicesTablePointer (
|
|||||||
return gPeiServices;
|
return gPeiServices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Notification service to be called when gEmuThunkPpiGuid is installed.
|
Notification service to be called when gEmuThunkPpiGuid is installed.
|
||||||
|
|
||||||
@ -81,9 +78,9 @@ GetPeiServicesTablePointer (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesTablePointerNotifyCallback (
|
PeiServicesTablePointerNotifyCallback (
|
||||||
IN EFI_PEI_SERVICES **PeiServices,
|
IN EFI_PEI_SERVICES **PeiServices,
|
||||||
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
|
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
|
||||||
IN VOID *Ppi
|
IN VOID *Ppi
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
gPeiServices = (CONST EFI_PEI_SERVICES **)PeiServices;
|
gPeiServices = (CONST EFI_PEI_SERVICES **)PeiServices;
|
||||||
@ -91,14 +88,12 @@ PeiServicesTablePointerNotifyCallback (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_PEI_NOTIFY_DESCRIPTOR mNotifyOnThunkList = {
|
||||||
EFI_PEI_NOTIFY_DESCRIPTOR mNotifyOnThunkList = {
|
|
||||||
(EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
(EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||||
&gEfiPeiMemoryDiscoveredPpiGuid,
|
&gEfiPeiMemoryDiscoveredPpiGuid,
|
||||||
PeiServicesTablePointerNotifyCallback
|
PeiServicesTablePointerNotifyCallback
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Constructor register notification on when PPI updates. If PPI is
|
Constructor register notification on when PPI updates. If PPI is
|
||||||
alreay installed registering the notify will cause the handle to
|
alreay installed registering the notify will cause the handle to
|
||||||
@ -113,11 +108,11 @@ EFI_PEI_NOTIFY_DESCRIPTOR mNotifyOnThunkList = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesTablePointerLibConstructor (
|
PeiServicesTablePointerLibConstructor (
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
gPeiServices = (CONST EFI_PEI_SERVICES **)PeiServices;
|
gPeiServices = (CONST EFI_PEI_SERVICES **)PeiServices;
|
||||||
|
|
||||||
@ -153,4 +148,3 @@ MigratePeiServicesTablePointer (
|
|||||||
//
|
//
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/EmuMagicPageLib.h>
|
#include <Library/EmuMagicPageLib.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Caches a pointer PEI Services Table.
|
Caches a pointer PEI Services Table.
|
||||||
|
|
||||||
@ -31,12 +30,12 @@
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SetPeiServicesTablePointer (
|
SetPeiServicesTablePointer (
|
||||||
IN CONST EFI_PEI_SERVICES ** PeiServicesTablePointer
|
IN CONST EFI_PEI_SERVICES **PeiServicesTablePointer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (PeiServicesTablePointer != NULL);
|
ASSERT (PeiServicesTablePointer != NULL);
|
||||||
ASSERT (*PeiServicesTablePointer != NULL);
|
ASSERT (*PeiServicesTablePointer != NULL);
|
||||||
EMU_MAGIC_PAGE()->PeiServicesTablePointer = PeiServicesTablePointer;
|
EMU_MAGIC_PAGE ()->PeiServicesTablePointer = PeiServicesTablePointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -57,9 +56,9 @@ GetPeiServicesTablePointer (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
|
CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
|
||||||
|
|
||||||
PeiServicesTablePointer = EMU_MAGIC_PAGE()->PeiServicesTablePointer;
|
PeiServicesTablePointer = EMU_MAGIC_PAGE ()->PeiServicesTablePointer;
|
||||||
ASSERT (PeiServicesTablePointer != NULL);
|
ASSERT (PeiServicesTablePointer != NULL);
|
||||||
ASSERT (*PeiServicesTablePointer != NULL);
|
ASSERT (*PeiServicesTablePointer != NULL);
|
||||||
return PeiServicesTablePointer;
|
return PeiServicesTablePointer;
|
||||||
@ -91,5 +90,3 @@ MigratePeiServicesTablePointer (
|
|||||||
//
|
//
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MicroSecondDelay (
|
MicroSecondDelay (
|
||||||
IN UINTN MicroSeconds
|
IN UINTN MicroSeconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return NanoSecondDelay (MicroSeconds * 1000);
|
return NanoSecondDelay (MicroSeconds * 1000);
|
||||||
@ -47,24 +47,24 @@ MicroSecondDelay (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
NanoSecondDelay (
|
NanoSecondDelay (
|
||||||
IN UINTN NanoSeconds
|
IN UINTN NanoSeconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_THUNK_PPI *ThunkPpi;
|
EMU_THUNK_PPI *ThunkPpi;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_THUNK_PROTOCOL *Thunk;
|
EMU_THUNK_PROTOCOL *Thunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Locate EmuThunkPpi for
|
// Locate EmuThunkPpi for
|
||||||
//
|
//
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid,
|
&gEmuThunkPpiGuid,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &ThunkPpi
|
(VOID **)&ThunkPpi
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
||||||
Thunk->Sleep (NanoSeconds * 100);
|
Thunk->Sleep (NanoSeconds * 100);
|
||||||
return NanoSeconds;
|
return NanoSeconds;
|
||||||
}
|
}
|
||||||
@ -89,22 +89,22 @@ GetPerformanceCounter (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_THUNK_PPI *ThunkPpi;
|
EMU_THUNK_PPI *ThunkPpi;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_THUNK_PROTOCOL *Thunk;
|
EMU_THUNK_PROTOCOL *Thunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Locate EmuThunkPpi for
|
// Locate EmuThunkPpi for
|
||||||
//
|
//
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid,
|
&gEmuThunkPpiGuid,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &ThunkPpi
|
(VOID **)&ThunkPpi
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
||||||
return Thunk->QueryPerformanceCounter ();
|
return Thunk->QueryPerformanceCounter ();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -136,33 +136,34 @@ GetPerformanceCounter (
|
|||||||
UINT64
|
UINT64
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetPerformanceCounterProperties (
|
GetPerformanceCounterProperties (
|
||||||
OUT UINT64 *StartValue OPTIONAL,
|
OUT UINT64 *StartValue OPTIONAL,
|
||||||
OUT UINT64 *EndValue OPTIONAL
|
OUT UINT64 *EndValue OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_THUNK_PPI *ThunkPpi;
|
EMU_THUNK_PPI *ThunkPpi;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_THUNK_PROTOCOL *Thunk;
|
EMU_THUNK_PROTOCOL *Thunk;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Locate EmuThunkPpi for
|
// Locate EmuThunkPpi for
|
||||||
//
|
//
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid,
|
&gEmuThunkPpiGuid,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &ThunkPpi
|
(VOID **)&ThunkPpi
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
if (StartValue != NULL) {
|
if (StartValue != NULL) {
|
||||||
*StartValue = 0ULL;
|
*StartValue = 0ULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EndValue != NULL) {
|
if (EndValue != NULL) {
|
||||||
*EndValue = (UINT64)-1LL;
|
*EndValue = (UINT64)-1LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
|
||||||
return Thunk->QueryPerformanceFrequency ();
|
return Thunk->QueryPerformanceFrequency ();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -204,9 +205,9 @@ GetTimeInNanoSecond (
|
|||||||
// Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,
|
// Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,
|
||||||
// i.e. highest bit set in Remainder should <= 33.
|
// i.e. highest bit set in Remainder should <= 33.
|
||||||
//
|
//
|
||||||
Shift = MAX (0, HighBitSet64 (Remainder) - 33);
|
Shift = MAX (0, HighBitSet64 (Remainder) - 33);
|
||||||
Remainder = RShiftU64 (Remainder, (UINTN) Shift);
|
Remainder = RShiftU64 (Remainder, (UINTN)Shift);
|
||||||
Frequency = RShiftU64 (Frequency, (UINTN) Shift);
|
Frequency = RShiftU64 (Frequency, (UINTN)Shift);
|
||||||
NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);
|
NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);
|
||||||
|
|
||||||
return NanoSeconds;
|
return NanoSeconds;
|
||||||
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "PlatformBm.h"
|
#include "PlatformBm.h"
|
||||||
|
|
||||||
EFI_GUID mBootMenuFile = {
|
EFI_GUID mBootMenuFile = {
|
||||||
0xEEC25BDC, 0x67F2, 0x4D95, { 0xB1, 0xD5, 0xF8, 0x1B, 0x20, 0x39, 0xD1, 0x1D }
|
0xEEC25BDC, 0x67F2, 0x4D95, { 0xB1, 0xD5, 0xF8, 0x1B, 0x20, 0x39, 0xD1, 0x1D }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -20,24 +20,24 @@ SetupVariableInit (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
EMU_SYSTEM_CONFIGURATION SystemConfigData;
|
EMU_SYSTEM_CONFIGURATION SystemConfigData;
|
||||||
|
|
||||||
Size = sizeof (SystemConfigData);
|
Size = sizeof (SystemConfigData);
|
||||||
Status = gRT->GetVariable (
|
Status = gRT->GetVariable (
|
||||||
L"Setup",
|
L"Setup",
|
||||||
&gEmuSystemConfigGuid,
|
&gEmuSystemConfigGuid,
|
||||||
NULL,
|
NULL,
|
||||||
&Size,
|
&Size,
|
||||||
(VOID *) &SystemConfigData
|
(VOID *)&SystemConfigData
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// SetupVariable is corrupt
|
// SetupVariable is corrupt
|
||||||
//
|
//
|
||||||
SystemConfigData.ConOutRow = PcdGet32 (PcdConOutColumn);
|
SystemConfigData.ConOutRow = PcdGet32 (PcdConOutColumn);
|
||||||
SystemConfigData.ConOutColumn = PcdGet32 (PcdConOutRow);
|
SystemConfigData.ConOutColumn = PcdGet32 (PcdConOutRow);
|
||||||
|
|
||||||
Status = gRT->SetVariable (
|
Status = gRT->SetVariable (
|
||||||
@ -45,7 +45,7 @@ SetupVariableInit (
|
|||||||
&gEmuSystemConfigGuid,
|
&gEmuSystemConfigGuid,
|
||||||
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
sizeof (SystemConfigData),
|
sizeof (SystemConfigData),
|
||||||
(VOID *) &SystemConfigData
|
(VOID *)&SystemConfigData
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "Failed to save Setup Variable to non-volatile storage, Status = %r\n", Status));
|
DEBUG ((DEBUG_ERROR, "Failed to save Setup Variable to non-volatile storage, Status = %r\n", Status));
|
||||||
@ -55,10 +55,9 @@ SetupVariableInit (
|
|||||||
|
|
||||||
EFI_DEVICE_PATH *
|
EFI_DEVICE_PATH *
|
||||||
FvFilePath (
|
FvFilePath (
|
||||||
EFI_GUID *FileGuid
|
EFI_GUID *FileGuid
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||||
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
|
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
|
||||||
@ -68,12 +67,12 @@ FvFilePath (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
gImageHandle,
|
gImageHandle,
|
||||||
&gEfiLoadedImageProtocolGuid,
|
&gEfiLoadedImageProtocolGuid,
|
||||||
(VOID **) &LoadedImage
|
(VOID **)&LoadedImage
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
return AppendDevicePathNode (
|
return AppendDevicePathNode (
|
||||||
DevicePathFromHandle (LoadedImage->DeviceHandle),
|
DevicePathFromHandle (LoadedImage->DeviceHandle),
|
||||||
(EFI_DEVICE_PATH_PROTOCOL *) &FileNode
|
(EFI_DEVICE_PATH_PROTOCOL *)&FileNode
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,28 +90,28 @@ FvFilePath (
|
|||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
RegisterBootManagerMenuAppBootOption (
|
RegisterBootManagerMenuAppBootOption (
|
||||||
EFI_GUID *FileGuid,
|
EFI_GUID *FileGuid,
|
||||||
CHAR16 *Description,
|
CHAR16 *Description,
|
||||||
UINTN Position,
|
UINTN Position,
|
||||||
BOOLEAN IsBootCategory
|
BOOLEAN IsBootCategory
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_BOOT_MANAGER_LOAD_OPTION NewOption;
|
EFI_BOOT_MANAGER_LOAD_OPTION NewOption;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
UINTN OptionNumber;
|
UINTN OptionNumber;
|
||||||
|
|
||||||
DevicePath = FvFilePath (FileGuid);
|
DevicePath = FvFilePath (FileGuid);
|
||||||
Status = EfiBootManagerInitializeLoadOption (
|
Status = EfiBootManagerInitializeLoadOption (
|
||||||
&NewOption,
|
&NewOption,
|
||||||
LoadOptionNumberUnassigned,
|
LoadOptionNumberUnassigned,
|
||||||
LoadOptionTypeBoot,
|
LoadOptionTypeBoot,
|
||||||
IsBootCategory ? LOAD_OPTION_ACTIVE : LOAD_OPTION_CATEGORY_APP,
|
IsBootCategory ? LOAD_OPTION_ACTIVE : LOAD_OPTION_CATEGORY_APP,
|
||||||
Description,
|
Description,
|
||||||
DevicePath,
|
DevicePath,
|
||||||
NULL,
|
NULL,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
FreePool (DevicePath);
|
FreePool (DevicePath);
|
||||||
|
|
||||||
@ -136,16 +135,16 @@ RegisterBootManagerMenuAppBootOption (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IsBootManagerMenuAppFilePath (
|
IsBootManagerMenuAppFilePath (
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE FvHandle;
|
EFI_HANDLE FvHandle;
|
||||||
VOID *NameGuid;
|
VOID *NameGuid;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = gBS->LocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, &DevicePath, &FvHandle);
|
Status = gBS->LocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, &DevicePath, &FvHandle);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) DevicePath);
|
NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)DevicePath);
|
||||||
if (NameGuid != NULL) {
|
if (NameGuid != NULL) {
|
||||||
return CompareGuid (NameGuid, &mBootMenuFile);
|
return CompareGuid (NameGuid, &mBootMenuFile);
|
||||||
}
|
}
|
||||||
@ -167,10 +166,10 @@ GetBootManagerMenuAppOption (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN BootOptionCount;
|
UINTN BootOptionCount;
|
||||||
EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;
|
EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN OptionNumber;
|
UINTN OptionNumber;
|
||||||
|
|
||||||
OptionNumber = 0;
|
OptionNumber = 0;
|
||||||
|
|
||||||
@ -189,7 +188,7 @@ GetBootManagerMenuAppOption (
|
|||||||
//
|
//
|
||||||
// If not found the BootManagerMenuApp, create it.
|
// If not found the BootManagerMenuApp, create it.
|
||||||
//
|
//
|
||||||
OptionNumber = (UINT16) RegisterBootManagerMenuAppBootOption (&mBootMenuFile, L"UEFI BootManagerMenuApp", (UINTN) -1, FALSE);
|
OptionNumber = (UINT16)RegisterBootManagerMenuAppBootOption (&mBootMenuFile, L"UEFI BootManagerMenuApp", (UINTN)-1, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return OptionNumber;
|
return OptionNumber;
|
||||||
@ -205,13 +204,13 @@ PlatformBootManagerBeforeConsole (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
SetupVariableInit ();
|
SetupVariableInit ();
|
||||||
|
|
||||||
EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);
|
EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);
|
||||||
|
|
||||||
Index = 0;
|
Index = 0;
|
||||||
while (gPlatformConsole[Index].DevicePath != NULL) {
|
while (gPlatformConsole[Index].DevicePath != NULL) {
|
||||||
//
|
//
|
||||||
// Update the console variable with the connect type
|
// Update the console variable with the connect type
|
||||||
@ -256,8 +255,8 @@ PlatformBdsConnectSequence (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
PlatformBdsDiagnostics (
|
PlatformBdsDiagnostics (
|
||||||
IN EXTENDMEM_COVERAGE_LEVEL MemoryTestLevel,
|
IN EXTENDMEM_COVERAGE_LEVEL MemoryTestLevel,
|
||||||
IN BOOLEAN QuietBoot
|
IN BOOLEAN QuietBoot
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -317,14 +316,14 @@ PlatformBdsRegisterStaticBootOptions (
|
|||||||
F2.ScanCode = SCAN_F2;
|
F2.ScanCode = SCAN_F2;
|
||||||
F2.UnicodeChar = CHAR_NULL;
|
F2.UnicodeChar = CHAR_NULL;
|
||||||
EfiBootManagerGetBootManagerMenu (&BootOption);
|
EfiBootManagerGetBootManagerMenu (&BootOption);
|
||||||
EfiBootManagerAddKeyOptionVariable (NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL);
|
EfiBootManagerAddKeyOptionVariable (NULL, (UINT16)BootOption.OptionNumber, 0, &F2, NULL);
|
||||||
|
|
||||||
//
|
//
|
||||||
// 3. Boot Device List menu
|
// 3. Boot Device List menu
|
||||||
//
|
//
|
||||||
F7.ScanCode = SCAN_F7;
|
F7.ScanCode = SCAN_F7;
|
||||||
F7.UnicodeChar = CHAR_NULL;
|
F7.UnicodeChar = CHAR_NULL;
|
||||||
OptionNumber = GetBootManagerMenuAppOption ();
|
OptionNumber = GetBootManagerMenuAppOption ();
|
||||||
EfiBootManagerAddKeyOptionVariable (NULL, (UINT16)OptionNumber, 0, &F7, NULL);
|
EfiBootManagerAddKeyOptionVariable (NULL, (UINT16)OptionNumber, 0, &F7, NULL);
|
||||||
|
|
||||||
PrintXY (10, 10, &White, &Black, L"F2 to enter Setup. ");
|
PrintXY (10, 10, &White, &Black, L"F2 to enter Setup. ");
|
||||||
@ -339,7 +338,7 @@ PlatformBdsRegisterStaticBootOptions (
|
|||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
BootOptionPriority (
|
BootOptionPriority (
|
||||||
CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
|
CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@ -348,6 +347,7 @@ BootOptionPriority (
|
|||||||
if (StrCmp (BootOption->Description, L"UEFI Shell") == 0) {
|
if (StrCmp (BootOption->Description, L"UEFI Shell") == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 100;
|
return 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -377,37 +377,35 @@ PlatformBootManagerAfterConsole (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
//
|
//
|
||||||
// Go the different platform policy with different boot mode
|
// Go the different platform policy with different boot mode
|
||||||
// Notes: this part code can be change with the table policy
|
// Notes: this part code can be change with the table policy
|
||||||
//
|
//
|
||||||
switch (GetBootModeHob ()) {
|
switch (GetBootModeHob ()) {
|
||||||
|
case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
|
||||||
|
case BOOT_WITH_MINIMAL_CONFIGURATION:
|
||||||
|
PlatformBdsDiagnostics (IGNORE, TRUE);
|
||||||
|
|
||||||
case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
|
//
|
||||||
case BOOT_WITH_MINIMAL_CONFIGURATION:
|
// Perform some platform specific connect sequence
|
||||||
PlatformBdsDiagnostics (IGNORE, TRUE);
|
//
|
||||||
|
PlatformBdsConnectSequence ();
|
||||||
|
break;
|
||||||
|
|
||||||
//
|
case BOOT_IN_RECOVERY_MODE:
|
||||||
// Perform some platform specific connect sequence
|
PlatformBdsDiagnostics (EXTENSIVE, FALSE);
|
||||||
//
|
break;
|
||||||
PlatformBdsConnectSequence ();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BOOT_IN_RECOVERY_MODE:
|
case BOOT_WITH_FULL_CONFIGURATION:
|
||||||
PlatformBdsDiagnostics (EXTENSIVE, FALSE);
|
case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
|
||||||
break;
|
case BOOT_WITH_DEFAULT_SETTINGS:
|
||||||
|
default:
|
||||||
case BOOT_WITH_FULL_CONFIGURATION:
|
PlatformBdsDiagnostics (IGNORE, TRUE);
|
||||||
case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
|
PlatformBdsRegisterStaticBootOptions ();
|
||||||
case BOOT_WITH_DEFAULT_SETTINGS:
|
PlatformBdsConnectSequence ();
|
||||||
default:
|
EfiBootManagerRefreshAllBootOption ();
|
||||||
PlatformBdsDiagnostics (IGNORE, TRUE);
|
EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, (SORT_COMPARE)CompareBootOption);
|
||||||
PlatformBdsRegisterStaticBootOptions ();
|
break;
|
||||||
PlatformBdsConnectSequence ();
|
|
||||||
EfiBootManagerRefreshAllBootOption ();
|
|
||||||
EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, (SORT_COMPARE)CompareBootOption);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -419,12 +417,12 @@ PlatformBootManagerAfterConsole (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PlatformBootManagerWaitCallback (
|
PlatformBootManagerWaitCallback (
|
||||||
UINT16 TimeoutRemain
|
UINT16 TimeoutRemain
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Black;
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Black;
|
||||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION White;
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION White;
|
||||||
UINT16 Timeout;
|
UINT16 Timeout;
|
||||||
|
|
||||||
Timeout = PcdGet16 (PcdPlatformBootTimeOut);
|
Timeout = PcdGet16 (PcdPlatformBootTimeOut);
|
||||||
|
|
||||||
@ -456,4 +454,3 @@ PlatformBootManagerUnableToBoot (
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,14 +34,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/HobLib.h>
|
#include <Library/HobLib.h>
|
||||||
#include <Library/HiiLib.h>
|
#include <Library/HiiLib.h>
|
||||||
|
|
||||||
#define CONSOLE_OUT 0x00000001
|
#define CONSOLE_OUT 0x00000001
|
||||||
#define STD_ERROR 0x00000002
|
#define STD_ERROR 0x00000002
|
||||||
#define CONSOLE_IN 0x00000004
|
#define CONSOLE_IN 0x00000004
|
||||||
#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
|
#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
UINTN ConnectType;
|
UINTN ConnectType;
|
||||||
} BDS_CONSOLE_CONNECT_ENTRY;
|
} BDS_CONSOLE_CONNECT_ENTRY;
|
||||||
|
|
||||||
extern BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
|
extern BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
|
||||||
@ -56,14 +56,12 @@ extern BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
|
|||||||
}\
|
}\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EMU_VENDOR_DEVICE_PATH_NODE EmuBus;
|
EMU_VENDOR_DEVICE_PATH_NODE EmuBus;
|
||||||
EMU_VENDOR_DEVICE_PATH_NODE EmuGraphicsWindow;
|
EMU_VENDOR_DEVICE_PATH_NODE EmuGraphicsWindow;
|
||||||
EFI_DEVICE_PATH_PROTOCOL End;
|
EFI_DEVICE_PATH_PROTOCOL End;
|
||||||
} EMU_PLATFORM_UGA_DEVICE_PATH;
|
} EMU_PLATFORM_UGA_DEVICE_PATH;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Platform BDS Functions
|
// Platform BDS Functions
|
||||||
//
|
//
|
||||||
@ -80,10 +78,9 @@ typedef struct {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PlatformBootManagerMemoryTest (
|
PlatformBootManagerMemoryTest (
|
||||||
IN EXTENDMEM_COVERAGE_LEVEL Level
|
IN EXTENDMEM_COVERAGE_LEVEL Level
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
PlatformBdsConnectSequence (
|
PlatformBdsConnectSequence (
|
||||||
VOID
|
VOID
|
||||||
|
@ -8,17 +8,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "PlatformBm.h"
|
#include "PlatformBm.h"
|
||||||
|
|
||||||
|
EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath = {
|
||||||
|
|
||||||
EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath = {
|
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
HARDWARE_DEVICE_PATH,
|
HARDWARE_DEVICE_PATH,
|
||||||
HW_VENDOR_DP,
|
HW_VENDOR_DP,
|
||||||
{
|
{
|
||||||
(UINT8) (sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
(UINT8)(sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
||||||
(UINT8) ((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
(UINT8)((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
EMU_THUNK_PROTOCOL_GUID
|
EMU_THUNK_PROTOCOL_GUID
|
||||||
@ -31,8 +29,8 @@ EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath = {
|
|||||||
HARDWARE_DEVICE_PATH,
|
HARDWARE_DEVICE_PATH,
|
||||||
HW_VENDOR_DP,
|
HW_VENDOR_DP,
|
||||||
{
|
{
|
||||||
(UINT8) (sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
(UINT8)(sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
||||||
(UINT8) ((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
(UINT8)((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
EMU_GRAPHICS_WINDOW_PROTOCOL_GUID,
|
EMU_GRAPHICS_WINDOW_PROTOCOL_GUID,
|
||||||
@ -42,15 +40,15 @@ EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath = {
|
|||||||
gEndEntire
|
gEndEntire
|
||||||
};
|
};
|
||||||
|
|
||||||
EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath2 = {
|
EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath2 = {
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
HARDWARE_DEVICE_PATH,
|
HARDWARE_DEVICE_PATH,
|
||||||
HW_VENDOR_DP,
|
HW_VENDOR_DP,
|
||||||
{
|
{
|
||||||
(UINT8) (sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
(UINT8)(sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
||||||
(UINT8) ((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
(UINT8)((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
EMU_THUNK_PROTOCOL_GUID
|
EMU_THUNK_PROTOCOL_GUID
|
||||||
@ -63,8 +61,8 @@ EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath2 = {
|
|||||||
HARDWARE_DEVICE_PATH,
|
HARDWARE_DEVICE_PATH,
|
||||||
HW_VENDOR_DP,
|
HW_VENDOR_DP,
|
||||||
{
|
{
|
||||||
(UINT8) (sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
(UINT8)(sizeof (EMU_VENDOR_DEVICE_PATH_NODE)),
|
||||||
(UINT8) ((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
(UINT8)((sizeof (EMU_VENDOR_DEVICE_PATH_NODE)) >> 8)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
EMU_GRAPHICS_WINDOW_PROTOCOL_GUID,
|
EMU_GRAPHICS_WINDOW_PROTOCOL_GUID,
|
||||||
@ -77,13 +75,13 @@ EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath2 = {
|
|||||||
//
|
//
|
||||||
// Predefined platform default console device path
|
// Predefined platform default console device path
|
||||||
//
|
//
|
||||||
BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
|
BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
|
||||||
{
|
{
|
||||||
(EFI_DEVICE_PATH_PROTOCOL *) &gGopDevicePath,
|
(EFI_DEVICE_PATH_PROTOCOL *)&gGopDevicePath,
|
||||||
(CONSOLE_OUT | CONSOLE_IN)
|
(CONSOLE_OUT | CONSOLE_IN)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
(EFI_DEVICE_PATH_PROTOCOL *) &gGopDevicePath2,
|
(EFI_DEVICE_PATH_PROTOCOL *)&gGopDevicePath2,
|
||||||
(CONSOLE_OUT | CONSOLE_IN)
|
(CONSOLE_OUT | CONSOLE_IN)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -91,4 +89,3 @@ BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
|
|||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PlatformBootManagerMemoryTest (
|
PlatformBootManagerMemoryTest (
|
||||||
IN EXTENDMEM_COVERAGE_LEVEL Level
|
IN EXTENDMEM_COVERAGE_LEVEL Level
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -42,17 +42,17 @@ PlatformBootManagerMemoryTest (
|
|||||||
ReturnStatus = EFI_SUCCESS;
|
ReturnStatus = EFI_SUCCESS;
|
||||||
ZeroMem (&Key, sizeof (EFI_INPUT_KEY));
|
ZeroMem (&Key, sizeof (EFI_INPUT_KEY));
|
||||||
|
|
||||||
TestedMemorySize = 0;
|
TestedMemorySize = 0;
|
||||||
TotalMemorySize = 0;
|
TotalMemorySize = 0;
|
||||||
ErrorOut = FALSE;
|
ErrorOut = FALSE;
|
||||||
TestAbort = FALSE;
|
TestAbort = FALSE;
|
||||||
|
|
||||||
RequireSoftECCInit = FALSE;
|
RequireSoftECCInit = FALSE;
|
||||||
|
|
||||||
Status = gBS->LocateProtocol (
|
Status = gBS->LocateProtocol (
|
||||||
&gEfiGenericMemTestProtocolGuid,
|
&gEfiGenericMemTestProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &GenMemoryTest
|
(VOID **)&GenMemoryTest
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -88,11 +88,10 @@ PlatformBootManagerMemoryTest (
|
|||||||
ASSERT (0);
|
ASSERT (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "Perform memory test (ESC to skip).\n"));
|
DEBUG ((DEBUG_INFO, "Perform memory test (ESC to skip).\n"));
|
||||||
|
|
||||||
if (!PcdGetBool (PcdConInConnectOnDemand)) {
|
if (!PcdGetBool (PcdConInConnectOnDemand)) {
|
||||||
KeyStatus = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
KeyStatus = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
||||||
if (!EFI_ERROR (KeyStatus) && (Key.ScanCode == SCAN_ESC)) {
|
if (!EFI_ERROR (KeyStatus) && (Key.ScanCode == SCAN_ESC)) {
|
||||||
if (!RequireSoftECCInit) {
|
if (!RequireSoftECCInit) {
|
||||||
Status = GenMemoryTest->Finished (GenMemoryTest);
|
Status = GenMemoryTest->Finished (GenMemoryTest);
|
||||||
|
@ -18,15 +18,15 @@
|
|||||||
#include <Guid/GlobalVariable.h>
|
#include <Guid/GlobalVariable.h>
|
||||||
#include <Guid/ImageAuthentication.h>
|
#include <Guid/ImageAuthentication.h>
|
||||||
|
|
||||||
BOOLEAN mSecureBootDisabled = FALSE;
|
BOOLEAN mSecureBootDisabled = FALSE;
|
||||||
BOOLEAN mStopRedfishService = FALSE;
|
BOOLEAN mStopRedfishService = FALSE;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
LibStopRedfishService (
|
LibStopRedfishService (
|
||||||
IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This,
|
IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This,
|
||||||
IN EDKII_REDFISH_CREDENTIAL_STOP_SERVICE_TYPE ServiceStopType
|
IN EDKII_REDFISH_CREDENTIAL_STOP_SERVICE_TYPE ServiceStopType
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Return the credential for accessing to Redfish servcice.
|
Return the credential for accessing to Redfish servcice.
|
||||||
@ -41,10 +41,10 @@ LibStopRedfishService (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetRedfishCredential (
|
GetRedfishCredential (
|
||||||
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
|
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
|
||||||
OUT CHAR8 **UserId,
|
OUT CHAR8 **UserId,
|
||||||
OUT CHAR8 **Password
|
OUT CHAR8 **Password
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN UserIdSize;
|
UINTN UserIdSize;
|
||||||
UINTN PasswordSize;
|
UINTN PasswordSize;
|
||||||
@ -59,14 +59,16 @@ GetRedfishCredential (
|
|||||||
//
|
//
|
||||||
UserIdSize = AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdRedfishServieUserId));
|
UserIdSize = AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdRedfishServieUserId));
|
||||||
PasswordSize = AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdRedfishServiePassword));
|
PasswordSize = AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdRedfishServiePassword));
|
||||||
if (UserIdSize == 0 || PasswordSize == 0) {
|
if ((UserIdSize == 0) || (PasswordSize == 0)) {
|
||||||
DEBUG ((DEBUG_ERROR, "Incorrect string of UserID or Password for REdfish service.\n"));
|
DEBUG ((DEBUG_ERROR, "Incorrect string of UserID or Password for REdfish service.\n"));
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
*UserId = AllocateZeroPool (UserIdSize);
|
*UserId = AllocateZeroPool (UserIdSize);
|
||||||
if (*UserId == NULL) {
|
if (*UserId == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (*UserId, (CHAR8 *)PcdGetPtr (PcdRedfishServieUserId), UserIdSize);
|
CopyMem (*UserId, (CHAR8 *)PcdGetPtr (PcdRedfishServieUserId), UserIdSize);
|
||||||
|
|
||||||
*Password = AllocateZeroPool (PasswordSize);
|
*Password = AllocateZeroPool (PasswordSize);
|
||||||
@ -110,11 +112,11 @@ LibCredentialGetAuthInfo (
|
|||||||
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
|
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
|
||||||
OUT CHAR8 **UserId,
|
OUT CHAR8 **UserId,
|
||||||
OUT CHAR8 **Password
|
OUT CHAR8 **Password
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
if (This == NULL || AuthMethod == NULL || UserId == NULL || Password == NULL) {
|
if ((This == NULL) || (AuthMethod == NULL) || (UserId == NULL) || (Password == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +126,7 @@ LibCredentialGetAuthInfo (
|
|||||||
|
|
||||||
if (mSecureBootDisabled) {
|
if (mSecureBootDisabled) {
|
||||||
Status = LibStopRedfishService (This, ServiceStopTypeSecureBootDisabled);
|
Status = LibStopRedfishService (This, ServiceStopTypeSecureBootDisabled);
|
||||||
if (EFI_ERROR (Status) && Status != EFI_UNSUPPORTED) {
|
if (EFI_ERROR (Status) && (Status != EFI_UNSUPPORTED)) {
|
||||||
DEBUG ((DEBUG_ERROR, "SecureBoot has been disabled, but failed to stop RedfishService - %r\n", Status));
|
DEBUG ((DEBUG_ERROR, "SecureBoot has been disabled, but failed to stop RedfishService - %r\n", Status));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -159,9 +161,9 @@ LibCredentialGetAuthInfo (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
LibStopRedfishService (
|
LibStopRedfishService (
|
||||||
IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This,
|
IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This,
|
||||||
IN EDKII_REDFISH_CREDENTIAL_STOP_SERVICE_TYPE ServiceStopType
|
IN EDKII_REDFISH_CREDENTIAL_STOP_SERVICE_TYPE ServiceStopType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (ServiceStopType >= ServiceStopTypeMax) {
|
if (ServiceStopType >= ServiceStopTypeMax) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -193,8 +195,10 @@ LibStopRedfishService (
|
|||||||
mStopRedfishService = TRUE;
|
mStopRedfishService = TRUE;
|
||||||
DEBUG ((DEBUG_INFO, "EFI Redfish service is stopped without Redfish service stop type!!\n"));
|
DEBUG ((DEBUG_INFO, "EFI Redfish service is stopped without Redfish service stop type!!\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Notification of Exit Boot Service.
|
Notification of Exit Boot Service.
|
||||||
|
|
||||||
@ -204,7 +208,7 @@ VOID
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
LibCredentialExitBootServicesNotify (
|
LibCredentialExitBootServicesNotify (
|
||||||
IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This
|
IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LibStopRedfishService (This, ServiceStopTypeExitBootService);
|
LibStopRedfishService (This, ServiceStopTypeExitBootService);
|
||||||
}
|
}
|
||||||
@ -218,15 +222,15 @@ VOID
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
LibCredentialEndOfDxeNotify (
|
LibCredentialEndOfDxeNotify (
|
||||||
IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This
|
IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT8 *SecureBootVar;
|
UINT8 *SecureBootVar;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check Secure Boot status and lock Redfish service if Secure Boot is disabled.
|
// Check Secure Boot status and lock Redfish service if Secure Boot is disabled.
|
||||||
//
|
//
|
||||||
Status = GetVariable2 (EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid, (VOID**)&SecureBootVar, NULL);
|
Status = GetVariable2 (EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid, (VOID **)&SecureBootVar, NULL);
|
||||||
if (EFI_ERROR (Status) || (*SecureBootVar != SECURE_BOOT_MODE_ENABLE)) {
|
if (EFI_ERROR (Status) || (*SecureBootVar != SECURE_BOOT_MODE_ENABLE)) {
|
||||||
//
|
//
|
||||||
// Secure Boot is disabled
|
// Secure Boot is disabled
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#define VERBOSE_COLUME_SIZE (16)
|
#define VERBOSE_COLUME_SIZE (16)
|
||||||
|
|
||||||
REDFISH_OVER_IP_PROTOCOL_DATA *mRedfishOverIpProtocolData;
|
REDFISH_OVER_IP_PROTOCOL_DATA *mRedfishOverIpProtocolData;
|
||||||
UINT8 mRedfishProtocolDataSize;
|
UINT8 mRedfishProtocolDataSize;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the MAC address of NIC.
|
Get the MAC address of NIC.
|
||||||
@ -38,22 +38,23 @@ UINT8 mRedfishProtocolDataSize;
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetMacAddressInformation (
|
GetMacAddressInformation (
|
||||||
OUT EFI_MAC_ADDRESS *MacAddress
|
OUT EFI_MAC_ADDRESS *MacAddress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
MAC_ADDR_DEVICE_PATH *Mac;
|
MAC_ADDR_DEVICE_PATH *Mac;
|
||||||
REST_EX_SERVICE_DEVICE_PATH_DATA *RestExServiceDevicePathData;
|
REST_EX_SERVICE_DEVICE_PATH_DATA *RestExServiceDevicePathData;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *RestExServiceDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *RestExServiceDevicePath;
|
||||||
MAC_ADDR_DEVICE_PATH *MacAddressDevicePath;
|
MAC_ADDR_DEVICE_PATH *MacAddressDevicePath;
|
||||||
|
|
||||||
Mac = NULL;
|
Mac = NULL;
|
||||||
RestExServiceDevicePathData = NULL;
|
RestExServiceDevicePathData = NULL;
|
||||||
RestExServiceDevicePath = NULL;
|
RestExServiceDevicePath = NULL;
|
||||||
|
|
||||||
RestExServiceDevicePathData = (REST_EX_SERVICE_DEVICE_PATH_DATA *)PcdGetPtr(PcdRedfishRestExServiceDevicePath);
|
RestExServiceDevicePathData = (REST_EX_SERVICE_DEVICE_PATH_DATA *)PcdGetPtr (PcdRedfishRestExServiceDevicePath);
|
||||||
if (RestExServiceDevicePathData == NULL ||
|
if ((RestExServiceDevicePathData == NULL) ||
|
||||||
RestExServiceDevicePathData->DevicePathNum == 0 ||
|
(RestExServiceDevicePathData->DevicePathNum == 0) ||
|
||||||
!IsDevicePathValid (RestExServiceDevicePathData->DevicePath, 0)) {
|
!IsDevicePathValid (RestExServiceDevicePathData->DevicePath, 0))
|
||||||
|
{
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,7 +68,8 @@ GetMacAddressInformation (
|
|||||||
//
|
//
|
||||||
while (!IsDevicePathEnd (RestExServiceDevicePath) &&
|
while (!IsDevicePathEnd (RestExServiceDevicePath) &&
|
||||||
((DevicePathType (RestExServiceDevicePath) != MESSAGING_DEVICE_PATH) ||
|
((DevicePathType (RestExServiceDevicePath) != MESSAGING_DEVICE_PATH) ||
|
||||||
(DevicePathSubType (RestExServiceDevicePath) != MSG_MAC_ADDR_DP))) {
|
(DevicePathSubType (RestExServiceDevicePath) != MSG_MAC_ADDR_DP)))
|
||||||
|
{
|
||||||
RestExServiceDevicePath = NextDevicePathNode (RestExServiceDevicePath);
|
RestExServiceDevicePath = NextDevicePathNode (RestExServiceDevicePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,6 +78,7 @@ GetMacAddressInformation (
|
|||||||
CopyMem ((VOID *)MacAddress, (VOID *)&MacAddressDevicePath->MacAddress, sizeof (EFI_MAC_ADDRESS));
|
CopyMem ((VOID *)MacAddress, (VOID *)&MacAddressDevicePath->MacAddress, sizeof (EFI_MAC_ADDRESS));
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,35 +94,38 @@ GetMacAddressInformation (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
RedfishPlatformHostInterfaceDeviceDescriptor (
|
RedfishPlatformHostInterfaceDeviceDescriptor (
|
||||||
OUT UINT8 *DeviceType,
|
OUT UINT8 *DeviceType,
|
||||||
OUT REDFISH_INTERFACE_DATA **DeviceDescriptor
|
OUT REDFISH_INTERFACE_DATA **DeviceDescriptor
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_MAC_ADDRESS MacAddress;
|
EFI_MAC_ADDRESS MacAddress;
|
||||||
REDFISH_INTERFACE_DATA *RedfishInterfaceData;
|
REDFISH_INTERFACE_DATA *RedfishInterfaceData;
|
||||||
PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2 *ThisDeviceDescriptor;
|
PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2 *ThisDeviceDescriptor;
|
||||||
|
|
||||||
RedfishInterfaceData = AllocateZeroPool (sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1);
|
RedfishInterfaceData = AllocateZeroPool (sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1);
|
||||||
if (RedfishInterfaceData == NULL) {
|
if (RedfishInterfaceData == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
RedfishInterfaceData->DeviceType = REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2;
|
RedfishInterfaceData->DeviceType = REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2;
|
||||||
//
|
//
|
||||||
// Fill up device type information.
|
// Fill up device type information.
|
||||||
//
|
//
|
||||||
ThisDeviceDescriptor = (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2 *)((UINT8 *)RedfishInterfaceData + 1);
|
ThisDeviceDescriptor = (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2 *)((UINT8 *)RedfishInterfaceData + 1);
|
||||||
ThisDeviceDescriptor->Length = sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1;
|
ThisDeviceDescriptor->Length = sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1;
|
||||||
Status = GetMacAddressInformation (&MacAddress);
|
Status = GetMacAddressInformation (&MacAddress);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
FreePool (RedfishInterfaceData);
|
FreePool (RedfishInterfaceData);
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem ((VOID *)&ThisDeviceDescriptor->MacAddress, (VOID *)&MacAddress, sizeof (ThisDeviceDescriptor->MacAddress));
|
CopyMem ((VOID *)&ThisDeviceDescriptor->MacAddress, (VOID *)&MacAddress, sizeof (ThisDeviceDescriptor->MacAddress));
|
||||||
*DeviceType = REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2;
|
*DeviceType = REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2;
|
||||||
*DeviceDescriptor = RedfishInterfaceData;
|
*DeviceDescriptor = RedfishInterfaceData;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get platform Redfish host interface protocol data.
|
Get platform Redfish host interface protocol data.
|
||||||
Caller should pass NULL in ProtocolRecord to retrive the first protocol record.
|
Caller should pass NULL in ProtocolRecord to retrive the first protocol record.
|
||||||
@ -136,29 +142,32 @@ RedfishPlatformHostInterfaceDeviceDescriptor (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
RedfishPlatformHostInterfaceProtocolData (
|
RedfishPlatformHostInterfaceProtocolData (
|
||||||
OUT MC_HOST_INTERFACE_PROTOCOL_RECORD **ProtocolRecord,
|
OUT MC_HOST_INTERFACE_PROTOCOL_RECORD **ProtocolRecord,
|
||||||
IN UINT8 IndexOfProtocolData
|
IN UINT8 IndexOfProtocolData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
MC_HOST_INTERFACE_PROTOCOL_RECORD *ThisProtocolRecord;
|
MC_HOST_INTERFACE_PROTOCOL_RECORD *ThisProtocolRecord;
|
||||||
|
|
||||||
if (mRedfishOverIpProtocolData == 0) {
|
if (mRedfishOverIpProtocolData == 0) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IndexOfProtocolData == 0) {
|
if (IndexOfProtocolData == 0) {
|
||||||
//
|
//
|
||||||
// Return the first Redfish protocol data to caller. We only have
|
// Return the first Redfish protocol data to caller. We only have
|
||||||
// one protocol data in this case.
|
// one protocol data in this case.
|
||||||
//
|
//
|
||||||
ThisProtocolRecord = (MC_HOST_INTERFACE_PROTOCOL_RECORD *) AllocatePool (mRedfishProtocolDataSize + sizeof (MC_HOST_INTERFACE_PROTOCOL_RECORD) - 1);
|
ThisProtocolRecord = (MC_HOST_INTERFACE_PROTOCOL_RECORD *)AllocatePool (mRedfishProtocolDataSize + sizeof (MC_HOST_INTERFACE_PROTOCOL_RECORD) - 1);
|
||||||
ThisProtocolRecord->ProtocolType = MCHostInterfaceProtocolTypeRedfishOverIP;
|
ThisProtocolRecord->ProtocolType = MCHostInterfaceProtocolTypeRedfishOverIP;
|
||||||
ThisProtocolRecord->ProtocolTypeDataLen = mRedfishProtocolDataSize;
|
ThisProtocolRecord->ProtocolTypeDataLen = mRedfishProtocolDataSize;
|
||||||
CopyMem ((VOID *)&ThisProtocolRecord->ProtocolTypeData, (VOID *)mRedfishOverIpProtocolData, mRedfishProtocolDataSize);
|
CopyMem ((VOID *)&ThisProtocolRecord->ProtocolTypeData, (VOID *)mRedfishOverIpProtocolData, mRedfishProtocolDataSize);
|
||||||
*ProtocolRecord = ThisProtocolRecord;
|
*ProtocolRecord = ThisProtocolRecord;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Dump IPv4 address.
|
Dump IPv4 address.
|
||||||
|
|
||||||
@ -166,10 +175,10 @@ RedfishPlatformHostInterfaceProtocolData (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
InternalDumpIp4Addr (
|
InternalDumpIp4Addr (
|
||||||
IN EFI_IPv4_ADDRESS *Ip
|
IN EFI_IPv4_ADDRESS *Ip
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
for (Index = 0; Index < 4; Index++) {
|
for (Index = 0; Index < 4; Index++) {
|
||||||
DEBUG ((DEBUG_VERBOSE, "%d", Ip->Addr[Index]));
|
DEBUG ((DEBUG_VERBOSE, "%d", Ip->Addr[Index]));
|
||||||
@ -180,6 +189,7 @@ InternalDumpIp4Addr (
|
|||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "\n"));
|
DEBUG ((DEBUG_VERBOSE, "\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Dump IPv6 address.
|
Dump IPv6 address.
|
||||||
|
|
||||||
@ -187,15 +197,16 @@ InternalDumpIp4Addr (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
InternalDumpIp6Addr (
|
InternalDumpIp6Addr (
|
||||||
IN EFI_IPv6_ADDRESS *Ip
|
IN EFI_IPv6_ADDRESS *Ip
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
for (Index = 0; Index < 16; Index++) {
|
for (Index = 0; Index < 16; Index++) {
|
||||||
if (Ip->Addr[Index] != 0) {
|
if (Ip->Addr[Index] != 0) {
|
||||||
DEBUG ((DEBUG_VERBOSE, "%x", Ip->Addr[Index]));
|
DEBUG ((DEBUG_VERBOSE, "%x", Ip->Addr[Index]));
|
||||||
}
|
}
|
||||||
|
|
||||||
Index++;
|
Index++;
|
||||||
|
|
||||||
if (Index > 15) {
|
if (Index > 15) {
|
||||||
@ -205,14 +216,17 @@ InternalDumpIp6Addr (
|
|||||||
if (((Ip->Addr[Index] & 0xf0) == 0) && (Ip->Addr[Index - 1] != 0)) {
|
if (((Ip->Addr[Index] & 0xf0) == 0) && (Ip->Addr[Index - 1] != 0)) {
|
||||||
DEBUG ((DEBUG_VERBOSE, "0"));
|
DEBUG ((DEBUG_VERBOSE, "0"));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "%x", Ip->Addr[Index]));
|
DEBUG ((DEBUG_VERBOSE, "%x", Ip->Addr[Index]));
|
||||||
|
|
||||||
if (Index < 15) {
|
if (Index < 15) {
|
||||||
DEBUG ((DEBUG_VERBOSE, ":"));
|
DEBUG ((DEBUG_VERBOSE, ":"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "\n"));
|
DEBUG ((DEBUG_VERBOSE, "\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Dump data
|
Dump data
|
||||||
|
|
||||||
@ -226,10 +240,12 @@ InternalDumpData (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
for (Index = 0; Index < Size; Index++) {
|
for (Index = 0; Index < Size; Index++) {
|
||||||
DEBUG ((DEBUG_VERBOSE, "%02x ", (UINTN)Data[Index]));
|
DEBUG ((DEBUG_VERBOSE, "%02x ", (UINTN)Data[Index]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Dump hex data
|
Dump hex data
|
||||||
|
|
||||||
@ -242,9 +258,9 @@ InternalDumpHex (
|
|||||||
IN UINTN Size
|
IN UINTN Size
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN Count;
|
UINTN Count;
|
||||||
UINTN Left;
|
UINTN Left;
|
||||||
|
|
||||||
Count = Size / VERBOSE_COLUME_SIZE;
|
Count = Size / VERBOSE_COLUME_SIZE;
|
||||||
Left = Size % VERBOSE_COLUME_SIZE;
|
Left = Size % VERBOSE_COLUME_SIZE;
|
||||||
@ -260,6 +276,7 @@ InternalDumpHex (
|
|||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "\n"));
|
DEBUG ((DEBUG_VERBOSE, "\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Dump Redfish over IP protocol data
|
Dump Redfish over IP protocol data
|
||||||
|
|
||||||
@ -268,14 +285,14 @@ InternalDumpHex (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DumpRedfishIpProtocolData (
|
DumpRedfishIpProtocolData (
|
||||||
IN REDFISH_OVER_IP_PROTOCOL_DATA *RedfishProtocolData,
|
IN REDFISH_OVER_IP_PROTOCOL_DATA *RedfishProtocolData,
|
||||||
IN UINT8 RedfishProtocolDataSize
|
IN UINT8 RedfishProtocolDataSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 Hostname[16];
|
CHAR16 Hostname[16];
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData: \n"));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData: \n"));
|
||||||
InternalDumpHex ((UINT8 *) RedfishProtocolData, RedfishProtocolDataSize);
|
InternalDumpHex ((UINT8 *)RedfishProtocolData, RedfishProtocolDataSize);
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "Parsing as below: \n"));
|
DEBUG ((DEBUG_VERBOSE, "Parsing as below: \n"));
|
||||||
|
|
||||||
@ -287,16 +304,16 @@ DumpRedfishIpProtocolData (
|
|||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->HostIpAddress: \n"));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->HostIpAddress: \n"));
|
||||||
if (RedfishProtocolData->HostIpAddressFormat == 0x01) {
|
if (RedfishProtocolData->HostIpAddressFormat == 0x01) {
|
||||||
InternalDumpIp4Addr ((EFI_IPv4_ADDRESS *) (RedfishProtocolData->HostIpAddress));
|
InternalDumpIp4Addr ((EFI_IPv4_ADDRESS *)(RedfishProtocolData->HostIpAddress));
|
||||||
} else {
|
} else {
|
||||||
InternalDumpIp6Addr ((EFI_IPv6_ADDRESS *) (RedfishProtocolData->HostIpAddress));
|
InternalDumpIp6Addr ((EFI_IPv6_ADDRESS *)(RedfishProtocolData->HostIpAddress));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->HostIpMask: \n"));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->HostIpMask: \n"));
|
||||||
if (RedfishProtocolData->HostIpAddressFormat == 0x01) {
|
if (RedfishProtocolData->HostIpAddressFormat == 0x01) {
|
||||||
InternalDumpIp4Addr ((EFI_IPv4_ADDRESS *) (RedfishProtocolData->HostIpMask));
|
InternalDumpIp4Addr ((EFI_IPv4_ADDRESS *)(RedfishProtocolData->HostIpMask));
|
||||||
} else {
|
} else {
|
||||||
InternalDumpIp6Addr ((EFI_IPv6_ADDRESS *) (RedfishProtocolData->HostIpMask));
|
InternalDumpIp6Addr ((EFI_IPv6_ADDRESS *)(RedfishProtocolData->HostIpMask));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceIpDiscoveryType - %d\n", RedfishProtocolData->RedfishServiceIpDiscoveryType));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceIpDiscoveryType - %d\n", RedfishProtocolData->RedfishServiceIpDiscoveryType));
|
||||||
@ -305,16 +322,16 @@ DumpRedfishIpProtocolData (
|
|||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceIpAddress: \n"));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceIpAddress: \n"));
|
||||||
if (RedfishProtocolData->RedfishServiceIpAddressFormat == 0x01) {
|
if (RedfishProtocolData->RedfishServiceIpAddressFormat == 0x01) {
|
||||||
InternalDumpIp4Addr ((EFI_IPv4_ADDRESS *) (RedfishProtocolData->RedfishServiceIpAddress));
|
InternalDumpIp4Addr ((EFI_IPv4_ADDRESS *)(RedfishProtocolData->RedfishServiceIpAddress));
|
||||||
} else {
|
} else {
|
||||||
InternalDumpIp6Addr ((EFI_IPv6_ADDRESS *) (RedfishProtocolData->RedfishServiceIpAddress));
|
InternalDumpIp6Addr ((EFI_IPv6_ADDRESS *)(RedfishProtocolData->RedfishServiceIpAddress));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceIpMask: \n"));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceIpMask: \n"));
|
||||||
if (RedfishProtocolData->RedfishServiceIpAddressFormat == 0x01) {
|
if (RedfishProtocolData->RedfishServiceIpAddressFormat == 0x01) {
|
||||||
InternalDumpIp4Addr ((EFI_IPv4_ADDRESS *) (RedfishProtocolData->RedfishServiceIpMask));
|
InternalDumpIp4Addr ((EFI_IPv4_ADDRESS *)(RedfishProtocolData->RedfishServiceIpMask));
|
||||||
} else {
|
} else {
|
||||||
InternalDumpIp6Addr ((EFI_IPv6_ADDRESS *) (RedfishProtocolData->RedfishServiceIpMask));
|
InternalDumpIp6Addr ((EFI_IPv6_ADDRESS *)(RedfishProtocolData->RedfishServiceIpMask));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceIpPort - %d\n", RedfishProtocolData->RedfishServiceIpPort));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceIpPort - %d\n", RedfishProtocolData->RedfishServiceIpPort));
|
||||||
@ -323,7 +340,7 @@ DumpRedfishIpProtocolData (
|
|||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceHostnameLength - %d\n", RedfishProtocolData->RedfishServiceHostnameLength));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceHostnameLength - %d\n", RedfishProtocolData->RedfishServiceHostnameLength));
|
||||||
|
|
||||||
AsciiStrToUnicodeStrS((CHAR8 *) RedfishProtocolData->RedfishServiceHostname, Hostname, sizeof (Hostname) / sizeof (Hostname[0]));
|
AsciiStrToUnicodeStrS ((CHAR8 *)RedfishProtocolData->RedfishServiceHostname, Hostname, sizeof (Hostname) / sizeof (Hostname[0]));
|
||||||
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceHostname - %s\n", Hostname));
|
DEBUG ((DEBUG_VERBOSE, "RedfishProtocolData->RedfishServiceHostname - %s\n", Hostname));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,24 +354,24 @@ DumpRedfishIpProtocolData (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetRedfishRecordFromVariable (
|
GetRedfishRecordFromVariable (
|
||||||
OUT REDFISH_OVER_IP_PROTOCOL_DATA **RedfishProtocolData,
|
OUT REDFISH_OVER_IP_PROTOCOL_DATA **RedfishProtocolData,
|
||||||
OUT UINT8 *RedfishProtocolDataSize
|
OUT UINT8 *RedfishProtocolDataSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT8 HostIpAssignmentType;
|
UINT8 HostIpAssignmentType;
|
||||||
UINTN HostIpAssignmentTypeSize;
|
UINTN HostIpAssignmentTypeSize;
|
||||||
EFI_IPv4_ADDRESS HostIpAddress;
|
EFI_IPv4_ADDRESS HostIpAddress;
|
||||||
UINTN IPv4DataSize;
|
UINTN IPv4DataSize;
|
||||||
EFI_IPv4_ADDRESS HostIpMask;
|
EFI_IPv4_ADDRESS HostIpMask;
|
||||||
EFI_IPv4_ADDRESS RedfishServiceIpAddress;
|
EFI_IPv4_ADDRESS RedfishServiceIpAddress;
|
||||||
EFI_IPv4_ADDRESS RedfishServiceIpMask;
|
EFI_IPv4_ADDRESS RedfishServiceIpMask;
|
||||||
UINT16 RedfishServiceIpPort;
|
UINT16 RedfishServiceIpPort;
|
||||||
UINTN IpPortDataSize;
|
UINTN IpPortDataSize;
|
||||||
UINT8 HostNameSize;
|
UINT8 HostNameSize;
|
||||||
CHAR8 RedfishHostName[20];
|
CHAR8 RedfishHostName[20];
|
||||||
|
|
||||||
if (RedfishProtocolData == NULL || RedfishProtocolDataSize == NULL) {
|
if ((RedfishProtocolData == NULL) || (RedfishProtocolDataSize == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -446,7 +463,7 @@ GetRedfishRecordFromVariable (
|
|||||||
RedfishServiceIpAddress.Addr[3]
|
RedfishServiceIpAddress.Addr[3]
|
||||||
);
|
);
|
||||||
|
|
||||||
HostNameSize = (UINT8) AsciiStrLen (RedfishHostName) + 1;
|
HostNameSize = (UINT8)AsciiStrLen (RedfishHostName) + 1;
|
||||||
|
|
||||||
//
|
//
|
||||||
// 2. Protocol Data Size.
|
// 2. Protocol Data Size.
|
||||||
@ -456,7 +473,7 @@ GetRedfishRecordFromVariable (
|
|||||||
//
|
//
|
||||||
// 3. Protocol Data.
|
// 3. Protocol Data.
|
||||||
//
|
//
|
||||||
*RedfishProtocolData = (REDFISH_OVER_IP_PROTOCOL_DATA *) AllocateZeroPool (*RedfishProtocolDataSize);
|
*RedfishProtocolData = (REDFISH_OVER_IP_PROTOCOL_DATA *)AllocateZeroPool (*RedfishProtocolDataSize);
|
||||||
if (*RedfishProtocolData == NULL) {
|
if (*RedfishProtocolData == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
@ -464,7 +481,7 @@ GetRedfishRecordFromVariable (
|
|||||||
CopyGuid (&(*RedfishProtocolData)->ServiceUuid, &gEmuRedfishServiceGuid);
|
CopyGuid (&(*RedfishProtocolData)->ServiceUuid, &gEmuRedfishServiceGuid);
|
||||||
|
|
||||||
(*RedfishProtocolData)->HostIpAssignmentType = HostIpAssignmentType;
|
(*RedfishProtocolData)->HostIpAssignmentType = HostIpAssignmentType;
|
||||||
(*RedfishProtocolData)->HostIpAddressFormat = 1; // Only support IPv4
|
(*RedfishProtocolData)->HostIpAddressFormat = 1; // Only support IPv4
|
||||||
|
|
||||||
if (HostIpAssignmentType == 1 ) {
|
if (HostIpAssignmentType == 1 ) {
|
||||||
(*RedfishProtocolData)->HostIpAddress[0] = HostIpAddress.Addr[0];
|
(*RedfishProtocolData)->HostIpAddress[0] = HostIpAddress.Addr[0];
|
||||||
@ -495,7 +512,7 @@ GetRedfishRecordFromVariable (
|
|||||||
(*RedfishProtocolData)->RedfishServiceVlanId = 0xffffffff;
|
(*RedfishProtocolData)->RedfishServiceVlanId = 0xffffffff;
|
||||||
|
|
||||||
(*RedfishProtocolData)->RedfishServiceHostnameLength = HostNameSize;
|
(*RedfishProtocolData)->RedfishServiceHostnameLength = HostNameSize;
|
||||||
AsciiStrCpyS ((CHAR8 *) ((*RedfishProtocolData)->RedfishServiceHostname), HostNameSize, RedfishHostName);
|
AsciiStrCpyS ((CHAR8 *)((*RedfishProtocolData)->RedfishServiceHostname), HostNameSize, RedfishHostName);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -513,16 +530,17 @@ GetRedfishRecordFromVariable (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RedfishPlatformHostInterfaceConstructor (
|
RedfishPlatformHostInterfaceConstructor (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = GetRedfishRecordFromVariable (&mRedfishOverIpProtocolData, &mRedfishProtocolDataSize);
|
Status = GetRedfishRecordFromVariable (&mRedfishOverIpProtocolData, &mRedfishProtocolDataSize);
|
||||||
DEBUG ((DEBUG_INFO, "%a: GetRedfishRecordFromVariable() - %r\n", __FUNCTION__, Status));
|
DEBUG ((DEBUG_INFO, "%a: GetRedfishRecordFromVariable() - %r\n", __FUNCTION__, Status));
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
DumpRedfishIpProtocolData (mRedfishOverIpProtocolData, mRedfishProtocolDataSize);
|
DumpRedfishIpProtocolData (mRedfishOverIpProtocolData, mRedfishProtocolDataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <PiPei.h>
|
#include <PiPei.h>
|
||||||
|
|
||||||
|
|
||||||
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
|
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
|
||||||
(ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
|
(ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
|
||||||
|
|
||||||
@ -18,6 +17,7 @@ GetFileState (
|
|||||||
IN UINT8 ErasePolarity,
|
IN UINT8 ErasePolarity,
|
||||||
IN EFI_FFS_FILE_HEADER *FfsHeader
|
IN EFI_FFS_FILE_HEADER *FfsHeader
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -39,7 +39,7 @@ Returns:
|
|||||||
FileState = FfsHeader->State;
|
FileState = FfsHeader->State;
|
||||||
|
|
||||||
if (ErasePolarity != 0) {
|
if (ErasePolarity != 0) {
|
||||||
FileState = (EFI_FFS_FILE_STATE)~FileState;
|
FileState = (EFI_FFS_FILE_STATE) ~FileState;
|
||||||
}
|
}
|
||||||
|
|
||||||
HighestBit = 0x80;
|
HighestBit = 0x80;
|
||||||
@ -54,6 +54,7 @@ UINT8
|
|||||||
CalculateHeaderChecksum (
|
CalculateHeaderChecksum (
|
||||||
IN EFI_FFS_FILE_HEADER *FileHeader
|
IN EFI_FFS_FILE_HEADER *FileHeader
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -67,41 +68,43 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
UINT8 *ptr;
|
UINT8 *ptr;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINT8 Sum;
|
UINT8 Sum;
|
||||||
|
|
||||||
Sum = 0;
|
Sum = 0;
|
||||||
ptr = (UINT8 *) FileHeader;
|
ptr = (UINT8 *)FileHeader;
|
||||||
|
|
||||||
for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
|
for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
|
||||||
Sum = (UINT8) (Sum + ptr[Index]);
|
Sum = (UINT8)(Sum + ptr[Index]);
|
||||||
Sum = (UINT8) (Sum + ptr[Index + 1]);
|
Sum = (UINT8)(Sum + ptr[Index + 1]);
|
||||||
Sum = (UINT8) (Sum + ptr[Index + 2]);
|
Sum = (UINT8)(Sum + ptr[Index + 2]);
|
||||||
Sum = (UINT8) (Sum + ptr[Index + 3]);
|
Sum = (UINT8)(Sum + ptr[Index + 3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
|
for ( ; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
|
||||||
Sum = (UINT8) (Sum + ptr[Index]);
|
Sum = (UINT8)(Sum + ptr[Index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// State field (since this indicates the different state of file).
|
// State field (since this indicates the different state of file).
|
||||||
//
|
//
|
||||||
Sum = (UINT8) (Sum - FileHeader->State);
|
Sum = (UINT8)(Sum - FileHeader->State);
|
||||||
//
|
//
|
||||||
// Checksum field of the file is not part of the header checksum.
|
// Checksum field of the file is not part of the header checksum.
|
||||||
//
|
//
|
||||||
Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
|
Sum = (UINT8)(Sum - FileHeader->IntegrityCheck.Checksum.File);
|
||||||
|
|
||||||
return Sum;
|
return Sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SecFfsFindNextFile (
|
SecFfsFindNextFile (
|
||||||
IN EFI_FV_FILETYPE SearchType,
|
IN EFI_FV_FILETYPE SearchType,
|
||||||
IN EFI_PEI_FV_HANDLE FvHandle,
|
IN EFI_PEI_FV_HANDLE FvHandle,
|
||||||
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -124,20 +127,20 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_FFS_FILE_HEADER *FfsFileHeader;
|
EFI_FFS_FILE_HEADER *FfsFileHeader;
|
||||||
UINT32 FileLength;
|
UINT32 FileLength;
|
||||||
UINT32 FileOccupiedSize;
|
UINT32 FileOccupiedSize;
|
||||||
UINT32 FileOffset;
|
UINT32 FileOffset;
|
||||||
UINT64 FvLength;
|
UINT64 FvLength;
|
||||||
UINT8 ErasePolarity;
|
UINT8 ErasePolarity;
|
||||||
UINT8 FileState;
|
UINT8 FileState;
|
||||||
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
||||||
EFI_FFS_FILE_HEADER **FileHeader;
|
EFI_FFS_FILE_HEADER **FileHeader;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Convert the handle of FV to FV header for memory-mapped firmware volume
|
// Convert the handle of FV to FV header for memory-mapped firmware volume
|
||||||
//
|
//
|
||||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
|
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)FvHandle;
|
||||||
FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
|
FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
|
||||||
|
|
||||||
FvLength = FwVolHeader->FvLength;
|
FvLength = FwVolHeader->FvLength;
|
||||||
@ -146,23 +149,24 @@ Returns:
|
|||||||
} else {
|
} else {
|
||||||
ErasePolarity = 0;
|
ErasePolarity = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If FileHeader is not specified (NULL) start with the first file in the
|
// If FileHeader is not specified (NULL) start with the first file in the
|
||||||
// firmware volume. Otherwise, start from the FileHeader.
|
// firmware volume. Otherwise, start from the FileHeader.
|
||||||
//
|
//
|
||||||
if (*FileHeader == NULL) {
|
if (*FileHeader == NULL) {
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolHeader + FwVolHeader->HeaderLength);
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// Length is 24 bits wide so mask upper 8 bits
|
// Length is 24 bits wide so mask upper 8 bits
|
||||||
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||||
//
|
//
|
||||||
FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
|
FileLength = *(UINT32 *)(*FileHeader)->Size & 0x00FFFFFF;
|
||||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)*FileHeader + FileOccupiedSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
|
FileOffset = (UINT32)((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader);
|
||||||
|
|
||||||
while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
|
while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
|
||||||
//
|
//
|
||||||
@ -171,42 +175,40 @@ Returns:
|
|||||||
FileState = GetFileState (ErasePolarity, FfsFileHeader);
|
FileState = GetFileState (ErasePolarity, FfsFileHeader);
|
||||||
|
|
||||||
switch (FileState) {
|
switch (FileState) {
|
||||||
|
case EFI_FILE_HEADER_INVALID:
|
||||||
|
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
|
||||||
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
|
||||||
|
break;
|
||||||
|
|
||||||
case EFI_FILE_HEADER_INVALID:
|
case EFI_FILE_DATA_VALID:
|
||||||
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
|
case EFI_FILE_MARKED_FOR_UPDATE:
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
|
if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
|
||||||
break;
|
FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;
|
||||||
|
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||||
|
|
||||||
case EFI_FILE_DATA_VALID:
|
if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
|
||||||
case EFI_FILE_MARKED_FOR_UPDATE:
|
*FileHeader = FfsFileHeader;
|
||||||
if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
|
|
||||||
FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
|
||||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
|
||||||
|
|
||||||
if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
*FileHeader = FfsFileHeader;
|
FileOffset += FileOccupiedSize;
|
||||||
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);
|
||||||
return EFI_SUCCESS;
|
} else {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileOffset += FileOccupiedSize;
|
break;
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
|
|
||||||
} else {
|
case EFI_FILE_DELETED:
|
||||||
|
FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;
|
||||||
|
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||||
|
FileOffset += FileOccupiedSize;
|
||||||
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_FILE_DELETED:
|
|
||||||
FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
|
||||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
|
||||||
FileOffset += FileOccupiedSize;
|
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return EFI_NOT_FOUND;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,10 +217,11 @@ Returns:
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SecFfsFindSectionData (
|
SecFfsFindSectionData (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||||
IN OUT VOID **SectionData
|
IN OUT VOID **SectionData
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -237,39 +240,39 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
UINT32 FileSize;
|
UINT32 FileSize;
|
||||||
EFI_COMMON_SECTION_HEADER *Section;
|
EFI_COMMON_SECTION_HEADER *Section;
|
||||||
UINT32 SectionLength;
|
UINT32 SectionLength;
|
||||||
UINT32 ParsedLength;
|
UINT32 ParsedLength;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Size is 24 bits wide so mask upper 8 bits.
|
// Size is 24 bits wide so mask upper 8 bits.
|
||||||
// Does not include FfsFileHeader header size
|
// Does not include FfsFileHeader header size
|
||||||
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||||
//
|
//
|
||||||
Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
|
Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1);
|
||||||
FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
FileSize = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;
|
||||||
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
|
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
|
||||||
|
|
||||||
*SectionData = NULL;
|
*SectionData = NULL;
|
||||||
ParsedLength = 0;
|
ParsedLength = 0;
|
||||||
while (ParsedLength < FileSize) {
|
while (ParsedLength < FileSize) {
|
||||||
if (Section->Type == SectionType) {
|
if (Section->Type == SectionType) {
|
||||||
*SectionData = (VOID *) (Section + 1);
|
*SectionData = (VOID *)(Section + 1);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Size is 24 bits wide so mask upper 8 bits.
|
// Size is 24 bits wide so mask upper 8 bits.
|
||||||
// SectionLength is adjusted it is 4 byte aligned.
|
// SectionLength is adjusted it is 4 byte aligned.
|
||||||
// Go to the next section
|
// Go to the next section
|
||||||
//
|
//
|
||||||
SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
|
SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF;
|
||||||
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
|
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
|
||||||
|
|
||||||
ParsedLength += SectionLength;
|
ParsedLength += SectionLength;
|
||||||
Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
|
Section = (EFI_COMMON_SECTION_HEADER *)((UINT8 *)Section + SectionLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,30 +6,26 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiPei.h>
|
#include <PiPei.h>
|
||||||
#include <Library/EmuMagicPageLib.h>
|
#include <Library/EmuMagicPageLib.h>
|
||||||
#include <Library/PeiServicesLib.h>
|
#include <Library/PeiServicesLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SecFfsFindNextFile (
|
SecFfsFindNextFile (
|
||||||
IN EFI_FV_FILETYPE SearchType,
|
IN EFI_FV_FILETYPE SearchType,
|
||||||
IN EFI_PEI_FV_HANDLE VolumeHandle,
|
IN EFI_PEI_FV_HANDLE VolumeHandle,
|
||||||
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SecFfsFindSectionData (
|
SecFfsFindSectionData (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
OUT VOID **SectionData
|
OUT VOID **SectionData
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This service enables a given PEIM to register an interface into the PEI Foundation.
|
This service enables a given PEIM to register an interface into the PEI Foundation.
|
||||||
|
|
||||||
@ -45,7 +41,7 @@ SecFfsFindSectionData (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesInstallPpi (
|
PeiServicesInstallPpi (
|
||||||
IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList
|
IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -70,8 +66,8 @@ PeiServicesInstallPpi (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesReInstallPpi (
|
PeiServicesReInstallPpi (
|
||||||
IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi,
|
IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi,
|
||||||
IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi
|
IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -97,26 +93,28 @@ PeiServicesReInstallPpi (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesLocatePpi (
|
PeiServicesLocatePpi (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor,
|
IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor,
|
||||||
IN OUT VOID **Ppi
|
IN OUT VOID **Ppi
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PEI_PPI_DESCRIPTOR *PpiList;
|
EFI_PEI_PPI_DESCRIPTOR *PpiList;
|
||||||
|
|
||||||
if (Instance != 0) {
|
if (Instance != 0) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PpiList = EMU_MAGIC_PAGE()->PpiList; ; PpiList++) {
|
for (PpiList = EMU_MAGIC_PAGE ()->PpiList; ; PpiList++) {
|
||||||
if (CompareGuid (PpiList->Guid, Guid)) {
|
if (CompareGuid (PpiList->Guid, Guid)) {
|
||||||
if (PpiDescriptor != NULL) {
|
if (PpiDescriptor != NULL) {
|
||||||
*PpiDescriptor = PpiList;
|
*PpiDescriptor = PpiList;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ppi != NULL) {
|
if (Ppi != NULL) {
|
||||||
*Ppi = PpiList->Ppi;
|
*Ppi = PpiList->Ppi;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +123,6 @@ PeiServicesLocatePpi (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +163,7 @@ PeiServicesNotifyPpi (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesGetBootMode (
|
PeiServicesGetBootMode (
|
||||||
OUT EFI_BOOT_MODE *BootMode
|
OUT EFI_BOOT_MODE *BootMode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -184,7 +181,7 @@ PeiServicesGetBootMode (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesSetBootMode (
|
PeiServicesSetBootMode (
|
||||||
IN EFI_BOOT_MODE BootMode
|
IN EFI_BOOT_MODE BootMode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -204,7 +201,7 @@ PeiServicesSetBootMode (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesGetHobList (
|
PeiServicesGetHobList (
|
||||||
OUT VOID **HobList
|
OUT VOID **HobList
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -226,9 +223,9 @@ PeiServicesGetHobList (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesCreateHob (
|
PeiServicesCreateHob (
|
||||||
IN UINT16 Type,
|
IN UINT16 Type,
|
||||||
IN UINT16 Length,
|
IN UINT16 Length,
|
||||||
OUT VOID **Hob
|
OUT VOID **Hob
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -251,8 +248,8 @@ PeiServicesCreateHob (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesFfsFindNextVolume (
|
PeiServicesFfsFindNextVolume (
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
IN OUT EFI_PEI_FV_HANDLE *VolumeHandle
|
IN OUT EFI_PEI_FV_HANDLE *VolumeHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -276,9 +273,9 @@ PeiServicesFfsFindNextVolume (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesFfsFindNextFile (
|
PeiServicesFfsFindNextFile (
|
||||||
IN EFI_FV_FILETYPE SearchType,
|
IN EFI_FV_FILETYPE SearchType,
|
||||||
IN EFI_PEI_FV_HANDLE VolumeHandle,
|
IN EFI_PEI_FV_HANDLE VolumeHandle,
|
||||||
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return SecFfsFindNextFile (SearchType, VolumeHandle, FileHandle);
|
return SecFfsFindNextFile (SearchType, VolumeHandle, FileHandle);
|
||||||
@ -299,9 +296,9 @@ PeiServicesFfsFindNextFile (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesFfsFindSectionData (
|
PeiServicesFfsFindSectionData (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
OUT VOID **SectionData
|
OUT VOID **SectionData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return SecFfsFindSectionData (SectionType, FileHandle, SectionData);
|
return SecFfsFindSectionData (SectionType, FileHandle, SectionData);
|
||||||
@ -322,8 +319,8 @@ PeiServicesFfsFindSectionData (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesInstallPeiMemory (
|
PeiServicesInstallPeiMemory (
|
||||||
IN EFI_PHYSICAL_ADDRESS MemoryBegin,
|
IN EFI_PHYSICAL_ADDRESS MemoryBegin,
|
||||||
IN UINT64 MemoryLength
|
IN UINT64 MemoryLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -347,9 +344,9 @@ PeiServicesInstallPeiMemory (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesAllocatePages (
|
PeiServicesAllocatePages (
|
||||||
IN EFI_MEMORY_TYPE MemoryType,
|
IN EFI_MEMORY_TYPE MemoryType,
|
||||||
IN UINTN Pages,
|
IN UINTN Pages,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *Memory
|
OUT EFI_PHYSICAL_ADDRESS *Memory
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -370,8 +367,8 @@ PeiServicesAllocatePages (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesAllocatePool (
|
PeiServicesAllocatePool (
|
||||||
IN UINTN Size,
|
IN UINTN Size,
|
||||||
OUT VOID **Buffer
|
OUT VOID **Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -415,7 +412,7 @@ PeiServicesResetSystem (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesRegisterForShadow (
|
PeiServicesRegisterForShadow (
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle
|
IN EFI_PEI_FILE_HANDLE FileHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -443,15 +440,14 @@ PeiServicesRegisterForShadow (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesFfsGetFileInfo (
|
PeiServicesFfsGetFileInfo (
|
||||||
IN CONST EFI_PEI_FILE_HANDLE FileHandle,
|
IN CONST EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
OUT EFI_FV_FILE_INFO *FileInfo
|
OUT EFI_FV_FILE_INFO *FileInfo
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This service is a wrapper for the PEI Service FfsFindByName(), except the pointer to the PEI Services
|
This service is a wrapper for the PEI Service FfsFindByName(), except the pointer to the PEI Services
|
||||||
Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface
|
Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface
|
||||||
@ -476,16 +472,15 @@ PeiServicesFfsGetFileInfo (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesFfsFindFileByName (
|
PeiServicesFfsFindFileByName (
|
||||||
IN CONST EFI_GUID *FileName,
|
IN CONST EFI_GUID *FileName,
|
||||||
IN CONST EFI_PEI_FV_HANDLE VolumeHandle,
|
IN CONST EFI_PEI_FV_HANDLE VolumeHandle,
|
||||||
OUT EFI_PEI_FILE_HANDLE *FileHandle
|
OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This service is a wrapper for the PEI Service FfsGetVolumeInfo(), except the pointer to the PEI Services
|
This service is a wrapper for the PEI Service FfsGetVolumeInfo(), except the pointer to the PEI Services
|
||||||
Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface
|
Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface
|
||||||
@ -507,8 +502,8 @@ PeiServicesFfsFindFileByName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesFfsGetVolumeInfo (
|
PeiServicesFfsGetVolumeInfo (
|
||||||
IN EFI_PEI_FV_HANDLE VolumeHandle,
|
IN EFI_PEI_FV_HANDLE VolumeHandle,
|
||||||
OUT EFI_FV_INFO *VolumeInfo
|
OUT EFI_FV_INFO *VolumeInfo
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -548,11 +543,11 @@ PeiServicesFfsGetVolumeInfo (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiServicesInstallFvInfoPpi (
|
PeiServicesInstallFvInfoPpi (
|
||||||
IN CONST EFI_GUID *FvFormat OPTIONAL,
|
IN CONST EFI_GUID *FvFormat OPTIONAL,
|
||||||
IN CONST VOID *FvInfo,
|
IN CONST VOID *FvInfo,
|
||||||
IN UINT32 FvInfoSize,
|
IN UINT32 FvInfoSize,
|
||||||
IN CONST EFI_GUID *ParentFvName OPTIONAL,
|
IN CONST EFI_GUID *ParentFvName OPTIONAL,
|
||||||
IN CONST EFI_GUID *ParentFileName OPTIONAL
|
IN CONST EFI_GUID *ParentFileName OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
|
@ -8,4 +8,3 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <PiPei.h>
|
#include <PiPei.h>
|
||||||
|
|
||||||
CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
|
CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
|
||||||
|
|
||||||
|
@ -18,9 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
#include <Library/SmbiosLib.h>
|
#include <Library/SmbiosLib.h>
|
||||||
|
|
||||||
|
EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
|
||||||
EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
|
Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
|
||||||
@ -34,11 +32,11 @@ EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibInitializeFromTemplate (
|
SmbiosLibInitializeFromTemplate (
|
||||||
IN SMBIOS_TEMPLATE_ENTRY *Template
|
IN SMBIOS_TEMPLATE_ENTRY *Template
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
if (Template == NULL) {
|
if (Template == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -53,8 +51,6 @@ SmbiosLibInitializeFromTemplate (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create SMBIOS record.
|
Create SMBIOS record.
|
||||||
|
|
||||||
@ -85,17 +81,17 @@ SmbiosLibInitializeFromTemplate (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibCreateEntry (
|
SmbiosLibCreateEntry (
|
||||||
IN SMBIOS_STRUCTURE *SmbiosEntry,
|
IN SMBIOS_STRUCTURE *SmbiosEntry,
|
||||||
IN CHAR8 **StringArray
|
IN CHAR8 **StringArray
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN StringSize;
|
UINTN StringSize;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
CHAR8 *Str;
|
CHAR8 *Str;
|
||||||
|
|
||||||
// Calculate the size of the fixed record and optional string pack
|
// Calculate the size of the fixed record and optional string pack
|
||||||
Size = SmbiosEntry->Length;
|
Size = SmbiosEntry->Length;
|
||||||
@ -106,8 +102,9 @@ SmbiosLibCreateEntry (
|
|||||||
} else {
|
} else {
|
||||||
for (Index = 0; StringArray[Index] != NULL; Index++) {
|
for (Index = 0; StringArray[Index] != NULL; Index++) {
|
||||||
StringSize = AsciiStrSize (StringArray[Index]);
|
StringSize = AsciiStrSize (StringArray[Index]);
|
||||||
Size += StringSize;
|
Size += StringSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't forget the terminating double null
|
// Don't forget the terminating double null
|
||||||
Size += 1;
|
Size += 1;
|
||||||
}
|
}
|
||||||
@ -117,6 +114,7 @@ SmbiosLibCreateEntry (
|
|||||||
if (Record == NULL) {
|
if (Record == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
|
CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
|
||||||
|
|
||||||
if (StringArray != NULL) {
|
if (StringArray != NULL) {
|
||||||
@ -127,23 +125,22 @@ SmbiosLibCreateEntry (
|
|||||||
CopyMem (Str, StringArray[Index], StringSize);
|
CopyMem (Str, StringArray[Index], StringSize);
|
||||||
Str += StringSize;
|
Str += StringSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
*Str = 0;
|
*Str = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||||
Status = gSmbios->Add (
|
Status = gSmbios->Add (
|
||||||
gSmbios,
|
gSmbios,
|
||||||
gImageHandle,
|
gImageHandle,
|
||||||
&SmbiosHandle,
|
&SmbiosHandle,
|
||||||
Record
|
Record
|
||||||
);
|
);
|
||||||
|
|
||||||
FreePool (Record);
|
FreePool (Record);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Update the string associated with an existing SMBIOS record.
|
Update the string associated with an existing SMBIOS record.
|
||||||
|
|
||||||
@ -162,12 +159,12 @@ SmbiosLibCreateEntry (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibUpdateString (
|
SmbiosLibUpdateString (
|
||||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||||
IN SMBIOS_TABLE_STRING StringNumber,
|
IN SMBIOS_TABLE_STRING StringNumber,
|
||||||
IN CHAR8 *String
|
IN CHAR8 *String
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN StringIndex;
|
UINTN StringIndex;
|
||||||
|
|
||||||
if (String == NULL) {
|
if (String == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -182,7 +179,6 @@ SmbiosLibUpdateString (
|
|||||||
return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);
|
return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Update the string associated with an existing SMBIOS record.
|
Update the string associated with an existing SMBIOS record.
|
||||||
|
|
||||||
@ -201,9 +197,9 @@ SmbiosLibUpdateString (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibUpdateUnicodeString (
|
SmbiosLibUpdateUnicodeString (
|
||||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||||
IN SMBIOS_TABLE_STRING StringNumber,
|
IN SMBIOS_TABLE_STRING StringNumber,
|
||||||
IN CHAR16 *String
|
IN CHAR16 *String
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -223,16 +219,16 @@ SmbiosLibUpdateUnicodeString (
|
|||||||
if (Ascii == NULL) {
|
if (Ascii == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeStrToAsciiStrS (String, Ascii, StrSize (String));
|
UnicodeStrToAsciiStrS (String, Ascii, StrSize (String));
|
||||||
|
|
||||||
StringIndex = StringNumber;
|
StringIndex = StringNumber;
|
||||||
Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);
|
Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);
|
||||||
|
|
||||||
FreePool (Ascii);
|
FreePool (Ascii);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Allow caller to read a specific SMBIOS string
|
Allow caller to read a specific SMBIOS string
|
||||||
|
|
||||||
@ -249,14 +245,15 @@ SmbiosLibReadString (
|
|||||||
IN EFI_SMBIOS_STRING StringNumber
|
IN EFI_SMBIOS_STRING StringNumber
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR8 *Data;
|
CHAR8 *Data;
|
||||||
UINTN Match;
|
UINTN Match;
|
||||||
|
|
||||||
Data = (CHAR8 *)Header + Header->Length;
|
Data = (CHAR8 *)Header + Header->Length;
|
||||||
for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
|
for (Match = 1; !(*Data == 0 && *(Data+1) == 0); ) {
|
||||||
if (StringNumber == Match) {
|
if (StringNumber == Match) {
|
||||||
return Data;
|
return Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
Data++;
|
Data++;
|
||||||
if (*(Data - 1) == '\0') {
|
if (*(Data - 1) == '\0') {
|
||||||
Match++;
|
Match++;
|
||||||
@ -266,7 +263,6 @@ SmbiosLibReadString (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
|
Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
|
||||||
|
|
||||||
@ -280,14 +276,14 @@ SmbiosLibReadString (
|
|||||||
SMBIOS_STRUCTURE *
|
SMBIOS_STRUCTURE *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibGetRecord (
|
SmbiosLibGetRecord (
|
||||||
IN EFI_SMBIOS_TYPE Type,
|
IN EFI_SMBIOS_TYPE Type,
|
||||||
IN UINTN Instance,
|
IN UINTN Instance,
|
||||||
OUT EFI_SMBIOS_HANDLE *SmbiosHandle
|
OUT EFI_SMBIOS_HANDLE *SmbiosHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||||
UINTN Match;
|
UINTN Match;
|
||||||
|
|
||||||
Match = 0;
|
Match = 0;
|
||||||
*SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
*SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||||
@ -297,6 +293,7 @@ SmbiosLibGetRecord (
|
|||||||
if (Match == Instance) {
|
if (Match == Instance) {
|
||||||
return (SMBIOS_STRUCTURE *)Record;
|
return (SMBIOS_STRUCTURE *)Record;
|
||||||
}
|
}
|
||||||
|
|
||||||
Match++;
|
Match++;
|
||||||
}
|
}
|
||||||
} while (!EFI_ERROR (Status));
|
} while (!EFI_ERROR (Status));
|
||||||
@ -304,7 +301,6 @@ SmbiosLibGetRecord (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Remove an SMBIOS record.
|
Remove an SMBIOS record.
|
||||||
|
|
||||||
@ -318,14 +314,12 @@ SmbiosLibGetRecord (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SmbiosLibRemove (
|
SmbiosLibRemove (
|
||||||
OUT EFI_SMBIOS_HANDLE SmbiosHandle
|
OUT EFI_SMBIOS_HANDLE SmbiosHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return gSmbios->Remove (gSmbios, SmbiosHandle);
|
return gSmbios->Remove (gSmbios, SmbiosHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@param ImageHandle ImageHandle of the loaded driver.
|
@param ImageHandle ImageHandle of the loaded driver.
|
||||||
@ -343,4 +337,3 @@ SmbiosLibConstructor (
|
|||||||
{
|
{
|
||||||
return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);
|
return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,30 +12,26 @@
|
|||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
|
||||||
|
|
||||||
UINTN gThunkPpiListSize = 0;
|
UINTN gThunkPpiListSize = 0;
|
||||||
EFI_PEI_PPI_DESCRIPTOR *gThunkPpiList = NULL;
|
EFI_PEI_PPI_DESCRIPTOR *gThunkPpiList = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_PEI_PPI_DESCRIPTOR *
|
EFI_PEI_PPI_DESCRIPTOR *
|
||||||
GetThunkPpiList (
|
GetThunkPpiList (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
if (gThunkPpiList == NULL) {
|
if (gThunkPpiList == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Index = (gThunkPpiListSize/sizeof (EFI_PEI_PPI_DESCRIPTOR)) - 1;
|
Index = (gThunkPpiListSize/sizeof (EFI_PEI_PPI_DESCRIPTOR)) - 1;
|
||||||
gThunkPpiList[Index].Flags |= EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
|
gThunkPpiList[Index].Flags |= EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
|
||||||
|
|
||||||
return gThunkPpiList;
|
return gThunkPpiList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
AddThunkPpi (
|
AddThunkPpi (
|
||||||
@ -44,7 +40,7 @@ AddThunkPpi (
|
|||||||
IN VOID *Ppi
|
IN VOID *Ppi
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
gThunkPpiList = ReallocatePool (
|
gThunkPpiList = ReallocatePool (
|
||||||
gThunkPpiListSize,
|
gThunkPpiListSize,
|
||||||
@ -55,16 +51,11 @@ AddThunkPpi (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Index = (gThunkPpiListSize/sizeof (EFI_PEI_PPI_DESCRIPTOR));
|
Index = (gThunkPpiListSize/sizeof (EFI_PEI_PPI_DESCRIPTOR));
|
||||||
gThunkPpiList[Index].Flags = Flags;
|
gThunkPpiList[Index].Flags = Flags;
|
||||||
gThunkPpiList[Index].Guid = Guid;
|
gThunkPpiList[Index].Guid = Guid;
|
||||||
gThunkPpiList[Index].Ppi = Ppi;
|
gThunkPpiList[Index].Ppi = Ppi;
|
||||||
gThunkPpiListSize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
|
gThunkPpiListSize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,25 +16,23 @@
|
|||||||
|
|
||||||
#include <Protocol/EmuIoThunk.h>
|
#include <Protocol/EmuIoThunk.h>
|
||||||
|
|
||||||
|
#define EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE SIGNATURE_32('E','m','u','T')
|
||||||
#define EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE SIGNATURE_32('E','m','u','T')
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
EMU_IO_THUNK_PROTOCOL Data;
|
EMU_IO_THUNK_PROTOCOL Data;
|
||||||
BOOLEAN EmuBusDriver;
|
BOOLEAN EmuBusDriver;
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
} EMU_IO_THUNK_PROTOCOL_DATA;
|
} EMU_IO_THUNK_PROTOCOL_DATA;
|
||||||
|
|
||||||
LIST_ENTRY mThunkList = INITIALIZE_LIST_HEAD_VARIABLE (mThunkList);
|
LIST_ENTRY mThunkList = INITIALIZE_LIST_HEAD_VARIABLE (mThunkList);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
AddThunkProtocol (
|
AddThunkProtocol (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *ThunkIo,
|
IN EMU_IO_THUNK_PROTOCOL *ThunkIo,
|
||||||
IN CHAR16 *ConfigString,
|
IN CHAR16 *ConfigString,
|
||||||
IN BOOLEAN EmuBusDriver
|
IN BOOLEAN EmuBusDriver
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
@ -47,15 +45,15 @@ AddThunkProtocol (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = 0;
|
Instance = 0;
|
||||||
Size = StrSize (ConfigString);
|
Size = StrSize (ConfigString);
|
||||||
StartString = AllocatePool (Size);
|
StartString = AllocatePool (Size);
|
||||||
if (StartString == NULL) {
|
if (StartString == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
StrCpyS (StartString, Size / sizeof (CHAR16), ConfigString);
|
StrCpyS (StartString, Size / sizeof (CHAR16), ConfigString);
|
||||||
while (*StartString != '\0') {
|
while (*StartString != '\0') {
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find the end of the sub string
|
// Find the end of the sub string
|
||||||
//
|
//
|
||||||
@ -77,12 +75,13 @@ AddThunkProtocol (
|
|||||||
if (Private == NULL) {
|
if (Private == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
Private->Signature = EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE;
|
|
||||||
Private->EmuBusDriver = EmuBusDriver;
|
Private->Signature = EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE;
|
||||||
|
Private->EmuBusDriver = EmuBusDriver;
|
||||||
|
|
||||||
CopyMem (&Private->Data, ThunkIo, sizeof (EMU_IO_THUNK_PROTOCOL));
|
CopyMem (&Private->Data, ThunkIo, sizeof (EMU_IO_THUNK_PROTOCOL));
|
||||||
Private->Data.Instance = (UINT16)Instance++;
|
Private->Data.Instance = (UINT16)Instance++;
|
||||||
Private->Data.ConfigString = StartString;
|
Private->Data.ConfigString = StartString;
|
||||||
|
|
||||||
InsertTailList (&mThunkList, &Private->Link);
|
InsertTailList (&mThunkList, &Private->Link);
|
||||||
|
|
||||||
@ -95,16 +94,15 @@ AddThunkProtocol (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetNextThunkProtocol (
|
GetNextThunkProtocol (
|
||||||
IN BOOLEAN EmuBusDriver,
|
IN BOOLEAN EmuBusDriver,
|
||||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
EMU_IO_THUNK_PROTOCOL_DATA *Private;
|
EMU_IO_THUNK_PROTOCOL_DATA *Private;
|
||||||
|
|
||||||
if (mThunkList.ForwardLink == &mThunkList) {
|
if (mThunkList.ForwardLink == &mThunkList) {
|
||||||
// Skip parsing an empty list
|
// Skip parsing an empty list
|
||||||
@ -125,13 +123,12 @@ GetNextThunkProtocol (
|
|||||||
if (Link == &mThunkList) {
|
if (Link == &mThunkList) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
Private = CR (Link, EMU_IO_THUNK_PROTOCOL_DATA, Link, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE);
|
|
||||||
|
Private = CR (Link, EMU_IO_THUNK_PROTOCOL_DATA, Link, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE);
|
||||||
*Instance = &Private->Data;
|
*Instance = &Private->Data;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,11 +17,9 @@
|
|||||||
#include <Library/SmbiosLib.h>
|
#include <Library/SmbiosLib.h>
|
||||||
#include <Library/HobLib.h>
|
#include <Library/HobLib.h>
|
||||||
|
|
||||||
extern SMBIOS_TEMPLATE_ENTRY gSmbiosTemplate[];
|
extern SMBIOS_TEMPLATE_ENTRY gSmbiosTemplate[];
|
||||||
|
|
||||||
|
SMBIOS_TABLE_TYPE19 gSmbiosType19Template = {
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE19 gSmbiosType19Template = {
|
|
||||||
{ EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, sizeof (SMBIOS_TABLE_TYPE19), 0 },
|
{ EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, sizeof (SMBIOS_TABLE_TYPE19), 0 },
|
||||||
0xffffffff, // StartingAddress;
|
0xffffffff, // StartingAddress;
|
||||||
0xffffffff, // EndingAddress;
|
0xffffffff, // EndingAddress;
|
||||||
@ -36,11 +34,11 @@ CreatePlatformSmbiosMemoryRecords (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PEI_HOB_POINTERS HobPtr;
|
EFI_PEI_HOB_POINTERS HobPtr;
|
||||||
SMBIOS_STRUCTURE_POINTER Smbios16;
|
SMBIOS_STRUCTURE_POINTER Smbios16;
|
||||||
SMBIOS_STRUCTURE_POINTER Smbios17;
|
SMBIOS_STRUCTURE_POINTER Smbios17;
|
||||||
EFI_SMBIOS_HANDLE PhyscialMemoryArrayHandle;
|
EFI_SMBIOS_HANDLE PhyscialMemoryArrayHandle;
|
||||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||||
|
|
||||||
Smbios16.Hdr = SmbiosLibGetRecord (EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, 0, &PhyscialMemoryArrayHandle);
|
Smbios16.Hdr = SmbiosLibGetRecord (EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, 0, &PhyscialMemoryArrayHandle);
|
||||||
if (Smbios16.Hdr == NULL) {
|
if (Smbios16.Hdr == NULL) {
|
||||||
@ -56,21 +54,21 @@ CreatePlatformSmbiosMemoryRecords (
|
|||||||
|
|
||||||
// Generate Type16 records
|
// Generate Type16 records
|
||||||
gSmbiosType19Template.MemoryArrayHandle = PhyscialMemoryArrayHandle;
|
gSmbiosType19Template.MemoryArrayHandle = PhyscialMemoryArrayHandle;
|
||||||
HobPtr.Raw = GetHobList ();
|
HobPtr.Raw = GetHobList ();
|
||||||
while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, HobPtr.Raw)) != NULL) {
|
while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, HobPtr.Raw)) != NULL) {
|
||||||
if (HobPtr.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
|
if (HobPtr.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
|
||||||
gSmbiosType19Template.ExtendedStartingAddress = HobPtr.ResourceDescriptor->PhysicalStart;
|
gSmbiosType19Template.ExtendedStartingAddress = HobPtr.ResourceDescriptor->PhysicalStart;
|
||||||
gSmbiosType19Template.ExtendedEndingAddress =
|
gSmbiosType19Template.ExtendedEndingAddress =
|
||||||
HobPtr.ResourceDescriptor->PhysicalStart +
|
HobPtr.ResourceDescriptor->PhysicalStart +
|
||||||
HobPtr.ResourceDescriptor->ResourceLength - 1;
|
HobPtr.ResourceDescriptor->ResourceLength - 1;
|
||||||
|
|
||||||
SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, NULL);
|
SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
HobPtr.Raw = GET_NEXT_HOB (HobPtr);
|
HobPtr.Raw = GET_NEXT_HOB (HobPtr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Main entry for this driver.
|
Main entry for this driver.
|
||||||
|
|
||||||
@ -83,13 +81,13 @@ CreatePlatformSmbiosMemoryRecords (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PlatformSmbiosDriverEntryPoint (
|
PlatformSmbiosDriverEntryPoint (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||||
SMBIOS_STRUCTURE_POINTER Smbios;
|
SMBIOS_STRUCTURE_POINTER Smbios;
|
||||||
|
|
||||||
// Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
|
// Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
|
||||||
// to an early version of the specification.
|
// to an early version of the specification.
|
||||||
@ -108,12 +106,12 @@ PlatformSmbiosDriverEntryPoint (
|
|||||||
SmbiosLibUpdateUnicodeString (
|
SmbiosLibUpdateUnicodeString (
|
||||||
SmbiosHandle,
|
SmbiosHandle,
|
||||||
Smbios.Type0->BiosVersion,
|
Smbios.Type0->BiosVersion,
|
||||||
(CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)
|
(CHAR16 *)PcdGetPtr (PcdFirmwareVersionString)
|
||||||
);
|
);
|
||||||
SmbiosLibUpdateUnicodeString (
|
SmbiosLibUpdateUnicodeString (
|
||||||
SmbiosHandle,
|
SmbiosHandle,
|
||||||
Smbios.Type0->BiosReleaseDate,
|
Smbios.Type0->BiosReleaseDate,
|
||||||
(CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)
|
(CHAR16 *)PcdGetPtr (PcdFirmwareReleaseDateString)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,15 +23,14 @@
|
|||||||
#include <Protocol/Smbios.h>
|
#include <Protocol/Smbios.h>
|
||||||
#include <Library/SmbiosLib.h>
|
#include <Library/SmbiosLib.h>
|
||||||
|
|
||||||
|
SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
|
||||||
SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
|
|
||||||
{ EFI_SMBIOS_TYPE_BIOS_INFORMATION, sizeof (SMBIOS_TABLE_TYPE0), 0 },
|
{ EFI_SMBIOS_TYPE_BIOS_INFORMATION, sizeof (SMBIOS_TABLE_TYPE0), 0 },
|
||||||
1, // Vendor String
|
1, // Vendor String
|
||||||
2, // BiosVersion String
|
2, // BiosVersion String
|
||||||
0xE000, // BiosSegment
|
0xE000, // BiosSegment
|
||||||
3, // BiosReleaseDate String
|
3, // BiosReleaseDate String
|
||||||
0x7F, // BiosSize
|
0x7F, // BiosSize
|
||||||
{ // BiosCharacteristics
|
{ // BiosCharacteristics
|
||||||
0, // Reserved :2; ///< Bits 0-1.
|
0, // Reserved :2; ///< Bits 0-1.
|
||||||
0, // Unknown :1;
|
0, // Unknown :1;
|
||||||
0, // BiosCharacteristicsNotSupported :1;
|
0, // BiosCharacteristicsNotSupported :1;
|
||||||
@ -64,7 +63,7 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
|
|||||||
0, // CgaMonoIsSupported :1;
|
0, // CgaMonoIsSupported :1;
|
||||||
0, // NecPc98 :1;
|
0, // NecPc98 :1;
|
||||||
0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
|
0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
|
||||||
///< and bits 48-63 reserved for System Vendor.
|
///< and bits 48-63 reserved for System Vendor.
|
||||||
},
|
},
|
||||||
{ // BIOSCharacteristicsExtensionBytes[]
|
{ // BIOSCharacteristicsExtensionBytes[]
|
||||||
0x81, // AcpiIsSupported :1;
|
0x81, // AcpiIsSupported :1;
|
||||||
@ -75,7 +74,7 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
|
|||||||
// AtapiZipDriveBootIsSupported :1;
|
// AtapiZipDriveBootIsSupported :1;
|
||||||
// Boot1394IsSupported :1;
|
// Boot1394IsSupported :1;
|
||||||
// SmartBatteryIsSupported :1;
|
// SmartBatteryIsSupported :1;
|
||||||
// BIOSCharacteristicsExtensionBytes[1]
|
// BIOSCharacteristicsExtensionBytes[1]
|
||||||
0x0a, // BiosBootSpecIsSupported :1;
|
0x0a, // BiosBootSpecIsSupported :1;
|
||||||
// FunctionKeyNetworkBootIsSupported :1;
|
// FunctionKeyNetworkBootIsSupported :1;
|
||||||
// TargetContentDistributionEnabled :1;
|
// TargetContentDistributionEnabled :1;
|
||||||
@ -88,25 +87,26 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
|
|||||||
0xFF, // EmbeddedControllerFirmwareMajorRelease
|
0xFF, // EmbeddedControllerFirmwareMajorRelease
|
||||||
0xFF, // EmbeddedControllerFirmwareMinorRelease
|
0xFF, // EmbeddedControllerFirmwareMinorRelease
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType0Strings[] = {
|
CHAR8 *gSmbiosType0Strings[] = {
|
||||||
"http://www.tianocore.org/edk2/", // Vendor String
|
"http://www.tianocore.org/edk2/", // Vendor String
|
||||||
__TIME__, // BiosVersion String
|
__TIME__, // BiosVersion String
|
||||||
__DATE__, // BiosReleaseDate String
|
__DATE__, // BiosReleaseDate String
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
|
SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
|
||||||
{ EFI_SMBIOS_TYPE_SYSTEM_INFORMATION, sizeof (SMBIOS_TABLE_TYPE1), 0 },
|
{ EFI_SMBIOS_TYPE_SYSTEM_INFORMATION, sizeof (SMBIOS_TABLE_TYPE1), 0 },
|
||||||
1, // Manufacturer String
|
1, // Manufacturer String
|
||||||
2, // ProductName String
|
2, // ProductName String
|
||||||
3, // Version String
|
3, // Version String
|
||||||
4, // SerialNumber String
|
4, // SerialNumber String
|
||||||
{ 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02 } },
|
{ 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02}
|
||||||
|
},
|
||||||
SystemWakeupTypePowerSwitch,
|
SystemWakeupTypePowerSwitch,
|
||||||
5, // SKUNumber String
|
5, // SKUNumber String
|
||||||
6, // Family String
|
6, // Family String
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType1Strings[] = {
|
CHAR8 *gSmbiosType1Strings[] = {
|
||||||
"http://www.tianocore.org/edk2/",
|
"http://www.tianocore.org/edk2/",
|
||||||
"EmulatorPkg",
|
"EmulatorPkg",
|
||||||
"1.0",
|
"1.0",
|
||||||
@ -124,20 +124,20 @@ SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
|
|||||||
4, // SerialNumber String
|
4, // SerialNumber String
|
||||||
5, // AssetTag String
|
5, // AssetTag String
|
||||||
{ // FeatureFlag
|
{ // FeatureFlag
|
||||||
1, // Motherboard :1;
|
1, // Motherboard :1;
|
||||||
0, // RequiresDaughterCard :1;
|
0, // RequiresDaughterCard :1;
|
||||||
0, // Removable :1;
|
0, // Removable :1;
|
||||||
0, // Replaceable :1;
|
0, // Replaceable :1;
|
||||||
0, // HotSwappable :1;
|
0, // HotSwappable :1;
|
||||||
0, // Reserved :3;
|
0, // Reserved :3;
|
||||||
},
|
},
|
||||||
6, // LocationInChassis String
|
6, // LocationInChassis String
|
||||||
0, // ChassisHandle;
|
0, // ChassisHandle;
|
||||||
BaseBoardTypeMotherBoard, // BoardType;
|
BaseBoardTypeMotherBoard, // BoardType;
|
||||||
0, // NumberOfContainedObjectHandles;
|
0, // NumberOfContainedObjectHandles;
|
||||||
{ 0 } // ContainedObjectHandles[1];
|
{ 0 } // ContainedObjectHandles[1];
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType2Strings[] = {
|
CHAR8 *gSmbiosType2Strings[] = {
|
||||||
"http://www.tianocore.org/edk2/",
|
"http://www.tianocore.org/edk2/",
|
||||||
"EmulatorPkg",
|
"EmulatorPkg",
|
||||||
"1.0",
|
"1.0",
|
||||||
@ -149,23 +149,25 @@ CHAR8 *gSmbiosType2Strings[] = {
|
|||||||
|
|
||||||
SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
|
SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
|
||||||
{ EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, sizeof (SMBIOS_TABLE_TYPE3), 0 },
|
{ EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, sizeof (SMBIOS_TABLE_TYPE3), 0 },
|
||||||
1, // Manufacturer String
|
1, // Manufacturer String
|
||||||
MiscChassisTypeLapTop, // Type;
|
MiscChassisTypeLapTop, // Type;
|
||||||
2, // Version String
|
2, // Version String
|
||||||
3, // SerialNumber String
|
3, // SerialNumber String
|
||||||
4, // AssetTag String
|
4, // AssetTag String
|
||||||
ChassisStateSafe, // BootupState;
|
ChassisStateSafe, // BootupState;
|
||||||
ChassisStateSafe, // PowerSupplyState;
|
ChassisStateSafe, // PowerSupplyState;
|
||||||
ChassisStateSafe, // ThermalState;
|
ChassisStateSafe, // ThermalState;
|
||||||
ChassisSecurityStatusNone,// SecurityStatus;
|
ChassisSecurityStatusNone, // SecurityStatus;
|
||||||
{ 0, 0, 0, 0 }, // OemDefined[4];
|
{ 0, 0, 0, 0}, // OemDefined[4];
|
||||||
0, // Height;
|
0, // Height;
|
||||||
0, // NumberofPowerCords;
|
0, // NumberofPowerCords;
|
||||||
0, // ContainedElementCount;
|
0, // ContainedElementCount;
|
||||||
0, // ContainedElementRecordLength;
|
0, // ContainedElementRecordLength;
|
||||||
{ { 0 } }, // ContainedElements[1];
|
{
|
||||||
|
{ 0 }
|
||||||
|
}, // ContainedElements[1];
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType3Strings[] = {
|
CHAR8 *gSmbiosType3Strings[] = {
|
||||||
"http://www.tianocore.org/edk2/",
|
"http://www.tianocore.org/edk2/",
|
||||||
"EmulatorPkg",
|
"EmulatorPkg",
|
||||||
"Chassis Board Serial#",
|
"Chassis Board Serial#",
|
||||||
@ -181,7 +183,7 @@ SMBIOS_TABLE_TYPE8 gSmbiosType8Template1 = {
|
|||||||
PortConnectorTypeNone, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeNone, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeOther, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeOther, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings1[] = {
|
CHAR8 *gSmbiosType8Strings1[] = {
|
||||||
"Mini DisplayPort",
|
"Mini DisplayPort",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -194,12 +196,11 @@ SMBIOS_TABLE_TYPE8 gSmbiosType8Template2 = {
|
|||||||
PortConnectorTypeNone, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeNone, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeFireWire, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeFireWire, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings2[] = {
|
CHAR8 *gSmbiosType8Strings2[] = {
|
||||||
"FireWire 800",
|
"FireWire 800",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE8 gSmbiosType8Template3 = {
|
SMBIOS_TABLE_TYPE8 gSmbiosType8Template3 = {
|
||||||
{ EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE8), 0 },
|
{ EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE8), 0 },
|
||||||
0, // InternalReferenceDesignator String
|
0, // InternalReferenceDesignator String
|
||||||
@ -208,7 +209,7 @@ SMBIOS_TABLE_TYPE8 gSmbiosType8Template3 = {
|
|||||||
PortConnectorTypeRJ45, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeRJ45, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeNetworkPort, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeNetworkPort, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings3[] = {
|
CHAR8 *gSmbiosType8Strings3[] = {
|
||||||
"Ethernet",
|
"Ethernet",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -221,7 +222,7 @@ SMBIOS_TABLE_TYPE8 gSmbiosType8Template4 = {
|
|||||||
PortConnectorTypeUsb, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeUsb, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeUsb, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeUsb, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings4[] = {
|
CHAR8 *gSmbiosType8Strings4[] = {
|
||||||
"USB0",
|
"USB0",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -234,7 +235,7 @@ SMBIOS_TABLE_TYPE8 gSmbiosType8Template5 = {
|
|||||||
PortConnectorTypeUsb, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeUsb, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeUsb, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeUsb, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings5[] = {
|
CHAR8 *gSmbiosType8Strings5[] = {
|
||||||
"USB1",
|
"USB1",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -247,7 +248,7 @@ SMBIOS_TABLE_TYPE8 gSmbiosType8Template6 = {
|
|||||||
PortConnectorTypeUsb, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeUsb, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeUsb, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeUsb, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings6[] = {
|
CHAR8 *gSmbiosType8Strings6[] = {
|
||||||
"USB2",
|
"USB2",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -260,54 +261,54 @@ SMBIOS_TABLE_TYPE8 gSmbiosType8Template7 = {
|
|||||||
PortConnectorTypeUsb, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeUsb, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeUsb, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeUsb, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings7[] = {
|
CHAR8 *gSmbiosType8Strings7[] = {
|
||||||
"USB3",
|
"USB3",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE8 gSmbiosType8Template8 = {
|
SMBIOS_TABLE_TYPE8 gSmbiosType8Template8 = {
|
||||||
{ EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE8), 0 },
|
{ EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE8), 0 },
|
||||||
0, // InternalReferenceDesignator String
|
0, // InternalReferenceDesignator String
|
||||||
PortConnectorTypeNone, // InternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeNone, // InternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
1, // ExternalReferenceDesignator String
|
1, // ExternalReferenceDesignator String
|
||||||
PortConnectorTypeHeadPhoneMiniJack, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeHeadPhoneMiniJack, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeAudioPort, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeAudioPort, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings8[] = {
|
CHAR8 *gSmbiosType8Strings8[] = {
|
||||||
"Audio Line In",
|
"Audio Line In",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE8 gSmbiosType8Template9 = {
|
SMBIOS_TABLE_TYPE8 gSmbiosType8Template9 = {
|
||||||
{ EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE8), 0 },
|
{ EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE8), 0 },
|
||||||
0, // InternalReferenceDesignator String
|
0, // InternalReferenceDesignator String
|
||||||
PortConnectorTypeNone, // InternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeNone, // InternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
1, // ExternalReferenceDesignator String
|
1, // ExternalReferenceDesignator String
|
||||||
PortConnectorTypeHeadPhoneMiniJack, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
PortConnectorTypeHeadPhoneMiniJack, // ExternalConnectorType; ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
|
||||||
PortTypeAudioPort, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
PortTypeAudioPort, // PortType; ///< The enumeration value from MISC_PORT_TYPE.
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType8Strings9[] = {
|
CHAR8 *gSmbiosType8Strings9[] = {
|
||||||
"Audio Line Out",
|
"Audio Line Out",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE9 gSmbiosType9Template = {
|
SMBIOS_TABLE_TYPE9 gSmbiosType9Template = {
|
||||||
{ EFI_SMBIOS_TYPE_SYSTEM_SLOTS, sizeof (SMBIOS_TABLE_TYPE9), 0 },
|
{ EFI_SMBIOS_TYPE_SYSTEM_SLOTS, sizeof (SMBIOS_TABLE_TYPE9), 0 },
|
||||||
1, // SlotDesignation String
|
1, // SlotDesignation String
|
||||||
SlotTypeOther, // SlotType; ///< The enumeration value from MISC_SLOT_TYPE.
|
SlotTypeOther, // SlotType; ///< The enumeration value from MISC_SLOT_TYPE.
|
||||||
SlotDataBusWidthOther, // SlotDataBusWidth; ///< The enumeration value from MISC_SLOT_DATA_BUS_WIDTH.
|
SlotDataBusWidthOther, // SlotDataBusWidth; ///< The enumeration value from MISC_SLOT_DATA_BUS_WIDTH.
|
||||||
SlotUsageAvailable, // CurrentUsage; ///< The enumeration value from MISC_SLOT_USAGE.
|
SlotUsageAvailable, // CurrentUsage; ///< The enumeration value from MISC_SLOT_USAGE.
|
||||||
SlotLengthOther, // SlotLength; ///< The enumeration value from MISC_SLOT_LENGTH.
|
SlotLengthOther, // SlotLength; ///< The enumeration value from MISC_SLOT_LENGTH.
|
||||||
0, // SlotID;
|
0, // SlotID;
|
||||||
{ // SlotCharacteristics1;
|
{ // SlotCharacteristics1;
|
||||||
1, // CharacteristicsUnknown :1;
|
1, // CharacteristicsUnknown :1;
|
||||||
0, // Provides50Volts :1;
|
0, // Provides50Volts :1;
|
||||||
0, // Provides33Volts :1;
|
0, // Provides33Volts :1;
|
||||||
0, // SharedSlot :1;
|
0, // SharedSlot :1;
|
||||||
0, // PcCard16Supported :1;
|
0, // PcCard16Supported :1;
|
||||||
0, // CardBusSupported :1;
|
0, // CardBusSupported :1;
|
||||||
0, // ZoomVideoSupported :1;
|
0, // ZoomVideoSupported :1;
|
||||||
0, // ModemRingResumeSupported:1;
|
0, // ModemRingResumeSupported:1;
|
||||||
},
|
},
|
||||||
{ // SlotCharacteristics2;
|
{ // SlotCharacteristics2;
|
||||||
0, // PmeSignalSupported :1;
|
0, // PmeSignalSupported :1;
|
||||||
@ -319,31 +320,30 @@ SMBIOS_TABLE_TYPE9 gSmbiosType9Template = {
|
|||||||
0, // BusNum;
|
0, // BusNum;
|
||||||
0, // DevFuncNum;
|
0, // DevFuncNum;
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType9Strings[] = {
|
CHAR8 *gSmbiosType9Strings[] = {
|
||||||
"SD Card",
|
"SD Card",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE11 gSmbiosType11Template = {
|
SMBIOS_TABLE_TYPE11 gSmbiosType11Template = {
|
||||||
{ EFI_SMBIOS_TYPE_OEM_STRINGS, sizeof (SMBIOS_TABLE_TYPE11), 0 },
|
{ EFI_SMBIOS_TYPE_OEM_STRINGS, sizeof (SMBIOS_TABLE_TYPE11), 0 },
|
||||||
1 // StringCount
|
1 // StringCount
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType11Strings[] = {
|
CHAR8 *gSmbiosType11Strings[] = {
|
||||||
"https://svn.code.sf.net/p/edk2/code/trunk/edk2/EmulatorPkg/",
|
"https://svn.code.sf.net/p/edk2/code/trunk/edk2/EmulatorPkg/",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SMBIOS_TABLE_TYPE12 gSmbiosType12Template = {
|
||||||
SMBIOS_TABLE_TYPE12 gSmbiosType12Template = {
|
|
||||||
{ EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
|
{ EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
|
||||||
1 // StringCount
|
1 // StringCount
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType12Strings[] = {
|
CHAR8 *gSmbiosType12Strings[] = {
|
||||||
"https://svn.code.sf.net/p/edk2/code/trunk/edk2/EmulatorPkg/EmulatorPkg.dsc",
|
"https://svn.code.sf.net/p/edk2/code/trunk/edk2/EmulatorPkg/EmulatorPkg.dsc",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE16 gSmbiosType16Template = {
|
SMBIOS_TABLE_TYPE16 gSmbiosType16Template = {
|
||||||
{ EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, sizeof (SMBIOS_TABLE_TYPE16), 0 },
|
{ EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, sizeof (SMBIOS_TABLE_TYPE16), 0 },
|
||||||
MemoryArrayLocationSystemBoard, // Location; ///< The enumeration value from MEMORY_ARRAY_LOCATION.
|
MemoryArrayLocationSystemBoard, // Location; ///< The enumeration value from MEMORY_ARRAY_LOCATION.
|
||||||
MemoryArrayUseSystemMemory, // Use; ///< The enumeration value from MEMORY_ARRAY_USE.
|
MemoryArrayUseSystemMemory, // Use; ///< The enumeration value from MEMORY_ARRAY_USE.
|
||||||
@ -354,19 +354,19 @@ SMBIOS_TABLE_TYPE16 gSmbiosType16Template = {
|
|||||||
0x3fffffffffffffffULL, // ExtendedMaximumCapacity;
|
0x3fffffffffffffffULL, // ExtendedMaximumCapacity;
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE17 gSmbiosType17Template = {
|
SMBIOS_TABLE_TYPE17 gSmbiosType17Template = {
|
||||||
{ EFI_SMBIOS_TYPE_MEMORY_DEVICE, sizeof (SMBIOS_TABLE_TYPE17), 0 },
|
{ EFI_SMBIOS_TYPE_MEMORY_DEVICE, sizeof (SMBIOS_TABLE_TYPE17), 0 },
|
||||||
0, // MemoryArrayHandle;
|
0, // MemoryArrayHandle;
|
||||||
0xFFFE, // MemoryErrorInformationHandle;
|
0xFFFE, // MemoryErrorInformationHandle;
|
||||||
0xFFFF, // TotalWidth;
|
0xFFFF, // TotalWidth;
|
||||||
0xFFFF, // DataWidth;
|
0xFFFF, // DataWidth;
|
||||||
0xFFFF, // Size;
|
0xFFFF, // Size;
|
||||||
MemoryFormFactorUnknown, // FormFactor; ///< The enumeration value from MEMORY_FORM_FACTOR.
|
MemoryFormFactorUnknown, // FormFactor; ///< The enumeration value from MEMORY_FORM_FACTOR.
|
||||||
0xff, // DeviceSet;
|
0xff, // DeviceSet;
|
||||||
1, // DeviceLocator String
|
1, // DeviceLocator String
|
||||||
2, // BankLocator String
|
2, // BankLocator String
|
||||||
MemoryTypeDram, // MemoryType; ///< The enumeration value from MEMORY_DEVICE_TYPE.
|
MemoryTypeDram, // MemoryType; ///< The enumeration value from MEMORY_DEVICE_TYPE.
|
||||||
{ // TypeDetail;
|
{ // TypeDetail;
|
||||||
0, // Reserved :1;
|
0, // Reserved :1;
|
||||||
0, // Other :1;
|
0, // Other :1;
|
||||||
1, // Unknown :1;
|
1, // Unknown :1;
|
||||||
@ -393,14 +393,14 @@ SMBIOS_TABLE_TYPE17 gSmbiosType17Template = {
|
|||||||
0, // ExtendedSize;
|
0, // ExtendedSize;
|
||||||
0, // ConfiguredMemoryClockSpeed;
|
0, // ConfiguredMemoryClockSpeed;
|
||||||
};
|
};
|
||||||
CHAR8 *gSmbiosType17Strings[] = {
|
CHAR8 *gSmbiosType17Strings[] = {
|
||||||
"OS Virtual Memory",
|
"OS Virtual Memory",
|
||||||
"malloc",
|
"malloc",
|
||||||
"OSV",
|
"OSV",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE23 gSmbiosType23Template = {
|
SMBIOS_TABLE_TYPE23 gSmbiosType23Template = {
|
||||||
{ EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, sizeof (SMBIOS_TABLE_TYPE23), 0 },
|
{ EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, sizeof (SMBIOS_TABLE_TYPE23), 0 },
|
||||||
0, // Capabilities;
|
0, // Capabilities;
|
||||||
0, // ResetCount;
|
0, // ResetCount;
|
||||||
@ -409,34 +409,32 @@ SMBIOS_TABLE_TYPE23 gSmbiosType23Template = {
|
|||||||
0 // Timeout;
|
0 // Timeout;
|
||||||
};
|
};
|
||||||
|
|
||||||
SMBIOS_TABLE_TYPE32 gSmbiosType32Template = {
|
SMBIOS_TABLE_TYPE32 gSmbiosType32Template = {
|
||||||
{ EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, sizeof (SMBIOS_TABLE_TYPE32), 0 },
|
{ EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, sizeof (SMBIOS_TABLE_TYPE32), 0 },
|
||||||
{ 0, 0, 0, 0, 0, 0 }, // Reserved[6];
|
{ 0, 0, 0, 0, 0, 0}, // Reserved[6];
|
||||||
BootInformationStatusNoError // BootStatus
|
BootInformationStatusNoError // BootStatus
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SMBIOS_TEMPLATE_ENTRY gSmbiosTemplate[] = {
|
||||||
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType0Template, gSmbiosType0Strings },
|
||||||
SMBIOS_TEMPLATE_ENTRY gSmbiosTemplate[] = {
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType1Template, gSmbiosType1Strings },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType0Template, gSmbiosType0Strings },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType2Template, gSmbiosType2Strings },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType1Template, gSmbiosType1Strings },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType3Template, gSmbiosType3Strings },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType2Template, gSmbiosType2Strings },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template1, gSmbiosType8Strings1 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType3Template, gSmbiosType3Strings },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template2, gSmbiosType8Strings2 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template1, gSmbiosType8Strings1 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template3, gSmbiosType8Strings3 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template2, gSmbiosType8Strings2 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template4, gSmbiosType8Strings4 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template3, gSmbiosType8Strings3 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template5, gSmbiosType8Strings5 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template4, gSmbiosType8Strings4 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template6, gSmbiosType8Strings6 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template5, gSmbiosType8Strings5 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template7, gSmbiosType8Strings7 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template6, gSmbiosType8Strings6 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template8, gSmbiosType8Strings8 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template7, gSmbiosType8Strings7 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template9, gSmbiosType8Strings9 },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template8, gSmbiosType8Strings8 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType9Template, gSmbiosType9Strings },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType8Template9, gSmbiosType8Strings9 },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType11Template, gSmbiosType11Strings },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType9Template, gSmbiosType9Strings },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType12Template, gSmbiosType12Strings },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType11Template, gSmbiosType11Strings },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType16Template, NULL },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType12Template, gSmbiosType12Strings },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType17Template, gSmbiosType17Strings },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType16Template, NULL },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType23Template, NULL },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType17Template, gSmbiosType17Strings },
|
{ (SMBIOS_STRUCTURE *)&gSmbiosType32Template, NULL },
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType23Template, NULL },
|
{ NULL, NULL }
|
||||||
{ (SMBIOS_STRUCTURE *)&gSmbiosType32Template, NULL },
|
|
||||||
{ NULL, NULL }
|
|
||||||
};
|
};
|
||||||
|
@ -25,27 +25,28 @@ DayValid (
|
|||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IsLeapYear (
|
IsLeapYear (
|
||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
RtcTimeFieldsValid (
|
RtcTimeFieldsValid (
|
||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeRealTimeClock (
|
InitializeRealTimeClock (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGetTime (
|
EmuGetTime (
|
||||||
OUT EFI_TIME * Time,
|
OUT EFI_TIME *Time,
|
||||||
OUT EFI_TIME_CAPABILITIES * Capabilities OPTIONAL
|
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -67,13 +68,11 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check parameter for null pointer
|
// Check parameter for null pointer
|
||||||
//
|
//
|
||||||
if (Time == NULL) {
|
if (Time == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gEmuThunk->GetTime (Time, Capabilities);
|
gEmuThunk->GetTime (Time, Capabilities);
|
||||||
@ -84,8 +83,9 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSetTime (
|
EmuSetTime (
|
||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -106,11 +106,12 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
if (Time == NULL) {
|
if (Time == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make sure that the time fields are valid
|
// Make sure that the time fields are valid
|
||||||
//
|
//
|
||||||
@ -118,16 +119,18 @@ Returns:
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuGetWakeupTime (
|
EmuGetWakeupTime (
|
||||||
OUT BOOLEAN *Enabled,
|
OUT BOOLEAN *Enabled,
|
||||||
OUT BOOLEAN *Pending,
|
OUT BOOLEAN *Pending,
|
||||||
OUT EFI_TIME *Time
|
OUT EFI_TIME *Time
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -159,9 +162,10 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuSetWakeupTime (
|
EmuSetWakeupTime (
|
||||||
IN BOOLEAN Enable,
|
IN BOOLEAN Enable,
|
||||||
OUT EFI_TIME *Time
|
OUT EFI_TIME *Time
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -193,9 +197,10 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeRealTimeClock (
|
InitializeRealTimeClock (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -231,8 +236,9 @@ Returns:
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
RtcTimeFieldsValid (
|
RtcTimeFieldsValid (
|
||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -242,18 +248,19 @@ Routine Description:
|
|||||||
Returns:
|
Returns:
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
if (Time->Year < 1998 ||
|
if ((Time->Year < 1998) ||
|
||||||
Time->Year > 2099 ||
|
(Time->Year > 2099) ||
|
||||||
Time->Month < 1 ||
|
(Time->Month < 1) ||
|
||||||
Time->Month > 12 ||
|
(Time->Month > 12) ||
|
||||||
(!DayValid (Time)) ||
|
(!DayValid (Time)) ||
|
||||||
Time->Hour > 23 ||
|
(Time->Hour > 23) ||
|
||||||
Time->Minute > 59 ||
|
(Time->Minute > 59) ||
|
||||||
Time->Second > 59 ||
|
(Time->Second > 59) ||
|
||||||
Time->Nanosecond > 999999999 ||
|
(Time->Nanosecond > 999999999) ||
|
||||||
(!(Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE || (Time->TimeZone >= -1440 && Time->TimeZone <= 1440))) ||
|
(!((Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE) || ((Time->TimeZone >= -1440) && (Time->TimeZone <= 1440)))) ||
|
||||||
(Time->Daylight & (~(EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT)))
|
(Time->Daylight & (~(EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT)))
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,13 +272,13 @@ DayValid (
|
|||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
STATIC const INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
STATIC const INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||||
|
|
||||||
if (Time->Day < 1 ||
|
if ((Time->Day < 1) ||
|
||||||
Time->Day > DayOfMonth[Time->Month - 1] ||
|
(Time->Day > DayOfMonth[Time->Month - 1]) ||
|
||||||
(Time->Month == 2 && (!IsLeapYear (Time) && Time->Day > 28))
|
((Time->Month == 2) && (!IsLeapYear (Time) && (Time->Day > 28)))
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,7 +287,7 @@ DayValid (
|
|||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IsLeapYear (
|
IsLeapYear (
|
||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (Time->Year % 4 == 0) {
|
if (Time->Year % 4 == 0) {
|
||||||
|
@ -19,14 +19,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <Protocol/Reset.h>
|
#include <Protocol/Reset.h>
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuResetSystem (
|
EmuResetSystem (
|
||||||
IN EFI_RESET_TYPE ResetType,
|
IN EFI_RESET_TYPE ResetType,
|
||||||
IN EFI_STATUS ResetStatus,
|
IN EFI_STATUS ResetStatus,
|
||||||
IN UINTN DataSize,
|
IN UINTN DataSize,
|
||||||
IN VOID *ResetData OPTIONAL
|
IN VOID *ResetData OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -52,7 +51,6 @@ EmuResetSystem (
|
|||||||
gBS->FreePool (HandleBuffer);
|
gBS->FreePool (HandleBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Discard ResetType, always return 0 as exit code
|
// Discard ResetType, always return 0 as exit code
|
||||||
//
|
//
|
||||||
@ -66,14 +64,13 @@ EmuResetSystem (
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeEmuReset (
|
InitializeEmuReset (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -105,4 +102,3 @@ Returns:
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,26 +15,25 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecSwitchStack (
|
SecSwitchStack (
|
||||||
UINT32 TemporaryMemoryBase,
|
UINT32 TemporaryMemoryBase,
|
||||||
UINT32 PermenentMemoryBase
|
UINT32 PermenentMemoryBase
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecTemporaryRamSupport (
|
SecTemporaryRamSupport (
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||||
IN UINTN CopySize
|
IN UINTN CopySize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Migrate the whole temporary memory to permanent memory.
|
// Migrate the whole temporary memory to permanent memory.
|
||||||
//
|
//
|
||||||
CopyMem (
|
CopyMem (
|
||||||
(VOID*)(UINTN)PermanentMemoryBase,
|
(VOID *)(UINTN)PermanentMemoryBase,
|
||||||
(VOID*)(UINTN)TemporaryMemoryBase,
|
(VOID *)(UINTN)TemporaryMemoryBase,
|
||||||
CopySize
|
CopySize
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -43,7 +42,7 @@ SecTemporaryRamSupport (
|
|||||||
// immediately, also we need fixup the stack change caused by new call into
|
// immediately, also we need fixup the stack change caused by new call into
|
||||||
// permanent memory.
|
// permanent memory.
|
||||||
//
|
//
|
||||||
SecSwitchStack ((UINT32) TemporaryMemoryBase, (UINT32) PermanentMemoryBase);
|
SecSwitchStack ((UINT32)TemporaryMemoryBase, (UINT32)PermanentMemoryBase);
|
||||||
|
|
||||||
//
|
//
|
||||||
// We need *not* fix the return address because currently,
|
// We need *not* fix the return address because currently,
|
||||||
@ -53,7 +52,7 @@ SecTemporaryRamSupport (
|
|||||||
//
|
//
|
||||||
// Simulate to invalid temporary memory, terminate temporary memory
|
// Simulate to invalid temporary memory, terminate temporary memory
|
||||||
//
|
//
|
||||||
//ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize);
|
// ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -10,13 +10,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "Sec.h"
|
#include "Sec.h"
|
||||||
|
|
||||||
|
EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
|
||||||
|
|
||||||
EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
|
|
||||||
SecTemporaryRamSupport
|
SecTemporaryRamSupport
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
|
EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
|
||||||
{
|
{
|
||||||
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
||||||
@ -25,8 +22,6 @@ EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
|
The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
|
||||||
SEC that sits on top of an OS application. So the entry and exit of this module
|
SEC that sits on top of an OS application. So the entry and exit of this module
|
||||||
@ -62,8 +57,8 @@ EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
_ModuleEntryPoint (
|
_ModuleEntryPoint (
|
||||||
IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
|
IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
|
||||||
IN EFI_PEI_PPI_DESCRIPTOR *PpiList
|
IN EFI_PEI_PPI_DESCRIPTOR *PpiList
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -77,7 +72,7 @@ _ModuleEntryPoint (
|
|||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
|
EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
|
||||||
|
|
||||||
EMU_MAGIC_PAGE()->PpiList = PpiList;
|
EMU_MAGIC_PAGE ()->PpiList = PpiList;
|
||||||
ProcessLibraryConstructorList ();
|
ProcessLibraryConstructorList ();
|
||||||
|
|
||||||
DEBUG ((DEBUG_ERROR, "SEC Has Started\n"));
|
DEBUG ((DEBUG_ERROR, "SEC Has Started\n"));
|
||||||
@ -99,12 +94,12 @@ _ModuleEntryPoint (
|
|||||||
// Keep everything on a good alignment
|
// Keep everything on a good alignment
|
||||||
SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
|
SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// Tell the PEI Core to not use our buffer in temp RAM
|
// Tell the PEI Core to not use our buffer in temp RAM
|
||||||
SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
|
SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
|
||||||
SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
|
SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
|
||||||
SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
|
SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
|
||||||
#else
|
#else
|
||||||
//
|
//
|
||||||
// When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
|
// When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
|
||||||
// or I don't understand temp RAM correctly?
|
// or I don't understand temp RAM correctly?
|
||||||
@ -112,7 +107,7 @@ _ModuleEntryPoint (
|
|||||||
|
|
||||||
SecPpiList = &PpiArray[0];
|
SecPpiList = &PpiArray[0];
|
||||||
ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
|
ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
|
||||||
#endif
|
#endif
|
||||||
// Copy existing list, and append our entries.
|
// Copy existing list, and append our entries.
|
||||||
CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
|
CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
|
||||||
CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
|
CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
|
||||||
@ -120,7 +115,7 @@ _ModuleEntryPoint (
|
|||||||
// Find PEI Core and transfer control
|
// Find PEI Core and transfer control
|
||||||
VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
|
VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
|
||||||
FileHandle = NULL;
|
FileHandle = NULL;
|
||||||
Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);
|
Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
|
Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
|
||||||
|
@ -11,7 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef __SEC_H___
|
#ifndef __SEC_H___
|
||||||
#define __SEC_H___
|
#define __SEC_H___
|
||||||
|
|
||||||
|
|
||||||
#include <PiPei.h>
|
#include <PiPei.h>
|
||||||
#include <Library/EmuMagicPageLib.h>
|
#include <Library/EmuMagicPageLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
@ -21,7 +20,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <Ppi/TemporaryRamSupport.h>
|
#include <Ppi/TemporaryRamSupport.h>
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// I think this should be defined in a MdePkg include file?
|
// I think this should be defined in a MdePkg include file?
|
||||||
//
|
//
|
||||||
@ -34,12 +32,10 @@ ProcessLibraryConstructorList (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecTemporaryRamSupport (
|
SecTemporaryRamSupport (
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||||
IN UINTN CopySize
|
IN UINTN CopySize
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -18,14 +18,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Ppi/EmuThunk.h>
|
#include <Ppi/EmuThunk.h>
|
||||||
#include <Protocol/EmuThunk.h>
|
#include <Protocol/EmuThunk.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PeiInitialzeThunkPpiToProtocolPei (
|
PeiInitialzeThunkPpiToProtocolPei (
|
||||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -50,11 +49,11 @@ Returns:
|
|||||||
DEBUG ((DEBUG_ERROR, "Emu Thunk PEIM Loaded\n"));
|
DEBUG ((DEBUG_ERROR, "Emu Thunk PEIM Loaded\n"));
|
||||||
|
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEmuThunkPpiGuid, // GUID
|
&gEmuThunkPpiGuid, // GUID
|
||||||
0, // INSTANCE
|
0, // INSTANCE
|
||||||
&PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR
|
&PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR
|
||||||
(VOID **)&Thunk // PPI
|
(VOID **)&Thunk // PPI
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
Ptr = Thunk->Thunk ();
|
Ptr = Thunk->Thunk ();
|
||||||
|
@ -27,12 +27,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Pointer to the CPU Architectural Protocol instance
|
// Pointer to the CPU Architectural Protocol instance
|
||||||
//
|
//
|
||||||
EFI_CPU_ARCH_PROTOCOL *mCpu;
|
EFI_CPU_ARCH_PROTOCOL *mCpu;
|
||||||
|
|
||||||
//
|
//
|
||||||
// The Timer Architectural Protocol that this driver produces
|
// The Timer Architectural Protocol that this driver produces
|
||||||
//
|
//
|
||||||
EFI_TIMER_ARCH_PROTOCOL mTimer = {
|
EFI_TIMER_ARCH_PROTOCOL mTimer = {
|
||||||
EmuTimerDriverRegisterHandler,
|
EmuTimerDriverRegisterHandler,
|
||||||
EmuTimerDriverSetTimerPeriod,
|
EmuTimerDriverSetTimerPeriod,
|
||||||
EmuTimerDriverGetTimerPeriod,
|
EmuTimerDriverGetTimerPeriod,
|
||||||
@ -42,22 +42,22 @@ EFI_TIMER_ARCH_PROTOCOL mTimer = {
|
|||||||
//
|
//
|
||||||
// The notification function to call on every timer interrupt
|
// The notification function to call on every timer interrupt
|
||||||
//
|
//
|
||||||
EFI_TIMER_NOTIFY mTimerNotifyFunction = NULL;
|
EFI_TIMER_NOTIFY mTimerNotifyFunction = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// The current period of the timer interrupt
|
// The current period of the timer interrupt
|
||||||
//
|
//
|
||||||
UINT64 mTimerPeriodMs;
|
UINT64 mTimerPeriodMs;
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TimerCallback (UINT64 DeltaMs)
|
TimerCallback (
|
||||||
|
UINT64 DeltaMs
|
||||||
|
)
|
||||||
{
|
{
|
||||||
EFI_TPL OriginalTPL;
|
EFI_TPL OriginalTPL;
|
||||||
EFI_TIMER_NOTIFY CallbackFunction;
|
EFI_TIMER_NOTIFY CallbackFunction;
|
||||||
|
|
||||||
|
|
||||||
OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);
|
OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);
|
||||||
|
|
||||||
if (OriginalTPL < TPL_HIGH_LEVEL) {
|
if (OriginalTPL < TPL_HIGH_LEVEL) {
|
||||||
@ -73,15 +73,15 @@ TimerCallback (UINT64 DeltaMs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
gBS->RestoreTPL (OriginalTPL);
|
gBS->RestoreTPL (OriginalTPL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuTimerDriverRegisterHandler (
|
EmuTimerDriverRegisterHandler (
|
||||||
IN EFI_TIMER_ARCH_PROTOCOL *This,
|
IN EFI_TIMER_ARCH_PROTOCOL *This,
|
||||||
IN EFI_TIMER_NOTIFY NotifyFunction
|
IN EFI_TIMER_NOTIFY NotifyFunction
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -127,11 +127,11 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Check for invalid parameters
|
// Check for invalid parameters
|
||||||
//
|
//
|
||||||
if (NotifyFunction == NULL && mTimerNotifyFunction == NULL) {
|
if ((NotifyFunction == NULL) && (mTimerNotifyFunction == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NotifyFunction != NULL && mTimerNotifyFunction != NULL) {
|
if ((NotifyFunction != NULL) && (mTimerNotifyFunction != NULL)) {
|
||||||
return EFI_ALREADY_STARTED;
|
return EFI_ALREADY_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,6 +142,7 @@ Returns:
|
|||||||
/* Enable Timer. */
|
/* Enable Timer. */
|
||||||
gEmuThunk->SetTimer (mTimerPeriodMs, TimerCallback);
|
gEmuThunk->SetTimer (mTimerPeriodMs, TimerCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
mTimerNotifyFunction = NotifyFunction;
|
mTimerNotifyFunction = NotifyFunction;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -153,6 +154,7 @@ EmuTimerDriverSetTimerPeriod (
|
|||||||
IN EFI_TIMER_ARCH_PROTOCOL *This,
|
IN EFI_TIMER_ARCH_PROTOCOL *This,
|
||||||
IN UINT64 TimerPeriod
|
IN UINT64 TimerPeriod
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -190,14 +192,14 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
|
|
||||||
//
|
//
|
||||||
// If TimerPeriod is 0, then the timer thread should be canceled
|
// If TimerPeriod is 0, then the timer thread should be canceled
|
||||||
// If the TimerPeriod is valid, then create and/or adjust the period of the timer thread
|
// If the TimerPeriod is valid, then create and/or adjust the period of the timer thread
|
||||||
//
|
//
|
||||||
if (TimerPeriod == 0
|
if ( (TimerPeriod == 0)
|
||||||
|| ((TimerPeriod > TIMER_MINIMUM_VALUE)
|
|| ( (TimerPeriod > TIMER_MINIMUM_VALUE)
|
||||||
&& (TimerPeriod < TIMER_MAXIMUM_VALUE))) {
|
&& (TimerPeriod < TIMER_MAXIMUM_VALUE)))
|
||||||
|
{
|
||||||
mTimerPeriodMs = DivU64x32 (TimerPeriod + 5000, 10000);
|
mTimerPeriodMs = DivU64x32 (TimerPeriod + 5000, 10000);
|
||||||
|
|
||||||
gEmuThunk->SetTimer (mTimerPeriodMs, TimerCallback);
|
gEmuThunk->SetTimer (mTimerPeriodMs, TimerCallback);
|
||||||
@ -209,9 +211,10 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuTimerDriverGetTimerPeriod (
|
EmuTimerDriverGetTimerPeriod (
|
||||||
IN EFI_TIMER_ARCH_PROTOCOL *This,
|
IN EFI_TIMER_ARCH_PROTOCOL *This,
|
||||||
OUT UINT64 *TimerPeriod
|
OUT UINT64 *TimerPeriod
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -250,6 +253,7 @@ EFIAPI
|
|||||||
EmuTimerDriverGenerateSoftInterrupt (
|
EmuTimerDriverGenerateSoftInterrupt (
|
||||||
IN EFI_TIMER_ARCH_PROTOCOL *This
|
IN EFI_TIMER_ARCH_PROTOCOL *This
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -283,6 +287,7 @@ EmuTimerDriverInitialize (
|
|||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -341,6 +346,5 @@ Returns:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -13,19 +13,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _TIMER_H_
|
#ifndef _TIMER_H_
|
||||||
#define _TIMER_H_
|
#define _TIMER_H_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Legal timer value range in 100 ns units
|
// Legal timer value range in 100 ns units
|
||||||
//
|
//
|
||||||
#define TIMER_MINIMUM_VALUE 0
|
#define TIMER_MINIMUM_VALUE 0
|
||||||
#define TIMER_MAXIMUM_VALUE (0x100000000ULL - 1)
|
#define TIMER_MAXIMUM_VALUE (0x100000000ULL - 1)
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default timer value in 100 ns units (50 ms)
|
// Default timer value in 100 ns units (50 ms)
|
||||||
//
|
//
|
||||||
#define DEFAULT_TIMER_TICK_DURATION 500000
|
#define DEFAULT_TIMER_TICK_DURATION 500000
|
||||||
|
|
||||||
//
|
//
|
||||||
// Function Prototypes
|
// Function Prototypes
|
||||||
@ -54,8 +51,8 @@ EmuTimerDriverSetTimerPeriod (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EmuTimerDriverGetTimerPeriod (
|
EmuTimerDriverGetTimerPeriod (
|
||||||
IN EFI_TIMER_ARCH_PROTOCOL *This,
|
IN EFI_TIMER_ARCH_PROTOCOL *This,
|
||||||
OUT UINT64 *TimerPeriod
|
OUT UINT64 *TimerPeriod
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
|
@ -11,53 +11,48 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
|
||||||
|
#include <Library/NetLib.h>
|
||||||
|
|
||||||
#include <Library/NetLib.h>
|
#define EMU_SNP_PRIVATE_SIGNATURE SIGNATURE_32('E', 'M', 's', 'n')
|
||||||
|
|
||||||
|
|
||||||
#define EMU_SNP_PRIVATE_SIGNATURE SIGNATURE_32('E', 'M', 's', 'n')
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
|
|
||||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||||
EMU_SNP_PROTOCOL EmuSnp;
|
EMU_SNP_PROTOCOL EmuSnp;
|
||||||
EFI_SIMPLE_NETWORK_MODE *Mode;
|
EFI_SIMPLE_NETWORK_MODE *Mode;
|
||||||
|
|
||||||
int BpfFd;
|
int BpfFd;
|
||||||
char *InterfaceName;
|
char *InterfaceName;
|
||||||
EFI_MAC_ADDRESS MacAddress;
|
EFI_MAC_ADDRESS MacAddress;
|
||||||
u_int ReadBufferSize;
|
u_int ReadBufferSize;
|
||||||
VOID *ReadBuffer;
|
VOID *ReadBuffer;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Two walking pointers to manage the multiple packets that can be returned
|
// Two walking pointers to manage the multiple packets that can be returned
|
||||||
// in a single read.
|
// in a single read.
|
||||||
//
|
//
|
||||||
VOID *CurrentReadPointer;
|
VOID *CurrentReadPointer;
|
||||||
VOID *EndReadPointer;
|
VOID *EndReadPointer;
|
||||||
|
|
||||||
UINT32 ReceivedPackets;
|
|
||||||
UINT32 DroppedPackets;
|
|
||||||
|
|
||||||
|
UINT32 ReceivedPackets;
|
||||||
|
UINT32 DroppedPackets;
|
||||||
} EMU_SNP_PRIVATE;
|
} EMU_SNP_PRIVATE;
|
||||||
|
|
||||||
#define EMU_SNP_PRIVATE_DATA_FROM_THIS(a) \
|
#define EMU_SNP_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
CR(a, EMU_SNP_PRIVATE, EmuSnp, EMU_SNP_PRIVATE_SIGNATURE)
|
CR(a, EMU_SNP_PRIVATE, EmuSnp, EMU_SNP_PRIVATE_SIGNATURE)
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Strange, but there doesn't appear to be any structure for the Ethernet header in edk2...
|
// Strange, but there doesn't appear to be any structure for the Ethernet header in edk2...
|
||||||
//
|
//
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 DstAddr[NET_ETHER_ADDR_LEN];
|
UINT8 DstAddr[NET_ETHER_ADDR_LEN];
|
||||||
UINT8 SrcAddr[NET_ETHER_ADDR_LEN];
|
UINT8 SrcAddr[NET_ETHER_ADDR_LEN];
|
||||||
UINT16 Type;
|
UINT16 Type;
|
||||||
} ETHERNET_HEADER;
|
} ETHERNET_HEADER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -76,7 +71,7 @@ EmuSnpCreateMapping (
|
|||||||
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -100,40 +95,38 @@ EmuSnpCreateMapping (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct bpf_insn mFilterInstructionTemplate[] = {
|
||||||
static struct bpf_insn mFilterInstructionTemplate[] = {
|
|
||||||
// Load 4 bytes from the destination MAC address.
|
// Load 4 bytes from the destination MAC address.
|
||||||
BPF_STMT (BPF_LD + BPF_W + BPF_ABS, OFFSET_OF (ETHERNET_HEADER, DstAddr[0])),
|
BPF_STMT (BPF_LD + BPF_W + BPF_ABS, OFFSET_OF (ETHERNET_HEADER, DstAddr[0])),
|
||||||
|
|
||||||
// Compare to first 4 bytes of fake MAC address.
|
// Compare to first 4 bytes of fake MAC address.
|
||||||
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0x12345678, 0, 3 ),
|
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0x12345678, 0, 3),
|
||||||
|
|
||||||
// Load remaining 2 bytes from the destination MAC address.
|
// Load remaining 2 bytes from the destination MAC address.
|
||||||
BPF_STMT (BPF_LD + BPF_H + BPF_ABS, OFFSET_OF( ETHERNET_HEADER, DstAddr[4])),
|
BPF_STMT (BPF_LD + BPF_H + BPF_ABS, OFFSET_OF (ETHERNET_HEADER, DstAddr[4])),
|
||||||
|
|
||||||
// Compare to remaining 2 bytes of fake MAC address.
|
// Compare to remaining 2 bytes of fake MAC address.
|
||||||
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0x9ABC, 5, 0 ),
|
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0x9ABC, 5, 0),
|
||||||
|
|
||||||
// Load 4 bytes from the destination MAC address.
|
// Load 4 bytes from the destination MAC address.
|
||||||
BPF_STMT (BPF_LD + BPF_W + BPF_ABS, OFFSET_OF (ETHERNET_HEADER, DstAddr[0])),
|
BPF_STMT (BPF_LD + BPF_W + BPF_ABS, OFFSET_OF (ETHERNET_HEADER, DstAddr[0])),
|
||||||
|
|
||||||
// Compare to first 4 bytes of broadcast MAC address.
|
// Compare to first 4 bytes of broadcast MAC address.
|
||||||
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0xFFFFFFFF, 0, 2),
|
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0xFFFFFFFF, 0, 2),
|
||||||
|
|
||||||
// Load remaining 2 bytes from the destination MAC address.
|
// Load remaining 2 bytes from the destination MAC address.
|
||||||
BPF_STMT (BPF_LD + BPF_H + BPF_ABS, OFFSET_OF( ETHERNET_HEADER, DstAddr[4])),
|
BPF_STMT (BPF_LD + BPF_H + BPF_ABS, OFFSET_OF (ETHERNET_HEADER, DstAddr[4])),
|
||||||
|
|
||||||
// Compare to remaining 2 bytes of broadcast MAC address.
|
// Compare to remaining 2 bytes of broadcast MAC address.
|
||||||
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0xFFFF, 1, 0),
|
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0xFFFF, 1, 0),
|
||||||
|
|
||||||
// Reject packet.
|
// Reject packet.
|
||||||
BPF_STMT (BPF_RET + BPF_K, 0),
|
BPF_STMT (BPF_RET + BPF_K, 0),
|
||||||
|
|
||||||
// Receive entire packet.
|
// Receive entire packet.
|
||||||
BPF_STMT (BPF_RET + BPF_K, -1)
|
BPF_STMT (BPF_RET + BPF_K, -1)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
OpenBpfFileDescriptor (
|
OpenBpfFileDescriptor (
|
||||||
IN EMU_SNP_PRIVATE *Private,
|
IN EMU_SNP_PRIVATE *Private,
|
||||||
@ -171,7 +164,6 @@ OpenBpfFileDescriptor (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Changes the state of a network interface from "stopped" to "started".
|
Changes the state of a network interface from "stopped" to "started".
|
||||||
|
|
||||||
@ -189,15 +181,15 @@ EmuSnpStart (
|
|||||||
IN EMU_SNP_PROTOCOL *This
|
IN EMU_SNP_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
struct ifreq BoundIf;
|
struct ifreq BoundIf;
|
||||||
struct bpf_program BpfProgram;
|
struct bpf_program BpfProgram;
|
||||||
struct bpf_insn *FilterProgram;
|
struct bpf_insn *FilterProgram;
|
||||||
u_int Value;
|
u_int Value;
|
||||||
u_int ReadBufferSize;
|
u_int ReadBufferSize;
|
||||||
UINT16 Temp16;
|
UINT16 Temp16;
|
||||||
UINT32 Temp32;
|
UINT32 Temp32;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -215,7 +207,7 @@ EmuSnpStart (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
Private->ReadBuffer = NULL;
|
Private->ReadBuffer = NULL;
|
||||||
if (Private->BpfFd == 0) {
|
if (Private->BpfFd == 0) {
|
||||||
Status = OpenBpfFileDescriptor (Private, &Private->BpfFd);
|
Status = OpenBpfFileDescriptor (Private, &Private->BpfFd);
|
||||||
@ -282,7 +274,7 @@ EmuSnpStart (
|
|||||||
// Allocate read buffer.
|
// Allocate read buffer.
|
||||||
//
|
//
|
||||||
Private->ReadBufferSize = ReadBufferSize;
|
Private->ReadBufferSize = ReadBufferSize;
|
||||||
Private->ReadBuffer = malloc (Private->ReadBufferSize);
|
Private->ReadBuffer = malloc (Private->ReadBufferSize);
|
||||||
if (Private->ReadBuffer == NULL) {
|
if (Private->ReadBuffer == NULL) {
|
||||||
goto ErrorExit;
|
goto ErrorExit;
|
||||||
}
|
}
|
||||||
@ -293,7 +285,7 @@ EmuSnpStart (
|
|||||||
// Install our packet filter: successful reads should only produce broadcast or unicast
|
// Install our packet filter: successful reads should only produce broadcast or unicast
|
||||||
// packets directed to our fake MAC address.
|
// packets directed to our fake MAC address.
|
||||||
//
|
//
|
||||||
FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;
|
FilterProgram = malloc (sizeof (mFilterInstructionTemplate));
|
||||||
if ( FilterProgram == NULL ) {
|
if ( FilterProgram == NULL ) {
|
||||||
goto ErrorExit;
|
goto ErrorExit;
|
||||||
}
|
}
|
||||||
@ -308,7 +300,7 @@ EmuSnpStart (
|
|||||||
CopyMem (&Temp16, &Private->Mode->CurrentAddress.Addr[4], sizeof (UINT16));
|
CopyMem (&Temp16, &Private->Mode->CurrentAddress.Addr[4], sizeof (UINT16));
|
||||||
FilterProgram[3].k = NTOHS (Temp16);
|
FilterProgram[3].k = NTOHS (Temp16);
|
||||||
|
|
||||||
BpfProgram.bf_len = sizeof (mFilterInstructionTemplate) / sizeof (struct bpf_insn);
|
BpfProgram.bf_len = sizeof (mFilterInstructionTemplate) / sizeof (struct bpf_insn);
|
||||||
BpfProgram.bf_insns = FilterProgram;
|
BpfProgram.bf_insns = FilterProgram;
|
||||||
|
|
||||||
if (ioctl (Private->BpfFd, BIOCSETF, &BpfProgram) < 0) {
|
if (ioctl (Private->BpfFd, BIOCSETF, &BpfProgram) < 0) {
|
||||||
@ -324,7 +316,6 @@ EmuSnpStart (
|
|||||||
goto DeviceErrorExit;
|
goto DeviceErrorExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Private->Mode->State = EfiSimpleNetworkStarted;
|
Private->Mode->State = EfiSimpleNetworkStarted;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,10 +328,10 @@ ErrorExit:
|
|||||||
free (Private->ReadBuffer);
|
free (Private->ReadBuffer);
|
||||||
Private->ReadBuffer = NULL;
|
Private->ReadBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Changes the state of a network interface from "started" to "stopped".
|
Changes the state of a network interface from "started" to "stopped".
|
||||||
|
|
||||||
@ -358,7 +349,7 @@ EmuSnpStop (
|
|||||||
IN EMU_SNP_PROTOCOL *This
|
IN EMU_SNP_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -381,7 +372,7 @@ EmuSnpStop (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Private->ReadBuffer != NULL) {
|
if (Private->ReadBuffer != NULL) {
|
||||||
free (Private->ReadBuffer );
|
free (Private->ReadBuffer);
|
||||||
Private->CurrentReadPointer = Private->EndReadPointer = Private->ReadBuffer = NULL;
|
Private->CurrentReadPointer = Private->EndReadPointer = Private->ReadBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,7 +381,6 @@ EmuSnpStop (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resets a network adapter and allocates the transmit and receive buffers
|
Resets a network adapter and allocates the transmit and receive buffers
|
||||||
required by the network interface; optionally, also requests allocation
|
required by the network interface; optionally, also requests allocation
|
||||||
@ -419,12 +409,12 @@ EmuSnpStop (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpInitialize (
|
EmuSnpInitialize (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -441,7 +431,7 @@ EmuSnpInitialize (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private->Mode->MCastFilterCount = 0;
|
Private->Mode->MCastFilterCount = 0;
|
||||||
Private->Mode->ReceiveFilterSetting = 0;
|
Private->Mode->ReceiveFilterSetting = 0;
|
||||||
ZeroMem (Private->Mode->MCastFilter, sizeof (Private->Mode->MCastFilter));
|
ZeroMem (Private->Mode->MCastFilter, sizeof (Private->Mode->MCastFilter));
|
||||||
|
|
||||||
@ -450,7 +440,6 @@ EmuSnpInitialize (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resets a network adapter and re-initializes it with the parameters that were
|
Resets a network adapter and re-initializes it with the parameters that were
|
||||||
provided in the previous call to Initialize().
|
provided in the previous call to Initialize().
|
||||||
@ -469,11 +458,11 @@ EmuSnpInitialize (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpReset (
|
EmuSnpReset (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -493,7 +482,6 @@ EmuSnpReset (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resets a network adapter and leaves it in a state that is safe for
|
Resets a network adapter and leaves it in a state that is safe for
|
||||||
another driver to initialize.
|
another driver to initialize.
|
||||||
@ -512,7 +500,7 @@ EmuSnpShutdown (
|
|||||||
IN EMU_SNP_PROTOCOL *This
|
IN EMU_SNP_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -532,7 +520,7 @@ EmuSnpShutdown (
|
|||||||
Private->Mode->State = EfiSimpleNetworkStarted;
|
Private->Mode->State = EfiSimpleNetworkStarted;
|
||||||
|
|
||||||
Private->Mode->ReceiveFilterSetting = 0;
|
Private->Mode->ReceiveFilterSetting = 0;
|
||||||
Private->Mode->MCastFilterCount = 0;
|
Private->Mode->MCastFilterCount = 0;
|
||||||
ZeroMem (Private->Mode->MCastFilter, sizeof (Private->Mode->MCastFilter));
|
ZeroMem (Private->Mode->MCastFilter, sizeof (Private->Mode->MCastFilter));
|
||||||
|
|
||||||
if (Private->BpfFd != 0) {
|
if (Private->BpfFd != 0) {
|
||||||
@ -574,15 +562,15 @@ EmuSnpShutdown (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpReceiveFilters (
|
EmuSnpReceiveFilters (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINT32 Enable,
|
IN UINT32 Enable,
|
||||||
IN UINT32 Disable,
|
IN UINT32 Disable,
|
||||||
IN BOOLEAN ResetMCastFilter,
|
IN BOOLEAN ResetMCastFilter,
|
||||||
IN UINTN MCastFilterCnt OPTIONAL,
|
IN UINTN MCastFilterCnt OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -590,7 +578,6 @@ EmuSnpReceiveFilters (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Modifies or resets the current station address, if supported.
|
Modifies or resets the current station address, if supported.
|
||||||
|
|
||||||
@ -608,19 +595,18 @@ EmuSnpReceiveFilters (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpStationAddress (
|
EmuSnpStationAddress (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resets or collects the statistics on a network interface.
|
Resets or collects the statistics on a network interface.
|
||||||
|
|
||||||
@ -644,20 +630,19 @@ EmuSnpStationAddress (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpStatistics (
|
EmuSnpStatistics (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Converts a multicast IP address to a multicast HW MAC address.
|
Converts a multicast IP address to a multicast HW MAC address.
|
||||||
|
|
||||||
@ -681,20 +666,19 @@ EmuSnpStatistics (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpMCastIpToMac (
|
EmuSnpMCastIpToMac (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN IPv6,
|
IN BOOLEAN IPv6,
|
||||||
IN EFI_IP_ADDRESS *IP,
|
IN EFI_IP_ADDRESS *IP,
|
||||||
OUT EFI_MAC_ADDRESS *MAC
|
OUT EFI_MAC_ADDRESS *MAC
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Performs read and write operations on the NVRAM device attached to a
|
Performs read and write operations on the NVRAM device attached to a
|
||||||
network interface.
|
network interface.
|
||||||
@ -717,14 +701,14 @@ EmuSnpMCastIpToMac (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpNvData (
|
EmuSnpNvData (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN ReadWrite,
|
IN BOOLEAN ReadWrite,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN OUT VOID *Buffer
|
IN OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -758,12 +742,12 @@ EmuSnpNvData (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpGetStatus (
|
EmuSnpGetStatus (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||||
OUT VOID **TxBuf OPTIONAL
|
OUT VOID **TxBuf OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -774,7 +758,6 @@ EmuSnpGetStatus (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Places a packet in the transmit queue of a network interface.
|
Places a packet in the transmit queue of a network interface.
|
||||||
|
|
||||||
@ -810,17 +793,17 @@ EmuSnpGetStatus (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpTransmit (
|
EmuSnpTransmit (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINTN HeaderSize,
|
IN UINTN HeaderSize,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer,
|
IN VOID *Buffer,
|
||||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
IN UINT16 *Protocol OPTIONAL
|
IN UINT16 *Protocol OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
ETHERNET_HEADER *EnetHeader;
|
ETHERNET_HEADER *EnetHeader;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -837,15 +820,15 @@ EmuSnpTransmit (
|
|||||||
SrcAddr = &Private->Mode->CurrentAddress;
|
SrcAddr = &Private->Mode->CurrentAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
EnetHeader = (ETHERNET_HEADER *) Buffer;
|
EnetHeader = (ETHERNET_HEADER *)Buffer;
|
||||||
|
|
||||||
CopyMem (EnetHeader->DstAddr, DestAddr, NET_ETHER_ADDR_LEN);
|
CopyMem (EnetHeader->DstAddr, DestAddr, NET_ETHER_ADDR_LEN);
|
||||||
CopyMem (EnetHeader->SrcAddr, SrcAddr, NET_ETHER_ADDR_LEN);
|
CopyMem (EnetHeader->SrcAddr, SrcAddr, NET_ETHER_ADDR_LEN);
|
||||||
|
|
||||||
EnetHeader->Type = HTONS(*Protocol);
|
EnetHeader->Type = HTONS (*Protocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write (Private->BpfFd, Buffer, BufferSize) < 0) {
|
if (write (Private->BpfFd, Buffer, BufferSize) < 0) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -886,20 +869,20 @@ EmuSnpTransmit (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpReceive (
|
EmuSnpReceive (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
OUT UINTN *HeaderSize OPTIONAL,
|
OUT UINTN *HeaderSize OPTIONAL,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT VOID *Buffer,
|
OUT VOID *Buffer,
|
||||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
OUT UINT16 *Protocol OPTIONAL
|
OUT UINT16 *Protocol OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
struct bpf_hdr *BpfHeader;
|
struct bpf_hdr *BpfHeader;
|
||||||
struct bpf_stat BpfStats;
|
struct bpf_stat BpfStats;
|
||||||
ETHERNET_HEADER *EnetHeader;
|
ETHERNET_HEADER *EnetHeader;
|
||||||
ssize_t Result;
|
ssize_t Result;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -907,7 +890,7 @@ EmuSnpReceive (
|
|||||||
return EFI_NOT_STARTED;
|
return EFI_NOT_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZeroMem (&BpfStats, sizeof( BpfStats));
|
ZeroMem (&BpfStats, sizeof (BpfStats));
|
||||||
|
|
||||||
if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
|
if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
|
||||||
Private->ReceivedPackets += BpfStats.bs_recv;
|
Private->ReceivedPackets += BpfStats.bs_recv;
|
||||||
@ -936,10 +919,10 @@ EmuSnpReceive (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Private->CurrentReadPointer = Private->ReadBuffer;
|
Private->CurrentReadPointer = Private->ReadBuffer;
|
||||||
Private->EndReadPointer = Private->CurrentReadPointer + Result;
|
Private->EndReadPointer = Private->CurrentReadPointer + Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
BpfHeader = Private->CurrentReadPointer;
|
BpfHeader = Private->CurrentReadPointer;
|
||||||
EnetHeader = Private->CurrentReadPointer + BpfHeader->bh_hdrlen;
|
EnetHeader = Private->CurrentReadPointer + BpfHeader->bh_hdrlen;
|
||||||
|
|
||||||
if (BpfHeader->bh_caplen > *BufferSize) {
|
if (BpfHeader->bh_caplen > *BufferSize) {
|
||||||
@ -972,8 +955,7 @@ EmuSnpReceive (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
||||||
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
|
||||||
GasketSnpCreateMapping,
|
GasketSnpCreateMapping,
|
||||||
GasketSnpStart,
|
GasketSnpStart,
|
||||||
GasketSnpStop,
|
GasketSnpStop,
|
||||||
@ -992,7 +974,7 @@ EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetInterfaceMacAddr (
|
GetInterfaceMacAddr (
|
||||||
EMU_SNP_PRIVATE *Private
|
EMU_SNP_PRIVATE *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -1020,12 +1002,12 @@ GetInterfaceMacAddr (
|
|||||||
);
|
);
|
||||||
|
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
If = IfAddrs;
|
If = IfAddrs;
|
||||||
while (If != NULL) {
|
while (If != NULL) {
|
||||||
IfSdl = (struct sockaddr_dl *)If->ifa_addr;
|
IfSdl = (struct sockaddr_dl *)If->ifa_addr;
|
||||||
|
|
||||||
if (IfSdl->sdl_family == AF_LINK) {
|
if (IfSdl->sdl_family == AF_LINK) {
|
||||||
if (!AsciiStrCmp( Private->InterfaceName, If->ifa_name)) {
|
if (!AsciiStrCmp (Private->InterfaceName, If->ifa_name)) {
|
||||||
CopyMem (&Private->MacAddress, LLADDR (IfSdl), NET_ETHER_ADDR_LEN);
|
CopyMem (&Private->MacAddress, LLADDR (IfSdl), NET_ETHER_ADDR_LEN);
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
@ -1041,10 +1023,9 @@ Exit:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpThunkOpen (
|
EmuSnpThunkOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
@ -1062,7 +1043,6 @@ EmuSnpThunkOpen (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Private->Signature = EMU_SNP_PRIVATE_SIGNATURE;
|
Private->Signature = EMU_SNP_PRIVATE_SIGNATURE;
|
||||||
Private->Thunk = This;
|
Private->Thunk = This;
|
||||||
CopyMem (&Private->EmuSnp, &gEmuSnpProtocol, sizeof (gEmuSnpProtocol));
|
CopyMem (&Private->EmuSnp, &gEmuSnpProtocol, sizeof (gEmuSnpProtocol));
|
||||||
@ -1073,10 +1053,9 @@ EmuSnpThunkOpen (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpThunkClose (
|
EmuSnpThunkClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
@ -1091,9 +1070,7 @@ EmuSnpThunkClose (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
|
||||||
|
|
||||||
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
|
|
||||||
&gEmuSnpProtocolGuid,
|
&gEmuSnpProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -7,41 +7,37 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
|
|
||||||
#define EMU_BLOCK_IO_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'b', 'k')
|
#define EMU_BLOCK_IO_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'b', 'k')
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
|
|
||||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||||
|
|
||||||
char *Filename;
|
char *Filename;
|
||||||
UINTN ReadMode;
|
UINTN ReadMode;
|
||||||
UINTN Mode;
|
UINTN Mode;
|
||||||
|
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
BOOLEAN RemovableMedia;
|
BOOLEAN RemovableMedia;
|
||||||
BOOLEAN WriteProtected;
|
BOOLEAN WriteProtected;
|
||||||
|
|
||||||
UINT64 NumberOfBlocks;
|
UINT64 NumberOfBlocks;
|
||||||
UINT32 BlockSize;
|
UINT32 BlockSize;
|
||||||
|
|
||||||
EMU_BLOCK_IO_PROTOCOL EmuBlockIo;
|
|
||||||
EFI_BLOCK_IO_MEDIA *Media;
|
|
||||||
|
|
||||||
|
EMU_BLOCK_IO_PROTOCOL EmuBlockIo;
|
||||||
|
EFI_BLOCK_IO_MEDIA *Media;
|
||||||
} EMU_BLOCK_IO_PRIVATE;
|
} EMU_BLOCK_IO_PRIVATE;
|
||||||
|
|
||||||
#define EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS(a) \
|
#define EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
CR(a, EMU_BLOCK_IO_PRIVATE, EmuBlockIo, EMU_BLOCK_IO_PRIVATE_SIGNATURE)
|
CR(a, EMU_BLOCK_IO_PRIVATE, EmuBlockIo, EMU_BLOCK_IO_PRIVATE_SIGNATURE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoReset (
|
EmuBlockIoReset (
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
This function extends the capability of SetFilePointer to accept 64 bit parameters
|
This function extends the capability of SetFilePointer to accept 64 bit parameters
|
||||||
@ -49,18 +45,18 @@ This function extends the capability of SetFilePointer to accept 64 bit paramete
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SetFilePointer64 (
|
SetFilePointer64 (
|
||||||
IN EMU_BLOCK_IO_PRIVATE *Private,
|
IN EMU_BLOCK_IO_PRIVATE *Private,
|
||||||
IN INT64 DistanceToMove,
|
IN INT64 DistanceToMove,
|
||||||
OUT UINT64 *NewFilePointer,
|
OUT UINT64 *NewFilePointer,
|
||||||
IN INT32 MoveMethod
|
IN INT32 MoveMethod
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
off_t res;
|
off_t res;
|
||||||
off_t offset = DistanceToMove;
|
off_t offset = DistanceToMove;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
res = lseek (Private->fd, offset, (int)MoveMethod);
|
res = lseek (Private->fd, offset, (int)MoveMethod);
|
||||||
if (res == -1) {
|
if (res == -1) {
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
@ -72,16 +68,14 @@ SetFilePointer64 (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoOpenDevice (
|
EmuBlockIoOpenDevice (
|
||||||
IN EMU_BLOCK_IO_PRIVATE *Private
|
IN EMU_BLOCK_IO_PRIVATE *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT64 FileSize;
|
UINT64 FileSize;
|
||||||
struct statfs buf;
|
struct statfs buf;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the device is already opened, close it
|
// If the device is already opened, close it
|
||||||
@ -95,9 +89,9 @@ EmuBlockIoOpenDevice (
|
|||||||
//
|
//
|
||||||
Private->fd = open (Private->Filename, Private->Mode, 0644);
|
Private->fd = open (Private->Filename, Private->Mode, 0644);
|
||||||
if (Private->fd < 0) {
|
if (Private->fd < 0) {
|
||||||
printf ("EmuOpenBlock: Could not open %s: %s\n", Private->Filename, strerror(errno));
|
printf ("EmuOpenBlock: Could not open %s: %s\n", Private->Filename, strerror (errno));
|
||||||
Private->Media->MediaPresent = FALSE;
|
Private->Media->MediaPresent = FALSE;
|
||||||
Status = EFI_NO_MEDIA;
|
Status = EFI_NO_MEDIA;
|
||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,13 +114,14 @@ EmuBlockIoOpenDevice (
|
|||||||
|
|
||||||
if (FileSize == 0) {
|
if (FileSize == 0) {
|
||||||
// lseek fails on a real device. ioctl calls are OS specific
|
// lseek fails on a real device. ioctl calls are OS specific
|
||||||
#if __APPLE__
|
#if __APPLE__
|
||||||
{
|
{
|
||||||
UINT32 BlockSize;
|
UINT32 BlockSize;
|
||||||
|
|
||||||
if (ioctl (Private->fd, DKIOCGETBLOCKSIZE, &BlockSize) == 0) {
|
if (ioctl (Private->fd, DKIOCGETBLOCKSIZE, &BlockSize) == 0) {
|
||||||
Private->Media->BlockSize = BlockSize;
|
Private->Media->BlockSize = BlockSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioctl (Private->fd, DKIOCGETBLOCKCOUNT, &Private->NumberOfBlocks) == 0) {
|
if (ioctl (Private->fd, DKIOCGETBLOCKCOUNT, &Private->NumberOfBlocks) == 0) {
|
||||||
if ((Private->NumberOfBlocks == 0) && (BlockSize == 0x800)) {
|
if ((Private->NumberOfBlocks == 0) && (BlockSize == 0x800)) {
|
||||||
// A DVD is ~ 4.37 GB so make up a number
|
// A DVD is ~ 4.37 GB so make up a number
|
||||||
@ -135,34 +130,35 @@ EmuBlockIoOpenDevice (
|
|||||||
Private->Media->LastBlock = Private->NumberOfBlocks - 1;
|
Private->Media->LastBlock = Private->NumberOfBlocks - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ioctl (Private->fd, DKIOCGETMAXBLOCKCOUNTWRITE, &Private->Media->OptimalTransferLengthGranularity);
|
ioctl (Private->fd, DKIOCGETMAXBLOCKCOUNTWRITE, &Private->Media->OptimalTransferLengthGranularity);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
size_t BlockSize;
|
size_t BlockSize;
|
||||||
UINT64 DiskSize;
|
UINT64 DiskSize;
|
||||||
|
|
||||||
if (ioctl (Private->fd, BLKSSZGET, &BlockSize) == 0) {
|
if (ioctl (Private->fd, BLKSSZGET, &BlockSize) == 0) {
|
||||||
Private->Media->BlockSize = BlockSize;
|
Private->Media->BlockSize = BlockSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioctl (Private->fd, BLKGETSIZE64, &DiskSize) == 0) {
|
if (ioctl (Private->fd, BLKGETSIZE64, &DiskSize) == 0) {
|
||||||
Private->NumberOfBlocks = DivU64x32 (DiskSize, (UINT32)BlockSize);
|
Private->NumberOfBlocks = DivU64x32 (DiskSize, (UINT32)BlockSize);
|
||||||
Private->Media->LastBlock = Private->NumberOfBlocks - 1;
|
Private->Media->LastBlock = Private->NumberOfBlocks - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Private->Media->BlockSize = Private->BlockSize;
|
Private->Media->BlockSize = Private->BlockSize;
|
||||||
Private->NumberOfBlocks = DivU64x32 (FileSize, Private->Media->BlockSize);
|
Private->NumberOfBlocks = DivU64x32 (FileSize, Private->Media->BlockSize);
|
||||||
Private->Media->LastBlock = Private->NumberOfBlocks - 1;
|
Private->Media->LastBlock = Private->NumberOfBlocks - 1;
|
||||||
|
|
||||||
if (fstatfs (Private->fd, &buf) == 0) {
|
if (fstatfs (Private->fd, &buf) == 0) {
|
||||||
#if __APPLE__
|
#if __APPLE__
|
||||||
Private->Media->OptimalTransferLengthGranularity = buf.f_iosize/buf.f_bsize;
|
Private->Media->OptimalTransferLengthGranularity = buf.f_iosize/buf.f_bsize;
|
||||||
#else
|
#else
|
||||||
Private->Media->OptimalTransferLengthGranularity = buf.f_bsize/buf.f_bsize;
|
Private->Media->OptimalTransferLengthGranularity = buf.f_bsize/buf.f_bsize;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,15 +175,14 @@ Done:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoCreateMapping (
|
EmuBlockIoCreateMapping (
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN EFI_BLOCK_IO_MEDIA *Media
|
IN EFI_BLOCK_IO_MEDIA *Media
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -206,66 +201,61 @@ EmuBlockIoCreateMapping (
|
|||||||
Media->LowestAlignedLba = 0;
|
Media->LowestAlignedLba = 0;
|
||||||
Media->LogicalBlocksPerPhysicalBlock = 0;
|
Media->LogicalBlocksPerPhysicalBlock = 0;
|
||||||
|
|
||||||
|
|
||||||
// EFI_BLOCK_IO_PROTOCOL_REVISION3
|
// EFI_BLOCK_IO_PROTOCOL_REVISION3
|
||||||
Media->OptimalTransferLengthGranularity = 0;
|
Media->OptimalTransferLengthGranularity = 0;
|
||||||
|
|
||||||
Status = EmuBlockIoOpenDevice (Private);
|
Status = EmuBlockIoOpenDevice (Private);
|
||||||
|
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoError (
|
EmuBlockIoError (
|
||||||
IN EMU_BLOCK_IO_PRIVATE *Private
|
IN EMU_BLOCK_IO_PRIVATE *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
BOOLEAN ReinstallBlockIoFlag;
|
BOOLEAN ReinstallBlockIoFlag;
|
||||||
|
|
||||||
|
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
|
case EAGAIN:
|
||||||
|
Status = EFI_NO_MEDIA;
|
||||||
|
Private->Media->ReadOnly = FALSE;
|
||||||
|
Private->Media->MediaPresent = FALSE;
|
||||||
|
ReinstallBlockIoFlag = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
case EAGAIN:
|
case EACCES:
|
||||||
Status = EFI_NO_MEDIA;
|
Private->Media->ReadOnly = FALSE;
|
||||||
Private->Media->ReadOnly = FALSE;
|
Private->Media->MediaPresent = TRUE;
|
||||||
Private->Media->MediaPresent = FALSE;
|
Private->Media->MediaId += 1;
|
||||||
ReinstallBlockIoFlag = FALSE;
|
ReinstallBlockIoFlag = TRUE;
|
||||||
break;
|
Status = EFI_MEDIA_CHANGED;
|
||||||
|
break;
|
||||||
|
|
||||||
case EACCES:
|
case EROFS:
|
||||||
Private->Media->ReadOnly = FALSE;
|
Private->Media->ReadOnly = TRUE;
|
||||||
Private->Media->MediaPresent = TRUE;
|
ReinstallBlockIoFlag = FALSE;
|
||||||
Private->Media->MediaId += 1;
|
Status = EFI_WRITE_PROTECTED;
|
||||||
ReinstallBlockIoFlag = TRUE;
|
break;
|
||||||
Status = EFI_MEDIA_CHANGED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EROFS:
|
default:
|
||||||
Private->Media->ReadOnly = TRUE;
|
ReinstallBlockIoFlag = FALSE;
|
||||||
ReinstallBlockIoFlag = FALSE;
|
Status = EFI_DEVICE_ERROR;
|
||||||
Status = EFI_WRITE_PROTECTED;
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ReinstallBlockIoFlag = FALSE;
|
|
||||||
Status = EFI_DEVICE_ERROR;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoReadWriteCommon (
|
EmuBlockIoReadWriteCommon (
|
||||||
IN EMU_BLOCK_IO_PRIVATE *Private,
|
IN EMU_BLOCK_IO_PRIVATE *Private,
|
||||||
IN UINT32 MediaId,
|
IN UINT32 MediaId,
|
||||||
IN EFI_LBA Lba,
|
IN EFI_LBA Lba,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer,
|
IN VOID *Buffer,
|
||||||
IN CHAR8 *CallerName
|
IN CHAR8 *CallerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -290,7 +280,7 @@ EmuBlockIoReadWriteCommon (
|
|||||||
return EFI_MEDIA_CHANGED;
|
return EFI_MEDIA_CHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((UINTN) Buffer % Private->Media->IoAlign != 0) {
|
if ((UINTN)Buffer % Private->Media->IoAlign != 0) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -313,11 +303,12 @@ EmuBlockIoReadWriteCommon (
|
|||||||
DEBUG ((DEBUG_INIT, "ReadBlocks: Attempted to read off end of device\n"));
|
DEBUG ((DEBUG_INIT, "ReadBlocks: Attempted to read off end of device\n"));
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Seek to End of File
|
// Seek to End of File
|
||||||
//
|
//
|
||||||
DistanceToMove = MultU64x32 (Lba, BlockSize);
|
DistanceToMove = MultU64x32 (Lba, BlockSize);
|
||||||
Status = SetFilePointer64 (Private, DistanceToMove, &DistanceMoved, SEEK_SET);
|
Status = SetFilePointer64 (Private, DistanceToMove, &DistanceMoved, SEEK_SET);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_INIT, "WriteBlocks: SetFilePointer failed\n"));
|
DEBUG ((DEBUG_INIT, "WriteBlocks: SetFilePointer failed\n"));
|
||||||
@ -327,7 +318,6 @@ EmuBlockIoReadWriteCommon (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Read BufferSize bytes from Lba into Buffer.
|
Read BufferSize bytes from Lba into Buffer.
|
||||||
|
|
||||||
@ -368,16 +358,16 @@ EmuBlockIoReadBlocks (
|
|||||||
IN EFI_LBA LBA,
|
IN EFI_LBA LBA,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
Status = EmuBlockIoReadWriteCommon (Private, MediaId, LBA, BufferSize, Buffer, "UnixReadBlocks");
|
Status = EmuBlockIoReadWriteCommon (Private, MediaId, LBA, BufferSize, Buffer, "UnixReadBlocks");
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
@ -393,7 +383,7 @@ EmuBlockIoReadBlocks (
|
|||||||
// If we read then media is present.
|
// If we read then media is present.
|
||||||
//
|
//
|
||||||
Private->Media->MediaPresent = TRUE;
|
Private->Media->MediaPresent = TRUE;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
Done:
|
Done:
|
||||||
if (Token != NULL) {
|
if (Token != NULL) {
|
||||||
@ -403,10 +393,10 @@ Done:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Write BufferSize bytes from Lba into Buffer.
|
Write BufferSize bytes from Lba into Buffer.
|
||||||
|
|
||||||
@ -448,14 +438,13 @@ EmuBlockIoWriteBlocks (
|
|||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
Status = EmuBlockIoReadWriteCommon (Private, MediaId, LBA, BufferSize, Buffer, "UnixWriteBlocks");
|
Status = EmuBlockIoReadWriteCommon (Private, MediaId, LBA, BufferSize, Buffer, "UnixWriteBlocks");
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
@ -472,7 +461,7 @@ EmuBlockIoWriteBlocks (
|
|||||||
//
|
//
|
||||||
Private->Media->MediaPresent = TRUE;
|
Private->Media->MediaPresent = TRUE;
|
||||||
Private->Media->ReadOnly = FALSE;
|
Private->Media->ReadOnly = FALSE;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
Done:
|
Done:
|
||||||
if (Token != NULL) {
|
if (Token != NULL) {
|
||||||
@ -486,7 +475,6 @@ Done:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Flush the Block Device.
|
Flush the Block Device.
|
||||||
|
|
||||||
@ -511,22 +499,21 @@ Done:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoFlushBlocks (
|
EmuBlockIoFlushBlocks (
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
if (Private->fd >= 0) {
|
if (Private->fd >= 0) {
|
||||||
fsync (Private->fd);
|
fsync (Private->fd);
|
||||||
#if __APPLE__
|
#if __APPLE__
|
||||||
fcntl (Private->fd, F_FULLFSYNC);
|
fcntl (Private->fd, F_FULLFSYNC);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (Token != NULL) {
|
if (Token != NULL) {
|
||||||
if (Token->Event != NULL) {
|
if (Token->Event != NULL) {
|
||||||
// Caller is responsible for signaling EFI Event
|
// Caller is responsible for signaling EFI Event
|
||||||
@ -538,7 +525,6 @@ EmuBlockIoFlushBlocks (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reset the block device hardware.
|
Reset the block device hardware.
|
||||||
|
|
||||||
@ -554,11 +540,11 @@ EmuBlockIoFlushBlocks (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoReset (
|
EmuBlockIoReset (
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -570,17 +556,16 @@ EmuBlockIoReset (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
StdDupUnicodeToAscii (
|
StdDupUnicodeToAscii (
|
||||||
IN CHAR16 *Str
|
IN CHAR16 *Str
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
char *Ascii;
|
char *Ascii;
|
||||||
char *Ptr;
|
char *Ptr;
|
||||||
|
|
||||||
Size = StrLen (Str) + 1;
|
Size = StrLen (Str) + 1;
|
||||||
Ascii = malloc (Size);
|
Ascii = malloc (Size);
|
||||||
if (Ascii == NULL) {
|
if (Ascii == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -589,13 +574,13 @@ StdDupUnicodeToAscii (
|
|||||||
for (Ptr = Ascii; *Str != '\0'; Ptr++, Str++) {
|
for (Ptr = Ascii; *Str != '\0'; Ptr++, Str++) {
|
||||||
*Ptr = *Str;
|
*Ptr = *Str;
|
||||||
}
|
}
|
||||||
|
|
||||||
*Ptr = 0;
|
*Ptr = 0;
|
||||||
|
|
||||||
return Ascii;
|
return Ascii;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
|
||||||
EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
|
|
||||||
GasketEmuBlockIoReset,
|
GasketEmuBlockIoReset,
|
||||||
GasketEmuBlockIoReadBlocks,
|
GasketEmuBlockIoReadBlocks,
|
||||||
GasketEmuBlockIoWriteBlocks,
|
GasketEmuBlockIoWriteBlocks,
|
||||||
@ -605,7 +590,7 @@ EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoThunkOpen (
|
EmuBlockIoThunkOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
@ -624,7 +609,6 @@ EmuBlockIoThunkOpen (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Private->Signature = EMU_BLOCK_IO_PRIVATE_SIGNATURE;
|
Private->Signature = EMU_BLOCK_IO_PRIVATE_SIGNATURE;
|
||||||
Private->Thunk = This;
|
Private->Thunk = This;
|
||||||
CopyMem (&Private->EmuBlockIo, &gEmuBlockIoProtocol, sizeof (gEmuBlockIoProtocol));
|
CopyMem (&Private->EmuBlockIo, &gEmuBlockIoProtocol, sizeof (gEmuBlockIoProtocol));
|
||||||
@ -642,12 +626,14 @@ EmuBlockIoThunkOpen (
|
|||||||
Private->WriteProtected = FALSE;
|
Private->WriteProtected = FALSE;
|
||||||
} else {
|
} else {
|
||||||
for (*Str++ = '\0'; *Str != 0; Str++) {
|
for (*Str++ = '\0'; *Str != 0; Str++) {
|
||||||
if (*Str == 'R' || *Str == 'F') {
|
if ((*Str == 'R') || (*Str == 'F')) {
|
||||||
Private->RemovableMedia = (BOOLEAN) (*Str == 'R');
|
Private->RemovableMedia = (BOOLEAN)(*Str == 'R');
|
||||||
}
|
}
|
||||||
if (*Str == 'O' || *Str == 'W') {
|
|
||||||
Private->WriteProtected = (BOOLEAN) (*Str == 'O');
|
if ((*Str == 'O') || (*Str == 'W')) {
|
||||||
|
Private->WriteProtected = (BOOLEAN)(*Str == 'O');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*Str == ':') {
|
if (*Str == ':') {
|
||||||
Private->BlockSize = strtol (++Str, NULL, 0);
|
Private->BlockSize = strtol (++Str, NULL, 0);
|
||||||
break;
|
break;
|
||||||
@ -662,10 +648,9 @@ EmuBlockIoThunkOpen (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuBlockIoThunkClose (
|
EmuBlockIoThunkClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_BLOCK_IO_PRIVATE *Private;
|
EMU_BLOCK_IO_PRIVATE *Private;
|
||||||
@ -680,6 +665,7 @@ EmuBlockIoThunkClose (
|
|||||||
if (Private->Filename != NULL) {
|
if (Private->Filename != NULL) {
|
||||||
free (Private->Filename);
|
free (Private->Filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
free (This->Private);
|
free (This->Private);
|
||||||
This->Private = NULL;
|
This->Private = NULL;
|
||||||
}
|
}
|
||||||
@ -687,9 +673,7 @@ EmuBlockIoThunkClose (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo = {
|
||||||
|
|
||||||
EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo = {
|
|
||||||
&gEmuBlockIoProtocolGuid,
|
&gEmuBlockIoProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -18,43 +18,41 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#define DebugAssert _Mangle__DebugAssert
|
#define DebugAssert _Mangle__DebugAssert
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <CoreServices/CoreServices.h>
|
#include <CoreServices/CoreServices.h>
|
||||||
#include <mach/mach.h>
|
#include <mach/mach.h>
|
||||||
#include <mach/mach_time.h>
|
#include <mach/mach_time.h>
|
||||||
|
|
||||||
#undef DebugAssert
|
#undef DebugAssert
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int settimer_initialized;
|
int settimer_initialized;
|
||||||
struct timeval settimer_timeval;
|
struct timeval settimer_timeval;
|
||||||
UINTN settimer_callback = 0;
|
UINTN settimer_callback = 0;
|
||||||
|
|
||||||
BOOLEAN gEmulatorInterruptEnabled = FALSE;
|
|
||||||
|
|
||||||
|
BOOLEAN gEmulatorInterruptEnabled = FALSE;
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
SecWriteStdErr (
|
SecWriteStdErr (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ssize_t Return;
|
ssize_t Return;
|
||||||
|
|
||||||
Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
|
Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
|
||||||
|
|
||||||
return (Return == -1) ? 0 : Return;
|
return (Return == -1) ? 0 : Return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SecConfigStdIn (
|
SecConfigStdIn (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct termios tty;
|
struct termios tty;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Need to turn off line buffering, ECHO, and make it unbuffered.
|
// Need to turn off line buffering, ECHO, and make it unbuffered.
|
||||||
@ -63,7 +61,7 @@ SecConfigStdIn (
|
|||||||
tty.c_lflag &= ~(ICANON | ECHO);
|
tty.c_lflag &= ~(ICANON | ECHO);
|
||||||
tcsetattr (STDIN_FILENO, TCSANOW, &tty);
|
tcsetattr (STDIN_FILENO, TCSANOW, &tty);
|
||||||
|
|
||||||
// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
|
// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
|
||||||
|
|
||||||
// now ioctl FIONREAD will do what we need
|
// now ioctl FIONREAD will do what we need
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -71,11 +69,11 @@ SecConfigStdIn (
|
|||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
SecWriteStdOut (
|
SecWriteStdOut (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ssize_t Return;
|
ssize_t Return;
|
||||||
|
|
||||||
Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
|
Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
|
||||||
|
|
||||||
@ -84,11 +82,11 @@ SecWriteStdOut (
|
|||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
SecReadStdIn (
|
SecReadStdIn (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ssize_t Return;
|
ssize_t Return;
|
||||||
|
|
||||||
Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
|
Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
|
||||||
|
|
||||||
@ -100,8 +98,8 @@ SecPollStdIn (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int Result;
|
int Result;
|
||||||
int Bytes;
|
int Bytes;
|
||||||
|
|
||||||
Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
|
Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
|
||||||
if (Result == -1) {
|
if (Result == -1) {
|
||||||
@ -111,10 +109,9 @@ SecPollStdIn (
|
|||||||
return (BOOLEAN)(Bytes > 0);
|
return (BOOLEAN)(Bytes > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID *
|
VOID *
|
||||||
SecMalloc (
|
SecMalloc (
|
||||||
IN UINTN Size
|
IN UINTN Size
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return malloc ((size_t)Size);
|
return malloc ((size_t)Size);
|
||||||
@ -122,7 +119,7 @@ SecMalloc (
|
|||||||
|
|
||||||
VOID *
|
VOID *
|
||||||
SecValloc (
|
SecValloc (
|
||||||
IN UINTN Size
|
IN UINTN Size
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return valloc ((size_t)Size);
|
return valloc ((size_t)Size);
|
||||||
@ -130,7 +127,7 @@ SecValloc (
|
|||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
SecFree (
|
SecFree (
|
||||||
IN VOID *Ptr
|
IN VOID *Ptr
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (EfiSystemMemoryRange (Ptr)) {
|
if (EfiSystemMemoryRange (Ptr)) {
|
||||||
@ -143,17 +140,18 @@ SecFree (
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
settimer_handler (int sig)
|
settimer_handler (
|
||||||
|
int sig
|
||||||
|
)
|
||||||
{
|
{
|
||||||
struct timeval timeval;
|
struct timeval timeval;
|
||||||
UINT64 delta;
|
UINT64 delta;
|
||||||
|
|
||||||
gettimeofday (&timeval, NULL);
|
gettimeofday (&timeval, NULL);
|
||||||
delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
|
delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
|
||||||
- ((UINT64)settimer_timeval.tv_sec * 1000)
|
- ((UINT64)settimer_timeval.tv_sec * 1000)
|
||||||
- (settimer_timeval.tv_usec / 1000);
|
- (settimer_timeval.tv_usec / 1000);
|
||||||
settimer_timeval = timeval;
|
settimer_timeval = timeval;
|
||||||
|
|
||||||
if (settimer_callback) {
|
if (settimer_callback) {
|
||||||
@ -167,37 +165,39 @@ SecSetTimer (
|
|||||||
IN EMU_SET_TIMER_CALLBACK CallBack
|
IN EMU_SET_TIMER_CALLBACK CallBack
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct itimerval timerval;
|
struct itimerval timerval;
|
||||||
UINT32 remainder;
|
UINT32 remainder;
|
||||||
|
|
||||||
if (!settimer_initialized) {
|
if (!settimer_initialized) {
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
|
|
||||||
settimer_initialized = 1;
|
settimer_initialized = 1;
|
||||||
act.sa_handler = settimer_handler;
|
act.sa_handler = settimer_handler;
|
||||||
act.sa_flags = 0;
|
act.sa_flags = 0;
|
||||||
sigemptyset (&act.sa_mask);
|
sigemptyset (&act.sa_mask);
|
||||||
gEmulatorInterruptEnabled = TRUE;
|
gEmulatorInterruptEnabled = TRUE;
|
||||||
if (sigaction (SIGALRM, &act, NULL) != 0) {
|
if (sigaction (SIGALRM, &act, NULL) != 0) {
|
||||||
printf ("SetTimer: sigaction error %s\n", strerror (errno));
|
printf ("SetTimer: sigaction error %s\n", strerror (errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gettimeofday (&settimer_timeval, NULL) != 0) {
|
if (gettimeofday (&settimer_timeval, NULL) != 0) {
|
||||||
printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
|
printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
|
|
||||||
DivU64x32Remainder(PeriodMs, 1000, &remainder);
|
timerval.it_value.tv_sec = DivU64x32 (PeriodMs, 1000);
|
||||||
|
DivU64x32Remainder (PeriodMs, 1000, &remainder);
|
||||||
timerval.it_value.tv_usec = remainder * 1000;
|
timerval.it_value.tv_usec = remainder * 1000;
|
||||||
timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
|
timerval.it_value.tv_sec = DivU64x32 (PeriodMs, 1000);
|
||||||
timerval.it_interval = timerval.it_value;
|
timerval.it_interval = timerval.it_value;
|
||||||
|
|
||||||
if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
|
if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
|
||||||
printf ("SetTimer: setitimer error %s\n", strerror (errno));
|
printf ("SetTimer: setitimer error %s\n", strerror (errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
settimer_callback = (UINTN)CallBack;
|
settimer_callback = (UINTN)CallBack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecEnableInterrupt (
|
SecEnableInterrupt (
|
||||||
VOID
|
VOID
|
||||||
@ -213,7 +213,6 @@ SecEnableInterrupt (
|
|||||||
pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
|
pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecDisableInterrupt (
|
SecDisableInterrupt (
|
||||||
VOID
|
VOID
|
||||||
@ -229,14 +228,14 @@ SecDisableInterrupt (
|
|||||||
gEmulatorInterruptEnabled = FALSE;
|
gEmulatorInterruptEnabled = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
SecInterruptEanbled (void)
|
SecInterruptEanbled (
|
||||||
|
void
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return gEmulatorInterruptEnabled;
|
return gEmulatorInterruptEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UINT64
|
UINT64
|
||||||
QueryPerformanceFrequency (
|
QueryPerformanceFrequency (
|
||||||
VOID
|
VOID
|
||||||
@ -251,10 +250,9 @@ QueryPerformanceCounter (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
#if __APPLE__
|
#if __APPLE__
|
||||||
UINT64 Start;
|
UINT64 Start;
|
||||||
static mach_timebase_info_data_t sTimebaseInfo;
|
static mach_timebase_info_data_t sTimebaseInfo;
|
||||||
|
|
||||||
|
|
||||||
Start = mach_absolute_time ();
|
Start = mach_absolute_time ();
|
||||||
|
|
||||||
@ -266,29 +264,27 @@ QueryPerformanceCounter (
|
|||||||
// denominator is a fraction.
|
// denominator is a fraction.
|
||||||
|
|
||||||
if ( sTimebaseInfo.denom == 0 ) {
|
if ( sTimebaseInfo.denom == 0 ) {
|
||||||
(void) mach_timebase_info(&sTimebaseInfo);
|
(void)mach_timebase_info (&sTimebaseInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do the maths. We hope that the multiplication doesn't
|
// Do the maths. We hope that the multiplication doesn't
|
||||||
// overflow; the price you pay for working in fixed point.
|
// overflow; the price you pay for working in fixed point.
|
||||||
|
|
||||||
return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
|
return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
|
||||||
#else
|
#else
|
||||||
// Need to figure out what to do for Linux?
|
// Need to figure out what to do for Linux?
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecSleep (
|
SecSleep (
|
||||||
IN UINT64 Nanoseconds
|
IN UINT64 Nanoseconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct timespec rq, rm;
|
struct timespec rq, rm;
|
||||||
struct timeval start, end;
|
struct timeval start, end;
|
||||||
unsigned long MicroSec;
|
unsigned long MicroSec;
|
||||||
|
|
||||||
rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
|
rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
|
||||||
rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
|
rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
|
||||||
@ -299,7 +295,7 @@ SecSleep (
|
|||||||
//
|
//
|
||||||
gettimeofday (&start, NULL);
|
gettimeofday (&start, NULL);
|
||||||
end.tv_sec = start.tv_sec + rq.tv_sec;
|
end.tv_sec = start.tv_sec + rq.tv_sec;
|
||||||
MicroSec = (start.tv_usec + rq.tv_nsec/1000);
|
MicroSec = (start.tv_usec + rq.tv_nsec/1000);
|
||||||
end.tv_usec = MicroSec % 1000000;
|
end.tv_usec = MicroSec % 1000000;
|
||||||
if (MicroSec > 1000000) {
|
if (MicroSec > 1000000) {
|
||||||
end.tv_sec++;
|
end.tv_sec++;
|
||||||
@ -309,23 +305,26 @@ SecSleep (
|
|||||||
if (errno != EINTR) {
|
if (errno != EINTR) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
gettimeofday (&start, NULL);
|
gettimeofday (&start, NULL);
|
||||||
if (start.tv_sec > end.tv_sec) {
|
if (start.tv_sec > end.tv_sec) {
|
||||||
break;
|
break;
|
||||||
} if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
|
}
|
||||||
|
|
||||||
|
if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rq = rm;
|
rq = rm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecCpuSleep (
|
SecCpuSleep (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct timespec rq, rm;
|
struct timespec rq, rm;
|
||||||
|
|
||||||
// nanosleep gets interrupted by the timer tic
|
// nanosleep gets interrupted by the timer tic
|
||||||
rq.tv_sec = 1;
|
rq.tv_sec = 1;
|
||||||
@ -334,51 +333,47 @@ SecCpuSleep (
|
|||||||
nanosleep (&rq, &rm);
|
nanosleep (&rq, &rm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecExit (
|
SecExit (
|
||||||
UINTN Status
|
UINTN Status
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
exit (Status);
|
exit (Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecGetTime (
|
SecGetTime (
|
||||||
OUT EFI_TIME *Time,
|
OUT EFI_TIME *Time,
|
||||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
time_t t;
|
time_t t;
|
||||||
|
|
||||||
t = time (NULL);
|
t = time (NULL);
|
||||||
tm = localtime (&t);
|
tm = localtime (&t);
|
||||||
|
|
||||||
Time->Year = 1900 + tm->tm_year;
|
Time->Year = 1900 + tm->tm_year;
|
||||||
Time->Month = tm->tm_mon + 1;
|
Time->Month = tm->tm_mon + 1;
|
||||||
Time->Day = tm->tm_mday;
|
Time->Day = tm->tm_mday;
|
||||||
Time->Hour = tm->tm_hour;
|
Time->Hour = tm->tm_hour;
|
||||||
Time->Minute = tm->tm_min;
|
Time->Minute = tm->tm_min;
|
||||||
Time->Second = tm->tm_sec;
|
Time->Second = tm->tm_sec;
|
||||||
Time->Nanosecond = 0;
|
Time->Nanosecond = 0;
|
||||||
Time->TimeZone = timezone / 60;
|
Time->TimeZone = timezone / 60;
|
||||||
Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
|
Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
|
||||||
| (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
|
| (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
|
||||||
|
|
||||||
if (Capabilities != NULL) {
|
if (Capabilities != NULL) {
|
||||||
Capabilities->Resolution = 1;
|
Capabilities->Resolution = 1;
|
||||||
Capabilities->Accuracy = 50000000;
|
Capabilities->Accuracy = 50000000;
|
||||||
Capabilities->SetsToZero = FALSE;
|
Capabilities->SetsToZero = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecSetTime (
|
SecSetTime (
|
||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Don't change the time on the system
|
// Don't change the time on the system
|
||||||
@ -386,18 +381,16 @@ SecSetTime (
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SecGetNextProtocol (
|
SecGetNextProtocol (
|
||||||
IN BOOLEAN EmuBusDriver,
|
IN BOOLEAN EmuBusDriver,
|
||||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return GetNextThunkProtocol (EmuBusDriver, Instance);
|
return GetNextThunkProtocol (EmuBusDriver, Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
|
||||||
EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
|
|
||||||
GasketSecWriteStdErr,
|
GasketSecWriteStdErr,
|
||||||
GasketSecConfigStdIn,
|
GasketSecConfigStdIn,
|
||||||
GasketSecWriteStdOut,
|
GasketSecWriteStdOut,
|
||||||
@ -422,7 +415,6 @@ EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
|
|||||||
GasketSecGetNextProtocol
|
GasketSecGetNextProtocol
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecInitThunkProtocol (
|
SecInitThunkProtocol (
|
||||||
VOID
|
VOID
|
||||||
@ -431,4 +423,3 @@ SecInitThunkProtocol (
|
|||||||
// timezone and daylight lib globals depend on tzset be called 1st.
|
// timezone and daylight lib globals depend on tzset be called 1st.
|
||||||
tzset ();
|
tzset ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecWriteStdErr (
|
GasketSecWriteStdErr (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -30,15 +30,15 @@ GasketSecConfigStdIn (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecWriteStdOut (
|
GasketSecWriteStdOut (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
);
|
);
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecReadStdIn (
|
GasketSecReadStdIn (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINTN NumberOfBytes
|
IN UINTN NumberOfBytes
|
||||||
);
|
);
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
@ -50,22 +50,21 @@ GasketSecPollStdIn (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecMalloc (
|
GasketSecMalloc (
|
||||||
IN UINTN Size
|
IN UINTN Size
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecValloc (
|
GasketSecValloc (
|
||||||
IN UINTN Size
|
IN UINTN Size
|
||||||
);
|
);
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecFree (
|
GasketSecFree (
|
||||||
IN VOID *Ptr
|
IN VOID *Ptr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecPeCoffGetEntryPoint (
|
GasketSecPeCoffGetEntryPoint (
|
||||||
@ -116,11 +115,10 @@ GasketQueryPerformanceCounter (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecSleep (
|
GasketSecSleep (
|
||||||
IN UINT64 Nanoseconds
|
IN UINT64 Nanoseconds
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
@ -132,33 +130,31 @@ GasketSecCpuSleep (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecExit (
|
GasketSecExit (
|
||||||
UINTN Status
|
UINTN Status
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecGetTime (
|
GasketSecGetTime (
|
||||||
OUT EFI_TIME *Time,
|
OUT EFI_TIME *Time,
|
||||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecSetTime (
|
GasketSecSetTime (
|
||||||
IN EFI_TIME *Time
|
IN EFI_TIME *Time
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecGetNextProtocol (
|
GasketSecGetNextProtocol (
|
||||||
IN BOOLEAN EmuBusDriver,
|
IN BOOLEAN EmuBusDriver,
|
||||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// PPIs produced by SEC
|
// PPIs produced by SEC
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecUnixPeiAutoScan (
|
GasketSecUnixPeiAutoScan (
|
||||||
@ -173,7 +169,6 @@ GasketSecEmuThunkAddress (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecUnixUnixFwhAddress (
|
GasketSecUnixUnixFwhAddress (
|
||||||
@ -181,55 +176,52 @@ GasketSecUnixUnixFwhAddress (
|
|||||||
IN OUT EFI_PHYSICAL_ADDRESS *FwhBase
|
IN OUT EFI_PHYSICAL_ADDRESS *FwhBase
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Reverse (UNIX to EFIAPI) gaskets
|
// Reverse (UNIX to EFIAPI) gaskets
|
||||||
//
|
//
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
void
|
void
|
||||||
(EFIAPI *CALL_BACK) (
|
(EFIAPI *CALL_BACK)(
|
||||||
UINT64 Delta
|
UINT64 Delta
|
||||||
);
|
);
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
ReverseGasketUint64 (
|
ReverseGasketUint64 (
|
||||||
UINTN CallBack,
|
UINTN CallBack,
|
||||||
UINT64 a
|
UINT64 a
|
||||||
);
|
);
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
ReverseGasketUint64Uint64 (
|
ReverseGasketUint64Uint64 (
|
||||||
VOID *CallBack,
|
VOID *CallBack,
|
||||||
VOID *Context,
|
VOID *Context,
|
||||||
VOID *Key
|
VOID *Key
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
|
// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11Size (
|
GasketX11Size (
|
||||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||||
UINT32 Width,
|
UINT32 Width,
|
||||||
UINT32 Height
|
UINT32 Height
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11CheckKey (
|
GasketX11CheckKey (
|
||||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
|
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11GetKey (
|
GasketX11GetKey (
|
||||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||||
EFI_KEY_DATA *key
|
EFI_KEY_DATA *key
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -242,45 +234,44 @@ GasketX11KeySetState (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11RegisterKeyNotify (
|
GasketX11RegisterKeyNotify (
|
||||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
|
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
|
||||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
|
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11Blt (
|
GasketX11Blt (
|
||||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||||
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
|
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
|
||||||
IN EFI_UGA_BLT_OPERATION BltOperation,
|
IN EFI_UGA_BLT_OPERATION BltOperation,
|
||||||
IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
|
IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11CheckPointer (
|
GasketX11CheckPointer (
|
||||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
|
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11GetPointerState (
|
GasketX11GetPointerState (
|
||||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||||
EFI_SIMPLE_POINTER_STATE *state
|
EFI_SIMPLE_POINTER_STATE *state
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11GraphicsWindowOpen (
|
GasketX11GraphicsWindowOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketX11GraphicsWindowClose (
|
GasketX11GraphicsWindowClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
// Pthreads
|
// Pthreads
|
||||||
@ -288,55 +279,48 @@ GasketX11GraphicsWindowClose (
|
|||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadMutexLock (
|
GasketPthreadMutexLock (
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadMutexUnLock (
|
GasketPthreadMutexUnLock (
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadMutexTryLock (
|
GasketPthreadMutexTryLock (
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadMutexInit (
|
GasketPthreadMutexInit (
|
||||||
IN VOID
|
IN VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadMutexDestroy (
|
GasketPthreadMutexDestroy (
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadCreate (
|
GasketPthreadCreate (
|
||||||
IN VOID *Thread,
|
IN VOID *Thread,
|
||||||
IN VOID *Attribute,
|
IN VOID *Attribute,
|
||||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadExit (
|
GasketPthreadExit (
|
||||||
IN VOID *ValuePtr
|
IN VOID *ValuePtr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadSelf (
|
GasketPthreadSelf (
|
||||||
@ -346,33 +330,32 @@ GasketPthreadSelf (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadOpen (
|
GasketPthreadOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPthreadClose (
|
GasketPthreadClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// PosixFileSystem
|
// PosixFileSystem
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixOpenVolume (
|
GasketPosixOpenVolume (
|
||||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
||||||
OUT EFI_FILE_PROTOCOL **Root
|
OUT EFI_FILE_PROTOCOL **Root
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileOpen (
|
GasketPosixFileOpen (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
OUT EFI_FILE_PROTOCOL **NewHandle,
|
OUT EFI_FILE_PROTOCOL **NewHandle,
|
||||||
IN CHAR16 *FileName,
|
IN CHAR16 *FileName,
|
||||||
IN UINT64 OpenMode,
|
IN UINT64 OpenMode,
|
||||||
IN UINT64 Attributes
|
IN UINT64 Attributes
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -390,49 +373,49 @@ GasketPosixFileDelete (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileRead (
|
GasketPosixFileRead (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileWrite (
|
GasketPosixFileWrite (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileSetPossition (
|
GasketPosixFileSetPossition (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
IN UINT64 Position
|
IN UINT64 Position
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileGetPossition (
|
GasketPosixFileGetPossition (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
OUT UINT64 *Position
|
OUT UINT64 *Position
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileGetInfo (
|
GasketPosixFileGetInfo (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
IN EFI_GUID *InformationType,
|
IN EFI_GUID *InformationType,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileSetInfo (
|
GasketPosixFileSetInfo (
|
||||||
IN EFI_FILE_PROTOCOL *This,
|
IN EFI_FILE_PROTOCOL *This,
|
||||||
IN EFI_GUID *InformationType,
|
IN EFI_GUID *InformationType,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -444,20 +427,20 @@ GasketPosixFileFlush (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileSystmeThunkOpen (
|
GasketPosixFileSystmeThunkOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketPosixFileSystmeThunkClose (
|
GasketPosixFileSystmeThunkClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketEmuBlockIoReset (
|
GasketEmuBlockIoReset (
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -468,7 +451,7 @@ GasketEmuBlockIoReadBlocks (
|
|||||||
IN EFI_LBA LBA,
|
IN EFI_LBA LBA,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -485,39 +468,39 @@ GasketEmuBlockIoWriteBlocks (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketEmuBlockIoFlushBlocks (
|
GasketEmuBlockIoFlushBlocks (
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketEmuBlockIoCreateMapping (
|
GasketEmuBlockIoCreateMapping (
|
||||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||||
IN EFI_BLOCK_IO_MEDIA *Media
|
IN EFI_BLOCK_IO_MEDIA *Media
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketBlockIoThunkOpen (
|
GasketBlockIoThunkOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketBlockIoThunkClose (
|
GasketBlockIoThunkClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpThunkOpen (
|
GasketSnpThunkOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpThunkClose (
|
GasketSnpThunkClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -542,16 +525,16 @@ GasketSnpStop (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpInitialize (
|
GasketSnpInitialize (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpReset (
|
GasketSnpReset (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -563,83 +546,80 @@ GasketSnpShutdown (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpReceiveFilters (
|
GasketSnpReceiveFilters (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINT32 Enable,
|
IN UINT32 Enable,
|
||||||
IN UINT32 Disable,
|
IN UINT32 Disable,
|
||||||
IN BOOLEAN ResetMCastFilter,
|
IN BOOLEAN ResetMCastFilter,
|
||||||
IN UINTN MCastFilterCnt OPTIONAL,
|
IN UINTN MCastFilterCnt OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpStationAddress (
|
GasketSnpStationAddress (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpStatistics (
|
GasketSnpStatistics (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpMCastIpToMac (
|
GasketSnpMCastIpToMac (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN IPv6,
|
IN BOOLEAN IPv6,
|
||||||
IN EFI_IP_ADDRESS *IP,
|
IN EFI_IP_ADDRESS *IP,
|
||||||
OUT EFI_MAC_ADDRESS *MAC
|
OUT EFI_MAC_ADDRESS *MAC
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpNvData (
|
GasketSnpNvData (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN ReadWrite,
|
IN BOOLEAN ReadWrite,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN OUT VOID *Buffer
|
IN OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpGetStatus (
|
GasketSnpGetStatus (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||||
OUT VOID **TxBuf OPTIONAL
|
OUT VOID **TxBuf OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpTransmit (
|
GasketSnpTransmit (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINTN HeaderSize,
|
IN UINTN HeaderSize,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer,
|
IN VOID *Buffer,
|
||||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
IN UINT16 *Protocol OPTIONAL
|
IN UINT16 *Protocol OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSnpReceive (
|
GasketSnpReceive (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
OUT UINTN *HeaderSize OPTIONAL,
|
OUT UINTN *HeaderSize OPTIONAL,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT VOID *Buffer,
|
OUT VOID *Buffer,
|
||||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
OUT UINT16 *Protocol OPTIONAL
|
OUT UINT16 *Protocol OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,23 +9,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#define MAP_ANONYMOUS MAP_ANON
|
#define MAP_ANONYMOUS MAP_ANON
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Globals
|
// Globals
|
||||||
//
|
//
|
||||||
|
|
||||||
EMU_THUNK_PPI mSecEmuThunkPpi = {
|
EMU_THUNK_PPI mSecEmuThunkPpi = {
|
||||||
GasketSecUnixPeiAutoScan,
|
GasketSecUnixPeiAutoScan,
|
||||||
GasketSecUnixFdAddress,
|
GasketSecUnixFdAddress,
|
||||||
GasketSecEmuThunkAddress
|
GasketSecEmuThunkAddress
|
||||||
};
|
};
|
||||||
|
|
||||||
char *gGdbWorkingFileName = NULL;
|
char *gGdbWorkingFileName = NULL;
|
||||||
unsigned int mScriptSymbolChangesCount = 0;
|
unsigned int mScriptSymbolChangesCount = 0;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default information about where the FD is located.
|
// Default information about where the FD is located.
|
||||||
@ -34,8 +32,8 @@ unsigned int mScriptSymbolChangesCount = 0;
|
|||||||
// The number of array elements is allocated base on parsing
|
// The number of array elements is allocated base on parsing
|
||||||
// EFI_FIRMWARE_VOLUMES and the memory is never freed.
|
// EFI_FIRMWARE_VOLUMES and the memory is never freed.
|
||||||
//
|
//
|
||||||
UINTN gFdInfoCount = 0;
|
UINTN gFdInfoCount = 0;
|
||||||
EMU_FD_INFO *gFdInfo;
|
EMU_FD_INFO *gFdInfo;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Array that supports separate memory ranges.
|
// Array that supports separate memory ranges.
|
||||||
@ -46,16 +44,12 @@ EMU_FD_INFO *gFdInfo;
|
|||||||
UINTN gSystemMemoryCount = 0;
|
UINTN gSystemMemoryCount = 0;
|
||||||
EMU_SYSTEM_MEMORY *gSystemMemory;
|
EMU_SYSTEM_MEMORY *gSystemMemory;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
UINTN mImageContextModHandleArraySize = 0;
|
UINTN mImageContextModHandleArraySize = 0;
|
||||||
IMAGE_CONTEXT_TO_MOD_HANDLE *mImageContextModHandleArray = NULL;
|
IMAGE_CONTEXT_TO_MOD_HANDLE *mImageContextModHandleArray = NULL;
|
||||||
|
|
||||||
EFI_PEI_PPI_DESCRIPTOR *gPpiList;
|
EFI_PEI_PPI_DESCRIPTOR *gPpiList;
|
||||||
|
|
||||||
|
int gInXcode = 0;
|
||||||
int gInXcode = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
Breakpoint target for Xcode project. Set in the Xcode XML
|
Breakpoint target for Xcode project. Set in the Xcode XML
|
||||||
@ -71,8 +65,6 @@ SecGdbConfigBreak (
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -121,8 +113,8 @@ main (
|
|||||||
// If dlopen doesn't work, then we build a gdb script to allow the
|
// If dlopen doesn't work, then we build a gdb script to allow the
|
||||||
// symbols to be loaded.
|
// symbols to be loaded.
|
||||||
//
|
//
|
||||||
Index = strlen (*Argv);
|
Index = strlen (*Argv);
|
||||||
gGdbWorkingFileName = AllocatePool (Index + strlen(".gdb") + 1);
|
gGdbWorkingFileName = AllocatePool (Index + strlen (".gdb") + 1);
|
||||||
strcpy (gGdbWorkingFileName, *Argv);
|
strcpy (gGdbWorkingFileName, *Argv);
|
||||||
strcat (gGdbWorkingFileName, ".gdb");
|
strcat (gGdbWorkingFileName, ".gdb");
|
||||||
|
|
||||||
@ -139,8 +131,8 @@ main (
|
|||||||
setbuf (stdout, 0);
|
setbuf (stdout, 0);
|
||||||
setbuf (stderr, 0);
|
setbuf (stderr, 0);
|
||||||
|
|
||||||
MemorySizeStr = (CHAR16 *) PcdGetPtr (PcdEmuMemorySize);
|
MemorySizeStr = (CHAR16 *)PcdGetPtr (PcdEmuMemorySize);
|
||||||
FirmwareVolumesStr = (CHAR16 *) PcdGetPtr (PcdEmuFirmwareVolume);
|
FirmwareVolumesStr = (CHAR16 *)PcdGetPtr (PcdEmuFirmwareVolume);
|
||||||
|
|
||||||
//
|
//
|
||||||
// PPIs pased into PEI_CORE
|
// PPIs pased into PEI_CORE
|
||||||
@ -169,17 +161,18 @@ main (
|
|||||||
//
|
//
|
||||||
// Allocate space for gSystemMemory Array
|
// Allocate space for gSystemMemory Array
|
||||||
//
|
//
|
||||||
gSystemMemoryCount = CountSeparatorsInString (MemorySizeStr, '!') + 1;
|
gSystemMemoryCount = CountSeparatorsInString (MemorySizeStr, '!') + 1;
|
||||||
gSystemMemory = AllocateZeroPool (gSystemMemoryCount * sizeof (EMU_SYSTEM_MEMORY));
|
gSystemMemory = AllocateZeroPool (gSystemMemoryCount * sizeof (EMU_SYSTEM_MEMORY));
|
||||||
if (gSystemMemory == NULL) {
|
if (gSystemMemory == NULL) {
|
||||||
printf ("ERROR : Can not allocate memory for system. Exiting.\n");
|
printf ("ERROR : Can not allocate memory for system. Exiting.\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Allocate space for gSystemMemory Array
|
// Allocate space for gSystemMemory Array
|
||||||
//
|
//
|
||||||
gFdInfoCount = CountSeparatorsInString (FirmwareVolumesStr, '!') + 1;
|
gFdInfoCount = CountSeparatorsInString (FirmwareVolumesStr, '!') + 1;
|
||||||
gFdInfo = AllocateZeroPool (gFdInfoCount * sizeof (EMU_FD_INFO));
|
gFdInfo = AllocateZeroPool (gFdInfoCount * sizeof (EMU_FD_INFO));
|
||||||
if (gFdInfo == NULL) {
|
if (gFdInfo == NULL) {
|
||||||
printf ("ERROR : Can not allocate memory for fd info. Exiting.\n");
|
printf ("ERROR : Can not allocate memory for fd info. Exiting.\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
@ -192,31 +185,35 @@ main (
|
|||||||
// on a real platform this would be SRAM, or using the cache as RAM.
|
// on a real platform this would be SRAM, or using the cache as RAM.
|
||||||
// Set InitialStackMemory to zero so UnixOpenFile will allocate a new mapping
|
// Set InitialStackMemory to zero so UnixOpenFile will allocate a new mapping
|
||||||
//
|
//
|
||||||
InitialStackMemorySize = STACK_SIZE;
|
InitialStackMemorySize = STACK_SIZE;
|
||||||
InitialStackMemory = (UINTN)MapMemory (
|
InitialStackMemory = (UINTN)MapMemory (
|
||||||
0, (UINT32) InitialStackMemorySize,
|
0,
|
||||||
PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE
|
(UINT32)InitialStackMemorySize,
|
||||||
);
|
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||||
|
MAP_ANONYMOUS | MAP_PRIVATE
|
||||||
|
);
|
||||||
if (InitialStackMemory == 0) {
|
if (InitialStackMemory == 0) {
|
||||||
printf ("ERROR : Can not open SecStack Exiting\n");
|
printf ("ERROR : Can not open SecStack Exiting\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf (" OS Emulator passing in %u KB of temp RAM at 0x%08lx to SEC\n",
|
printf (
|
||||||
|
" OS Emulator passing in %u KB of temp RAM at 0x%08lx to SEC\n",
|
||||||
(unsigned int)(InitialStackMemorySize / 1024),
|
(unsigned int)(InitialStackMemorySize / 1024),
|
||||||
(unsigned long)InitialStackMemory
|
(unsigned long)InitialStackMemory
|
||||||
);
|
);
|
||||||
|
|
||||||
for (StackPointer = (UINTN*) (UINTN) InitialStackMemory;
|
for (StackPointer = (UINTN *)(UINTN)InitialStackMemory;
|
||||||
StackPointer < (UINTN*)(UINTN)((UINTN) InitialStackMemory + (UINT64) InitialStackMemorySize);
|
StackPointer < (UINTN *)(UINTN)((UINTN)InitialStackMemory + (UINT64)InitialStackMemorySize);
|
||||||
StackPointer ++) {
|
StackPointer++)
|
||||||
|
{
|
||||||
*StackPointer = 0x5AA55AA5;
|
*StackPointer = 0x5AA55AA5;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open All the firmware volumes and remember the info in the gFdInfo global
|
// Open All the firmware volumes and remember the info in the gFdInfo global
|
||||||
//
|
//
|
||||||
FileName = (CHAR8 *) AllocatePool (StrLen (FirmwareVolumesStr) + 1);
|
FileName = (CHAR8 *)AllocatePool (StrLen (FirmwareVolumesStr) + 1);
|
||||||
if (FileName == NULL) {
|
if (FileName == NULL) {
|
||||||
printf ("ERROR : Can not allocate memory for firmware volume string\n");
|
printf ("ERROR : Can not allocate memory for firmware volume string\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
@ -225,39 +222,43 @@ main (
|
|||||||
Index2 = 0;
|
Index2 = 0;
|
||||||
for (Done = FALSE, Index = 0, PeiIndex = 0, SecFile = NULL;
|
for (Done = FALSE, Index = 0, PeiIndex = 0, SecFile = NULL;
|
||||||
FirmwareVolumesStr[Index2] != 0;
|
FirmwareVolumesStr[Index2] != 0;
|
||||||
Index++) {
|
Index++)
|
||||||
|
{
|
||||||
for (Index1 = 0; (FirmwareVolumesStr[Index2] != '!') && (FirmwareVolumesStr[Index2] != 0); Index2++) {
|
for (Index1 = 0; (FirmwareVolumesStr[Index2] != '!') && (FirmwareVolumesStr[Index2] != 0); Index2++) {
|
||||||
FileName[Index1++] = FirmwareVolumesStr[Index2];
|
FileName[Index1++] = FirmwareVolumesStr[Index2];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FirmwareVolumesStr[Index2] == '!') {
|
if (FirmwareVolumesStr[Index2] == '!') {
|
||||||
Index2++;
|
Index2++;
|
||||||
}
|
}
|
||||||
FileName[Index1] = '\0';
|
|
||||||
|
FileName[Index1] = '\0';
|
||||||
|
|
||||||
if (Index == 0) {
|
if (Index == 0) {
|
||||||
// Map FV Recovery Read Only and other areas Read/Write
|
// Map FV Recovery Read Only and other areas Read/Write
|
||||||
Status = MapFd0 (
|
Status = MapFd0 (
|
||||||
FileName,
|
FileName,
|
||||||
&gFdInfo[0].Address,
|
&gFdInfo[0].Address,
|
||||||
&gFdInfo[0].Size
|
&gFdInfo[0].Size
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// Open the FD and remember where it got mapped into our processes address space
|
// Open the FD and remember where it got mapped into our processes address space
|
||||||
// Maps Read Only
|
// Maps Read Only
|
||||||
//
|
//
|
||||||
Status = MapFile (
|
Status = MapFile (
|
||||||
FileName,
|
FileName,
|
||||||
&gFdInfo[Index].Address,
|
&gFdInfo[Index].Address,
|
||||||
&gFdInfo[Index].Size
|
&gFdInfo[Index].Size
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
printf ("ERROR : Can not open Firmware Device File %s (%x). Exiting.\n", FileName, (unsigned int)Status);
|
printf ("ERROR : Can not open Firmware Device File %s (%x). Exiting.\n", FileName, (unsigned int)Status);
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf (" FD loaded from %s at 0x%08lx",FileName, (unsigned long)gFdInfo[Index].Address);
|
printf (" FD loaded from %s at 0x%08lx", FileName, (unsigned long)gFdInfo[Index].Address);
|
||||||
|
|
||||||
if (SecFile == NULL) {
|
if (SecFile == NULL) {
|
||||||
//
|
//
|
||||||
@ -265,11 +266,11 @@ main (
|
|||||||
// Load the first one we find.
|
// Load the first one we find.
|
||||||
//
|
//
|
||||||
FileHandle = NULL;
|
FileHandle = NULL;
|
||||||
Status = PeiServicesFfsFindNextFile (
|
Status = PeiServicesFfsFindNextFile (
|
||||||
EFI_FV_FILETYPE_SECURITY_CORE,
|
EFI_FV_FILETYPE_SECURITY_CORE,
|
||||||
(EFI_PEI_FV_HANDLE)(UINTN)gFdInfo[Index].Address,
|
(EFI_PEI_FV_HANDLE)(UINTN)gFdInfo[Index].Address,
|
||||||
&FileHandle
|
&FileHandle
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SecFile);
|
Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SecFile);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
@ -293,9 +294,9 @@ main (
|
|||||||
// map this memory into the SEC process memory space.
|
// map this memory into the SEC process memory space.
|
||||||
//
|
//
|
||||||
Index1 = 0;
|
Index1 = 0;
|
||||||
Index = 0;
|
Index = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
UINTN val = 0;
|
UINTN val = 0;
|
||||||
//
|
//
|
||||||
// Save the size of the memory.
|
// Save the size of the memory.
|
||||||
//
|
//
|
||||||
@ -303,10 +304,12 @@ main (
|
|||||||
val = val * 10 + MemorySizeStr[Index1] - '0';
|
val = val * 10 + MemorySizeStr[Index1] - '0';
|
||||||
Index1++;
|
Index1++;
|
||||||
}
|
}
|
||||||
|
|
||||||
gSystemMemory[Index++].Size = val * 0x100000;
|
gSystemMemory[Index++].Size = val * 0x100000;
|
||||||
if (MemorySizeStr[Index1] == 0) {
|
if (MemorySizeStr[Index1] == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Index1++;
|
Index1++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,7 +318,7 @@ main (
|
|||||||
//
|
//
|
||||||
// Hand off to SEC
|
// Hand off to SEC
|
||||||
//
|
//
|
||||||
SecLoadFromCore ((UINTN) InitialStackMemory, (UINTN) InitialStackMemorySize, (UINTN) gFdInfo[0].Address, SecFile);
|
SecLoadFromCore ((UINTN)InitialStackMemory, (UINTN)InitialStackMemorySize, (UINTN)gFdInfo[0].Address, SecFile);
|
||||||
|
|
||||||
//
|
//
|
||||||
// If we get here, then the SEC Core returned. This is an error as SEC should
|
// If we get here, then the SEC Core returned. This is an error as SEC should
|
||||||
@ -325,40 +328,40 @@ main (
|
|||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_PHYSICAL_ADDRESS *
|
EFI_PHYSICAL_ADDRESS *
|
||||||
MapMemory (
|
MapMemory (
|
||||||
IN INTN fd,
|
IN INTN fd,
|
||||||
IN UINT64 length,
|
IN UINT64 length,
|
||||||
IN INTN prot,
|
IN INTN prot,
|
||||||
IN INTN flags
|
IN INTN flags
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
STATIC UINTN base = 0x40000000;
|
STATIC UINTN base = 0x40000000;
|
||||||
CONST UINTN align = (1 << 24);
|
CONST UINTN align = (1 << 24);
|
||||||
VOID *res = NULL;
|
VOID *res = NULL;
|
||||||
BOOLEAN isAligned = 0;
|
BOOLEAN isAligned = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Try to get an aligned block somewhere in the address space of this
|
// Try to get an aligned block somewhere in the address space of this
|
||||||
// process.
|
// process.
|
||||||
//
|
//
|
||||||
while((!isAligned) && (base != 0)) {
|
while ((!isAligned) && (base != 0)) {
|
||||||
res = mmap ((void *)base, length, prot, flags, fd, 0);
|
res = mmap ((void *)base, length, prot, flags, fd, 0);
|
||||||
if (res == MAP_FAILED) {
|
if (res == MAP_FAILED) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((((UINTN)res) & ~(align-1)) == (UINTN)res) {
|
if ((((UINTN)res) & ~(align-1)) == (UINTN)res) {
|
||||||
isAligned=1;
|
isAligned = 1;
|
||||||
} else {
|
} else {
|
||||||
munmap(res, length);
|
munmap (res, length);
|
||||||
base += align;
|
base += align;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -389,16 +392,16 @@ MapFile (
|
|||||||
OUT UINT64 *Length
|
OUT UINT64 *Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
VOID *res;
|
VOID *res;
|
||||||
UINTN FileSize;
|
UINTN FileSize;
|
||||||
|
|
||||||
fd = open (FileName, O_RDWR);
|
fd = open (FileName, O_RDWR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
FileSize = lseek (fd, 0, SEEK_END);
|
|
||||||
|
|
||||||
|
FileSize = lseek (fd, 0, SEEK_END);
|
||||||
|
|
||||||
res = MapMemory (fd, FileSize, PROT_READ | PROT_EXEC, MAP_PRIVATE);
|
res = MapMemory (fd, FileSize, PROT_READ | PROT_EXEC, MAP_PRIVATE);
|
||||||
|
|
||||||
@ -409,8 +412,8 @@ MapFile (
|
|||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
*Length = (UINT64) FileSize;
|
*Length = (UINT64)FileSize;
|
||||||
*BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res;
|
*BaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)res;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -422,16 +425,17 @@ MapFd0 (
|
|||||||
OUT UINT64 *Length
|
OUT UINT64 *Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
void *res, *res2, *res3;
|
void *res, *res2, *res3;
|
||||||
UINTN FileSize;
|
UINTN FileSize;
|
||||||
UINTN FvSize;
|
UINTN FvSize;
|
||||||
void *EmuMagicPage;
|
void *EmuMagicPage;
|
||||||
|
|
||||||
fd = open (FileName, O_RDWR);
|
fd = open (FileName, O_RDWR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileSize = lseek (fd, 0, SEEK_END);
|
FileSize = lseek (fd, 0, SEEK_END);
|
||||||
|
|
||||||
FvSize = FixedPcdGet64 (PcdEmuFlashFvRecoverySize);
|
FvSize = FixedPcdGet64 (PcdEmuFlashFvRecoverySize);
|
||||||
@ -469,13 +473,13 @@ MapFd0 (
|
|||||||
|
|
||||||
// Map the rest of the FD as read/write
|
// Map the rest of the FD as read/write
|
||||||
res2 = mmap (
|
res2 = mmap (
|
||||||
(void *)(UINTN)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize),
|
(void *)(UINTN)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize),
|
||||||
FileSize - FvSize,
|
FileSize - FvSize,
|
||||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||||
MAP_SHARED,
|
MAP_SHARED,
|
||||||
fd,
|
fd,
|
||||||
FvSize
|
FvSize
|
||||||
);
|
);
|
||||||
close (fd);
|
close (fd);
|
||||||
if (res2 == MAP_FAILED) {
|
if (res2 == MAP_FAILED) {
|
||||||
perror ("MapFd0() Failed res2 =");
|
perror ("MapFd0() Failed res2 =");
|
||||||
@ -504,13 +508,12 @@ MapFd0 (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*Length = (UINT64) FileSize;
|
*Length = (UINT64)FileSize;
|
||||||
*BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res;
|
*BaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)res;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -528,24 +531,24 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
SecLoadFromCore (
|
SecLoadFromCore (
|
||||||
IN UINTN LargestRegion,
|
IN UINTN LargestRegion,
|
||||||
IN UINTN LargestRegionSize,
|
IN UINTN LargestRegionSize,
|
||||||
IN UINTN BootFirmwareVolumeBase,
|
IN UINTN BootFirmwareVolumeBase,
|
||||||
IN VOID *PeiCorePe32File
|
IN VOID *PeiCorePe32File
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_PHYSICAL_ADDRESS TopOfMemory;
|
EFI_PHYSICAL_ADDRESS TopOfMemory;
|
||||||
VOID *TopOfStack;
|
VOID *TopOfStack;
|
||||||
EFI_PHYSICAL_ADDRESS PeiCoreEntryPoint;
|
EFI_PHYSICAL_ADDRESS PeiCoreEntryPoint;
|
||||||
EFI_SEC_PEI_HAND_OFF *SecCoreData;
|
EFI_SEC_PEI_HAND_OFF *SecCoreData;
|
||||||
UINTN PeiStackSize;
|
UINTN PeiStackSize;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Compute Top Of Memory for Stack and PEI Core Allocations
|
// Compute Top Of Memory for Stack and PEI Core Allocations
|
||||||
//
|
//
|
||||||
TopOfMemory = LargestRegion + LargestRegionSize;
|
TopOfMemory = LargestRegion + LargestRegionSize;
|
||||||
PeiStackSize = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);
|
PeiStackSize = (UINTN)RShiftU64 ((UINT64)STACK_SIZE, 1);
|
||||||
|
|
||||||
//
|
//
|
||||||
// |-----------| <---- TemporaryRamBase + TemporaryRamSize
|
// |-----------| <---- TemporaryRamBase + TemporaryRamSize
|
||||||
@ -562,22 +565,21 @@ SecLoadFromCore (
|
|||||||
//
|
//
|
||||||
// Reservet space for storing PeiCore's parament in stack.
|
// Reservet space for storing PeiCore's parament in stack.
|
||||||
//
|
//
|
||||||
TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);
|
TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);
|
||||||
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
|
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Bind this information into the SEC hand-off state
|
// Bind this information into the SEC hand-off state
|
||||||
//
|
//
|
||||||
SecCoreData = (EFI_SEC_PEI_HAND_OFF*)(UINTN) TopOfStack;
|
SecCoreData = (EFI_SEC_PEI_HAND_OFF *)(UINTN)TopOfStack;
|
||||||
SecCoreData->DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);
|
SecCoreData->DataSize = sizeof (EFI_SEC_PEI_HAND_OFF);
|
||||||
SecCoreData->BootFirmwareVolumeBase = (VOID*)BootFirmwareVolumeBase;
|
SecCoreData->BootFirmwareVolumeBase = (VOID *)BootFirmwareVolumeBase;
|
||||||
SecCoreData->BootFirmwareVolumeSize = PcdGet32 (PcdEmuFirmwareFdSize);
|
SecCoreData->BootFirmwareVolumeSize = PcdGet32 (PcdEmuFirmwareFdSize);
|
||||||
SecCoreData->TemporaryRamBase = (VOID*)(UINTN)LargestRegion;
|
SecCoreData->TemporaryRamBase = (VOID *)(UINTN)LargestRegion;
|
||||||
SecCoreData->TemporaryRamSize = STACK_SIZE;
|
SecCoreData->TemporaryRamSize = STACK_SIZE;
|
||||||
SecCoreData->StackBase = SecCoreData->TemporaryRamBase;
|
SecCoreData->StackBase = SecCoreData->TemporaryRamBase;
|
||||||
SecCoreData->StackSize = PeiStackSize;
|
SecCoreData->StackSize = PeiStackSize;
|
||||||
SecCoreData->PeiTemporaryRamBase = (VOID*) ((UINTN) SecCoreData->TemporaryRamBase + PeiStackSize);
|
SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->TemporaryRamBase + PeiStackSize);
|
||||||
SecCoreData->PeiTemporaryRamSize = STACK_SIZE - PeiStackSize;
|
SecCoreData->PeiTemporaryRamSize = STACK_SIZE - PeiStackSize;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -585,14 +587,14 @@ SecLoadFromCore (
|
|||||||
//
|
//
|
||||||
Status = SecPeCoffGetEntryPoint (PeiCorePe32File, (VOID **)&PeiCoreEntryPoint);
|
Status = SecPeCoffGetEntryPoint (PeiCorePe32File, (VOID **)&PeiCoreEntryPoint);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Transfer control to the SEC Core
|
// Transfer control to the SEC Core
|
||||||
//
|
//
|
||||||
PeiSwitchStacks (
|
PeiSwitchStacks (
|
||||||
(SWITCH_STACK_ENTRY_POINT) (UINTN) PeiCoreEntryPoint,
|
(SWITCH_STACK_ENTRY_POINT)(UINTN)PeiCoreEntryPoint,
|
||||||
SecCoreData,
|
SecCoreData,
|
||||||
(VOID *)gPpiList,
|
(VOID *)gPpiList,
|
||||||
TopOfStack
|
TopOfStack
|
||||||
@ -600,10 +602,9 @@ SecLoadFromCore (
|
|||||||
//
|
//
|
||||||
// If we get here, then the SEC Core returned. This is an error
|
// If we get here, then the SEC Core returned. This is an error
|
||||||
//
|
//
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -631,29 +632,30 @@ SecUnixPeiAutoScan (
|
|||||||
OUT UINT64 *MemorySize
|
OUT UINT64 *MemorySize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
void *res;
|
void *res;
|
||||||
|
|
||||||
if (Index >= gSystemMemoryCount) {
|
if (Index >= gSystemMemoryCount) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
*MemoryBase = 0;
|
*MemoryBase = 0;
|
||||||
res = MapMemory (
|
res = MapMemory (
|
||||||
0, gSystemMemory[Index].Size,
|
0,
|
||||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
gSystemMemory[Index].Size,
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS
|
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||||
);
|
MAP_PRIVATE | MAP_ANONYMOUS
|
||||||
|
);
|
||||||
if (res == MAP_FAILED) {
|
if (res == MAP_FAILED) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
*MemorySize = gSystemMemory[Index].Size;
|
|
||||||
*MemoryBase = (UINTN)res;
|
*MemorySize = gSystemMemory[Index].Size;
|
||||||
|
*MemoryBase = (UINTN)res;
|
||||||
gSystemMemory[Index].Memory = *MemoryBase;
|
gSystemMemory[Index].Memory = *MemoryBase;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -675,7 +677,7 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
EfiSystemMemoryRange (
|
EfiSystemMemoryRange (
|
||||||
IN VOID *MemoryAddress
|
IN VOID *MemoryAddress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
@ -684,7 +686,8 @@ EfiSystemMemoryRange (
|
|||||||
MemoryBase = (EFI_PHYSICAL_ADDRESS)(UINTN)MemoryAddress;
|
MemoryBase = (EFI_PHYSICAL_ADDRESS)(UINTN)MemoryAddress;
|
||||||
for (Index = 0; Index < gSystemMemoryCount; Index++) {
|
for (Index = 0; Index < gSystemMemoryCount; Index++) {
|
||||||
if ((MemoryBase >= gSystemMemory[Index].Memory) &&
|
if ((MemoryBase >= gSystemMemory[Index].Memory) &&
|
||||||
(MemoryBase < (gSystemMemory[Index].Memory + gSystemMemory[Index].Size)) ) {
|
(MemoryBase < (gSystemMemory[Index].Memory + gSystemMemory[Index].Size)))
|
||||||
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -692,7 +695,6 @@ EfiSystemMemoryRange (
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -715,8 +717,6 @@ SecEmuThunkAddress (
|
|||||||
return &gEmuThunkProtocol;
|
return &gEmuThunkProtocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecPeCoffGetEntryPoint (
|
SecPeCoffGetEntryPoint (
|
||||||
@ -728,10 +728,10 @@ SecPeCoffGetEntryPoint (
|
|||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
||||||
|
|
||||||
ZeroMem (&ImageContext, sizeof (ImageContext));
|
ZeroMem (&ImageContext, sizeof (ImageContext));
|
||||||
ImageContext.Handle = Pe32Data;
|
ImageContext.Handle = Pe32Data;
|
||||||
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) SecImageRead;
|
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE)SecImageRead;
|
||||||
|
|
||||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -741,7 +741,7 @@ SecPeCoffGetEntryPoint (
|
|||||||
// Relocate image to match the address where it resides
|
// Relocate image to match the address where it resides
|
||||||
//
|
//
|
||||||
ImageContext.ImageAddress = (UINTN)Pe32Data;
|
ImageContext.ImageAddress = (UINTN)Pe32Data;
|
||||||
Status = PeCoffLoaderLoadImage (&ImageContext);
|
Status = PeCoffLoaderLoadImage (&ImageContext);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -755,10 +755,11 @@ SecPeCoffGetEntryPoint (
|
|||||||
// Or just return image entry point
|
// Or just return image entry point
|
||||||
//
|
//
|
||||||
ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer (Pe32Data);
|
ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer (Pe32Data);
|
||||||
Status = PeCoffLoaderGetEntryPoint (Pe32Data, EntryPoint);
|
Status = PeCoffLoaderGetEntryPoint (Pe32Data, EntryPoint);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageContext.EntryPoint = (UINTN)*EntryPoint;
|
ImageContext.EntryPoint = (UINTN)*EntryPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -769,8 +770,6 @@ SecPeCoffGetEntryPoint (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -804,7 +803,7 @@ SecUnixFdAddress (
|
|||||||
*FdSize = gFdInfo[Index].Size;
|
*FdSize = gFdInfo[Index].Size;
|
||||||
*FixUp = 0;
|
*FixUp = 0;
|
||||||
|
|
||||||
if (*FdBase == 0 && *FdSize == 0) {
|
if ((*FdBase == 0) && (*FdSize == 0)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -820,7 +819,6 @@ SecUnixFdAddress (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -836,11 +834,11 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
CountSeparatorsInString (
|
CountSeparatorsInString (
|
||||||
IN const CHAR16 *String,
|
IN const CHAR16 *String,
|
||||||
IN CHAR16 Separator
|
IN CHAR16 Separator
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Count;
|
UINTN Count;
|
||||||
|
|
||||||
for (Count = 0; *String != '\0'; String++) {
|
for (Count = 0; *String != '\0'; String++) {
|
||||||
if (*String == Separator) {
|
if (*String == Separator) {
|
||||||
@ -851,15 +849,15 @@ CountSeparatorsInString (
|
|||||||
return Count;
|
return Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecImageRead (
|
SecImageRead (
|
||||||
IN VOID *FileHandle,
|
IN VOID *FileHandle,
|
||||||
IN UINTN FileOffset,
|
IN UINTN FileOffset,
|
||||||
IN OUT UINTN *ReadSize,
|
IN OUT UINTN *ReadSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -876,13 +874,13 @@ Returns:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
{
|
{
|
||||||
CHAR8 *Destination8;
|
CHAR8 *Destination8;
|
||||||
CHAR8 *Source8;
|
CHAR8 *Source8;
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
|
|
||||||
Destination8 = Buffer;
|
Destination8 = Buffer;
|
||||||
Source8 = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
|
Source8 = (CHAR8 *)((UINTN)FileHandle + FileOffset);
|
||||||
Length = *ReadSize;
|
Length = *ReadSize;
|
||||||
while (Length--) {
|
while (Length--) {
|
||||||
*(Destination8++) = *(Source8++);
|
*(Destination8++) = *(Source8++);
|
||||||
}
|
}
|
||||||
@ -890,7 +888,6 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -909,14 +906,13 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
AddHandle (
|
AddHandle (
|
||||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||||
IN VOID *ModHandle
|
IN VOID *ModHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
IMAGE_CONTEXT_TO_MOD_HANDLE *Array;
|
IMAGE_CONTEXT_TO_MOD_HANDLE *Array;
|
||||||
UINTN PreviousSize;
|
UINTN PreviousSize;
|
||||||
|
|
||||||
|
|
||||||
Array = mImageContextModHandleArray;
|
Array = mImageContextModHandleArray;
|
||||||
for (Index = 0; Index < mImageContextModHandleArraySize; Index++, Array++) {
|
for (Index = 0; Index < mImageContextModHandleArraySize; Index++, Array++) {
|
||||||
@ -936,7 +932,7 @@ AddHandle (
|
|||||||
// copy the old values to the new location. But it does
|
// copy the old values to the new location. But it does
|
||||||
// not zero the new memory area.
|
// not zero the new memory area.
|
||||||
//
|
//
|
||||||
PreviousSize = mImageContextModHandleArraySize * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE);
|
PreviousSize = mImageContextModHandleArraySize * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE);
|
||||||
mImageContextModHandleArraySize += MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE;
|
mImageContextModHandleArraySize += MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE;
|
||||||
|
|
||||||
mImageContextModHandleArray = ReallocatePool (
|
mImageContextModHandleArray = ReallocatePool (
|
||||||
@ -954,7 +950,6 @@ AddHandle (
|
|||||||
return AddHandle (ImageContext, ModHandle);
|
return AddHandle (ImageContext, ModHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
@ -971,7 +966,7 @@ Returns:
|
|||||||
**/
|
**/
|
||||||
VOID *
|
VOID *
|
||||||
RemoveHandle (
|
RemoveHandle (
|
||||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
@ -998,60 +993,60 @@ RemoveHandle (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IsPdbFile (
|
IsPdbFile (
|
||||||
IN CHAR8 *PdbFileName
|
IN CHAR8 *PdbFileName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Len;
|
UINTN Len;
|
||||||
|
|
||||||
if (PdbFileName == NULL) {
|
if (PdbFileName == NULL) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Len = strlen (PdbFileName);
|
Len = strlen (PdbFileName);
|
||||||
if ((Len < 5)|| (PdbFileName[Len - 4] != '.')) {
|
if ((Len < 5) || (PdbFileName[Len - 4] != '.')) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((PdbFileName[Len - 3] == 'P' || PdbFileName[Len - 3] == 'p') &&
|
if (((PdbFileName[Len - 3] == 'P') || (PdbFileName[Len - 3] == 'p')) &&
|
||||||
(PdbFileName[Len - 2] == 'D' || PdbFileName[Len - 2] == 'd') &&
|
((PdbFileName[Len - 2] == 'D') || (PdbFileName[Len - 2] == 'd')) &&
|
||||||
(PdbFileName[Len - 1] == 'B' || PdbFileName[Len - 1] == 'b')) {
|
((PdbFileName[Len - 1] == 'B') || (PdbFileName[Len - 1] == 'b')))
|
||||||
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_SPRINT_BUFFER_SIZE 0x200
|
||||||
#define MAX_SPRINT_BUFFER_SIZE 0x200
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PrintLoadAddress (
|
PrintLoadAddress (
|
||||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (ImageContext->PdbPointer == NULL) {
|
if (ImageContext->PdbPointer == NULL) {
|
||||||
fprintf (stderr,
|
fprintf (
|
||||||
|
stderr,
|
||||||
"0x%08lx Loading NO DEBUG with entry point 0x%08lx\n",
|
"0x%08lx Loading NO DEBUG with entry point 0x%08lx\n",
|
||||||
(unsigned long)(ImageContext->ImageAddress),
|
(unsigned long)(ImageContext->ImageAddress),
|
||||||
(unsigned long)ImageContext->EntryPoint
|
(unsigned long)ImageContext->EntryPoint
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
fprintf (stderr,
|
fprintf (
|
||||||
|
stderr,
|
||||||
"0x%08lx Loading %s with entry point 0x%08lx\n",
|
"0x%08lx Loading %s with entry point 0x%08lx\n",
|
||||||
(unsigned long)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders),
|
(unsigned long)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders),
|
||||||
ImageContext->PdbPointer,
|
ImageContext->PdbPointer,
|
||||||
(unsigned long)ImageContext->EntryPoint
|
(unsigned long)ImageContext->EntryPoint
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep output synced up
|
// Keep output synced up
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Loads the image using dlopen so symbols will be automatically
|
Loads the image using dlopen so symbols will be automatically
|
||||||
loaded by gdb.
|
loaded by gdb.
|
||||||
@ -1064,18 +1059,17 @@ PrintLoadAddress (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
DlLoadImage (
|
DlLoadImage (
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
#ifdef __APPLE__
|
||||||
#ifdef __APPLE__
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void *Handle = NULL;
|
void *Handle = NULL;
|
||||||
void *Entry = NULL;
|
void *Entry = NULL;
|
||||||
|
|
||||||
if (ImageContext->PdbPointer == NULL) {
|
if (ImageContext->PdbPointer == NULL) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -1086,19 +1080,19 @@ DlLoadImage (
|
|||||||
}
|
}
|
||||||
|
|
||||||
fprintf (
|
fprintf (
|
||||||
stderr,
|
stderr,
|
||||||
"Loading %s 0x%08lx - entry point 0x%08lx\n",
|
"Loading %s 0x%08lx - entry point 0x%08lx\n",
|
||||||
ImageContext->PdbPointer,
|
ImageContext->PdbPointer,
|
||||||
(unsigned long)ImageContext->ImageAddress,
|
(unsigned long)ImageContext->ImageAddress,
|
||||||
(unsigned long)ImageContext->EntryPoint
|
(unsigned long)ImageContext->EntryPoint
|
||||||
);
|
);
|
||||||
|
|
||||||
Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW);
|
Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW);
|
||||||
if (Handle != NULL) {
|
if (Handle != NULL) {
|
||||||
Entry = dlsym (Handle, "_ModuleEntryPoint");
|
Entry = dlsym (Handle, "_ModuleEntryPoint");
|
||||||
AddHandle (ImageContext, Handle);
|
AddHandle (ImageContext, Handle);
|
||||||
} else {
|
} else {
|
||||||
printf("%s\n", dlerror());
|
printf ("%s\n", dlerror ());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Entry != NULL) {
|
if (Entry != NULL) {
|
||||||
@ -1109,25 +1103,23 @@ DlLoadImage (
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
__attribute__((noinline))
|
__attribute__ ((noinline))
|
||||||
#endif
|
#endif
|
||||||
VOID
|
VOID
|
||||||
SecGdbScriptBreak (
|
SecGdbScriptBreak (
|
||||||
char *FileName,
|
char *FileName,
|
||||||
int FileNameLength,
|
int FileNameLength,
|
||||||
long unsigned int LoadAddress,
|
long unsigned int LoadAddress,
|
||||||
int AddSymbolFlag
|
int AddSymbolFlag
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Adds the image to a gdb script so its symbols can be loaded.
|
Adds the image to a gdb script so its symbols can be loaded.
|
||||||
The AddFirmwareSymbolFile helper macro is used.
|
The AddFirmwareSymbolFile helper macro is used.
|
||||||
@ -1137,18 +1129,17 @@ SecGdbScriptBreak (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
GdbScriptAddImage (
|
GdbScriptAddImage (
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
PrintLoadAddress (ImageContext);
|
PrintLoadAddress (ImageContext);
|
||||||
|
|
||||||
if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {
|
if ((ImageContext->PdbPointer != NULL) && !IsPdbFile (ImageContext->PdbPointer)) {
|
||||||
FILE *GdbTempFile;
|
FILE *GdbTempFile;
|
||||||
if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
|
if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
|
||||||
GdbTempFile = fopen (gGdbWorkingFileName, "a");
|
GdbTempFile = fopen (gGdbWorkingFileName, "a");
|
||||||
if (GdbTempFile != NULL) {
|
if (GdbTempFile != NULL) {
|
||||||
long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);
|
long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);
|
||||||
mScriptSymbolChangesCount++;
|
mScriptSymbolChangesCount++;
|
||||||
fprintf (
|
fprintf (
|
||||||
GdbTempFile,
|
GdbTempFile,
|
||||||
@ -1188,11 +1179,10 @@ GdbScriptAddImage (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecPeCoffRelocateImageExtraAction (
|
SecPeCoffRelocateImageExtraAction (
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (!DlLoadImage (ImageContext)) {
|
if (!DlLoadImage (ImageContext)) {
|
||||||
@ -1200,7 +1190,6 @@ SecPeCoffRelocateImageExtraAction (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Adds the image to a gdb script so its symbols can be unloaded.
|
Adds the image to a gdb script so its symbols can be unloaded.
|
||||||
The RemoveFirmwareSymbolFile helper macro is used.
|
The RemoveFirmwareSymbolFile helper macro is used.
|
||||||
@ -1210,7 +1199,7 @@ SecPeCoffRelocateImageExtraAction (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
GdbScriptRemoveImage (
|
GdbScriptRemoveImage (
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
FILE *GdbTempFile;
|
FILE *GdbTempFile;
|
||||||
@ -1257,27 +1246,24 @@ GdbScriptRemoveImage (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecPeCoffUnloadImageExtraAction (
|
SecPeCoffUnloadImageExtraAction (
|
||||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *Handle;
|
VOID *Handle;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check to see if the image symbols were loaded with gdb script, or dlopen
|
// Check to see if the image symbols were loaded with gdb script, or dlopen
|
||||||
//
|
//
|
||||||
Handle = RemoveHandle (ImageContext);
|
Handle = RemoveHandle (ImageContext);
|
||||||
if (Handle != NULL) {
|
if (Handle != NULL) {
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
dlclose (Handle);
|
dlclose (Handle);
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GdbScriptRemoveImage (ImageContext);
|
GdbScriptRemoveImage (ImageContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,9 +30,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
#if __CYGWIN__
|
#if __CYGWIN__
|
||||||
#include <sys/dirent.h>
|
#include <sys/dirent.h>
|
||||||
#else
|
#else
|
||||||
#include <sys/dir.h>
|
#include <sys/dir.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
@ -56,19 +56,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <ifaddrs.h>
|
#include <ifaddrs.h>
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#include <net/if_dl.h>
|
#include <net/if_dl.h>
|
||||||
#include <net/bpf.h>
|
#include <net/bpf.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
#include <sys/disk.h>
|
#include <sys/disk.h>
|
||||||
#define _XOPEN_SOURCE
|
#define _XOPEN_SOURCE
|
||||||
#ifndef _Bool
|
#ifndef _Bool
|
||||||
#define _Bool char // for clang debug
|
#define _Bool char // for clang debug
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#include <termio.h>
|
#include <termio.h>
|
||||||
#include <sys/vfs.h>
|
#include <sys/vfs.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
@ -120,31 +120,27 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Guid/FileSystemInfo.h>
|
#include <Guid/FileSystemInfo.h>
|
||||||
#include <Guid/FileSystemVolumeLabelInfo.h>
|
#include <Guid/FileSystemVolumeLabelInfo.h>
|
||||||
|
|
||||||
|
|
||||||
#include "Gasket.h"
|
#include "Gasket.h"
|
||||||
|
|
||||||
|
#define STACK_SIZE 0x20000
|
||||||
#define STACK_SIZE 0x20000
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
UINT64 Size;
|
UINT64 Size;
|
||||||
} EMU_FD_INFO;
|
} EMU_FD_INFO;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_PHYSICAL_ADDRESS Memory;
|
EFI_PHYSICAL_ADDRESS Memory;
|
||||||
UINT64 Size;
|
UINT64 Size;
|
||||||
} EMU_SYSTEM_MEMORY;
|
} EMU_SYSTEM_MEMORY;
|
||||||
|
|
||||||
|
#define MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE 0x100
|
||||||
#define MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE 0x100
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext;
|
PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext;
|
||||||
VOID *ModHandle;
|
VOID *ModHandle;
|
||||||
} IMAGE_CONTEXT_TO_MOD_HANDLE;
|
} IMAGE_CONTEXT_TO_MOD_HANDLE;
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecUnixPeiLoadFile (
|
SecUnixPeiLoadFile (
|
||||||
@ -163,18 +159,18 @@ main (
|
|||||||
|
|
||||||
VOID
|
VOID
|
||||||
SecLoadFromCore (
|
SecLoadFromCore (
|
||||||
IN UINTN LargestRegion,
|
IN UINTN LargestRegion,
|
||||||
IN UINTN LargestRegionSize,
|
IN UINTN LargestRegionSize,
|
||||||
IN UINTN BootFirmwareVolumeBase,
|
IN UINTN BootFirmwareVolumeBase,
|
||||||
IN VOID *PeiCoreFile
|
IN VOID *PeiCoreFile
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SecLoadFile (
|
SecLoadFile (
|
||||||
IN VOID *Pe32Data,
|
IN VOID *Pe32Data,
|
||||||
IN EFI_PHYSICAL_ADDRESS *ImageAddress,
|
IN EFI_PHYSICAL_ADDRESS *ImageAddress,
|
||||||
IN UINT64 *ImageSize,
|
IN UINT64 *ImageSize,
|
||||||
IN EFI_PHYSICAL_ADDRESS *EntryPoint
|
IN EFI_PHYSICAL_ADDRESS *EntryPoint
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -192,23 +188,23 @@ SecFfsFindNextFile (
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SecFfsFindSectionData (
|
SecFfsFindSectionData (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||||
IN OUT VOID **SectionData
|
IN OUT VOID **SectionData
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecUnixPeCoffLoaderLoadAsDll (
|
SecUnixPeCoffLoaderLoadAsDll (
|
||||||
IN CHAR8 *PdbFileName,
|
IN CHAR8 *PdbFileName,
|
||||||
IN VOID **ImageEntryPoint,
|
IN VOID **ImageEntryPoint,
|
||||||
OUT VOID **ModHandle
|
OUT VOID **ModHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecUnixPeCoffLoaderFreeLibrary (
|
SecUnixPeCoffLoaderFreeLibrary (
|
||||||
OUT VOID *ModHandle
|
OUT VOID *ModHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -230,53 +226,51 @@ GasketSecUnixFdAddress (
|
|||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetImageReadFunction (
|
GetImageReadFunction (
|
||||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||||
IN EFI_PHYSICAL_ADDRESS *TopOfMemory
|
IN EFI_PHYSICAL_ADDRESS *TopOfMemory
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecImageRead (
|
SecImageRead (
|
||||||
IN VOID *FileHandle,
|
IN VOID *FileHandle,
|
||||||
IN UINTN FileOffset,
|
IN UINTN FileOffset,
|
||||||
IN OUT UINTN *ReadSize,
|
IN OUT UINTN *ReadSize,
|
||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
CHAR16 *
|
CHAR16 *
|
||||||
AsciiToUnicode (
|
AsciiToUnicode (
|
||||||
IN CHAR8 *Ascii,
|
IN CHAR8 *Ascii,
|
||||||
IN UINTN *StrLen OPTIONAL
|
IN UINTN *StrLen OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
CountSeparatorsInString (
|
CountSeparatorsInString (
|
||||||
IN const CHAR16 *String,
|
IN const CHAR16 *String,
|
||||||
IN CHAR16 Separator
|
IN CHAR16 Separator
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecTemporaryRamSupport (
|
SecTemporaryRamSupport (
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||||
IN UINTN CopySize
|
IN UINTN CopySize
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GasketSecTemporaryRamSupport (
|
GasketSecTemporaryRamSupport (
|
||||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||||
IN UINTN CopySize
|
IN UINTN CopySize
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SecPeCoffGetEntryPoint (
|
SecPeCoffGetEntryPoint (
|
||||||
@ -296,7 +290,6 @@ SecPeCoffLoaderUnloadImageExtraAction (
|
|||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
PeiSwitchStacks (
|
PeiSwitchStacks (
|
||||||
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
|
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
|
||||||
@ -310,13 +303,13 @@ SecInitThunkProtocol (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_PHYSICAL_ADDRESS *
|
EFI_PHYSICAL_ADDRESS *
|
||||||
MapMemory (
|
MapMemory (
|
||||||
INTN fd,
|
INTN fd,
|
||||||
UINT64 length,
|
UINT64 length,
|
||||||
INTN prot,
|
INTN prot,
|
||||||
INTN flags);
|
INTN flags
|
||||||
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
MapFile (
|
MapFile (
|
||||||
@ -334,21 +327,34 @@ MapFd0 (
|
|||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
EfiSystemMemoryRange (
|
EfiSystemMemoryRange (
|
||||||
IN VOID *MemoryAddress
|
IN VOID *MemoryAddress
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
SecSleep (
|
||||||
|
UINT64 Nanoseconds
|
||||||
|
);
|
||||||
|
|
||||||
VOID SecSleep (UINT64 Nanoseconds);
|
VOID
|
||||||
VOID SecEnableInterrupt (VOID);
|
SecEnableInterrupt (
|
||||||
VOID SecDisableInterrupt (VOID);
|
VOID
|
||||||
BOOLEAN SecInterruptEanbled (VOID);
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
SecDisableInterrupt (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
extern EMU_THUNK_PROTOCOL gEmuThunkProtocol;
|
BOOLEAN
|
||||||
extern EMU_IO_THUNK_PROTOCOL gX11ThunkIo;
|
SecInterruptEanbled (
|
||||||
extern EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo;
|
VOID
|
||||||
extern EMU_IO_THUNK_PROTOCOL gPthreadThunkIo;
|
);
|
||||||
extern EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo;
|
|
||||||
extern EMU_IO_THUNK_PROTOCOL gSnpThunkIo;
|
extern EMU_THUNK_PROTOCOL gEmuThunkProtocol;
|
||||||
|
extern EMU_IO_THUNK_PROTOCOL gX11ThunkIo;
|
||||||
|
extern EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo;
|
||||||
|
extern EMU_IO_THUNK_PROTOCOL gPthreadThunkIo;
|
||||||
|
extern EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo;
|
||||||
|
extern EMU_IO_THUNK_PROTOCOL gSnpThunkIo;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Transfers control to a function starting with a new stack.
|
Transfers control to a function starting with a new stack.
|
||||||
|
|
||||||
@ -49,15 +48,14 @@ PeiSwitchStacks (
|
|||||||
//
|
//
|
||||||
ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
|
ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
|
||||||
|
|
||||||
JumpBuffer.Eip = (UINTN)EntryPoint;
|
JumpBuffer.Eip = (UINTN)EntryPoint;
|
||||||
JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
|
JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID *);
|
||||||
JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
|
JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
|
||||||
((VOID**)JumpBuffer.Esp)[1] = Context1;
|
((VOID **)JumpBuffer.Esp)[1] = Context1;
|
||||||
((VOID**)JumpBuffer.Esp)[2] = Context2;
|
((VOID **)JumpBuffer.Esp)[2] = Context2;
|
||||||
|
|
||||||
LongJump (&JumpBuffer, (UINTN)-1);
|
LongJump (&JumpBuffer, (UINTN)-1);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// PeiSwitchStacks () will never return
|
// PeiSwitchStacks () will never return
|
||||||
//
|
//
|
||||||
|
@ -12,21 +12,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
|
|
||||||
#define EMU_SNP_PRIVATE_SIGNATURE SIGNATURE_32('E', 'M', 's', 'n')
|
#define EMU_SNP_PRIVATE_SIGNATURE SIGNATURE_32('E', 'M', 's', 'n')
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
|
|
||||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||||
|
|
||||||
|
|
||||||
EMU_SNP_PROTOCOL EmuSnp;
|
|
||||||
EFI_SIMPLE_NETWORK_MODE *Mode;
|
|
||||||
|
|
||||||
|
EMU_SNP_PROTOCOL EmuSnp;
|
||||||
|
EFI_SIMPLE_NETWORK_MODE *Mode;
|
||||||
} EMU_SNP_PRIVATE;
|
} EMU_SNP_PRIVATE;
|
||||||
|
|
||||||
#define EMU_SNP_PRIVATE_DATA_FROM_THIS(a) \
|
#define EMU_SNP_PRIVATE_DATA_FROM_THIS(a) \
|
||||||
@ -48,7 +45,7 @@ EmuSnpCreateMapping (
|
|||||||
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -74,7 +71,7 @@ EmuSnpStart (
|
|||||||
IN EMU_SNP_PROTOCOL *This
|
IN EMU_SNP_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -98,7 +95,7 @@ EmuSnpStop (
|
|||||||
IN EMU_SNP_PROTOCOL *This
|
IN EMU_SNP_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -133,12 +130,12 @@ EmuSnpStop (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpInitialize (
|
EmuSnpInitialize (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -163,11 +160,11 @@ EmuSnpInitialize (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpReset (
|
EmuSnpReset (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -192,7 +189,7 @@ EmuSnpShutdown (
|
|||||||
IN EMU_SNP_PROTOCOL *This
|
IN EMU_SNP_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -225,15 +222,15 @@ EmuSnpShutdown (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpReceiveFilters (
|
EmuSnpReceiveFilters (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINT32 Enable,
|
IN UINT32 Enable,
|
||||||
IN UINT32 Disable,
|
IN UINT32 Disable,
|
||||||
IN BOOLEAN ResetMCastFilter,
|
IN BOOLEAN ResetMCastFilter,
|
||||||
IN UINTN MCastFilterCnt OPTIONAL,
|
IN UINTN MCastFilterCnt OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -257,12 +254,12 @@ EmuSnpReceiveFilters (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpStationAddress (
|
EmuSnpStationAddress (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -292,13 +289,13 @@ EmuSnpStationAddress (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpStatistics (
|
EmuSnpStatistics (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN Reset,
|
IN BOOLEAN Reset,
|
||||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -328,13 +325,13 @@ EmuSnpStatistics (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpMCastIpToMac (
|
EmuSnpMCastIpToMac (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN IPv6,
|
IN BOOLEAN IPv6,
|
||||||
IN EFI_IP_ADDRESS *IP,
|
IN EFI_IP_ADDRESS *IP,
|
||||||
OUT EFI_MAC_ADDRESS *MAC
|
OUT EFI_MAC_ADDRESS *MAC
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -363,14 +360,14 @@ EmuSnpMCastIpToMac (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpNvData (
|
EmuSnpNvData (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN BOOLEAN ReadWrite,
|
IN BOOLEAN ReadWrite,
|
||||||
IN UINTN Offset,
|
IN UINTN Offset,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN OUT VOID *Buffer
|
IN OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -404,12 +401,12 @@ EmuSnpNvData (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpGetStatus (
|
EmuSnpGetStatus (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||||
OUT VOID **TxBuf OPTIONAL
|
OUT VOID **TxBuf OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -451,16 +448,16 @@ EmuSnpGetStatus (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpTransmit (
|
EmuSnpTransmit (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
IN UINTN HeaderSize,
|
IN UINTN HeaderSize,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer,
|
IN VOID *Buffer,
|
||||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
IN UINT16 *Protocol OPTIONAL
|
IN UINT16 *Protocol OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
@ -501,24 +498,23 @@ EmuSnpTransmit (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpReceive (
|
EmuSnpReceive (
|
||||||
IN EMU_SNP_PROTOCOL *This,
|
IN EMU_SNP_PROTOCOL *This,
|
||||||
OUT UINTN *HeaderSize OPTIONAL,
|
OUT UINTN *HeaderSize OPTIONAL,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT VOID *Buffer,
|
OUT VOID *Buffer,
|
||||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
OUT UINT16 *Protocol OPTIONAL
|
OUT UINT16 *Protocol OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
|
|
||||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
||||||
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
|
||||||
GasketSnpCreateMapping,
|
GasketSnpCreateMapping,
|
||||||
GasketSnpStart,
|
GasketSnpStart,
|
||||||
GasketSnpStop,
|
GasketSnpStop,
|
||||||
@ -537,7 +533,7 @@ EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpThunkOpen (
|
EmuSnpThunkOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
@ -555,7 +551,6 @@ EmuSnpThunkOpen (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Private->Signature = EMU_SNP_PRIVATE_SIGNATURE;
|
Private->Signature = EMU_SNP_PRIVATE_SIGNATURE;
|
||||||
Private->Thunk = This;
|
Private->Thunk = This;
|
||||||
CopyMem (&Private->EmuSnp, &gEmuSnpProtocol, sizeof (gEmuSnpProtocol));
|
CopyMem (&Private->EmuSnp, &gEmuSnpProtocol, sizeof (gEmuSnpProtocol));
|
||||||
@ -565,10 +560,9 @@ EmuSnpThunkOpen (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EmuSnpThunkClose (
|
EmuSnpThunkClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EMU_SNP_PRIVATE *Private;
|
EMU_SNP_PRIVATE *Private;
|
||||||
@ -583,9 +577,7 @@ EmuSnpThunkClose (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
|
||||||
|
|
||||||
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
|
|
||||||
&gEmuSnpProtocolGuid,
|
&gEmuSnpProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -30,10 +30,9 @@ AllocatePool (
|
|||||||
IN UINTN AllocationSize
|
IN UINTN AllocationSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return (VOID*) malloc (AllocationSize);
|
return (VOID *)malloc (AllocationSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Allocates and zeros a buffer of type EfiBootServicesData.
|
Allocates and zeros a buffer of type EfiBootServicesData.
|
||||||
|
|
||||||
@ -53,7 +52,7 @@ AllocateZeroPool (
|
|||||||
IN UINTN AllocationSize
|
IN UINTN AllocationSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *Buffer;
|
VOID *Buffer;
|
||||||
|
|
||||||
Buffer = AllocatePool (AllocationSize);
|
Buffer = AllocatePool (AllocationSize);
|
||||||
if (Buffer == NULL) {
|
if (Buffer == NULL) {
|
||||||
@ -65,7 +64,6 @@ AllocateZeroPool (
|
|||||||
return Buffer;
|
return Buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reallocates a buffer of type EfiBootServicesData.
|
Reallocates a buffer of type EfiBootServicesData.
|
||||||
|
|
||||||
@ -95,7 +93,7 @@ ReallocatePool (
|
|||||||
IN VOID *OldBuffer OPTIONAL
|
IN VOID *OldBuffer OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *NewBuffer;
|
VOID *NewBuffer;
|
||||||
|
|
||||||
NewBuffer = AllocatePool (NewSize);
|
NewBuffer = AllocatePool (NewSize);
|
||||||
if (NewBuffer == NULL) {
|
if (NewBuffer == NULL) {
|
||||||
@ -113,7 +111,6 @@ ReallocatePool (
|
|||||||
return NewBuffer;
|
return NewBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Frees a buffer that was previously allocated with one of the pool allocation functions in the
|
Frees a buffer that was previously allocated with one of the pool allocation functions in the
|
||||||
Memory Allocation Library.
|
Memory Allocation Library.
|
||||||
@ -131,9 +128,8 @@ ReallocatePool (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FreePool (
|
FreePool (
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
free ((void *) Buffer);
|
free ((void *)Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -12,48 +12,43 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PthreadMutexLock (
|
PthreadMutexLock (
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
|
return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PthreadMutexUnLock (
|
PthreadMutexUnLock (
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
|
return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PthreadMutexTryLock (
|
PthreadMutexTryLock (
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
|
return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID *
|
VOID *
|
||||||
PthreadMutexInit (
|
PthreadMutexInit (
|
||||||
IN VOID
|
IN VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pthread_mutex_t *Mutex;
|
pthread_mutex_t *Mutex;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
Mutex = malloc (sizeof (pthread_mutex_t));
|
Mutex = malloc (sizeof (pthread_mutex_t));
|
||||||
err = pthread_mutex_init (Mutex, NULL);
|
err = pthread_mutex_init (Mutex, NULL);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
return Mutex;
|
return Mutex;
|
||||||
}
|
}
|
||||||
@ -61,10 +56,9 @@ PthreadMutexInit (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
PthreadMutexDestroy (
|
PthreadMutexDestroy (
|
||||||
IN VOID *Mutex
|
IN VOID *Mutex
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (Mutex != NULL) {
|
if (Mutex != NULL) {
|
||||||
@ -76,11 +70,11 @@ PthreadMutexDestroy (
|
|||||||
|
|
||||||
// Can't store this data on PthreadCreate stack so we need a global
|
// Can't store this data on PthreadCreate stack so we need a global
|
||||||
typedef struct {
|
typedef struct {
|
||||||
pthread_mutex_t Mutex;
|
pthread_mutex_t Mutex;
|
||||||
THREAD_THUNK_THREAD_ENTRY Start;
|
THREAD_THUNK_THREAD_ENTRY Start;
|
||||||
} THREAD_MANGLE;
|
} THREAD_MANGLE;
|
||||||
|
|
||||||
THREAD_MANGLE mThreadMangle = {
|
THREAD_MANGLE mThreadMangle = {
|
||||||
PTHREAD_MUTEX_INITIALIZER,
|
PTHREAD_MUTEX_INITIALIZER,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -90,11 +84,11 @@ SecFakePthreadStart (
|
|||||||
VOID *Context
|
VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
THREAD_THUNK_THREAD_ENTRY Start;
|
THREAD_THUNK_THREAD_ENTRY Start;
|
||||||
sigset_t SigMask;
|
sigset_t SigMask;
|
||||||
|
|
||||||
// Save global on the stack before we unlock
|
// Save global on the stack before we unlock
|
||||||
Start = mThreadMangle.Start;
|
Start = mThreadMangle.Start;
|
||||||
pthread_mutex_unlock (&mThreadMangle.Mutex);
|
pthread_mutex_unlock (&mThreadMangle.Mutex);
|
||||||
|
|
||||||
// Mask all signals to the APs
|
// Mask all signals to the APs
|
||||||
@ -109,19 +103,19 @@ SecFakePthreadStart (
|
|||||||
// This is a great example of how all problems in computer
|
// This is a great example of how all problems in computer
|
||||||
// science can be solved by adding another level of indirection
|
// science can be solved by adding another level of indirection
|
||||||
//
|
//
|
||||||
return (VOID *)ReverseGasketUint64 ((UINTN)Start, (UINTN)Context);
|
return (VOID *)ReverseGasketUint64 ((UINTN)Start, (UINTN)Context);
|
||||||
}
|
}
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
PthreadCreate (
|
PthreadCreate (
|
||||||
IN VOID *Thread,
|
IN VOID *Thread,
|
||||||
IN VOID *Attribute,
|
IN VOID *Attribute,
|
||||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
BOOLEAN EnabledOnEntry;
|
BOOLEAN EnabledOnEntry;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Threads inherit interrupt state so disable interrupts before we start thread
|
// Threads inherit interrupt state so disable interrupts before we start thread
|
||||||
@ -135,7 +129,7 @@ PthreadCreate (
|
|||||||
|
|
||||||
// Acquire lock for global, SecFakePthreadStart runs in a different thread.
|
// Acquire lock for global, SecFakePthreadStart runs in a different thread.
|
||||||
pthread_mutex_lock (&mThreadMangle.Mutex);
|
pthread_mutex_lock (&mThreadMangle.Mutex);
|
||||||
mThreadMangle.Start = Start;
|
mThreadMangle.Start = Start;
|
||||||
|
|
||||||
err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
|
err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
@ -151,17 +145,15 @@ PthreadCreate (
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
PthreadExit (
|
PthreadExit (
|
||||||
IN VOID *ValuePtr
|
IN VOID *ValuePtr
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pthread_exit (ValuePtr);
|
pthread_exit (ValuePtr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
PthreadSelf (
|
PthreadSelf (
|
||||||
VOID
|
VOID
|
||||||
@ -173,8 +165,7 @@ PthreadSelf (
|
|||||||
return (UINTN)pthread_self ();
|
return (UINTN)pthread_self ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
|
||||||
EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
|
|
||||||
GasketPthreadMutexLock,
|
GasketPthreadMutexLock,
|
||||||
GasketPthreadMutexUnLock,
|
GasketPthreadMutexUnLock,
|
||||||
GasketPthreadMutexTryLock,
|
GasketPthreadMutexTryLock,
|
||||||
@ -185,10 +176,9 @@ EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
|
|||||||
GasketPthreadSelf
|
GasketPthreadSelf
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PthreadOpen (
|
PthreadOpen (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (This->Instance != 0) {
|
if (This->Instance != 0) {
|
||||||
@ -206,17 +196,15 @@ PthreadOpen (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PthreadClose (
|
PthreadClose (
|
||||||
IN EMU_IO_THUNK_PROTOCOL *This
|
IN EMU_IO_THUNK_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
|
||||||
EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
|
|
||||||
&gEmuThreadThunkProtocolGuid,
|
&gEmuThreadThunkProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
@ -225,5 +213,3 @@ EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
|
|||||||
GasketPthreadClose,
|
GasketPthreadClose,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
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
Reference in New Issue
Block a user