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
@ -11,53 +11,48 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
#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 {
|
||||
UINTN Signature;
|
||||
UINTN Signature;
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||
EMU_SNP_PROTOCOL EmuSnp;
|
||||
EFI_SIMPLE_NETWORK_MODE *Mode;
|
||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||
EMU_SNP_PROTOCOL EmuSnp;
|
||||
EFI_SIMPLE_NETWORK_MODE *Mode;
|
||||
|
||||
int BpfFd;
|
||||
char *InterfaceName;
|
||||
EFI_MAC_ADDRESS MacAddress;
|
||||
u_int ReadBufferSize;
|
||||
VOID *ReadBuffer;
|
||||
int BpfFd;
|
||||
char *InterfaceName;
|
||||
EFI_MAC_ADDRESS MacAddress;
|
||||
u_int ReadBufferSize;
|
||||
VOID *ReadBuffer;
|
||||
|
||||
//
|
||||
// Two walking pointers to manage the multiple packets that can be returned
|
||||
// in a single read.
|
||||
//
|
||||
VOID *CurrentReadPointer;
|
||||
VOID *EndReadPointer;
|
||||
|
||||
UINT32 ReceivedPackets;
|
||||
UINT32 DroppedPackets;
|
||||
VOID *CurrentReadPointer;
|
||||
VOID *EndReadPointer;
|
||||
|
||||
UINT32 ReceivedPackets;
|
||||
UINT32 DroppedPackets;
|
||||
} EMU_SNP_PRIVATE;
|
||||
|
||||
#define EMU_SNP_PRIVATE_DATA_FROM_THIS(a) \
|
||||
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...
|
||||
//
|
||||
|
||||
typedef struct {
|
||||
UINT8 DstAddr[NET_ETHER_ADDR_LEN];
|
||||
UINT8 SrcAddr[NET_ETHER_ADDR_LEN];
|
||||
UINT16 Type;
|
||||
UINT8 DstAddr[NET_ETHER_ADDR_LEN];
|
||||
UINT8 SrcAddr[NET_ETHER_ADDR_LEN];
|
||||
UINT16 Type;
|
||||
} ETHERNET_HEADER;
|
||||
|
||||
/**
|
||||
@ -76,7 +71,7 @@ EmuSnpCreateMapping (
|
||||
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -100,40 +95,38 @@ EmuSnpCreateMapping (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static struct bpf_insn mFilterInstructionTemplate[] = {
|
||||
static struct bpf_insn mFilterInstructionTemplate[] = {
|
||||
// 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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0xFFFF, 1, 0),
|
||||
BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 0xFFFF, 1, 0),
|
||||
|
||||
// Reject packet.
|
||||
BPF_STMT (BPF_RET + BPF_K, 0),
|
||||
BPF_STMT (BPF_RET + BPF_K, 0),
|
||||
|
||||
// Receive entire packet.
|
||||
BPF_STMT (BPF_RET + BPF_K, -1)
|
||||
BPF_STMT (BPF_RET + BPF_K, -1)
|
||||
};
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
OpenBpfFileDescriptor (
|
||||
IN EMU_SNP_PRIVATE *Private,
|
||||
@ -171,7 +164,6 @@ OpenBpfFileDescriptor (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Changes the state of a network interface from "stopped" to "started".
|
||||
|
||||
@ -189,15 +181,15 @@ EmuSnpStart (
|
||||
IN EMU_SNP_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
struct ifreq BoundIf;
|
||||
struct bpf_program BpfProgram;
|
||||
struct bpf_insn *FilterProgram;
|
||||
EFI_STATUS Status;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
struct ifreq BoundIf;
|
||||
struct bpf_program BpfProgram;
|
||||
struct bpf_insn *FilterProgram;
|
||||
u_int Value;
|
||||
u_int ReadBufferSize;
|
||||
UINT16 Temp16;
|
||||
UINT32 Temp32;
|
||||
UINT16 Temp16;
|
||||
UINT32 Temp32;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -215,7 +207,7 @@ EmuSnpStart (
|
||||
break;
|
||||
}
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
Private->ReadBuffer = NULL;
|
||||
if (Private->BpfFd == 0) {
|
||||
Status = OpenBpfFileDescriptor (Private, &Private->BpfFd);
|
||||
@ -282,7 +274,7 @@ EmuSnpStart (
|
||||
// Allocate read buffer.
|
||||
//
|
||||
Private->ReadBufferSize = ReadBufferSize;
|
||||
Private->ReadBuffer = malloc (Private->ReadBufferSize);
|
||||
Private->ReadBuffer = malloc (Private->ReadBufferSize);
|
||||
if (Private->ReadBuffer == NULL) {
|
||||
goto ErrorExit;
|
||||
}
|
||||
@ -293,7 +285,7 @@ EmuSnpStart (
|
||||
// Install our packet filter: successful reads should only produce broadcast or unicast
|
||||
// packets directed to our fake MAC address.
|
||||
//
|
||||
FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;
|
||||
FilterProgram = malloc (sizeof (mFilterInstructionTemplate));
|
||||
if ( FilterProgram == NULL ) {
|
||||
goto ErrorExit;
|
||||
}
|
||||
@ -308,7 +300,7 @@ EmuSnpStart (
|
||||
CopyMem (&Temp16, &Private->Mode->CurrentAddress.Addr[4], sizeof (UINT16));
|
||||
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;
|
||||
|
||||
if (ioctl (Private->BpfFd, BIOCSETF, &BpfProgram) < 0) {
|
||||
@ -324,7 +316,6 @@ EmuSnpStart (
|
||||
goto DeviceErrorExit;
|
||||
}
|
||||
|
||||
|
||||
Private->Mode->State = EfiSimpleNetworkStarted;
|
||||
}
|
||||
|
||||
@ -337,10 +328,10 @@ ErrorExit:
|
||||
free (Private->ReadBuffer);
|
||||
Private->ReadBuffer = NULL;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Changes the state of a network interface from "started" to "stopped".
|
||||
|
||||
@ -358,7 +349,7 @@ EmuSnpStop (
|
||||
IN EMU_SNP_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -381,7 +372,7 @@ EmuSnpStop (
|
||||
}
|
||||
|
||||
if (Private->ReadBuffer != NULL) {
|
||||
free (Private->ReadBuffer );
|
||||
free (Private->ReadBuffer);
|
||||
Private->CurrentReadPointer = Private->EndReadPointer = Private->ReadBuffer = NULL;
|
||||
}
|
||||
|
||||
@ -390,7 +381,6 @@ EmuSnpStop (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Resets a network adapter and allocates the transmit and receive buffers
|
||||
required by the network interface; optionally, also requests allocation
|
||||
@ -419,12 +409,12 @@ EmuSnpStop (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpInitialize (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -441,7 +431,7 @@ EmuSnpInitialize (
|
||||
break;
|
||||
}
|
||||
|
||||
Private->Mode->MCastFilterCount = 0;
|
||||
Private->Mode->MCastFilterCount = 0;
|
||||
Private->Mode->ReceiveFilterSetting = 0;
|
||||
ZeroMem (Private->Mode->MCastFilter, sizeof (Private->Mode->MCastFilter));
|
||||
|
||||
@ -450,7 +440,6 @@ EmuSnpInitialize (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Resets a network adapter and re-initializes it with the parameters that were
|
||||
provided in the previous call to Initialize().
|
||||
@ -469,11 +458,11 @@ EmuSnpInitialize (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpReset (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -493,7 +482,6 @@ EmuSnpReset (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Resets a network adapter and leaves it in a state that is safe for
|
||||
another driver to initialize.
|
||||
@ -512,7 +500,7 @@ EmuSnpShutdown (
|
||||
IN EMU_SNP_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -532,7 +520,7 @@ EmuSnpShutdown (
|
||||
Private->Mode->State = EfiSimpleNetworkStarted;
|
||||
|
||||
Private->Mode->ReceiveFilterSetting = 0;
|
||||
Private->Mode->MCastFilterCount = 0;
|
||||
Private->Mode->MCastFilterCount = 0;
|
||||
ZeroMem (Private->Mode->MCastFilter, sizeof (Private->Mode->MCastFilter));
|
||||
|
||||
if (Private->BpfFd != 0) {
|
||||
@ -574,15 +562,15 @@ EmuSnpShutdown (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpReceiveFilters (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINT32 Enable,
|
||||
IN UINT32 Disable,
|
||||
IN BOOLEAN ResetMCastFilter,
|
||||
IN UINTN MCastFilterCnt OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINT32 Enable,
|
||||
IN UINT32 Disable,
|
||||
IN BOOLEAN ResetMCastFilter,
|
||||
IN UINTN MCastFilterCnt OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -590,7 +578,6 @@ EmuSnpReceiveFilters (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Modifies or resets the current station address, if supported.
|
||||
|
||||
@ -608,19 +595,18 @@ EmuSnpReceiveFilters (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpStationAddress (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Resets or collects the statistics on a network interface.
|
||||
|
||||
@ -644,20 +630,19 @@ EmuSnpStationAddress (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpStatistics (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Converts a multicast IP address to a multicast HW MAC address.
|
||||
|
||||
@ -681,20 +666,19 @@ EmuSnpStatistics (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpMCastIpToMac (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN IPv6,
|
||||
IN EFI_IP_ADDRESS *IP,
|
||||
OUT EFI_MAC_ADDRESS *MAC
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN IPv6,
|
||||
IN EFI_IP_ADDRESS *IP,
|
||||
OUT EFI_MAC_ADDRESS *MAC
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Performs read and write operations on the NVRAM device attached to a
|
||||
network interface.
|
||||
@ -717,14 +701,14 @@ EmuSnpMCastIpToMac (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpNvData (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ReadWrite,
|
||||
IN UINTN Offset,
|
||||
IN UINTN BufferSize,
|
||||
IN OUT VOID *Buffer
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ReadWrite,
|
||||
IN UINTN Offset,
|
||||
IN UINTN BufferSize,
|
||||
IN OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -758,12 +742,12 @@ EmuSnpNvData (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpGetStatus (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||
OUT VOID **TxBuf OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||
OUT VOID **TxBuf OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -774,7 +758,6 @@ EmuSnpGetStatus (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Places a packet in the transmit queue of a network interface.
|
||||
|
||||
@ -810,17 +793,17 @@ EmuSnpGetStatus (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpTransmit (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN HeaderSize,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer,
|
||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
IN UINT16 *Protocol OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN HeaderSize,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer,
|
||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
IN UINT16 *Protocol OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
ETHERNET_HEADER *EnetHeader;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
ETHERNET_HEADER *EnetHeader;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -837,15 +820,15 @@ EmuSnpTransmit (
|
||||
SrcAddr = &Private->Mode->CurrentAddress;
|
||||
}
|
||||
|
||||
EnetHeader = (ETHERNET_HEADER *) Buffer;
|
||||
EnetHeader = (ETHERNET_HEADER *)Buffer;
|
||||
|
||||
CopyMem (EnetHeader->DstAddr, DestAddr, 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;
|
||||
}
|
||||
|
||||
@ -886,20 +869,20 @@ EmuSnpTransmit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpReceive (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINTN *HeaderSize OPTIONAL,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer,
|
||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
OUT UINT16 *Protocol OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINTN *HeaderSize OPTIONAL,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer,
|
||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
OUT UINT16 *Protocol OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
struct bpf_hdr *BpfHeader;
|
||||
struct bpf_stat BpfStats;
|
||||
ETHERNET_HEADER *EnetHeader;
|
||||
ssize_t Result;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
struct bpf_hdr *BpfHeader;
|
||||
struct bpf_stat BpfStats;
|
||||
ETHERNET_HEADER *EnetHeader;
|
||||
ssize_t Result;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -907,7 +890,7 @@ EmuSnpReceive (
|
||||
return EFI_NOT_STARTED;
|
||||
}
|
||||
|
||||
ZeroMem (&BpfStats, sizeof( BpfStats));
|
||||
ZeroMem (&BpfStats, sizeof (BpfStats));
|
||||
|
||||
if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
|
||||
Private->ReceivedPackets += BpfStats.bs_recv;
|
||||
@ -936,10 +919,10 @@ EmuSnpReceive (
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (BpfHeader->bh_caplen > *BufferSize) {
|
||||
@ -972,8 +955,7 @@ EmuSnpReceive (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
||||
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
||||
GasketSnpCreateMapping,
|
||||
GasketSnpStart,
|
||||
GasketSnpStop,
|
||||
@ -992,7 +974,7 @@ EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
||||
|
||||
EFI_STATUS
|
||||
GetInterfaceMacAddr (
|
||||
EMU_SNP_PRIVATE *Private
|
||||
EMU_SNP_PRIVATE *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -1020,12 +1002,12 @@ GetInterfaceMacAddr (
|
||||
);
|
||||
|
||||
Status = EFI_NOT_FOUND;
|
||||
If = IfAddrs;
|
||||
If = IfAddrs;
|
||||
while (If != NULL) {
|
||||
IfSdl = (struct sockaddr_dl *)If->ifa_addr;
|
||||
|
||||
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);
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
@ -1041,10 +1023,9 @@ Exit:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuSnpThunkOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
@ -1062,7 +1043,6 @@ EmuSnpThunkOpen (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
Private->Signature = EMU_SNP_PRIVATE_SIGNATURE;
|
||||
Private->Thunk = This;
|
||||
CopyMem (&Private->EmuSnp, &gEmuSnpProtocol, sizeof (gEmuSnpProtocol));
|
||||
@ -1073,10 +1053,9 @@ EmuSnpThunkOpen (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuSnpThunkClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
@ -1091,9 +1070,7 @@ EmuSnpThunkClose (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
|
||||
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
|
||||
&gEmuSnpProtocolGuid,
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -7,41 +7,37 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
#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 {
|
||||
UINTN Signature;
|
||||
UINTN Signature;
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||
|
||||
char *Filename;
|
||||
UINTN ReadMode;
|
||||
UINTN Mode;
|
||||
char *Filename;
|
||||
UINTN ReadMode;
|
||||
UINTN Mode;
|
||||
|
||||
int fd;
|
||||
int fd;
|
||||
|
||||
BOOLEAN RemovableMedia;
|
||||
BOOLEAN WriteProtected;
|
||||
BOOLEAN RemovableMedia;
|
||||
BOOLEAN WriteProtected;
|
||||
|
||||
UINT64 NumberOfBlocks;
|
||||
UINT32 BlockSize;
|
||||
|
||||
EMU_BLOCK_IO_PROTOCOL EmuBlockIo;
|
||||
EFI_BLOCK_IO_MEDIA *Media;
|
||||
UINT64 NumberOfBlocks;
|
||||
UINT32 BlockSize;
|
||||
|
||||
EMU_BLOCK_IO_PROTOCOL EmuBlockIo;
|
||||
EFI_BLOCK_IO_MEDIA *Media;
|
||||
} EMU_BLOCK_IO_PRIVATE;
|
||||
|
||||
#define EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS(a) \
|
||||
CR(a, EMU_BLOCK_IO_PRIVATE, EmuBlockIo, EMU_BLOCK_IO_PRIVATE_SIGNATURE)
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuBlockIoReset (
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
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
|
||||
SetFilePointer64 (
|
||||
IN EMU_BLOCK_IO_PRIVATE *Private,
|
||||
IN INT64 DistanceToMove,
|
||||
OUT UINT64 *NewFilePointer,
|
||||
IN INT32 MoveMethod
|
||||
IN EMU_BLOCK_IO_PRIVATE *Private,
|
||||
IN INT64 DistanceToMove,
|
||||
OUT UINT64 *NewFilePointer,
|
||||
IN INT32 MoveMethod
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
off_t res;
|
||||
off_t offset = DistanceToMove;
|
||||
EFI_STATUS Status;
|
||||
off_t res;
|
||||
off_t offset = DistanceToMove;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
res = lseek (Private->fd, offset, (int)MoveMethod);
|
||||
res = lseek (Private->fd, offset, (int)MoveMethod);
|
||||
if (res == -1) {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@ -72,16 +68,14 @@ SetFilePointer64 (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuBlockIoOpenDevice (
|
||||
IN EMU_BLOCK_IO_PRIVATE *Private
|
||||
IN EMU_BLOCK_IO_PRIVATE *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 FileSize;
|
||||
struct statfs buf;
|
||||
|
||||
EFI_STATUS Status;
|
||||
UINT64 FileSize;
|
||||
struct statfs buf;
|
||||
|
||||
//
|
||||
// If the device is already opened, close it
|
||||
@ -95,9 +89,9 @@ EmuBlockIoOpenDevice (
|
||||
//
|
||||
Private->fd = open (Private->Filename, Private->Mode, 0644);
|
||||
if (Private->fd < 0) {
|
||||
printf ("EmuOpenBlock: Could not open %s: %s\n", Private->Filename, strerror(errno));
|
||||
Private->Media->MediaPresent = FALSE;
|
||||
Status = EFI_NO_MEDIA;
|
||||
printf ("EmuOpenBlock: Could not open %s: %s\n", Private->Filename, strerror (errno));
|
||||
Private->Media->MediaPresent = FALSE;
|
||||
Status = EFI_NO_MEDIA;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
@ -120,13 +114,14 @@ EmuBlockIoOpenDevice (
|
||||
|
||||
if (FileSize == 0) {
|
||||
// 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) {
|
||||
Private->Media->BlockSize = BlockSize;
|
||||
}
|
||||
|
||||
if (ioctl (Private->fd, DKIOCGETBLOCKCOUNT, &Private->NumberOfBlocks) == 0) {
|
||||
if ((Private->NumberOfBlocks == 0) && (BlockSize == 0x800)) {
|
||||
// A DVD is ~ 4.37 GB so make up a number
|
||||
@ -135,34 +130,35 @@ EmuBlockIoOpenDevice (
|
||||
Private->Media->LastBlock = Private->NumberOfBlocks - 1;
|
||||
}
|
||||
}
|
||||
|
||||
ioctl (Private->fd, DKIOCGETMAXBLOCKCOUNTWRITE, &Private->Media->OptimalTransferLengthGranularity);
|
||||
}
|
||||
#else
|
||||
#else
|
||||
{
|
||||
size_t BlockSize;
|
||||
UINT64 DiskSize;
|
||||
size_t BlockSize;
|
||||
UINT64 DiskSize;
|
||||
|
||||
if (ioctl (Private->fd, BLKSSZGET, &BlockSize) == 0) {
|
||||
Private->Media->BlockSize = BlockSize;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
} else {
|
||||
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;
|
||||
|
||||
if (fstatfs (Private->fd, &buf) == 0) {
|
||||
#if __APPLE__
|
||||
#if __APPLE__
|
||||
Private->Media->OptimalTransferLengthGranularity = buf.f_iosize/buf.f_bsize;
|
||||
#else
|
||||
#else
|
||||
Private->Media->OptimalTransferLengthGranularity = buf.f_bsize/buf.f_bsize;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -179,15 +175,14 @@ Done:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuBlockIoCreateMapping (
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN EFI_BLOCK_IO_MEDIA *Media
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN EFI_BLOCK_IO_MEDIA *Media
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
EFI_STATUS Status;
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
|
||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -206,66 +201,61 @@ EmuBlockIoCreateMapping (
|
||||
Media->LowestAlignedLba = 0;
|
||||
Media->LogicalBlocksPerPhysicalBlock = 0;
|
||||
|
||||
|
||||
// EFI_BLOCK_IO_PROTOCOL_REVISION3
|
||||
Media->OptimalTransferLengthGranularity = 0;
|
||||
|
||||
Status = EmuBlockIoOpenDevice (Private);
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuBlockIoError (
|
||||
IN EMU_BLOCK_IO_PRIVATE *Private
|
||||
IN EMU_BLOCK_IO_PRIVATE *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN ReinstallBlockIoFlag;
|
||||
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN ReinstallBlockIoFlag;
|
||||
|
||||
switch (errno) {
|
||||
case EAGAIN:
|
||||
Status = EFI_NO_MEDIA;
|
||||
Private->Media->ReadOnly = FALSE;
|
||||
Private->Media->MediaPresent = FALSE;
|
||||
ReinstallBlockIoFlag = FALSE;
|
||||
break;
|
||||
|
||||
case EAGAIN:
|
||||
Status = EFI_NO_MEDIA;
|
||||
Private->Media->ReadOnly = FALSE;
|
||||
Private->Media->MediaPresent = FALSE;
|
||||
ReinstallBlockIoFlag = FALSE;
|
||||
break;
|
||||
case EACCES:
|
||||
Private->Media->ReadOnly = FALSE;
|
||||
Private->Media->MediaPresent = TRUE;
|
||||
Private->Media->MediaId += 1;
|
||||
ReinstallBlockIoFlag = TRUE;
|
||||
Status = EFI_MEDIA_CHANGED;
|
||||
break;
|
||||
|
||||
case EACCES:
|
||||
Private->Media->ReadOnly = FALSE;
|
||||
Private->Media->MediaPresent = TRUE;
|
||||
Private->Media->MediaId += 1;
|
||||
ReinstallBlockIoFlag = TRUE;
|
||||
Status = EFI_MEDIA_CHANGED;
|
||||
break;
|
||||
case EROFS:
|
||||
Private->Media->ReadOnly = TRUE;
|
||||
ReinstallBlockIoFlag = FALSE;
|
||||
Status = EFI_WRITE_PROTECTED;
|
||||
break;
|
||||
|
||||
case EROFS:
|
||||
Private->Media->ReadOnly = TRUE;
|
||||
ReinstallBlockIoFlag = FALSE;
|
||||
Status = EFI_WRITE_PROTECTED;
|
||||
break;
|
||||
|
||||
default:
|
||||
ReinstallBlockIoFlag = FALSE;
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
break;
|
||||
default:
|
||||
ReinstallBlockIoFlag = FALSE;
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuBlockIoReadWriteCommon (
|
||||
IN EMU_BLOCK_IO_PRIVATE *Private,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer,
|
||||
IN CHAR8 *CallerName
|
||||
IN EMU_BLOCK_IO_PRIVATE *Private,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer,
|
||||
IN CHAR8 *CallerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -290,7 +280,7 @@ EmuBlockIoReadWriteCommon (
|
||||
return EFI_MEDIA_CHANGED;
|
||||
}
|
||||
|
||||
if ((UINTN) Buffer % Private->Media->IoAlign != 0) {
|
||||
if ((UINTN)Buffer % Private->Media->IoAlign != 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -313,11 +303,12 @@ EmuBlockIoReadWriteCommon (
|
||||
DEBUG ((DEBUG_INIT, "ReadBlocks: Attempted to read off end of device\n"));
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Seek to End of File
|
||||
//
|
||||
DistanceToMove = MultU64x32 (Lba, BlockSize);
|
||||
Status = SetFilePointer64 (Private, DistanceToMove, &DistanceMoved, SEEK_SET);
|
||||
Status = SetFilePointer64 (Private, DistanceToMove, &DistanceMoved, SEEK_SET);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_INIT, "WriteBlocks: SetFilePointer failed\n"));
|
||||
@ -327,7 +318,6 @@ EmuBlockIoReadWriteCommon (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Read BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@ -368,16 +358,16 @@ EmuBlockIoReadBlocks (
|
||||
IN EFI_LBA LBA,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
ssize_t len;
|
||||
EFI_STATUS Status;
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
ssize_t len;
|
||||
|
||||
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)) {
|
||||
goto Done;
|
||||
}
|
||||
@ -393,7 +383,7 @@ EmuBlockIoReadBlocks (
|
||||
// If we read then media is present.
|
||||
//
|
||||
Private->Media->MediaPresent = TRUE;
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
Done:
|
||||
if (Token != NULL) {
|
||||
@ -403,10 +393,10 @@ Done:
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Write BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@ -448,14 +438,13 @@ EmuBlockIoWriteBlocks (
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
ssize_t len;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
ssize_t len;
|
||||
EFI_STATUS Status;
|
||||
|
||||
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)) {
|
||||
goto Done;
|
||||
}
|
||||
@ -472,7 +461,7 @@ EmuBlockIoWriteBlocks (
|
||||
//
|
||||
Private->Media->MediaPresent = TRUE;
|
||||
Private->Media->ReadOnly = FALSE;
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
Done:
|
||||
if (Token != NULL) {
|
||||
@ -486,7 +475,6 @@ Done:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Flush the Block Device.
|
||||
|
||||
@ -511,22 +499,21 @@ Done:
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuBlockIoFlushBlocks (
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
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);
|
||||
|
||||
if (Private->fd >= 0) {
|
||||
fsync (Private->fd);
|
||||
#if __APPLE__
|
||||
#if __APPLE__
|
||||
fcntl (Private->fd, F_FULLFSYNC);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
if (Token != NULL) {
|
||||
if (Token->Event != NULL) {
|
||||
// Caller is responsible for signaling EFI Event
|
||||
@ -538,7 +525,6 @@ EmuBlockIoFlushBlocks (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reset the block device hardware.
|
||||
|
||||
@ -554,11 +540,11 @@ EmuBlockIoFlushBlocks (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuBlockIoReset (
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
|
||||
Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -570,17 +556,16 @@ EmuBlockIoReset (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
StdDupUnicodeToAscii (
|
||||
IN CHAR16 *Str
|
||||
IN CHAR16 *Str
|
||||
)
|
||||
{
|
||||
UINTN Size;
|
||||
char *Ascii;
|
||||
char *Ptr;
|
||||
UINTN Size;
|
||||
char *Ascii;
|
||||
char *Ptr;
|
||||
|
||||
Size = StrLen (Str) + 1;
|
||||
Size = StrLen (Str) + 1;
|
||||
Ascii = malloc (Size);
|
||||
if (Ascii == NULL) {
|
||||
return NULL;
|
||||
@ -589,13 +574,13 @@ StdDupUnicodeToAscii (
|
||||
for (Ptr = Ascii; *Str != '\0'; Ptr++, Str++) {
|
||||
*Ptr = *Str;
|
||||
}
|
||||
|
||||
*Ptr = 0;
|
||||
|
||||
return Ascii;
|
||||
}
|
||||
|
||||
|
||||
EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
|
||||
EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
|
||||
GasketEmuBlockIoReset,
|
||||
GasketEmuBlockIoReadBlocks,
|
||||
GasketEmuBlockIoWriteBlocks,
|
||||
@ -605,7 +590,7 @@ EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
|
||||
|
||||
EFI_STATUS
|
||||
EmuBlockIoThunkOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
@ -624,7 +609,6 @@ EmuBlockIoThunkOpen (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
Private->Signature = EMU_BLOCK_IO_PRIVATE_SIGNATURE;
|
||||
Private->Thunk = This;
|
||||
CopyMem (&Private->EmuBlockIo, &gEmuBlockIoProtocol, sizeof (gEmuBlockIoProtocol));
|
||||
@ -642,12 +626,14 @@ EmuBlockIoThunkOpen (
|
||||
Private->WriteProtected = FALSE;
|
||||
} else {
|
||||
for (*Str++ = '\0'; *Str != 0; Str++) {
|
||||
if (*Str == 'R' || *Str == 'F') {
|
||||
Private->RemovableMedia = (BOOLEAN) (*Str == 'R');
|
||||
if ((*Str == 'R') || (*Str == 'F')) {
|
||||
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 == ':') {
|
||||
Private->BlockSize = strtol (++Str, NULL, 0);
|
||||
break;
|
||||
@ -662,10 +648,9 @@ EmuBlockIoThunkOpen (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuBlockIoThunkClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_BLOCK_IO_PRIVATE *Private;
|
||||
@ -680,6 +665,7 @@ EmuBlockIoThunkClose (
|
||||
if (Private->Filename != NULL) {
|
||||
free (Private->Filename);
|
||||
}
|
||||
|
||||
free (This->Private);
|
||||
This->Private = NULL;
|
||||
}
|
||||
@ -687,9 +673,7 @@ EmuBlockIoThunkClose (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo = {
|
||||
EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo = {
|
||||
&gEmuBlockIoProtocolGuid,
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -18,43 +18,41 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include "Host.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
#define DebugAssert _Mangle__DebugAssert
|
||||
#define DebugAssert _Mangle__DebugAssert
|
||||
|
||||
#include <assert.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_time.h>
|
||||
#include <assert.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_time.h>
|
||||
|
||||
#undef DebugAssert
|
||||
#undef DebugAssert
|
||||
#endif
|
||||
|
||||
int settimer_initialized;
|
||||
struct timeval settimer_timeval;
|
||||
UINTN settimer_callback = 0;
|
||||
|
||||
BOOLEAN gEmulatorInterruptEnabled = FALSE;
|
||||
int settimer_initialized;
|
||||
struct timeval settimer_timeval;
|
||||
UINTN settimer_callback = 0;
|
||||
|
||||
BOOLEAN gEmulatorInterruptEnabled = FALSE;
|
||||
|
||||
UINTN
|
||||
SecWriteStdErr (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
ssize_t Return;
|
||||
ssize_t Return;
|
||||
|
||||
Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
|
||||
|
||||
return (Return == -1) ? 0 : Return;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
SecConfigStdIn (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
struct termios tty;
|
||||
struct termios tty;
|
||||
|
||||
//
|
||||
// Need to turn off line buffering, ECHO, and make it unbuffered.
|
||||
@ -63,7 +61,7 @@ SecConfigStdIn (
|
||||
tty.c_lflag &= ~(ICANON | ECHO);
|
||||
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
|
||||
return EFI_SUCCESS;
|
||||
@ -71,11 +69,11 @@ SecConfigStdIn (
|
||||
|
||||
UINTN
|
||||
SecWriteStdOut (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
ssize_t Return;
|
||||
ssize_t Return;
|
||||
|
||||
Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
|
||||
|
||||
@ -84,11 +82,11 @@ SecWriteStdOut (
|
||||
|
||||
UINTN
|
||||
SecReadStdIn (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
ssize_t Return;
|
||||
ssize_t Return;
|
||||
|
||||
Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
|
||||
|
||||
@ -100,8 +98,8 @@ SecPollStdIn (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
int Result;
|
||||
int Bytes;
|
||||
int Result;
|
||||
int Bytes;
|
||||
|
||||
Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
|
||||
if (Result == -1) {
|
||||
@ -111,10 +109,9 @@ SecPollStdIn (
|
||||
return (BOOLEAN)(Bytes > 0);
|
||||
}
|
||||
|
||||
|
||||
VOID *
|
||||
SecMalloc (
|
||||
IN UINTN Size
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
return malloc ((size_t)Size);
|
||||
@ -122,7 +119,7 @@ SecMalloc (
|
||||
|
||||
VOID *
|
||||
SecValloc (
|
||||
IN UINTN Size
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
return valloc ((size_t)Size);
|
||||
@ -130,7 +127,7 @@ SecValloc (
|
||||
|
||||
BOOLEAN
|
||||
SecFree (
|
||||
IN VOID *Ptr
|
||||
IN VOID *Ptr
|
||||
)
|
||||
{
|
||||
if (EfiSystemMemoryRange (Ptr)) {
|
||||
@ -143,17 +140,18 @@ SecFree (
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
settimer_handler (int sig)
|
||||
settimer_handler (
|
||||
int sig
|
||||
)
|
||||
{
|
||||
struct timeval timeval;
|
||||
UINT64 delta;
|
||||
struct timeval timeval;
|
||||
UINT64 delta;
|
||||
|
||||
gettimeofday (&timeval, NULL);
|
||||
delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
|
||||
- ((UINT64)settimer_timeval.tv_sec * 1000)
|
||||
- (settimer_timeval.tv_usec / 1000);
|
||||
- ((UINT64)settimer_timeval.tv_sec * 1000)
|
||||
- (settimer_timeval.tv_usec / 1000);
|
||||
settimer_timeval = timeval;
|
||||
|
||||
if (settimer_callback) {
|
||||
@ -167,37 +165,39 @@ SecSetTimer (
|
||||
IN EMU_SET_TIMER_CALLBACK CallBack
|
||||
)
|
||||
{
|
||||
struct itimerval timerval;
|
||||
UINT32 remainder;
|
||||
struct itimerval timerval;
|
||||
UINT32 remainder;
|
||||
|
||||
if (!settimer_initialized) {
|
||||
struct sigaction act;
|
||||
struct sigaction act;
|
||||
|
||||
settimer_initialized = 1;
|
||||
act.sa_handler = settimer_handler;
|
||||
act.sa_flags = 0;
|
||||
act.sa_handler = settimer_handler;
|
||||
act.sa_flags = 0;
|
||||
sigemptyset (&act.sa_mask);
|
||||
gEmulatorInterruptEnabled = TRUE;
|
||||
if (sigaction (SIGALRM, &act, NULL) != 0) {
|
||||
printf ("SetTimer: sigaction error %s\n", strerror (errno));
|
||||
}
|
||||
|
||||
if (gettimeofday (&settimer_timeval, NULL) != 0) {
|
||||
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_sec = DivU64x32(PeriodMs, 1000);
|
||||
timerval.it_interval = timerval.it_value;
|
||||
timerval.it_value.tv_sec = DivU64x32 (PeriodMs, 1000);
|
||||
timerval.it_interval = timerval.it_value;
|
||||
|
||||
if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
|
||||
printf ("SetTimer: setitimer error %s\n", strerror (errno));
|
||||
}
|
||||
|
||||
settimer_callback = (UINTN)CallBack;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecEnableInterrupt (
|
||||
VOID
|
||||
@ -213,7 +213,6 @@ SecEnableInterrupt (
|
||||
pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecDisableInterrupt (
|
||||
VOID
|
||||
@ -229,14 +228,14 @@ SecDisableInterrupt (
|
||||
gEmulatorInterruptEnabled = FALSE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
SecInterruptEanbled (void)
|
||||
SecInterruptEanbled (
|
||||
void
|
||||
)
|
||||
{
|
||||
return gEmulatorInterruptEnabled;
|
||||
}
|
||||
|
||||
|
||||
UINT64
|
||||
QueryPerformanceFrequency (
|
||||
VOID
|
||||
@ -251,10 +250,9 @@ QueryPerformanceCounter (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
#if __APPLE__
|
||||
UINT64 Start;
|
||||
static mach_timebase_info_data_t sTimebaseInfo;
|
||||
|
||||
#if __APPLE__
|
||||
UINT64 Start;
|
||||
static mach_timebase_info_data_t sTimebaseInfo;
|
||||
|
||||
Start = mach_absolute_time ();
|
||||
|
||||
@ -266,29 +264,27 @@ QueryPerformanceCounter (
|
||||
// denominator is a fraction.
|
||||
|
||||
if ( sTimebaseInfo.denom == 0 ) {
|
||||
(void) mach_timebase_info(&sTimebaseInfo);
|
||||
(void)mach_timebase_info (&sTimebaseInfo);
|
||||
}
|
||||
|
||||
// Do the maths. We hope that the multiplication doesn't
|
||||
// overflow; the price you pay for working in fixed point.
|
||||
|
||||
return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
|
||||
#else
|
||||
#else
|
||||
// Need to figure out what to do for Linux?
|
||||
return 0;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
SecSleep (
|
||||
IN UINT64 Nanoseconds
|
||||
IN UINT64 Nanoseconds
|
||||
)
|
||||
{
|
||||
struct timespec rq, rm;
|
||||
struct timeval start, end;
|
||||
unsigned long MicroSec;
|
||||
struct timespec rq, rm;
|
||||
struct timeval start, end;
|
||||
unsigned long MicroSec;
|
||||
|
||||
rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
|
||||
rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
|
||||
@ -299,7 +295,7 @@ SecSleep (
|
||||
//
|
||||
gettimeofday (&start, NULL);
|
||||
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;
|
||||
if (MicroSec > 1000000) {
|
||||
end.tv_sec++;
|
||||
@ -309,23 +305,26 @@ SecSleep (
|
||||
if (errno != EINTR) {
|
||||
break;
|
||||
}
|
||||
|
||||
gettimeofday (&start, NULL);
|
||||
if (start.tv_sec > end.tv_sec) {
|
||||
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;
|
||||
}
|
||||
|
||||
rq = rm;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecCpuSleep (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
struct timespec rq, rm;
|
||||
struct timespec rq, rm;
|
||||
|
||||
// nanosleep gets interrupted by the timer tic
|
||||
rq.tv_sec = 1;
|
||||
@ -334,51 +333,47 @@ SecCpuSleep (
|
||||
nanosleep (&rq, &rm);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecExit (
|
||||
UINTN Status
|
||||
UINTN Status
|
||||
)
|
||||
{
|
||||
exit (Status);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecGetTime (
|
||||
OUT EFI_TIME *Time,
|
||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||
OUT EFI_TIME *Time,
|
||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||
)
|
||||
{
|
||||
struct tm *tm;
|
||||
time_t t;
|
||||
struct tm *tm;
|
||||
time_t t;
|
||||
|
||||
t = time (NULL);
|
||||
t = time (NULL);
|
||||
tm = localtime (&t);
|
||||
|
||||
Time->Year = 1900 + tm->tm_year;
|
||||
Time->Month = tm->tm_mon + 1;
|
||||
Time->Day = tm->tm_mday;
|
||||
Time->Hour = tm->tm_hour;
|
||||
Time->Minute = tm->tm_min;
|
||||
Time->Second = tm->tm_sec;
|
||||
Time->Year = 1900 + tm->tm_year;
|
||||
Time->Month = tm->tm_mon + 1;
|
||||
Time->Day = tm->tm_mday;
|
||||
Time->Hour = tm->tm_hour;
|
||||
Time->Minute = tm->tm_min;
|
||||
Time->Second = tm->tm_sec;
|
||||
Time->Nanosecond = 0;
|
||||
Time->TimeZone = timezone / 60;
|
||||
Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
|
||||
| (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
|
||||
Time->TimeZone = timezone / 60;
|
||||
Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
|
||||
| (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
|
||||
|
||||
if (Capabilities != NULL) {
|
||||
Capabilities->Resolution = 1;
|
||||
Capabilities->Accuracy = 50000000;
|
||||
Capabilities->SetsToZero = FALSE;
|
||||
Capabilities->Resolution = 1;
|
||||
Capabilities->Accuracy = 50000000;
|
||||
Capabilities->SetsToZero = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
SecSetTime (
|
||||
IN EFI_TIME *Time
|
||||
IN EFI_TIME *Time
|
||||
)
|
||||
{
|
||||
// Don't change the time on the system
|
||||
@ -386,18 +381,16 @@ SecSetTime (
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
SecGetNextProtocol (
|
||||
IN BOOLEAN EmuBusDriver,
|
||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||
IN BOOLEAN EmuBusDriver,
|
||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||
)
|
||||
{
|
||||
return GetNextThunkProtocol (EmuBusDriver, Instance);
|
||||
}
|
||||
|
||||
|
||||
EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
|
||||
EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
|
||||
GasketSecWriteStdErr,
|
||||
GasketSecConfigStdIn,
|
||||
GasketSecWriteStdOut,
|
||||
@ -422,7 +415,6 @@ EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
|
||||
GasketSecGetNextProtocol
|
||||
};
|
||||
|
||||
|
||||
VOID
|
||||
SecInitThunkProtocol (
|
||||
VOID
|
||||
@ -431,4 +423,3 @@ SecInitThunkProtocol (
|
||||
// timezone and daylight lib globals depend on tzset be called 1st.
|
||||
tzset ();
|
||||
}
|
||||
|
||||
|
@ -17,8 +17,8 @@
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketSecWriteStdErr (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -30,15 +30,15 @@ GasketSecConfigStdIn (
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketSecWriteStdOut (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
);
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketSecReadStdIn (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
);
|
||||
|
||||
BOOLEAN
|
||||
@ -50,22 +50,21 @@ GasketSecPollStdIn (
|
||||
VOID *
|
||||
EFIAPI
|
||||
GasketSecMalloc (
|
||||
IN UINTN Size
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
VOID *
|
||||
EFIAPI
|
||||
GasketSecValloc (
|
||||
IN UINTN Size
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
GasketSecFree (
|
||||
IN VOID *Ptr
|
||||
IN VOID *Ptr
|
||||
);
|
||||
|
||||
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
GasketSecPeCoffGetEntryPoint (
|
||||
@ -116,11 +115,10 @@ GasketQueryPerformanceCounter (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GasketSecSleep (
|
||||
IN UINT64 Nanoseconds
|
||||
IN UINT64 Nanoseconds
|
||||
);
|
||||
|
||||
VOID
|
||||
@ -132,33 +130,31 @@ GasketSecCpuSleep (
|
||||
VOID
|
||||
EFIAPI
|
||||
GasketSecExit (
|
||||
UINTN Status
|
||||
UINTN Status
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GasketSecGetTime (
|
||||
OUT EFI_TIME *Time,
|
||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||
OUT EFI_TIME *Time,
|
||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GasketSecSetTime (
|
||||
IN EFI_TIME *Time
|
||||
IN EFI_TIME *Time
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSecGetNextProtocol (
|
||||
IN BOOLEAN EmuBusDriver,
|
||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||
IN BOOLEAN EmuBusDriver,
|
||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||
);
|
||||
|
||||
|
||||
// PPIs produced by SEC
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSecUnixPeiAutoScan (
|
||||
@ -173,7 +169,6 @@ GasketSecEmuThunkAddress (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSecUnixUnixFwhAddress (
|
||||
@ -181,55 +176,52 @@ GasketSecUnixUnixFwhAddress (
|
||||
IN OUT EFI_PHYSICAL_ADDRESS *FwhBase
|
||||
);
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Reverse (UNIX to EFIAPI) gaskets
|
||||
//
|
||||
|
||||
typedef
|
||||
void
|
||||
(EFIAPI *CALL_BACK) (
|
||||
(EFIAPI *CALL_BACK)(
|
||||
UINT64 Delta
|
||||
);
|
||||
|
||||
UINTN
|
||||
ReverseGasketUint64 (
|
||||
UINTN CallBack,
|
||||
UINT64 a
|
||||
UINTN CallBack,
|
||||
UINT64 a
|
||||
);
|
||||
|
||||
UINTN
|
||||
ReverseGasketUint64Uint64 (
|
||||
VOID *CallBack,
|
||||
VOID *Context,
|
||||
VOID *Key
|
||||
VOID *CallBack,
|
||||
VOID *Context,
|
||||
VOID *Key
|
||||
);
|
||||
|
||||
//
|
||||
// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
|
||||
//
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11Size (
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||
UINT32 Width,
|
||||
UINT32 Height
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||
UINT32 Width,
|
||||
UINT32 Height
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11CheckKey (
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11GetKey (
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||
EFI_KEY_DATA *key
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||
EFI_KEY_DATA *key
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -242,45 +234,44 @@ GasketX11KeySetState (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11RegisterKeyNotify (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
|
||||
IN VOID *Context
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11Blt (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
|
||||
IN EFI_UGA_BLT_OPERATION BltOperation,
|
||||
IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
|
||||
IN EFI_UGA_BLT_OPERATION BltOperation,
|
||||
IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11CheckPointer (
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11GetPointerState (
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||
EFI_SIMPLE_POINTER_STATE *state
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
|
||||
EFI_SIMPLE_POINTER_STATE *state
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11GraphicsWindowOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketX11GraphicsWindowClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
// Pthreads
|
||||
@ -288,55 +279,48 @@ GasketX11GraphicsWindowClose (
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketPthreadMutexLock (
|
||||
IN VOID *Mutex
|
||||
IN VOID *Mutex
|
||||
);
|
||||
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketPthreadMutexUnLock (
|
||||
IN VOID *Mutex
|
||||
IN VOID *Mutex
|
||||
);
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketPthreadMutexTryLock (
|
||||
IN VOID *Mutex
|
||||
IN VOID *Mutex
|
||||
);
|
||||
|
||||
|
||||
VOID *
|
||||
EFIAPI
|
||||
GasketPthreadMutexInit (
|
||||
IN VOID
|
||||
);
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketPthreadMutexDestroy (
|
||||
IN VOID *Mutex
|
||||
IN VOID *Mutex
|
||||
);
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketPthreadCreate (
|
||||
IN VOID *Thread,
|
||||
IN VOID *Attribute,
|
||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||
IN VOID *Context
|
||||
IN VOID *Thread,
|
||||
IN VOID *Attribute,
|
||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GasketPthreadExit (
|
||||
IN VOID *ValuePtr
|
||||
IN VOID *ValuePtr
|
||||
);
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
GasketPthreadSelf (
|
||||
@ -346,33 +330,32 @@ GasketPthreadSelf (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPthreadOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPthreadClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
|
||||
// PosixFileSystem
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixOpenVolume (
|
||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
||||
OUT EFI_FILE_PROTOCOL **Root
|
||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
||||
OUT EFI_FILE_PROTOCOL **Root
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileOpen (
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
OUT EFI_FILE_PROTOCOL **NewHandle,
|
||||
IN CHAR16 *FileName,
|
||||
IN UINT64 OpenMode,
|
||||
IN UINT64 Attributes
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
OUT EFI_FILE_PROTOCOL **NewHandle,
|
||||
IN CHAR16 *FileName,
|
||||
IN UINT64 OpenMode,
|
||||
IN UINT64 Attributes
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -390,49 +373,49 @@ GasketPosixFileDelete (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileRead (
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileWrite (
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN OUT UINTN *BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN OUT UINTN *BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileSetPossition (
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN UINT64 Position
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN UINT64 Position
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileGetPossition (
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
OUT UINT64 *Position
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
OUT UINT64 *Position
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileGetInfo (
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN EFI_GUID *InformationType,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN EFI_GUID *InformationType,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileSetInfo (
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN EFI_GUID *InformationType,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_FILE_PROTOCOL *This,
|
||||
IN EFI_GUID *InformationType,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -444,20 +427,20 @@ GasketPosixFileFlush (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileSystmeThunkOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketPosixFileSystmeThunkClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketEmuBlockIoReset (
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -468,7 +451,7 @@ GasketEmuBlockIoReadBlocks (
|
||||
IN EFI_LBA LBA,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -485,39 +468,39 @@ GasketEmuBlockIoWriteBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketEmuBlockIoFlushBlocks (
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketEmuBlockIoCreateMapping (
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN EFI_BLOCK_IO_MEDIA *Media
|
||||
IN EMU_BLOCK_IO_PROTOCOL *This,
|
||||
IN EFI_BLOCK_IO_MEDIA *Media
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketBlockIoThunkOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketBlockIoThunkClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpThunkOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpThunkClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -542,16 +525,16 @@ GasketSnpStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpInitialize (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpReset (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -563,83 +546,80 @@ GasketSnpShutdown (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpReceiveFilters (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINT32 Enable,
|
||||
IN UINT32 Disable,
|
||||
IN BOOLEAN ResetMCastFilter,
|
||||
IN UINTN MCastFilterCnt OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINT32 Enable,
|
||||
IN UINT32 Disable,
|
||||
IN BOOLEAN ResetMCastFilter,
|
||||
IN UINTN MCastFilterCnt OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpStationAddress (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpStatistics (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpMCastIpToMac (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN IPv6,
|
||||
IN EFI_IP_ADDRESS *IP,
|
||||
OUT EFI_MAC_ADDRESS *MAC
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN IPv6,
|
||||
IN EFI_IP_ADDRESS *IP,
|
||||
OUT EFI_MAC_ADDRESS *MAC
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpNvData (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ReadWrite,
|
||||
IN UINTN Offset,
|
||||
IN UINTN BufferSize,
|
||||
IN OUT VOID *Buffer
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ReadWrite,
|
||||
IN UINTN Offset,
|
||||
IN UINTN BufferSize,
|
||||
IN OUT VOID *Buffer
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpGetStatus (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||
OUT VOID **TxBuf OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||
OUT VOID **TxBuf OPTIONAL
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpTransmit (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN HeaderSize,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer,
|
||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
IN UINT16 *Protocol OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN HeaderSize,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer,
|
||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
IN UINT16 *Protocol OPTIONAL
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSnpReceive (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINTN *HeaderSize OPTIONAL,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer,
|
||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
OUT UINT16 *Protocol OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINTN *HeaderSize OPTIONAL,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer,
|
||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
OUT UINT16 *Protocol OPTIONAL
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -9,23 +9,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include "Host.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// Globals
|
||||
//
|
||||
|
||||
EMU_THUNK_PPI mSecEmuThunkPpi = {
|
||||
EMU_THUNK_PPI mSecEmuThunkPpi = {
|
||||
GasketSecUnixPeiAutoScan,
|
||||
GasketSecUnixFdAddress,
|
||||
GasketSecEmuThunkAddress
|
||||
};
|
||||
|
||||
char *gGdbWorkingFileName = NULL;
|
||||
unsigned int mScriptSymbolChangesCount = 0;
|
||||
|
||||
char *gGdbWorkingFileName = NULL;
|
||||
unsigned int mScriptSymbolChangesCount = 0;
|
||||
|
||||
//
|
||||
// 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
|
||||
// EFI_FIRMWARE_VOLUMES and the memory is never freed.
|
||||
//
|
||||
UINTN gFdInfoCount = 0;
|
||||
EMU_FD_INFO *gFdInfo;
|
||||
UINTN gFdInfoCount = 0;
|
||||
EMU_FD_INFO *gFdInfo;
|
||||
|
||||
//
|
||||
// Array that supports separate memory ranges.
|
||||
@ -46,16 +44,12 @@ EMU_FD_INFO *gFdInfo;
|
||||
UINTN gSystemMemoryCount = 0;
|
||||
EMU_SYSTEM_MEMORY *gSystemMemory;
|
||||
|
||||
|
||||
|
||||
UINTN mImageContextModHandleArraySize = 0;
|
||||
IMAGE_CONTEXT_TO_MOD_HANDLE *mImageContextModHandleArray = NULL;
|
||||
IMAGE_CONTEXT_TO_MOD_HANDLE *mImageContextModHandleArray = NULL;
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR *gPpiList;
|
||||
|
||||
|
||||
int gInXcode = 0;
|
||||
|
||||
int gInXcode = 0;
|
||||
|
||||
/*++
|
||||
Breakpoint target for Xcode project. Set in the Xcode XML
|
||||
@ -71,8 +65,6 @@ SecGdbConfigBreak (
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -121,8 +113,8 @@ main (
|
||||
// If dlopen doesn't work, then we build a gdb script to allow the
|
||||
// symbols to be loaded.
|
||||
//
|
||||
Index = strlen (*Argv);
|
||||
gGdbWorkingFileName = AllocatePool (Index + strlen(".gdb") + 1);
|
||||
Index = strlen (*Argv);
|
||||
gGdbWorkingFileName = AllocatePool (Index + strlen (".gdb") + 1);
|
||||
strcpy (gGdbWorkingFileName, *Argv);
|
||||
strcat (gGdbWorkingFileName, ".gdb");
|
||||
|
||||
@ -139,8 +131,8 @@ main (
|
||||
setbuf (stdout, 0);
|
||||
setbuf (stderr, 0);
|
||||
|
||||
MemorySizeStr = (CHAR16 *) PcdGetPtr (PcdEmuMemorySize);
|
||||
FirmwareVolumesStr = (CHAR16 *) PcdGetPtr (PcdEmuFirmwareVolume);
|
||||
MemorySizeStr = (CHAR16 *)PcdGetPtr (PcdEmuMemorySize);
|
||||
FirmwareVolumesStr = (CHAR16 *)PcdGetPtr (PcdEmuFirmwareVolume);
|
||||
|
||||
//
|
||||
// PPIs pased into PEI_CORE
|
||||
@ -169,17 +161,18 @@ main (
|
||||
//
|
||||
// Allocate space for gSystemMemory Array
|
||||
//
|
||||
gSystemMemoryCount = CountSeparatorsInString (MemorySizeStr, '!') + 1;
|
||||
gSystemMemory = AllocateZeroPool (gSystemMemoryCount * sizeof (EMU_SYSTEM_MEMORY));
|
||||
gSystemMemoryCount = CountSeparatorsInString (MemorySizeStr, '!') + 1;
|
||||
gSystemMemory = AllocateZeroPool (gSystemMemoryCount * sizeof (EMU_SYSTEM_MEMORY));
|
||||
if (gSystemMemory == NULL) {
|
||||
printf ("ERROR : Can not allocate memory for system. Exiting.\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate space for gSystemMemory Array
|
||||
//
|
||||
gFdInfoCount = CountSeparatorsInString (FirmwareVolumesStr, '!') + 1;
|
||||
gFdInfo = AllocateZeroPool (gFdInfoCount * sizeof (EMU_FD_INFO));
|
||||
gFdInfoCount = CountSeparatorsInString (FirmwareVolumesStr, '!') + 1;
|
||||
gFdInfo = AllocateZeroPool (gFdInfoCount * sizeof (EMU_FD_INFO));
|
||||
if (gFdInfo == NULL) {
|
||||
printf ("ERROR : Can not allocate memory for fd info. Exiting.\n");
|
||||
exit (1);
|
||||
@ -192,31 +185,35 @@ main (
|
||||
// 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
|
||||
//
|
||||
InitialStackMemorySize = STACK_SIZE;
|
||||
InitialStackMemory = (UINTN)MapMemory (
|
||||
0, (UINT32) InitialStackMemorySize,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE
|
||||
);
|
||||
InitialStackMemorySize = STACK_SIZE;
|
||||
InitialStackMemory = (UINTN)MapMemory (
|
||||
0,
|
||||
(UINT32)InitialStackMemorySize,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE
|
||||
);
|
||||
if (InitialStackMemory == 0) {
|
||||
printf ("ERROR : Can not open SecStack Exiting\n");
|
||||
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 long)InitialStackMemory
|
||||
);
|
||||
|
||||
for (StackPointer = (UINTN*) (UINTN) InitialStackMemory;
|
||||
StackPointer < (UINTN*)(UINTN)((UINTN) InitialStackMemory + (UINT64) InitialStackMemorySize);
|
||||
StackPointer ++) {
|
||||
for (StackPointer = (UINTN *)(UINTN)InitialStackMemory;
|
||||
StackPointer < (UINTN *)(UINTN)((UINTN)InitialStackMemory + (UINT64)InitialStackMemorySize);
|
||||
StackPointer++)
|
||||
{
|
||||
*StackPointer = 0x5AA55AA5;
|
||||
}
|
||||
|
||||
//
|
||||
// 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) {
|
||||
printf ("ERROR : Can not allocate memory for firmware volume string\n");
|
||||
exit (1);
|
||||
@ -225,39 +222,43 @@ main (
|
||||
Index2 = 0;
|
||||
for (Done = FALSE, Index = 0, PeiIndex = 0, SecFile = NULL;
|
||||
FirmwareVolumesStr[Index2] != 0;
|
||||
Index++) {
|
||||
Index++)
|
||||
{
|
||||
for (Index1 = 0; (FirmwareVolumesStr[Index2] != '!') && (FirmwareVolumesStr[Index2] != 0); Index2++) {
|
||||
FileName[Index1++] = FirmwareVolumesStr[Index2];
|
||||
}
|
||||
|
||||
if (FirmwareVolumesStr[Index2] == '!') {
|
||||
Index2++;
|
||||
}
|
||||
FileName[Index1] = '\0';
|
||||
|
||||
FileName[Index1] = '\0';
|
||||
|
||||
if (Index == 0) {
|
||||
// Map FV Recovery Read Only and other areas Read/Write
|
||||
Status = MapFd0 (
|
||||
FileName,
|
||||
&gFdInfo[0].Address,
|
||||
&gFdInfo[0].Size
|
||||
);
|
||||
FileName,
|
||||
&gFdInfo[0].Address,
|
||||
&gFdInfo[0].Size
|
||||
);
|
||||
} else {
|
||||
//
|
||||
// Open the FD and remember where it got mapped into our processes address space
|
||||
// Maps Read Only
|
||||
//
|
||||
Status = MapFile (
|
||||
FileName,
|
||||
&gFdInfo[Index].Address,
|
||||
&gFdInfo[Index].Size
|
||||
);
|
||||
FileName,
|
||||
&gFdInfo[Index].Address,
|
||||
&gFdInfo[Index].Size
|
||||
);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
printf ("ERROR : Can not open Firmware Device File %s (%x). Exiting.\n", FileName, (unsigned int)Status);
|
||||
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) {
|
||||
//
|
||||
@ -265,11 +266,11 @@ main (
|
||||
// Load the first one we find.
|
||||
//
|
||||
FileHandle = NULL;
|
||||
Status = PeiServicesFfsFindNextFile (
|
||||
EFI_FV_FILETYPE_SECURITY_CORE,
|
||||
(EFI_PEI_FV_HANDLE)(UINTN)gFdInfo[Index].Address,
|
||||
&FileHandle
|
||||
);
|
||||
Status = PeiServicesFfsFindNextFile (
|
||||
EFI_FV_FILETYPE_SECURITY_CORE,
|
||||
(EFI_PEI_FV_HANDLE)(UINTN)gFdInfo[Index].Address,
|
||||
&FileHandle
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SecFile);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
@ -293,9 +294,9 @@ main (
|
||||
// map this memory into the SEC process memory space.
|
||||
//
|
||||
Index1 = 0;
|
||||
Index = 0;
|
||||
Index = 0;
|
||||
while (1) {
|
||||
UINTN val = 0;
|
||||
UINTN val = 0;
|
||||
//
|
||||
// Save the size of the memory.
|
||||
//
|
||||
@ -303,10 +304,12 @@ main (
|
||||
val = val * 10 + MemorySizeStr[Index1] - '0';
|
||||
Index1++;
|
||||
}
|
||||
|
||||
gSystemMemory[Index++].Size = val * 0x100000;
|
||||
if (MemorySizeStr[Index1] == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
Index1++;
|
||||
}
|
||||
|
||||
@ -315,7 +318,7 @@ main (
|
||||
//
|
||||
// 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
|
||||
@ -325,40 +328,40 @@ main (
|
||||
exit (1);
|
||||
}
|
||||
|
||||
|
||||
EFI_PHYSICAL_ADDRESS *
|
||||
MapMemory (
|
||||
IN INTN fd,
|
||||
IN UINT64 length,
|
||||
IN INTN prot,
|
||||
IN INTN flags
|
||||
IN INTN fd,
|
||||
IN UINT64 length,
|
||||
IN INTN prot,
|
||||
IN INTN flags
|
||||
)
|
||||
{
|
||||
STATIC UINTN base = 0x40000000;
|
||||
CONST UINTN align = (1 << 24);
|
||||
VOID *res = NULL;
|
||||
BOOLEAN isAligned = 0;
|
||||
STATIC UINTN base = 0x40000000;
|
||||
CONST UINTN align = (1 << 24);
|
||||
VOID *res = NULL;
|
||||
BOOLEAN isAligned = 0;
|
||||
|
||||
//
|
||||
// Try to get an aligned block somewhere in the address space of this
|
||||
// process.
|
||||
//
|
||||
while((!isAligned) && (base != 0)) {
|
||||
while ((!isAligned) && (base != 0)) {
|
||||
res = mmap ((void *)base, length, prot, flags, fd, 0);
|
||||
if (res == MAP_FAILED) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((((UINTN)res) & ~(align-1)) == (UINTN)res) {
|
||||
isAligned=1;
|
||||
isAligned = 1;
|
||||
} else {
|
||||
munmap(res, length);
|
||||
munmap (res, length);
|
||||
base += align;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -389,16 +392,16 @@ MapFile (
|
||||
OUT UINT64 *Length
|
||||
)
|
||||
{
|
||||
int fd;
|
||||
VOID *res;
|
||||
UINTN FileSize;
|
||||
int fd;
|
||||
VOID *res;
|
||||
UINTN FileSize;
|
||||
|
||||
fd = open (FileName, O_RDWR);
|
||||
if (fd < 0) {
|
||||
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);
|
||||
|
||||
@ -409,8 +412,8 @@ MapFile (
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
*Length = (UINT64) FileSize;
|
||||
*BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res;
|
||||
*Length = (UINT64)FileSize;
|
||||
*BaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)res;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -422,16 +425,17 @@ MapFd0 (
|
||||
OUT UINT64 *Length
|
||||
)
|
||||
{
|
||||
int fd;
|
||||
void *res, *res2, *res3;
|
||||
UINTN FileSize;
|
||||
UINTN FvSize;
|
||||
void *EmuMagicPage;
|
||||
int fd;
|
||||
void *res, *res2, *res3;
|
||||
UINTN FileSize;
|
||||
UINTN FvSize;
|
||||
void *EmuMagicPage;
|
||||
|
||||
fd = open (FileName, O_RDWR);
|
||||
if (fd < 0) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
FileSize = lseek (fd, 0, SEEK_END);
|
||||
|
||||
FvSize = FixedPcdGet64 (PcdEmuFlashFvRecoverySize);
|
||||
@ -469,13 +473,13 @@ MapFd0 (
|
||||
|
||||
// Map the rest of the FD as read/write
|
||||
res2 = mmap (
|
||||
(void *)(UINTN)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize),
|
||||
FileSize - FvSize,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_SHARED,
|
||||
fd,
|
||||
FvSize
|
||||
);
|
||||
(void *)(UINTN)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize),
|
||||
FileSize - FvSize,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_SHARED,
|
||||
fd,
|
||||
FvSize
|
||||
);
|
||||
close (fd);
|
||||
if (res2 == MAP_FAILED) {
|
||||
perror ("MapFd0() Failed res2 =");
|
||||
@ -504,13 +508,12 @@ MapFd0 (
|
||||
}
|
||||
}
|
||||
|
||||
*Length = (UINT64) FileSize;
|
||||
*BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res;
|
||||
*Length = (UINT64)FileSize;
|
||||
*BaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)res;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -528,24 +531,24 @@ Returns:
|
||||
**/
|
||||
VOID
|
||||
SecLoadFromCore (
|
||||
IN UINTN LargestRegion,
|
||||
IN UINTN LargestRegionSize,
|
||||
IN UINTN BootFirmwareVolumeBase,
|
||||
IN VOID *PeiCorePe32File
|
||||
IN UINTN LargestRegion,
|
||||
IN UINTN LargestRegionSize,
|
||||
IN UINTN BootFirmwareVolumeBase,
|
||||
IN VOID *PeiCorePe32File
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS TopOfMemory;
|
||||
VOID *TopOfStack;
|
||||
EFI_PHYSICAL_ADDRESS PeiCoreEntryPoint;
|
||||
EFI_SEC_PEI_HAND_OFF *SecCoreData;
|
||||
UINTN PeiStackSize;
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS TopOfMemory;
|
||||
VOID *TopOfStack;
|
||||
EFI_PHYSICAL_ADDRESS PeiCoreEntryPoint;
|
||||
EFI_SEC_PEI_HAND_OFF *SecCoreData;
|
||||
UINTN PeiStackSize;
|
||||
|
||||
//
|
||||
// Compute Top Of Memory for Stack and PEI Core Allocations
|
||||
//
|
||||
TopOfMemory = LargestRegion + LargestRegionSize;
|
||||
PeiStackSize = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);
|
||||
PeiStackSize = (UINTN)RShiftU64 ((UINT64)STACK_SIZE, 1);
|
||||
|
||||
//
|
||||
// |-----------| <---- TemporaryRamBase + TemporaryRamSize
|
||||
@ -562,22 +565,21 @@ SecLoadFromCore (
|
||||
//
|
||||
// Reservet space for storing PeiCore's parament in stack.
|
||||
//
|
||||
TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);
|
||||
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
|
||||
|
||||
TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);
|
||||
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
|
||||
|
||||
//
|
||||
// Bind this information into the SEC hand-off state
|
||||
//
|
||||
SecCoreData = (EFI_SEC_PEI_HAND_OFF*)(UINTN) TopOfStack;
|
||||
SecCoreData->DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);
|
||||
SecCoreData->BootFirmwareVolumeBase = (VOID*)BootFirmwareVolumeBase;
|
||||
SecCoreData = (EFI_SEC_PEI_HAND_OFF *)(UINTN)TopOfStack;
|
||||
SecCoreData->DataSize = sizeof (EFI_SEC_PEI_HAND_OFF);
|
||||
SecCoreData->BootFirmwareVolumeBase = (VOID *)BootFirmwareVolumeBase;
|
||||
SecCoreData->BootFirmwareVolumeSize = PcdGet32 (PcdEmuFirmwareFdSize);
|
||||
SecCoreData->TemporaryRamBase = (VOID*)(UINTN)LargestRegion;
|
||||
SecCoreData->TemporaryRamBase = (VOID *)(UINTN)LargestRegion;
|
||||
SecCoreData->TemporaryRamSize = STACK_SIZE;
|
||||
SecCoreData->StackBase = SecCoreData->TemporaryRamBase;
|
||||
SecCoreData->StackSize = PeiStackSize;
|
||||
SecCoreData->PeiTemporaryRamBase = (VOID*) ((UINTN) SecCoreData->TemporaryRamBase + PeiStackSize);
|
||||
SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->TemporaryRamBase + PeiStackSize);
|
||||
SecCoreData->PeiTemporaryRamSize = STACK_SIZE - PeiStackSize;
|
||||
|
||||
//
|
||||
@ -585,14 +587,14 @@ SecLoadFromCore (
|
||||
//
|
||||
Status = SecPeCoffGetEntryPoint (PeiCorePe32File, (VOID **)&PeiCoreEntryPoint);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Transfer control to the SEC Core
|
||||
//
|
||||
PeiSwitchStacks (
|
||||
(SWITCH_STACK_ENTRY_POINT) (UINTN) PeiCoreEntryPoint,
|
||||
(SWITCH_STACK_ENTRY_POINT)(UINTN)PeiCoreEntryPoint,
|
||||
SecCoreData,
|
||||
(VOID *)gPpiList,
|
||||
TopOfStack
|
||||
@ -600,10 +602,9 @@ SecLoadFromCore (
|
||||
//
|
||||
// If we get here, then the SEC Core returned. This is an error
|
||||
//
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -631,29 +632,30 @@ SecUnixPeiAutoScan (
|
||||
OUT UINT64 *MemorySize
|
||||
)
|
||||
{
|
||||
void *res;
|
||||
void *res;
|
||||
|
||||
if (Index >= gSystemMemoryCount) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
*MemoryBase = 0;
|
||||
res = MapMemory (
|
||||
0, gSystemMemory[Index].Size,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS
|
||||
);
|
||||
res = MapMemory (
|
||||
0,
|
||||
gSystemMemory[Index].Size,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS
|
||||
);
|
||||
if (res == MAP_FAILED) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
*MemorySize = gSystemMemory[Index].Size;
|
||||
*MemoryBase = (UINTN)res;
|
||||
|
||||
*MemorySize = gSystemMemory[Index].Size;
|
||||
*MemoryBase = (UINTN)res;
|
||||
gSystemMemory[Index].Memory = *MemoryBase;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -675,7 +677,7 @@ Returns:
|
||||
**/
|
||||
BOOLEAN
|
||||
EfiSystemMemoryRange (
|
||||
IN VOID *MemoryAddress
|
||||
IN VOID *MemoryAddress
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
@ -684,7 +686,8 @@ EfiSystemMemoryRange (
|
||||
MemoryBase = (EFI_PHYSICAL_ADDRESS)(UINTN)MemoryAddress;
|
||||
for (Index = 0; Index < gSystemMemoryCount; Index++) {
|
||||
if ((MemoryBase >= gSystemMemory[Index].Memory) &&
|
||||
(MemoryBase < (gSystemMemory[Index].Memory + gSystemMemory[Index].Size)) ) {
|
||||
(MemoryBase < (gSystemMemory[Index].Memory + gSystemMemory[Index].Size)))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@ -692,7 +695,6 @@ EfiSystemMemoryRange (
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -715,8 +717,6 @@ SecEmuThunkAddress (
|
||||
return &gEmuThunkProtocol;
|
||||
}
|
||||
|
||||
|
||||
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SecPeCoffGetEntryPoint (
|
||||
@ -728,10 +728,10 @@ SecPeCoffGetEntryPoint (
|
||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
||||
|
||||
ZeroMem (&ImageContext, sizeof (ImageContext));
|
||||
ImageContext.Handle = Pe32Data;
|
||||
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) SecImageRead;
|
||||
ImageContext.Handle = Pe32Data;
|
||||
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE)SecImageRead;
|
||||
|
||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -741,7 +741,7 @@ SecPeCoffGetEntryPoint (
|
||||
// Relocate image to match the address where it resides
|
||||
//
|
||||
ImageContext.ImageAddress = (UINTN)Pe32Data;
|
||||
Status = PeCoffLoaderLoadImage (&ImageContext);
|
||||
Status = PeCoffLoaderLoadImage (&ImageContext);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -755,10 +755,11 @@ SecPeCoffGetEntryPoint (
|
||||
// Or just return image entry point
|
||||
//
|
||||
ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer (Pe32Data);
|
||||
Status = PeCoffLoaderGetEntryPoint (Pe32Data, EntryPoint);
|
||||
Status = PeCoffLoaderGetEntryPoint (Pe32Data, EntryPoint);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
ImageContext.EntryPoint = (UINTN)*EntryPoint;
|
||||
}
|
||||
|
||||
@ -769,8 +770,6 @@ SecPeCoffGetEntryPoint (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -804,7 +803,7 @@ SecUnixFdAddress (
|
||||
*FdSize = gFdInfo[Index].Size;
|
||||
*FixUp = 0;
|
||||
|
||||
if (*FdBase == 0 && *FdSize == 0) {
|
||||
if ((*FdBase == 0) && (*FdSize == 0)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@ -820,7 +819,6 @@ SecUnixFdAddress (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -836,11 +834,11 @@ Returns:
|
||||
**/
|
||||
UINTN
|
||||
CountSeparatorsInString (
|
||||
IN const CHAR16 *String,
|
||||
IN CHAR16 Separator
|
||||
IN const CHAR16 *String,
|
||||
IN CHAR16 Separator
|
||||
)
|
||||
{
|
||||
UINTN Count;
|
||||
UINTN Count;
|
||||
|
||||
for (Count = 0; *String != '\0'; String++) {
|
||||
if (*String == Separator) {
|
||||
@ -851,15 +849,15 @@ CountSeparatorsInString (
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecImageRead (
|
||||
IN VOID *FileHandle,
|
||||
IN UINTN FileOffset,
|
||||
IN OUT UINTN *ReadSize,
|
||||
OUT VOID *Buffer
|
||||
IN VOID *FileHandle,
|
||||
IN UINTN FileOffset,
|
||||
IN OUT UINTN *ReadSize,
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -876,13 +874,13 @@ Returns:
|
||||
|
||||
**/
|
||||
{
|
||||
CHAR8 *Destination8;
|
||||
CHAR8 *Source8;
|
||||
UINTN Length;
|
||||
CHAR8 *Destination8;
|
||||
CHAR8 *Source8;
|
||||
UINTN Length;
|
||||
|
||||
Destination8 = Buffer;
|
||||
Source8 = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
|
||||
Length = *ReadSize;
|
||||
Destination8 = Buffer;
|
||||
Source8 = (CHAR8 *)((UINTN)FileHandle + FileOffset);
|
||||
Length = *ReadSize;
|
||||
while (Length--) {
|
||||
*(Destination8++) = *(Source8++);
|
||||
}
|
||||
@ -890,7 +888,6 @@ Returns:
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -909,14 +906,13 @@ Returns:
|
||||
**/
|
||||
EFI_STATUS
|
||||
AddHandle (
|
||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
IN VOID *ModHandle
|
||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
IN VOID *ModHandle
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
IMAGE_CONTEXT_TO_MOD_HANDLE *Array;
|
||||
UINTN PreviousSize;
|
||||
|
||||
UINTN Index;
|
||||
IMAGE_CONTEXT_TO_MOD_HANDLE *Array;
|
||||
UINTN PreviousSize;
|
||||
|
||||
Array = mImageContextModHandleArray;
|
||||
for (Index = 0; Index < mImageContextModHandleArraySize; Index++, Array++) {
|
||||
@ -936,7 +932,7 @@ AddHandle (
|
||||
// copy the old values to the new location. But it does
|
||||
// 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;
|
||||
|
||||
mImageContextModHandleArray = ReallocatePool (
|
||||
@ -954,7 +950,6 @@ AddHandle (
|
||||
return AddHandle (ImageContext, ModHandle);
|
||||
}
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -971,7 +966,7 @@ Returns:
|
||||
**/
|
||||
VOID *
|
||||
RemoveHandle (
|
||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
@ -998,60 +993,60 @@ RemoveHandle (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOLEAN
|
||||
IsPdbFile (
|
||||
IN CHAR8 *PdbFileName
|
||||
IN CHAR8 *PdbFileName
|
||||
)
|
||||
{
|
||||
UINTN Len;
|
||||
UINTN Len;
|
||||
|
||||
if (PdbFileName == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Len = strlen (PdbFileName);
|
||||
if ((Len < 5)|| (PdbFileName[Len - 4] != '.')) {
|
||||
if ((Len < 5) || (PdbFileName[Len - 4] != '.')) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ((PdbFileName[Len - 3] == 'P' || PdbFileName[Len - 3] == 'p') &&
|
||||
(PdbFileName[Len - 2] == 'D' || PdbFileName[Len - 2] == 'd') &&
|
||||
(PdbFileName[Len - 1] == 'B' || PdbFileName[Len - 1] == 'b')) {
|
||||
if (((PdbFileName[Len - 3] == 'P') || (PdbFileName[Len - 3] == 'p')) &&
|
||||
((PdbFileName[Len - 2] == 'D') || (PdbFileName[Len - 2] == 'd')) &&
|
||||
((PdbFileName[Len - 1] == 'B') || (PdbFileName[Len - 1] == 'b')))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
#define MAX_SPRINT_BUFFER_SIZE 0x200
|
||||
#define MAX_SPRINT_BUFFER_SIZE 0x200
|
||||
|
||||
void
|
||||
PrintLoadAddress (
|
||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
)
|
||||
{
|
||||
if (ImageContext->PdbPointer == NULL) {
|
||||
fprintf (stderr,
|
||||
fprintf (
|
||||
stderr,
|
||||
"0x%08lx Loading NO DEBUG with entry point 0x%08lx\n",
|
||||
(unsigned long)(ImageContext->ImageAddress),
|
||||
(unsigned long)ImageContext->EntryPoint
|
||||
);
|
||||
} else {
|
||||
fprintf (stderr,
|
||||
fprintf (
|
||||
stderr,
|
||||
"0x%08lx Loading %s with entry point 0x%08lx\n",
|
||||
(unsigned long)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders),
|
||||
ImageContext->PdbPointer,
|
||||
(unsigned long)ImageContext->EntryPoint
|
||||
);
|
||||
}
|
||||
|
||||
// Keep output synced up
|
||||
fflush (stderr);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Loads the image using dlopen so symbols will be automatically
|
||||
loaded by gdb.
|
||||
@ -1064,18 +1059,17 @@ PrintLoadAddress (
|
||||
**/
|
||||
BOOLEAN
|
||||
DlLoadImage (
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
)
|
||||
{
|
||||
|
||||
#ifdef __APPLE__
|
||||
#ifdef __APPLE__
|
||||
|
||||
return FALSE;
|
||||
|
||||
#else
|
||||
#else
|
||||
|
||||
void *Handle = NULL;
|
||||
void *Entry = NULL;
|
||||
void *Handle = NULL;
|
||||
void *Entry = NULL;
|
||||
|
||||
if (ImageContext->PdbPointer == NULL) {
|
||||
return FALSE;
|
||||
@ -1086,19 +1080,19 @@ DlLoadImage (
|
||||
}
|
||||
|
||||
fprintf (
|
||||
stderr,
|
||||
"Loading %s 0x%08lx - entry point 0x%08lx\n",
|
||||
ImageContext->PdbPointer,
|
||||
(unsigned long)ImageContext->ImageAddress,
|
||||
(unsigned long)ImageContext->EntryPoint
|
||||
);
|
||||
stderr,
|
||||
"Loading %s 0x%08lx - entry point 0x%08lx\n",
|
||||
ImageContext->PdbPointer,
|
||||
(unsigned long)ImageContext->ImageAddress,
|
||||
(unsigned long)ImageContext->EntryPoint
|
||||
);
|
||||
|
||||
Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW);
|
||||
if (Handle != NULL) {
|
||||
Entry = dlsym (Handle, "_ModuleEntryPoint");
|
||||
AddHandle (ImageContext, Handle);
|
||||
} else {
|
||||
printf("%s\n", dlerror());
|
||||
printf ("%s\n", dlerror ());
|
||||
}
|
||||
|
||||
if (Entry != NULL) {
|
||||
@ -1109,25 +1103,23 @@ DlLoadImage (
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
__attribute__((noinline))
|
||||
__attribute__ ((noinline))
|
||||
#endif
|
||||
VOID
|
||||
SecGdbScriptBreak (
|
||||
char *FileName,
|
||||
int FileNameLength,
|
||||
long unsigned int LoadAddress,
|
||||
int AddSymbolFlag
|
||||
char *FileName,
|
||||
int FileNameLength,
|
||||
long unsigned int LoadAddress,
|
||||
int AddSymbolFlag
|
||||
)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Adds the image to a gdb script so its symbols can be loaded.
|
||||
The AddFirmwareSymbolFile helper macro is used.
|
||||
@ -1137,18 +1129,17 @@ SecGdbScriptBreak (
|
||||
**/
|
||||
VOID
|
||||
GdbScriptAddImage (
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
)
|
||||
{
|
||||
|
||||
PrintLoadAddress (ImageContext);
|
||||
|
||||
if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {
|
||||
if ((ImageContext->PdbPointer != NULL) && !IsPdbFile (ImageContext->PdbPointer)) {
|
||||
FILE *GdbTempFile;
|
||||
if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
|
||||
GdbTempFile = fopen (gGdbWorkingFileName, "a");
|
||||
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++;
|
||||
fprintf (
|
||||
GdbTempFile,
|
||||
@ -1188,11 +1179,10 @@ GdbScriptAddImage (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
SecPeCoffRelocateImageExtraAction (
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
)
|
||||
{
|
||||
if (!DlLoadImage (ImageContext)) {
|
||||
@ -1200,7 +1190,6 @@ SecPeCoffRelocateImageExtraAction (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Adds the image to a gdb script so its symbols can be unloaded.
|
||||
The RemoveFirmwareSymbolFile helper macro is used.
|
||||
@ -1210,7 +1199,7 @@ SecPeCoffRelocateImageExtraAction (
|
||||
**/
|
||||
VOID
|
||||
GdbScriptRemoveImage (
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
)
|
||||
{
|
||||
FILE *GdbTempFile;
|
||||
@ -1257,27 +1246,24 @@ GdbScriptRemoveImage (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
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
|
||||
//
|
||||
Handle = RemoveHandle (ImageContext);
|
||||
if (Handle != NULL) {
|
||||
#ifndef __APPLE__
|
||||
#ifndef __APPLE__
|
||||
dlclose (Handle);
|
||||
#endif
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
GdbScriptRemoveImage (ImageContext);
|
||||
}
|
||||
|
||||
|
||||
|
@ -30,9 +30,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include <sys/time.h>
|
||||
|
||||
#if __CYGWIN__
|
||||
#include <sys/dirent.h>
|
||||
#include <sys/dirent.h>
|
||||
#else
|
||||
#include <sys/dir.h>
|
||||
#include <sys/dir.h>
|
||||
#endif
|
||||
|
||||
#include <sys/mman.h>
|
||||
@ -56,19 +56,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include <ifaddrs.h>
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <net/if_dl.h>
|
||||
#include <net/bpf.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/disk.h>
|
||||
#include <net/if_dl.h>
|
||||
#include <net/bpf.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/disk.h>
|
||||
#define _XOPEN_SOURCE
|
||||
#ifndef _Bool
|
||||
#define _Bool char // for clang debug
|
||||
#endif
|
||||
#ifndef _Bool
|
||||
#define _Bool char // for clang debug
|
||||
#endif
|
||||
#else
|
||||
#include <termio.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <linux/fs.h>
|
||||
#include <termio.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <linux/fs.h>
|
||||
#endif
|
||||
|
||||
#include <utime.h>
|
||||
@ -120,31 +120,27 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include <Guid/FileSystemInfo.h>
|
||||
#include <Guid/FileSystemVolumeLabelInfo.h>
|
||||
|
||||
|
||||
#include "Gasket.h"
|
||||
|
||||
|
||||
#define STACK_SIZE 0x20000
|
||||
#define STACK_SIZE 0x20000
|
||||
|
||||
typedef struct {
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
UINT64 Size;
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
UINT64 Size;
|
||||
} EMU_FD_INFO;
|
||||
|
||||
typedef struct {
|
||||
EFI_PHYSICAL_ADDRESS Memory;
|
||||
UINT64 Size;
|
||||
EFI_PHYSICAL_ADDRESS Memory;
|
||||
UINT64 Size;
|
||||
} 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 {
|
||||
PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext;
|
||||
VOID *ModHandle;
|
||||
PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext;
|
||||
VOID *ModHandle;
|
||||
} IMAGE_CONTEXT_TO_MOD_HANDLE;
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecUnixPeiLoadFile (
|
||||
@ -163,18 +159,18 @@ main (
|
||||
|
||||
VOID
|
||||
SecLoadFromCore (
|
||||
IN UINTN LargestRegion,
|
||||
IN UINTN LargestRegionSize,
|
||||
IN UINTN BootFirmwareVolumeBase,
|
||||
IN VOID *PeiCoreFile
|
||||
IN UINTN LargestRegion,
|
||||
IN UINTN LargestRegionSize,
|
||||
IN UINTN BootFirmwareVolumeBase,
|
||||
IN VOID *PeiCoreFile
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
SecLoadFile (
|
||||
IN VOID *Pe32Data,
|
||||
IN EFI_PHYSICAL_ADDRESS *ImageAddress,
|
||||
IN UINT64 *ImageSize,
|
||||
IN EFI_PHYSICAL_ADDRESS *EntryPoint
|
||||
IN VOID *Pe32Data,
|
||||
IN EFI_PHYSICAL_ADDRESS *ImageAddress,
|
||||
IN UINT64 *ImageSize,
|
||||
IN EFI_PHYSICAL_ADDRESS *EntryPoint
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -192,23 +188,23 @@ SecFfsFindNextFile (
|
||||
|
||||
EFI_STATUS
|
||||
SecFfsFindSectionData (
|
||||
IN EFI_SECTION_TYPE SectionType,
|
||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||
IN OUT VOID **SectionData
|
||||
IN EFI_SECTION_TYPE SectionType,
|
||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||
IN OUT VOID **SectionData
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecUnixPeCoffLoaderLoadAsDll (
|
||||
IN CHAR8 *PdbFileName,
|
||||
IN VOID **ImageEntryPoint,
|
||||
OUT VOID **ModHandle
|
||||
IN CHAR8 *PdbFileName,
|
||||
IN VOID **ImageEntryPoint,
|
||||
OUT VOID **ModHandle
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecUnixPeCoffLoaderFreeLibrary (
|
||||
OUT VOID *ModHandle
|
||||
OUT VOID *ModHandle
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
@ -230,53 +226,51 @@ GasketSecUnixFdAddress (
|
||||
)
|
||||
;
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
GetImageReadFunction (
|
||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
IN EFI_PHYSICAL_ADDRESS *TopOfMemory
|
||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
IN EFI_PHYSICAL_ADDRESS *TopOfMemory
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecImageRead (
|
||||
IN VOID *FileHandle,
|
||||
IN UINTN FileOffset,
|
||||
IN OUT UINTN *ReadSize,
|
||||
OUT VOID *Buffer
|
||||
IN VOID *FileHandle,
|
||||
IN UINTN FileOffset,
|
||||
IN OUT UINTN *ReadSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
CHAR16 *
|
||||
AsciiToUnicode (
|
||||
IN CHAR8 *Ascii,
|
||||
IN UINTN *StrLen OPTIONAL
|
||||
IN CHAR8 *Ascii,
|
||||
IN UINTN *StrLen OPTIONAL
|
||||
);
|
||||
|
||||
UINTN
|
||||
CountSeparatorsInString (
|
||||
IN const CHAR16 *String,
|
||||
IN CHAR16 Separator
|
||||
IN const CHAR16 *String,
|
||||
IN CHAR16 Separator
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecTemporaryRamSupport (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||
IN UINTN CopySize
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||
IN UINTN CopySize
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GasketSecTemporaryRamSupport (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||
IN UINTN CopySize
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||
IN UINTN CopySize
|
||||
);
|
||||
|
||||
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SecPeCoffGetEntryPoint (
|
||||
@ -296,7 +290,6 @@ SecPeCoffLoaderUnloadImageExtraAction (
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
PeiSwitchStacks (
|
||||
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
|
||||
@ -310,13 +303,13 @@ SecInitThunkProtocol (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
EFI_PHYSICAL_ADDRESS *
|
||||
MapMemory (
|
||||
INTN fd,
|
||||
UINT64 length,
|
||||
INTN prot,
|
||||
INTN flags);
|
||||
INTN fd,
|
||||
UINT64 length,
|
||||
INTN prot,
|
||||
INTN flags
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
MapFile (
|
||||
@ -334,21 +327,34 @@ MapFd0 (
|
||||
|
||||
BOOLEAN
|
||||
EfiSystemMemoryRange (
|
||||
IN VOID *MemoryAddress
|
||||
IN VOID *MemoryAddress
|
||||
);
|
||||
|
||||
VOID
|
||||
SecSleep (
|
||||
UINT64 Nanoseconds
|
||||
);
|
||||
|
||||
VOID SecSleep (UINT64 Nanoseconds);
|
||||
VOID SecEnableInterrupt (VOID);
|
||||
VOID SecDisableInterrupt (VOID);
|
||||
BOOLEAN SecInterruptEanbled (VOID);
|
||||
VOID
|
||||
SecEnableInterrupt (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
SecDisableInterrupt (
|
||||
VOID
|
||||
);
|
||||
|
||||
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;
|
||||
BOOLEAN
|
||||
SecInterruptEanbled (
|
||||
VOID
|
||||
);
|
||||
|
||||
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
|
||||
|
@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
|
||||
/**
|
||||
Transfers control to a function starting with a new stack.
|
||||
|
||||
@ -49,15 +48,14 @@ PeiSwitchStacks (
|
||||
//
|
||||
ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
|
||||
|
||||
JumpBuffer.Eip = (UINTN)EntryPoint;
|
||||
JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
|
||||
JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
|
||||
((VOID**)JumpBuffer.Esp)[1] = Context1;
|
||||
((VOID**)JumpBuffer.Esp)[2] = Context2;
|
||||
JumpBuffer.Eip = (UINTN)EntryPoint;
|
||||
JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID *);
|
||||
JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
|
||||
((VOID **)JumpBuffer.Esp)[1] = Context1;
|
||||
((VOID **)JumpBuffer.Esp)[2] = Context2;
|
||||
|
||||
LongJump (&JumpBuffer, (UINTN)-1);
|
||||
|
||||
|
||||
//
|
||||
// PeiSwitchStacks () will never return
|
||||
//
|
||||
|
@ -12,21 +12,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
#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 {
|
||||
UINTN Signature;
|
||||
UINTN Signature;
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||
|
||||
|
||||
EMU_SNP_PROTOCOL EmuSnp;
|
||||
EFI_SIMPLE_NETWORK_MODE *Mode;
|
||||
EMU_IO_THUNK_PROTOCOL *Thunk;
|
||||
|
||||
EMU_SNP_PROTOCOL EmuSnp;
|
||||
EFI_SIMPLE_NETWORK_MODE *Mode;
|
||||
} EMU_SNP_PRIVATE;
|
||||
|
||||
#define EMU_SNP_PRIVATE_DATA_FROM_THIS(a) \
|
||||
@ -48,7 +45,7 @@ EmuSnpCreateMapping (
|
||||
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -74,7 +71,7 @@ EmuSnpStart (
|
||||
IN EMU_SNP_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -98,7 +95,7 @@ EmuSnpStop (
|
||||
IN EMU_SNP_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -133,12 +130,12 @@ EmuSnpStop (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpInitialize (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -163,11 +160,11 @@ EmuSnpInitialize (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpReset (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -192,7 +189,7 @@ EmuSnpShutdown (
|
||||
IN EMU_SNP_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -225,15 +222,15 @@ EmuSnpShutdown (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpReceiveFilters (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINT32 Enable,
|
||||
IN UINT32 Disable,
|
||||
IN BOOLEAN ResetMCastFilter,
|
||||
IN UINTN MCastFilterCnt OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINT32 Enable,
|
||||
IN UINT32 Disable,
|
||||
IN BOOLEAN ResetMCastFilter,
|
||||
IN UINTN MCastFilterCnt OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -257,12 +254,12 @@ EmuSnpReceiveFilters (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpStationAddress (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -292,13 +289,13 @@ EmuSnpStationAddress (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpStatistics (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN Reset,
|
||||
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -328,13 +325,13 @@ EmuSnpStatistics (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpMCastIpToMac (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN IPv6,
|
||||
IN EFI_IP_ADDRESS *IP,
|
||||
OUT EFI_MAC_ADDRESS *MAC
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN IPv6,
|
||||
IN EFI_IP_ADDRESS *IP,
|
||||
OUT EFI_MAC_ADDRESS *MAC
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -363,14 +360,14 @@ EmuSnpMCastIpToMac (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpNvData (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ReadWrite,
|
||||
IN UINTN Offset,
|
||||
IN UINTN BufferSize,
|
||||
IN OUT VOID *Buffer
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN BOOLEAN ReadWrite,
|
||||
IN UINTN Offset,
|
||||
IN UINTN BufferSize,
|
||||
IN OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -404,12 +401,12 @@ EmuSnpNvData (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpGetStatus (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||
OUT VOID **TxBuf OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||
OUT VOID **TxBuf OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -451,16 +448,16 @@ EmuSnpGetStatus (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpTransmit (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN HeaderSize,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer,
|
||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
IN UINT16 *Protocol OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
IN UINTN HeaderSize,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer,
|
||||
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
IN UINT16 *Protocol OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -501,24 +498,23 @@ EmuSnpTransmit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmuSnpReceive (
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINTN *HeaderSize OPTIONAL,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer,
|
||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
OUT UINT16 *Protocol OPTIONAL
|
||||
IN EMU_SNP_PROTOCOL *This,
|
||||
OUT UINTN *HeaderSize OPTIONAL,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer,
|
||||
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||
OUT UINT16 *Protocol OPTIONAL
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
|
||||
Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
||||
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
||||
GasketSnpCreateMapping,
|
||||
GasketSnpStart,
|
||||
GasketSnpStop,
|
||||
@ -537,7 +533,7 @@ EMU_SNP_PROTOCOL gEmuSnpProtocol = {
|
||||
|
||||
EFI_STATUS
|
||||
EmuSnpThunkOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
@ -555,7 +551,6 @@ EmuSnpThunkOpen (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
Private->Signature = EMU_SNP_PRIVATE_SIGNATURE;
|
||||
Private->Thunk = This;
|
||||
CopyMem (&Private->EmuSnp, &gEmuSnpProtocol, sizeof (gEmuSnpProtocol));
|
||||
@ -565,10 +560,9 @@ EmuSnpThunkOpen (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuSnpThunkClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
@ -583,9 +577,7 @@ EmuSnpThunkClose (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
|
||||
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
|
||||
&gEmuSnpProtocolGuid,
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -30,10 +30,9 @@ AllocatePool (
|
||||
IN UINTN AllocationSize
|
||||
)
|
||||
{
|
||||
return (VOID*) malloc (AllocationSize);
|
||||
return (VOID *)malloc (AllocationSize);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiBootServicesData.
|
||||
|
||||
@ -53,7 +52,7 @@ AllocateZeroPool (
|
||||
IN UINTN AllocationSize
|
||||
)
|
||||
{
|
||||
VOID *Buffer;
|
||||
VOID *Buffer;
|
||||
|
||||
Buffer = AllocatePool (AllocationSize);
|
||||
if (Buffer == NULL) {
|
||||
@ -65,7 +64,6 @@ AllocateZeroPool (
|
||||
return Buffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reallocates a buffer of type EfiBootServicesData.
|
||||
|
||||
@ -95,7 +93,7 @@ ReallocatePool (
|
||||
IN VOID *OldBuffer OPTIONAL
|
||||
)
|
||||
{
|
||||
VOID *NewBuffer;
|
||||
VOID *NewBuffer;
|
||||
|
||||
NewBuffer = AllocatePool (NewSize);
|
||||
if (NewBuffer == NULL) {
|
||||
@ -113,7 +111,6 @@ ReallocatePool (
|
||||
return NewBuffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Frees a buffer that was previously allocated with one of the pool allocation functions in the
|
||||
Memory Allocation Library.
|
||||
@ -131,9 +128,8 @@ ReallocatePool (
|
||||
VOID
|
||||
EFIAPI
|
||||
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 <pthread.h>
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexLock (
|
||||
IN VOID *Mutex
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexUnLock (
|
||||
IN VOID *Mutex
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexTryLock (
|
||||
IN VOID *Mutex
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
VOID *
|
||||
PthreadMutexInit (
|
||||
IN VOID
|
||||
)
|
||||
{
|
||||
pthread_mutex_t *Mutex;
|
||||
int err;
|
||||
pthread_mutex_t *Mutex;
|
||||
int err;
|
||||
|
||||
Mutex = malloc (sizeof (pthread_mutex_t));
|
||||
err = pthread_mutex_init (Mutex, NULL);
|
||||
err = pthread_mutex_init (Mutex, NULL);
|
||||
if (err == 0) {
|
||||
return Mutex;
|
||||
}
|
||||
@ -61,10 +56,9 @@ PthreadMutexInit (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
PthreadMutexDestroy (
|
||||
IN VOID *Mutex
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
if (Mutex != NULL) {
|
||||
@ -76,11 +70,11 @@ PthreadMutexDestroy (
|
||||
|
||||
// Can't store this data on PthreadCreate stack so we need a global
|
||||
typedef struct {
|
||||
pthread_mutex_t Mutex;
|
||||
THREAD_THUNK_THREAD_ENTRY Start;
|
||||
pthread_mutex_t Mutex;
|
||||
THREAD_THUNK_THREAD_ENTRY Start;
|
||||
} THREAD_MANGLE;
|
||||
|
||||
THREAD_MANGLE mThreadMangle = {
|
||||
THREAD_MANGLE mThreadMangle = {
|
||||
PTHREAD_MUTEX_INITIALIZER,
|
||||
NULL
|
||||
};
|
||||
@ -90,11 +84,11 @@ SecFakePthreadStart (
|
||||
VOID *Context
|
||||
)
|
||||
{
|
||||
THREAD_THUNK_THREAD_ENTRY Start;
|
||||
sigset_t SigMask;
|
||||
THREAD_THUNK_THREAD_ENTRY Start;
|
||||
sigset_t SigMask;
|
||||
|
||||
// Save global on the stack before we unlock
|
||||
Start = mThreadMangle.Start;
|
||||
Start = mThreadMangle.Start;
|
||||
pthread_mutex_unlock (&mThreadMangle.Mutex);
|
||||
|
||||
// Mask all signals to the APs
|
||||
@ -109,19 +103,19 @@ SecFakePthreadStart (
|
||||
// This is a great example of how all problems in computer
|
||||
// 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
|
||||
PthreadCreate (
|
||||
IN VOID *Thread,
|
||||
IN VOID *Attribute,
|
||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||
IN VOID *Context
|
||||
IN VOID *Thread,
|
||||
IN VOID *Attribute,
|
||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
int err;
|
||||
BOOLEAN EnabledOnEntry;
|
||||
int err;
|
||||
BOOLEAN EnabledOnEntry;
|
||||
|
||||
//
|
||||
// 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.
|
||||
pthread_mutex_lock (&mThreadMangle.Mutex);
|
||||
mThreadMangle.Start = Start;
|
||||
mThreadMangle.Start = Start;
|
||||
|
||||
err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
|
||||
if (err != 0) {
|
||||
@ -151,17 +145,15 @@ PthreadCreate (
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
PthreadExit (
|
||||
IN VOID *ValuePtr
|
||||
IN VOID *ValuePtr
|
||||
)
|
||||
{
|
||||
pthread_exit (ValuePtr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
PthreadSelf (
|
||||
VOID
|
||||
@ -173,8 +165,7 @@ PthreadSelf (
|
||||
return (UINTN)pthread_self ();
|
||||
}
|
||||
|
||||
|
||||
EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
|
||||
EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
|
||||
GasketPthreadMutexLock,
|
||||
GasketPthreadMutexUnLock,
|
||||
GasketPthreadMutexTryLock,
|
||||
@ -185,10 +176,9 @@ EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
|
||||
GasketPthreadSelf
|
||||
};
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
PthreadOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
if (This->Instance != 0) {
|
||||
@ -206,17 +196,15 @@ PthreadOpen (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
PthreadClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
|
||||
EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
|
||||
&gEmuThreadThunkProtocolGuid,
|
||||
NULL,
|
||||
NULL,
|
||||
@ -225,5 +213,3 @@ EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
|
||||
GasketPthreadClose,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user