EmulatorPkg: formalize line endings
The patch is the result of running "BaseTools/Scripts/FormatDosFiles.py EmulatorPkg/" No functionality impact. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Hao A Wu <hao.a.wu@intel.com> Cc: Liming Gao <liming.gao@intel.com>
This commit is contained in:
@ -63,7 +63,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
|
||||
0, // ProcessorXModel: 4;
|
||||
0, // ProcessorXFamily: 8;
|
||||
0, // ProcessorReserved2: 4;
|
||||
},
|
||||
},
|
||||
{ // PROCESSOR_FEATURE_FLAGS
|
||||
0, // ProcessorFpu :1;
|
||||
0, // ProcessorVme :1;
|
||||
@ -100,13 +100,13 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
|
||||
},
|
||||
3, // ProcessorVersion String;
|
||||
{ // Voltage;
|
||||
1, // ProcessorVoltageCapability5V :1;
|
||||
1, // ProcessorVoltageCapability3_3V :1;
|
||||
1, // ProcessorVoltageCapability2_9V :1;
|
||||
1, // ProcessorVoltageCapability5V :1;
|
||||
1, // ProcessorVoltageCapability3_3V :1;
|
||||
1, // ProcessorVoltageCapability2_9V :1;
|
||||
0, // ProcessorVoltageCapabilityReserved :1; ///< Bit 3, must be zero.
|
||||
0, // ProcessorVoltageReserved :3; ///< Bits 4-6, must be zero.
|
||||
0 // ProcessorVoltageIndicateLegacy :1;
|
||||
},
|
||||
},
|
||||
0, // ExternalClock;
|
||||
0, // MaxSpeed;
|
||||
0, // CurrentSpeed;
|
||||
@ -151,26 +151,26 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
|
||||
"Not Found",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
...
|
||||
LogSmbiosData (
|
||||
(EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
|
||||
(EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
|
||||
gSmbiosType12Strings
|
||||
);
|
||||
|
||||
@param Template Fixed SMBIOS structure, required.
|
||||
@param StringArray Array of strings to convert to an SMBIOS string pack.
|
||||
@param StringArray Array of strings to convert to an SMBIOS string pack.
|
||||
NULL is OK.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LogSmbiosData (
|
||||
IN EFI_SMBIOS_TABLE_HEADER *Template,
|
||||
IN CHAR8 **StringPack
|
||||
IN CHAR8 **StringPack
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SMBIOS_PROTOCOL *Smbios;
|
||||
EFI_SMBIOS_PROTOCOL *Smbios;
|
||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||
UINTN Index;
|
||||
@ -219,7 +219,7 @@ LogSmbiosData (
|
||||
Str += StringSize;
|
||||
}
|
||||
*Str = 0;
|
||||
|
||||
|
||||
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||
Status = Smbios->Add (
|
||||
Smbios,
|
||||
@ -228,7 +228,7 @@ LogSmbiosData (
|
||||
Record
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
FreePool (Record);
|
||||
return Status;
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ EmuBlockIo2Reset (
|
||||
@param[in] MediaId Id of the media, changes every time the media is
|
||||
replaced.
|
||||
@param[in] Lba The starting Logical Block Address to read from.
|
||||
@param[in, out] Token A pointer to the token associated with the transaction.
|
||||
@param[in, out] Token A pointer to the token associated with the transaction.
|
||||
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param[out] Buffer A pointer to the destination buffer for the data. The
|
||||
caller is responsible for either having implicit or
|
||||
|
@ -1,195 +1,195 @@
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __UGA_H_
|
||||
#define __UGA_H_
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Protocol/GraphicsOutput.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/SimplePointer.h>
|
||||
#include <Protocol/EmuIoThunk.h>
|
||||
#include <Protocol/EmuGraphicsWindow.h>
|
||||
|
||||
#include <Guid/EventGroup.h>
|
||||
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/KeyMapLib.h>
|
||||
|
||||
|
||||
#define MAX_Q 256
|
||||
|
||||
typedef struct {
|
||||
UINTN Front;
|
||||
UINTN Rear;
|
||||
UINTN Count;
|
||||
EFI_INPUT_KEY Q[MAX_Q];
|
||||
} GOP_QUEUE_FIXED;
|
||||
|
||||
#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')
|
||||
typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
|
||||
UINTN Signature;
|
||||
EFI_HANDLE NotifyHandle;
|
||||
EFI_KEY_DATA KeyData;
|
||||
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
||||
EFI_EVENT Event;
|
||||
LIST_ENTRY NotifyEntry;
|
||||
} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
|
||||
|
||||
#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
|
||||
|
||||
typedef struct {
|
||||
UINT32 HorizontalResolution;
|
||||
UINT32 VerticalResolution;
|
||||
UINT32 ColorDepth;
|
||||
UINT32 RefreshRate;
|
||||
} GOP_MODE_DATA;
|
||||
|
||||
|
||||
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
|
||||
|
||||
#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
|
||||
|
||||
#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
|
||||
typedef struct {
|
||||
UINT64 Signature;
|
||||
|
||||
EFI_HANDLE Handle;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
|
||||
EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
|
||||
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
|
||||
EFI_SIMPLE_POINTER_MODE PointerMode;
|
||||
//
|
||||
// GOP Private Data for QueryMode ()
|
||||
//
|
||||
GOP_MODE_DATA *ModeData;
|
||||
|
||||
|
||||
//
|
||||
// UGA Private Data knowing when to start hardware
|
||||
//
|
||||
BOOLEAN HardwareNeedsStarting;
|
||||
|
||||
CHAR16 *WindowName;
|
||||
|
||||
GOP_QUEUE_FIXED Queue;
|
||||
|
||||
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
|
||||
EFI_KEY_STATE KeyState;
|
||||
LIST_ENTRY NotifyList;
|
||||
} GOP_PRIVATE_DATA;
|
||||
|
||||
|
||||
#define GOP_PRIVATE_DATA_FROM_THIS(a) \
|
||||
CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
|
||||
|
||||
#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
|
||||
CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)
|
||||
|
||||
#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \
|
||||
CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)
|
||||
|
||||
#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
|
||||
CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)
|
||||
|
||||
|
||||
//
|
||||
// Global Protocol Variables
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
|
||||
|
||||
//
|
||||
// Gop Hardware abstraction internal worker functions
|
||||
//
|
||||
EFI_STATUS
|
||||
EmuGopSupported (
|
||||
IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopConstructor (
|
||||
IN GOP_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopDestructor (
|
||||
IN GOP_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
GopPrivateAddQ (
|
||||
IN GOP_PRIVATE_DATA *Private,
|
||||
IN EFI_INPUT_KEY Key
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopInitializeSimpleTextInForWindow (
|
||||
IN GOP_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopInitializeSimplePointerForWindow (
|
||||
IN GOP_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopStartWindow (
|
||||
IN GOP_PRIVATE_DATA *Private,
|
||||
IN UINT32 HorizontalResolution,
|
||||
IN UINT32 VerticalResolution,
|
||||
IN UINT32 ColorDepth,
|
||||
IN UINT32 RefreshRate
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ShutdownGopEvent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GopPrivateMakeCallbackFunction (
|
||||
IN VOID *Context,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GopPrivateBreakCallbackFunction (
|
||||
IN VOID *Context,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
#endif
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __UGA_H_
|
||||
#define __UGA_H_
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Protocol/GraphicsOutput.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/SimplePointer.h>
|
||||
#include <Protocol/EmuIoThunk.h>
|
||||
#include <Protocol/EmuGraphicsWindow.h>
|
||||
|
||||
#include <Guid/EventGroup.h>
|
||||
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/KeyMapLib.h>
|
||||
|
||||
|
||||
#define MAX_Q 256
|
||||
|
||||
typedef struct {
|
||||
UINTN Front;
|
||||
UINTN Rear;
|
||||
UINTN Count;
|
||||
EFI_INPUT_KEY Q[MAX_Q];
|
||||
} GOP_QUEUE_FIXED;
|
||||
|
||||
#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')
|
||||
typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
|
||||
UINTN Signature;
|
||||
EFI_HANDLE NotifyHandle;
|
||||
EFI_KEY_DATA KeyData;
|
||||
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
||||
EFI_EVENT Event;
|
||||
LIST_ENTRY NotifyEntry;
|
||||
} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
|
||||
|
||||
#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
|
||||
|
||||
typedef struct {
|
||||
UINT32 HorizontalResolution;
|
||||
UINT32 VerticalResolution;
|
||||
UINT32 ColorDepth;
|
||||
UINT32 RefreshRate;
|
||||
} GOP_MODE_DATA;
|
||||
|
||||
|
||||
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
|
||||
|
||||
#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
|
||||
|
||||
#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
|
||||
typedef struct {
|
||||
UINT64 Signature;
|
||||
|
||||
EFI_HANDLE Handle;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
|
||||
EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
|
||||
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
|
||||
EFI_SIMPLE_POINTER_MODE PointerMode;
|
||||
//
|
||||
// GOP Private Data for QueryMode ()
|
||||
//
|
||||
GOP_MODE_DATA *ModeData;
|
||||
|
||||
|
||||
//
|
||||
// UGA Private Data knowing when to start hardware
|
||||
//
|
||||
BOOLEAN HardwareNeedsStarting;
|
||||
|
||||
CHAR16 *WindowName;
|
||||
|
||||
GOP_QUEUE_FIXED Queue;
|
||||
|
||||
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
|
||||
EFI_KEY_STATE KeyState;
|
||||
LIST_ENTRY NotifyList;
|
||||
} GOP_PRIVATE_DATA;
|
||||
|
||||
|
||||
#define GOP_PRIVATE_DATA_FROM_THIS(a) \
|
||||
CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
|
||||
|
||||
#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
|
||||
CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)
|
||||
|
||||
#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \
|
||||
CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)
|
||||
|
||||
#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
|
||||
CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)
|
||||
|
||||
|
||||
//
|
||||
// Global Protocol Variables
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
|
||||
|
||||
//
|
||||
// Gop Hardware abstraction internal worker functions
|
||||
//
|
||||
EFI_STATUS
|
||||
EmuGopSupported (
|
||||
IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopConstructor (
|
||||
IN GOP_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopDestructor (
|
||||
IN GOP_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
GopPrivateAddQ (
|
||||
IN GOP_PRIVATE_DATA *Private,
|
||||
IN EFI_INPUT_KEY Key
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopInitializeSimpleTextInForWindow (
|
||||
IN GOP_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopInitializeSimplePointerForWindow (
|
||||
IN GOP_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopStartWindow (
|
||||
IN GOP_PRIVATE_DATA *Private,
|
||||
IN UINT32 HorizontalResolution,
|
||||
IN UINT32 VerticalResolution,
|
||||
IN UINT32 ColorDepth,
|
||||
IN UINT32 RefreshRate
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ShutdownGopEvent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GopPrivateMakeCallbackFunction (
|
||||
IN VOID *Context,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GopPrivateBreakCallbackFunction (
|
||||
IN VOID *Context,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,416 +1,416 @@
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
EmuGopScreen.c
|
||||
|
||||
Abstract:
|
||||
|
||||
This file produces the graphics abstration of UGA. It is called by
|
||||
EmuGopDriver.c file which deals with the EFI 1.1 driver model.
|
||||
This file just does graphics.
|
||||
|
||||
**/
|
||||
|
||||
#include "Gop.h"
|
||||
|
||||
|
||||
EFI_EVENT mGopScreenExitBootServicesEvent;
|
||||
|
||||
GOP_MODE_DATA mGopModeData[] = {
|
||||
{ 800, 600, 0, 0 },
|
||||
{ 640, 480, 0, 0 },
|
||||
{ 720, 400, 0, 0 },
|
||||
{1024, 768, 0, 0 },
|
||||
{1280, 1024, 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Returns information for an available graphics mode that the graphics device
|
||||
and the set of active video output devices supports.
|
||||
|
||||
@param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
|
||||
@param ModeNumber The mode number to return information on.
|
||||
@param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
|
||||
@param Info A pointer to callee allocated buffer that returns information about ModeNumber.
|
||||
|
||||
@retval EFI_SUCCESS Mode information returned.
|
||||
@retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
|
||||
@retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the video mode.
|
||||
@retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
|
||||
@retval EFI_INVALID_PARAMETER One of the input args was NULL.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmuGopQuerytMode (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN UINT32 ModeNumber,
|
||||
OUT UINTN *SizeOfInfo,
|
||||
OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
|
||||
)
|
||||
{
|
||||
GOP_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
|
||||
if (*Info == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
*SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
||||
|
||||
(*Info)->Version = 0;
|
||||
(*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
|
||||
(*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;
|
||||
(*Info)->PixelFormat = PixelBltOnly;
|
||||
(*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Set the video device into the specified mode and clears the visible portions of
|
||||
the output display to black.
|
||||
|
||||
@param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
|
||||
@param ModeNumber Abstraction that defines the current video mode.
|
||||
|
||||
@retval EFI_SUCCESS The graphics mode specified by ModeNumber was selected.
|
||||
@retval EFI_DEVICE_ERROR The device had an error and could not complete the request.
|
||||
@retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmuGopSetMode (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN UINT32 ModeNumber
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
GOP_PRIVATE_DATA *Private;
|
||||
GOP_MODE_DATA *ModeData;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
|
||||
|
||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
if (ModeNumber >= This->Mode->MaxMode) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
ModeData = &Private->ModeData[ModeNumber];
|
||||
This->Mode->Mode = ModeNumber;
|
||||
Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
|
||||
Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
|
||||
Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
|
||||
|
||||
if (Private->HardwareNeedsStarting) {
|
||||
Status = EmuGopStartWindow (
|
||||
Private,
|
||||
ModeData->HorizontalResolution,
|
||||
ModeData->VerticalResolution,
|
||||
ModeData->ColorDepth,
|
||||
ModeData->RefreshRate
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
Private->HardwareNeedsStarting = FALSE;
|
||||
}
|
||||
|
||||
|
||||
Status = Private->EmuGraphicsWindow->Size(
|
||||
Private->EmuGraphicsWindow,
|
||||
ModeData->HorizontalResolution,
|
||||
ModeData->VerticalResolution
|
||||
);
|
||||
|
||||
|
||||
Fill.Red = 0x7f;
|
||||
Fill.Green = 0x7F;
|
||||
Fill.Blue = 0x7f;
|
||||
This->Blt (
|
||||
This,
|
||||
&Fill,
|
||||
EfiBltVideoFill,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
ModeData->HorizontalResolution,
|
||||
ModeData->VerticalResolution,
|
||||
ModeData->HorizontalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
|
||||
);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param BltBuffer Buffer containing data to blit into video buffer. This
|
||||
buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
|
||||
@param BltOperation Operation to perform on BlitBuffer and video memory
|
||||
@param SourceX X coordinate of source for the BltBuffer.
|
||||
@param SourceY Y coordinate of source for the BltBuffer.
|
||||
@param DestinationX X coordinate of destination for the BltBuffer.
|
||||
@param DestinationY Y coordinate of destination for the BltBuffer.
|
||||
@param Width Width of rectangle in BltBuffer in pixels.
|
||||
@param Height Hight of rectangle in BltBuffer in pixels.
|
||||
@param Delta OPTIONAL
|
||||
|
||||
@retval EFI_SUCCESS The Blt operation completed.
|
||||
@retval EFI_INVALID_PARAMETER BltOperation is not valid.
|
||||
@retval EFI_DEVICE_ERROR A hardware error occured writting to the video buffer.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmuGopBlt (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
|
||||
IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
|
||||
IN UINTN SourceX,
|
||||
IN UINTN SourceY,
|
||||
IN UINTN DestinationX,
|
||||
IN UINTN DestinationY,
|
||||
IN UINTN Width,
|
||||
IN UINTN Height,
|
||||
IN UINTN Delta OPTIONAL
|
||||
)
|
||||
{
|
||||
GOP_PRIVATE_DATA *Private;
|
||||
EFI_TPL OriginalTPL;
|
||||
EFI_STATUS Status;
|
||||
EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
|
||||
|
||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (Width == 0 || Height == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
//
|
||||
// If Delta is zero, then the entire BltBuffer is being used, so Delta
|
||||
// is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
|
||||
// the number of bytes in each row can be computed.
|
||||
//
|
||||
if (Delta == 0) {
|
||||
Delta = Width * sizeof (EFI_UGA_PIXEL);
|
||||
}
|
||||
|
||||
//
|
||||
// We have to raise to TPL Notify, so we make an atomic write the frame buffer.
|
||||
// We would not want a timer based event (Cursor, ...) to come in while we are
|
||||
// doing this operation.
|
||||
//
|
||||
OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
|
||||
//
|
||||
// Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
|
||||
// GopBlt() API of Unix UGA IO protocol.
|
||||
//
|
||||
GopBltArgs.DestinationX = DestinationX;
|
||||
GopBltArgs.DestinationY = DestinationY;
|
||||
GopBltArgs.Height = Height;
|
||||
GopBltArgs.Width = Width;
|
||||
GopBltArgs.SourceX = SourceX;
|
||||
GopBltArgs.SourceY = SourceY;
|
||||
GopBltArgs.Delta = Delta;
|
||||
Status = Private->EmuGraphicsWindow->Blt (
|
||||
Private->EmuGraphicsWindow,
|
||||
(EFI_UGA_PIXEL *)BltBuffer,
|
||||
(EFI_UGA_BLT_OPERATION)BltOperation,
|
||||
&GopBltArgs
|
||||
);
|
||||
|
||||
gBS->RestoreTPL (OriginalTPL);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Construction and Destruction functions
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopSupported (
|
||||
IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
|
||||
)
|
||||
{
|
||||
//
|
||||
// Check to see if the IO abstraction represents a device type we support.
|
||||
//
|
||||
// This would be replaced a check of PCI subsystem ID, etc.
|
||||
//
|
||||
if (!CompareGuid (EmuIoThunk->Protocol, &gEmuGraphicsWindowProtocolGuid)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopStartWindow (
|
||||
IN GOP_PRIVATE_DATA *Private,
|
||||
IN UINT32 HorizontalResolution,
|
||||
IN UINT32 VerticalResolution,
|
||||
IN UINT32 ColorDepth,
|
||||
IN UINT32 RefreshRate
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Register to be notified on exit boot services so we can destroy the window.
|
||||
//
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_SIGNAL_EXIT_BOOT_SERVICES,
|
||||
TPL_CALLBACK,
|
||||
ShutdownGopEvent,
|
||||
Private,
|
||||
&mGopScreenExitBootServicesEvent
|
||||
);
|
||||
|
||||
Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
|
||||
|
||||
// Register callback to support RegisterKeyNotify()
|
||||
Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
|
||||
Private->EmuGraphicsWindow,
|
||||
GopPrivateMakeCallbackFunction,
|
||||
GopPrivateBreakCallbackFunction,
|
||||
Private
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopConstructor (
|
||||
GOP_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
Private->ModeData = mGopModeData;
|
||||
|
||||
Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
|
||||
Private->GraphicsOutput.SetMode = EmuGopSetMode;
|
||||
Private->GraphicsOutput.Blt = EmuGopBlt;
|
||||
|
||||
//
|
||||
// Allocate buffer for Graphics Output Protocol mode information
|
||||
//
|
||||
Private->GraphicsOutput.Mode = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
|
||||
if (Private->GraphicsOutput.Mode == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
|
||||
if (Private->GraphicsOutput.Mode->Info == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);
|
||||
//
|
||||
// Till now, we have no idea about the window size.
|
||||
//
|
||||
Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
|
||||
Private->GraphicsOutput.Mode->Info->Version = 0;
|
||||
Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
|
||||
Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
|
||||
Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
|
||||
Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
||||
Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
|
||||
Private->GraphicsOutput.Mode->FrameBufferSize = 0;
|
||||
|
||||
Private->HardwareNeedsStarting = TRUE;
|
||||
Private->EmuGraphicsWindow = NULL;
|
||||
|
||||
EmuGopInitializeSimpleTextInForWindow (Private);
|
||||
|
||||
EmuGopInitializeSimplePointerForWindow (Private);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopDestructor (
|
||||
GOP_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
if (!Private->HardwareNeedsStarting) {
|
||||
Private->EmuIoThunk->Close (Private->EmuIoThunk);
|
||||
Private->EmuGraphicsWindow = NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Free graphics output protocol occupied resource
|
||||
//
|
||||
if (Private->GraphicsOutput.Mode != NULL) {
|
||||
if (Private->GraphicsOutput.Mode->Info != NULL) {
|
||||
FreePool (Private->GraphicsOutput.Mode->Info);
|
||||
}
|
||||
FreePool (Private->GraphicsOutput.Mode);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ShutdownGopEvent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This is the UGA screen's callback notification function for exit-boot-services.
|
||||
All we do here is call EmuGopDestructor().
|
||||
|
||||
Arguments:
|
||||
|
||||
Event - not used
|
||||
Context - pointer to the Private structure.
|
||||
|
||||
Returns:
|
||||
|
||||
None.
|
||||
|
||||
**/
|
||||
{
|
||||
EmuGopDestructor (Context);
|
||||
}
|
||||
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
EmuGopScreen.c
|
||||
|
||||
Abstract:
|
||||
|
||||
This file produces the graphics abstration of UGA. It is called by
|
||||
EmuGopDriver.c file which deals with the EFI 1.1 driver model.
|
||||
This file just does graphics.
|
||||
|
||||
**/
|
||||
|
||||
#include "Gop.h"
|
||||
|
||||
|
||||
EFI_EVENT mGopScreenExitBootServicesEvent;
|
||||
|
||||
GOP_MODE_DATA mGopModeData[] = {
|
||||
{ 800, 600, 0, 0 },
|
||||
{ 640, 480, 0, 0 },
|
||||
{ 720, 400, 0, 0 },
|
||||
{1024, 768, 0, 0 },
|
||||
{1280, 1024, 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Returns information for an available graphics mode that the graphics device
|
||||
and the set of active video output devices supports.
|
||||
|
||||
@param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
|
||||
@param ModeNumber The mode number to return information on.
|
||||
@param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
|
||||
@param Info A pointer to callee allocated buffer that returns information about ModeNumber.
|
||||
|
||||
@retval EFI_SUCCESS Mode information returned.
|
||||
@retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
|
||||
@retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the video mode.
|
||||
@retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
|
||||
@retval EFI_INVALID_PARAMETER One of the input args was NULL.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmuGopQuerytMode (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN UINT32 ModeNumber,
|
||||
OUT UINTN *SizeOfInfo,
|
||||
OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
|
||||
)
|
||||
{
|
||||
GOP_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
|
||||
if (*Info == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
*SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
||||
|
||||
(*Info)->Version = 0;
|
||||
(*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
|
||||
(*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;
|
||||
(*Info)->PixelFormat = PixelBltOnly;
|
||||
(*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Set the video device into the specified mode and clears the visible portions of
|
||||
the output display to black.
|
||||
|
||||
@param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
|
||||
@param ModeNumber Abstraction that defines the current video mode.
|
||||
|
||||
@retval EFI_SUCCESS The graphics mode specified by ModeNumber was selected.
|
||||
@retval EFI_DEVICE_ERROR The device had an error and could not complete the request.
|
||||
@retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmuGopSetMode (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN UINT32 ModeNumber
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
GOP_PRIVATE_DATA *Private;
|
||||
GOP_MODE_DATA *ModeData;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
|
||||
|
||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
if (ModeNumber >= This->Mode->MaxMode) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
ModeData = &Private->ModeData[ModeNumber];
|
||||
This->Mode->Mode = ModeNumber;
|
||||
Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
|
||||
Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
|
||||
Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
|
||||
|
||||
if (Private->HardwareNeedsStarting) {
|
||||
Status = EmuGopStartWindow (
|
||||
Private,
|
||||
ModeData->HorizontalResolution,
|
||||
ModeData->VerticalResolution,
|
||||
ModeData->ColorDepth,
|
||||
ModeData->RefreshRate
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
Private->HardwareNeedsStarting = FALSE;
|
||||
}
|
||||
|
||||
|
||||
Status = Private->EmuGraphicsWindow->Size(
|
||||
Private->EmuGraphicsWindow,
|
||||
ModeData->HorizontalResolution,
|
||||
ModeData->VerticalResolution
|
||||
);
|
||||
|
||||
|
||||
Fill.Red = 0x7f;
|
||||
Fill.Green = 0x7F;
|
||||
Fill.Blue = 0x7f;
|
||||
This->Blt (
|
||||
This,
|
||||
&Fill,
|
||||
EfiBltVideoFill,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
ModeData->HorizontalResolution,
|
||||
ModeData->VerticalResolution,
|
||||
ModeData->HorizontalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
|
||||
);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param BltBuffer Buffer containing data to blit into video buffer. This
|
||||
buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
|
||||
@param BltOperation Operation to perform on BlitBuffer and video memory
|
||||
@param SourceX X coordinate of source for the BltBuffer.
|
||||
@param SourceY Y coordinate of source for the BltBuffer.
|
||||
@param DestinationX X coordinate of destination for the BltBuffer.
|
||||
@param DestinationY Y coordinate of destination for the BltBuffer.
|
||||
@param Width Width of rectangle in BltBuffer in pixels.
|
||||
@param Height Hight of rectangle in BltBuffer in pixels.
|
||||
@param Delta OPTIONAL
|
||||
|
||||
@retval EFI_SUCCESS The Blt operation completed.
|
||||
@retval EFI_INVALID_PARAMETER BltOperation is not valid.
|
||||
@retval EFI_DEVICE_ERROR A hardware error occured writting to the video buffer.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmuGopBlt (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
|
||||
IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
|
||||
IN UINTN SourceX,
|
||||
IN UINTN SourceY,
|
||||
IN UINTN DestinationX,
|
||||
IN UINTN DestinationY,
|
||||
IN UINTN Width,
|
||||
IN UINTN Height,
|
||||
IN UINTN Delta OPTIONAL
|
||||
)
|
||||
{
|
||||
GOP_PRIVATE_DATA *Private;
|
||||
EFI_TPL OriginalTPL;
|
||||
EFI_STATUS Status;
|
||||
EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
|
||||
|
||||
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (Width == 0 || Height == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
//
|
||||
// If Delta is zero, then the entire BltBuffer is being used, so Delta
|
||||
// is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
|
||||
// the number of bytes in each row can be computed.
|
||||
//
|
||||
if (Delta == 0) {
|
||||
Delta = Width * sizeof (EFI_UGA_PIXEL);
|
||||
}
|
||||
|
||||
//
|
||||
// We have to raise to TPL Notify, so we make an atomic write the frame buffer.
|
||||
// We would not want a timer based event (Cursor, ...) to come in while we are
|
||||
// doing this operation.
|
||||
//
|
||||
OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
|
||||
//
|
||||
// Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
|
||||
// GopBlt() API of Unix UGA IO protocol.
|
||||
//
|
||||
GopBltArgs.DestinationX = DestinationX;
|
||||
GopBltArgs.DestinationY = DestinationY;
|
||||
GopBltArgs.Height = Height;
|
||||
GopBltArgs.Width = Width;
|
||||
GopBltArgs.SourceX = SourceX;
|
||||
GopBltArgs.SourceY = SourceY;
|
||||
GopBltArgs.Delta = Delta;
|
||||
Status = Private->EmuGraphicsWindow->Blt (
|
||||
Private->EmuGraphicsWindow,
|
||||
(EFI_UGA_PIXEL *)BltBuffer,
|
||||
(EFI_UGA_BLT_OPERATION)BltOperation,
|
||||
&GopBltArgs
|
||||
);
|
||||
|
||||
gBS->RestoreTPL (OriginalTPL);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Construction and Destruction functions
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopSupported (
|
||||
IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
|
||||
)
|
||||
{
|
||||
//
|
||||
// Check to see if the IO abstraction represents a device type we support.
|
||||
//
|
||||
// This would be replaced a check of PCI subsystem ID, etc.
|
||||
//
|
||||
if (!CompareGuid (EmuIoThunk->Protocol, &gEmuGraphicsWindowProtocolGuid)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopStartWindow (
|
||||
IN GOP_PRIVATE_DATA *Private,
|
||||
IN UINT32 HorizontalResolution,
|
||||
IN UINT32 VerticalResolution,
|
||||
IN UINT32 ColorDepth,
|
||||
IN UINT32 RefreshRate
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Register to be notified on exit boot services so we can destroy the window.
|
||||
//
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_SIGNAL_EXIT_BOOT_SERVICES,
|
||||
TPL_CALLBACK,
|
||||
ShutdownGopEvent,
|
||||
Private,
|
||||
&mGopScreenExitBootServicesEvent
|
||||
);
|
||||
|
||||
Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
|
||||
|
||||
// Register callback to support RegisterKeyNotify()
|
||||
Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
|
||||
Private->EmuGraphicsWindow,
|
||||
GopPrivateMakeCallbackFunction,
|
||||
GopPrivateBreakCallbackFunction,
|
||||
Private
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopConstructor (
|
||||
GOP_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
Private->ModeData = mGopModeData;
|
||||
|
||||
Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
|
||||
Private->GraphicsOutput.SetMode = EmuGopSetMode;
|
||||
Private->GraphicsOutput.Blt = EmuGopBlt;
|
||||
|
||||
//
|
||||
// Allocate buffer for Graphics Output Protocol mode information
|
||||
//
|
||||
Private->GraphicsOutput.Mode = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
|
||||
if (Private->GraphicsOutput.Mode == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
|
||||
if (Private->GraphicsOutput.Mode->Info == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);
|
||||
//
|
||||
// Till now, we have no idea about the window size.
|
||||
//
|
||||
Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
|
||||
Private->GraphicsOutput.Mode->Info->Version = 0;
|
||||
Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
|
||||
Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
|
||||
Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
|
||||
Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
||||
Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
|
||||
Private->GraphicsOutput.Mode->FrameBufferSize = 0;
|
||||
|
||||
Private->HardwareNeedsStarting = TRUE;
|
||||
Private->EmuGraphicsWindow = NULL;
|
||||
|
||||
EmuGopInitializeSimpleTextInForWindow (Private);
|
||||
|
||||
EmuGopInitializeSimplePointerForWindow (Private);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EmuGopDestructor (
|
||||
GOP_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
if (!Private->HardwareNeedsStarting) {
|
||||
Private->EmuIoThunk->Close (Private->EmuIoThunk);
|
||||
Private->EmuGraphicsWindow = NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Free graphics output protocol occupied resource
|
||||
//
|
||||
if (Private->GraphicsOutput.Mode != NULL) {
|
||||
if (Private->GraphicsOutput.Mode->Info != NULL) {
|
||||
FreePool (Private->GraphicsOutput.Mode->Info);
|
||||
}
|
||||
FreePool (Private->GraphicsOutput.Mode);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ShutdownGopEvent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This is the UGA screen's callback notification function for exit-boot-services.
|
||||
All we do here is call EmuGopDestructor().
|
||||
|
||||
Arguments:
|
||||
|
||||
Event - not used
|
||||
Context - pointer to the Private structure.
|
||||
|
||||
Returns:
|
||||
|
||||
None.
|
||||
|
||||
**/
|
||||
{
|
||||
EmuGopDestructor (Context);
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,7 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
|
||||
NULL // Mode
|
||||
};
|
||||
|
||||
EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
|
||||
EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
|
||||
EfiSimpleNetworkStopped, // State
|
||||
NET_ETHER_ADDR_LEN, // HwAddressSize
|
||||
NET_ETHER_HEADER_SIZE, // MediaHeaderSize
|
||||
|
@ -1,38 +1,38 @@
|
||||
/*++ @file
|
||||
The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a magic page
|
||||
of memory that is like SRAM on an embedded system. This file defines what goes
|
||||
where in the magic page.
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __EMU_MAGIC_PAGE_LIB_H__
|
||||
#define __EMU_MAGIC_PAGE_LIB_H__
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Protocol/EmuThunk.h>
|
||||
|
||||
typedef struct {
|
||||
// Used by PEI Core and PEIMs to store the PEI Services pointer.
|
||||
// Privilege issues prevent using the PI mechanism in the emulator.
|
||||
CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
|
||||
|
||||
// Used by SecPeiServicesLib
|
||||
EFI_PEI_PPI_DESCRIPTOR *PpiList;
|
||||
|
||||
// Needed by PEI PEI PeCoffLoaderExtraActionLib
|
||||
EMU_THUNK_PROTOCOL *Thunk;
|
||||
} EMU_MAGIC_PAGE_LAYOUT;
|
||||
|
||||
#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
|
||||
|
||||
#endif
|
||||
/*++ @file
|
||||
The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a magic page
|
||||
of memory that is like SRAM on an embedded system. This file defines what goes
|
||||
where in the magic page.
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __EMU_MAGIC_PAGE_LIB_H__
|
||||
#define __EMU_MAGIC_PAGE_LIB_H__
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Protocol/EmuThunk.h>
|
||||
|
||||
typedef struct {
|
||||
// Used by PEI Core and PEIMs to store the PEI Services pointer.
|
||||
// Privilege issues prevent using the PI mechanism in the emulator.
|
||||
CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
|
||||
|
||||
// Used by SecPeiServicesLib
|
||||
EFI_PEI_PPI_DESCRIPTOR *PpiList;
|
||||
|
||||
// Needed by PEI PEI PeCoffLoaderExtraActionLib
|
||||
EMU_THUNK_PROTOCOL *Thunk;
|
||||
} EMU_MAGIC_PAGE_LAYOUT;
|
||||
|
||||
#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
|
||||
|
||||
#endif
|
||||
|
@ -1,42 +1,42 @@
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __EMU_THUNK_LIB_H__
|
||||
#define __EMU_THUNK_LIB_H__
|
||||
|
||||
#include <Protocol/EmuThunk.h>
|
||||
|
||||
|
||||
extern EMU_THUNK_PROTOCOL *gEmuThunk;
|
||||
|
||||
|
||||
/**
|
||||
Serach the EMU IO Thunk database for a matching EMU IO Thunk
|
||||
Protocol instance.
|
||||
|
||||
@param Protocol Protocol to search for.
|
||||
@param Instance Instance of protocol to search for.
|
||||
|
||||
@retval NULL Protocol and Instance not found.
|
||||
@retval other EMU IO Thunk protocol that matched.
|
||||
|
||||
**/
|
||||
EMU_IO_THUNK_PROTOCOL *
|
||||
EFIAPI
|
||||
GetIoThunkInstance (
|
||||
IN EFI_GUID *Protocol,
|
||||
IN UINTN Instance
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __EMU_THUNK_LIB_H__
|
||||
#define __EMU_THUNK_LIB_H__
|
||||
|
||||
#include <Protocol/EmuThunk.h>
|
||||
|
||||
|
||||
extern EMU_THUNK_PROTOCOL *gEmuThunk;
|
||||
|
||||
|
||||
/**
|
||||
Serach the EMU IO Thunk database for a matching EMU IO Thunk
|
||||
Protocol instance.
|
||||
|
||||
@param Protocol Protocol to search for.
|
||||
@param Instance Instance of protocol to search for.
|
||||
|
||||
@retval NULL Protocol and Instance not found.
|
||||
@retval other EMU IO Thunk protocol that matched.
|
||||
|
||||
**/
|
||||
EMU_IO_THUNK_PROTOCOL *
|
||||
EFIAPI
|
||||
GetIoThunkInstance (
|
||||
IN EFI_GUID *Protocol,
|
||||
IN UINTN Instance
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -1,21 +1,21 @@
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __PPI_LIST_LIB_H__
|
||||
#define __PPI_LIST_LIB_H__
|
||||
|
||||
|
||||
extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
|
||||
|
||||
|
||||
#endif
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __PPI_LIST_LIB_H__
|
||||
#define __PPI_LIST_LIB_H__
|
||||
|
||||
|
||||
extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -1,202 +1,202 @@
|
||||
/** @file
|
||||
Provides library functions for common SMBIOS operations. Only available to DXE
|
||||
and UEFI module types.
|
||||
|
||||
|
||||
Copyright (c) 2012, Apple Inc. All rights reserved.
|
||||
Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials are licensed and made available under
|
||||
the terms and conditions of the BSD License that accompanies this distribution.
|
||||
The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _SMBIOS_LIB_H__
|
||||
#define _SMBIOS_LIB_H__
|
||||
|
||||
#include <IndustryStandard/SmBios.h>
|
||||
#include <Protocol/Smbios.h>
|
||||
|
||||
|
||||
///
|
||||
/// Cache copy of the SMBIOS Protocol pointer
|
||||
///
|
||||
extern EFI_SMBIOS_PROTOCOL *gSmbios;
|
||||
|
||||
|
||||
///
|
||||
/// Template for SMBIOS table initialization.
|
||||
/// The SMBIOS_TABLE_STRING types in the formated area must match the
|
||||
/// StringArray sequene.
|
||||
///
|
||||
typedef struct {
|
||||
//
|
||||
// formatted area of a given SMBIOS record
|
||||
//
|
||||
SMBIOS_STRUCTURE *Entry;
|
||||
//
|
||||
// NULL terminated array of ASCII strings to be added to the SMBIOS record.
|
||||
//
|
||||
CHAR8 **StringArray;
|
||||
} SMBIOS_TEMPLATE_ENTRY;
|
||||
|
||||
|
||||
/**
|
||||
Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
|
||||
entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
|
||||
|
||||
@param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
|
||||
|
||||
@retval EFI_SUCCESS New SMBIOS tables were created.
|
||||
@retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibInitializeFromTemplate (
|
||||
IN SMBIOS_TEMPLATE_ENTRY *Template
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Create SMBIOS record.
|
||||
|
||||
Converts a fixed SMBIOS structure and an array of pointers to strings into
|
||||
an SMBIOS record where the strings are cat'ed on the end of the fixed record
|
||||
and terminated via a double NULL and add to SMBIOS table.
|
||||
|
||||
SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
|
||||
{ EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
|
||||
1 // StringCount
|
||||
};
|
||||
CHAR8 *gSmbiosType12Strings[] = {
|
||||
"Not Found",
|
||||
NULL
|
||||
};
|
||||
|
||||
...
|
||||
AddSmbiosEntryFromTemplate (
|
||||
(EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
|
||||
gSmbiosType12Strings
|
||||
);
|
||||
|
||||
@param SmbiosEntry Fixed SMBIOS structure
|
||||
@param StringArray Array of strings to convert to an SMBIOS string pack.
|
||||
NULL is OK.
|
||||
|
||||
@retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.
|
||||
@retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibCreateEntry (
|
||||
IN SMBIOS_STRUCTURE *SmbiosEntry,
|
||||
IN CHAR8 **StringArray
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Update the string associated with an existing SMBIOS record.
|
||||
|
||||
This function allows the update of specific SMBIOS strings. The number of valid strings for any
|
||||
SMBIOS record is defined by how many strings were present when Add() was called.
|
||||
|
||||
@param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
|
||||
@param[in] StringNumber The non-zero string number of the string to update.
|
||||
@param[in] String Update the StringNumber string with String.
|
||||
|
||||
@retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
|
||||
@retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
|
||||
@retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibUpdateString (
|
||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||
IN SMBIOS_TABLE_STRING StringNumber,
|
||||
IN CHAR8 *String
|
||||
);
|
||||
|
||||
/**
|
||||
Update the string associated with an existing SMBIOS record.
|
||||
|
||||
This function allows the update of specific SMBIOS strings. The number of valid strings for any
|
||||
SMBIOS record is defined by how many strings were present when Add() was called.
|
||||
|
||||
@param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
|
||||
@param[in] StringNumber The non-zero string number of the string to update.
|
||||
@param[in] String Update the StringNumber string with String.
|
||||
|
||||
@retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
|
||||
@retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
|
||||
@retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibUpdateUnicodeString (
|
||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||
IN SMBIOS_TABLE_STRING StringNumber,
|
||||
IN CHAR16 *String
|
||||
);
|
||||
|
||||
/**
|
||||
Allow caller to read a specific SMBIOS string
|
||||
|
||||
@param[in] Header SMBIOS record that contains the string.
|
||||
@param[in[ StringNumber Instance of SMBIOS string 1 - N.
|
||||
|
||||
@retval NULL Instance of Type SMBIOS string was not found.
|
||||
@retval Other Pointer to matching SMBIOS string.
|
||||
**/
|
||||
CHAR8 *
|
||||
EFIAPI
|
||||
SmbiosLibReadString (
|
||||
IN SMBIOS_STRUCTURE *Header,
|
||||
IN EFI_SMBIOS_STRING StringNumber
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
|
||||
|
||||
@param[in] Type Type of the next SMBIOS record to return.
|
||||
@param[in[ Instance Instance of SMBIOS record 0 - N-1.
|
||||
@param[out] SmbiosHandle Returns SMBIOS handle for the matching record.
|
||||
|
||||
@retval NULL Instance of Type SMBIOS record was not found.
|
||||
@retval Other Pointer to matching SMBIOS record.
|
||||
**/
|
||||
SMBIOS_STRUCTURE *
|
||||
EFIAPI
|
||||
SmbiosLibGetRecord (
|
||||
IN EFI_SMBIOS_TYPE Type,
|
||||
IN UINTN Instance,
|
||||
OUT EFI_SMBIOS_HANDLE *SmbiosHandle
|
||||
);
|
||||
|
||||
/**
|
||||
Remove an SMBIOS record.
|
||||
|
||||
This function removes an SMBIOS record using the handle specified by SmbiosHandle.
|
||||
|
||||
@param[in] SmbiosHandle The handle of the SMBIOS record to remove.
|
||||
|
||||
@retval EFI_SUCCESS SMBIOS record was removed.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibRemove (
|
||||
OUT EFI_SMBIOS_HANDLE SmbiosHandle
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
/** @file
|
||||
Provides library functions for common SMBIOS operations. Only available to DXE
|
||||
and UEFI module types.
|
||||
|
||||
|
||||
Copyright (c) 2012, Apple Inc. All rights reserved.
|
||||
Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials are licensed and made available under
|
||||
the terms and conditions of the BSD License that accompanies this distribution.
|
||||
The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _SMBIOS_LIB_H__
|
||||
#define _SMBIOS_LIB_H__
|
||||
|
||||
#include <IndustryStandard/SmBios.h>
|
||||
#include <Protocol/Smbios.h>
|
||||
|
||||
|
||||
///
|
||||
/// Cache copy of the SMBIOS Protocol pointer
|
||||
///
|
||||
extern EFI_SMBIOS_PROTOCOL *gSmbios;
|
||||
|
||||
|
||||
///
|
||||
/// Template for SMBIOS table initialization.
|
||||
/// The SMBIOS_TABLE_STRING types in the formated area must match the
|
||||
/// StringArray sequene.
|
||||
///
|
||||
typedef struct {
|
||||
//
|
||||
// formatted area of a given SMBIOS record
|
||||
//
|
||||
SMBIOS_STRUCTURE *Entry;
|
||||
//
|
||||
// NULL terminated array of ASCII strings to be added to the SMBIOS record.
|
||||
//
|
||||
CHAR8 **StringArray;
|
||||
} SMBIOS_TEMPLATE_ENTRY;
|
||||
|
||||
|
||||
/**
|
||||
Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
|
||||
entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
|
||||
|
||||
@param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
|
||||
|
||||
@retval EFI_SUCCESS New SMBIOS tables were created.
|
||||
@retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibInitializeFromTemplate (
|
||||
IN SMBIOS_TEMPLATE_ENTRY *Template
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Create SMBIOS record.
|
||||
|
||||
Converts a fixed SMBIOS structure and an array of pointers to strings into
|
||||
an SMBIOS record where the strings are cat'ed on the end of the fixed record
|
||||
and terminated via a double NULL and add to SMBIOS table.
|
||||
|
||||
SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
|
||||
{ EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
|
||||
1 // StringCount
|
||||
};
|
||||
CHAR8 *gSmbiosType12Strings[] = {
|
||||
"Not Found",
|
||||
NULL
|
||||
};
|
||||
|
||||
...
|
||||
AddSmbiosEntryFromTemplate (
|
||||
(EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
|
||||
gSmbiosType12Strings
|
||||
);
|
||||
|
||||
@param SmbiosEntry Fixed SMBIOS structure
|
||||
@param StringArray Array of strings to convert to an SMBIOS string pack.
|
||||
NULL is OK.
|
||||
|
||||
@retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.
|
||||
@retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibCreateEntry (
|
||||
IN SMBIOS_STRUCTURE *SmbiosEntry,
|
||||
IN CHAR8 **StringArray
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Update the string associated with an existing SMBIOS record.
|
||||
|
||||
This function allows the update of specific SMBIOS strings. The number of valid strings for any
|
||||
SMBIOS record is defined by how many strings were present when Add() was called.
|
||||
|
||||
@param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
|
||||
@param[in] StringNumber The non-zero string number of the string to update.
|
||||
@param[in] String Update the StringNumber string with String.
|
||||
|
||||
@retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
|
||||
@retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
|
||||
@retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibUpdateString (
|
||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||
IN SMBIOS_TABLE_STRING StringNumber,
|
||||
IN CHAR8 *String
|
||||
);
|
||||
|
||||
/**
|
||||
Update the string associated with an existing SMBIOS record.
|
||||
|
||||
This function allows the update of specific SMBIOS strings. The number of valid strings for any
|
||||
SMBIOS record is defined by how many strings were present when Add() was called.
|
||||
|
||||
@param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
|
||||
@param[in] StringNumber The non-zero string number of the string to update.
|
||||
@param[in] String Update the StringNumber string with String.
|
||||
|
||||
@retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
|
||||
@retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
|
||||
@retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibUpdateUnicodeString (
|
||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||
IN SMBIOS_TABLE_STRING StringNumber,
|
||||
IN CHAR16 *String
|
||||
);
|
||||
|
||||
/**
|
||||
Allow caller to read a specific SMBIOS string
|
||||
|
||||
@param[in] Header SMBIOS record that contains the string.
|
||||
@param[in[ StringNumber Instance of SMBIOS string 1 - N.
|
||||
|
||||
@retval NULL Instance of Type SMBIOS string was not found.
|
||||
@retval Other Pointer to matching SMBIOS string.
|
||||
**/
|
||||
CHAR8 *
|
||||
EFIAPI
|
||||
SmbiosLibReadString (
|
||||
IN SMBIOS_STRUCTURE *Header,
|
||||
IN EFI_SMBIOS_STRING StringNumber
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
|
||||
|
||||
@param[in] Type Type of the next SMBIOS record to return.
|
||||
@param[in[ Instance Instance of SMBIOS record 0 - N-1.
|
||||
@param[out] SmbiosHandle Returns SMBIOS handle for the matching record.
|
||||
|
||||
@retval NULL Instance of Type SMBIOS record was not found.
|
||||
@retval Other Pointer to matching SMBIOS record.
|
||||
**/
|
||||
SMBIOS_STRUCTURE *
|
||||
EFIAPI
|
||||
SmbiosLibGetRecord (
|
||||
IN EFI_SMBIOS_TYPE Type,
|
||||
IN UINTN Instance,
|
||||
OUT EFI_SMBIOS_HANDLE *SmbiosHandle
|
||||
);
|
||||
|
||||
/**
|
||||
Remove an SMBIOS record.
|
||||
|
||||
This function removes an SMBIOS record using the handle specified by SmbiosHandle.
|
||||
|
||||
@param[in] SmbiosHandle The handle of the SMBIOS record to remove.
|
||||
|
||||
@retval EFI_SUCCESS SMBIOS record was removed.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibRemove (
|
||||
OUT EFI_SMBIOS_HANDLE SmbiosHandle
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -62,7 +62,7 @@ EFI_STATUS
|
||||
@param[in] MediaId Id of the media, changes every time the media is
|
||||
replaced.
|
||||
@param[in] Lba The starting Logical Block Address to read from.
|
||||
@param[in, out] Token A pointer to the token associated with the transaction.
|
||||
@param[in, out] Token A pointer to the token associated with the transaction.
|
||||
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param[out] Buffer A pointer to the destination buffer for the data. The
|
||||
caller is responsible for either having implicit or
|
||||
|
@ -1,140 +1,140 @@
|
||||
/** @file
|
||||
SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
|
||||
|
||||
The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)
|
||||
file system specified in UEFI 2.0. It can also be used to abstract a file
|
||||
system other than FAT.
|
||||
|
||||
UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2011, Apple Inc. All rights reserved.
|
||||
This program and the accompanying materials are licensed and made available under
|
||||
the terms and conditions of the BSD License that accompanies this distribution.
|
||||
The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _EMU_UGA_IO_H_
|
||||
#define _EMU_UGA_IO_H_
|
||||
|
||||
#include <Protocol/SimplePointer.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/UgaDraw.h>
|
||||
|
||||
#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
|
||||
{ 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
|
||||
|
||||
typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
|
||||
UINT32 Width,
|
||||
UINT32 Height
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
|
||||
EFI_KEY_DATA *key
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
||||
);
|
||||
|
||||
|
||||
typedef
|
||||
VOID
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
|
||||
IN VOID *Context,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
|
||||
typedef struct {
|
||||
UINTN SourceX;
|
||||
UINTN SourceY;
|
||||
UINTN DestinationX;
|
||||
UINTN DestinationY;
|
||||
UINTN Width;
|
||||
UINTN Height;
|
||||
UINTN Delta;
|
||||
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
|
||||
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
|
||||
);
|
||||
|
||||
typedef
|
||||
BOOLEAN
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
EFI_SIMPLE_POINTER_STATE *state
|
||||
);
|
||||
|
||||
struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
|
||||
EMU_GRAPHICS_WINDOWS_SIZE Size;
|
||||
EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
|
||||
EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
|
||||
EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
|
||||
EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
|
||||
EMU_GRAPHICS_WINDOWS_BLT Blt;
|
||||
EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
|
||||
EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
|
||||
EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
|
||||
};
|
||||
|
||||
|
||||
extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
|
||||
|
||||
#endif
|
||||
/** @file
|
||||
SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
|
||||
|
||||
The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)
|
||||
file system specified in UEFI 2.0. It can also be used to abstract a file
|
||||
system other than FAT.
|
||||
|
||||
UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2011, Apple Inc. All rights reserved.
|
||||
This program and the accompanying materials are licensed and made available under
|
||||
the terms and conditions of the BSD License that accompanies this distribution.
|
||||
The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _EMU_UGA_IO_H_
|
||||
#define _EMU_UGA_IO_H_
|
||||
|
||||
#include <Protocol/SimplePointer.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/UgaDraw.h>
|
||||
|
||||
#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
|
||||
{ 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
|
||||
|
||||
typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
|
||||
UINT32 Width,
|
||||
UINT32 Height
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
|
||||
EFI_KEY_DATA *key
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
||||
);
|
||||
|
||||
|
||||
typedef
|
||||
VOID
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
|
||||
IN VOID *Context,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
|
||||
typedef struct {
|
||||
UINTN SourceX;
|
||||
UINTN SourceY;
|
||||
UINTN DestinationX;
|
||||
UINTN DestinationY;
|
||||
UINTN Width;
|
||||
UINTN Height;
|
||||
UINTN Delta;
|
||||
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
|
||||
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
|
||||
);
|
||||
|
||||
typedef
|
||||
BOOLEAN
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
EFI_SIMPLE_POINTER_STATE *state
|
||||
);
|
||||
|
||||
struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
|
||||
EMU_GRAPHICS_WINDOWS_SIZE Size;
|
||||
EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
|
||||
EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
|
||||
EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
|
||||
EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
|
||||
EMU_GRAPHICS_WINDOWS_BLT Blt;
|
||||
EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
|
||||
EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
|
||||
EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
|
||||
};
|
||||
|
||||
|
||||
extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
|
||||
|
||||
#endif
|
||||
|
@ -1,134 +1,134 @@
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
|
||||
Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the
|
||||
BSD License which accompanies this distribution. The full text of the
|
||||
license may be found at http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _EMU_UGA_IO_H_
|
||||
#define _EMU_UGA_IO_H_
|
||||
|
||||
#include <Protocol/SimplePointer.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/UgaDraw.h>
|
||||
|
||||
#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
|
||||
{ 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
|
||||
|
||||
typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
|
||||
UINT32 Width,
|
||||
UINT32 Height
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
|
||||
EFI_KEY_DATA *key
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
||||
);
|
||||
|
||||
|
||||
typedef
|
||||
VOID
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
|
||||
IN VOID *Context,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
|
||||
typedef struct {
|
||||
UINTN SourceX;
|
||||
UINTN SourceY;
|
||||
UINTN DestinationX;
|
||||
UINTN DestinationY;
|
||||
UINTN Width;
|
||||
UINTN Height;
|
||||
UINTN Delta;
|
||||
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
|
||||
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
|
||||
);
|
||||
|
||||
typedef
|
||||
BOOLEAN
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
EFI_SIMPLE_POINTER_STATE *state
|
||||
);
|
||||
|
||||
struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
|
||||
EMU_GRAPHICS_WINDOWS_SIZE Size;
|
||||
EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
|
||||
EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
|
||||
EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
|
||||
EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
|
||||
EMU_GRAPHICS_WINDOWS_BLT Blt;
|
||||
EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
|
||||
EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
|
||||
EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
|
||||
};
|
||||
|
||||
|
||||
extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
|
||||
|
||||
#endif
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
|
||||
Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the
|
||||
BSD License which accompanies this distribution. The full text of the
|
||||
license may be found at http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _EMU_UGA_IO_H_
|
||||
#define _EMU_UGA_IO_H_
|
||||
|
||||
#include <Protocol/SimplePointer.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/UgaDraw.h>
|
||||
|
||||
#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
|
||||
{ 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
|
||||
|
||||
typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
|
||||
UINT32 Width,
|
||||
UINT32 Height
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
|
||||
EFI_KEY_DATA *key
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
||||
);
|
||||
|
||||
|
||||
typedef
|
||||
VOID
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
|
||||
IN VOID *Context,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
|
||||
IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
|
||||
typedef struct {
|
||||
UINTN SourceX;
|
||||
UINTN SourceY;
|
||||
UINTN DestinationX;
|
||||
UINTN DestinationY;
|
||||
UINTN Width;
|
||||
UINTN Height;
|
||||
UINTN Delta;
|
||||
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
|
||||
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
|
||||
);
|
||||
|
||||
typedef
|
||||
BOOLEAN
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
|
||||
IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
|
||||
);
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
|
||||
EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
|
||||
EFI_SIMPLE_POINTER_STATE *state
|
||||
);
|
||||
|
||||
struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
|
||||
EMU_GRAPHICS_WINDOWS_SIZE Size;
|
||||
EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
|
||||
EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
|
||||
EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
|
||||
EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
|
||||
EMU_GRAPHICS_WINDOWS_BLT Blt;
|
||||
EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
|
||||
EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
|
||||
EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
|
||||
};
|
||||
|
||||
|
||||
extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
|
||||
|
||||
#endif
|
||||
|
@ -180,4 +180,4 @@ DevicePathToTextLibConstructor (
|
||||
DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread);
|
||||
DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
@ -45,4 +45,4 @@
|
||||
gEmuGraphicsWindowProtocolGuid
|
||||
gEfiSimpleFileSystemProtocolGuid
|
||||
gEmuBlockIoProtocolGuid
|
||||
gEmuThreadThunkProtocolGuid
|
||||
gEmuThreadThunkProtocolGuid
|
||||
|
@ -85,4 +85,4 @@ GetIoThunkInstance (
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -1,48 +1,48 @@
|
||||
## @file
|
||||
# PeCoff extra action libary for DXE phase that run Emu emulator.
|
||||
#
|
||||
# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
# Portions copyright (c) 2011, Apple Inc. All rights reserved.
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = DxeEmuPeCoffExtraActionLib
|
||||
FILE_GUID = 68FCD487-D230-6846-95B1-5E1F2EF942C4
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER
|
||||
|
||||
CONSTRUCTOR = DxeEmuPeCoffLibExtraActionConstructor
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32
|
||||
#
|
||||
|
||||
[Sources]
|
||||
DxeEmuPeCoffExtraActionLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
EmulatorPkg/EmulatorPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
DebugLib
|
||||
HobLib
|
||||
BaseMemoryLib
|
||||
|
||||
[Protocols]
|
||||
gEmuThunkProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
|
||||
## @file
|
||||
# PeCoff extra action libary for DXE phase that run Emu emulator.
|
||||
#
|
||||
# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
# Portions copyright (c) 2011, Apple Inc. All rights reserved.
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = DxeEmuPeCoffExtraActionLib
|
||||
FILE_GUID = 68FCD487-D230-6846-95B1-5E1F2EF942C4
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER
|
||||
|
||||
CONSTRUCTOR = DxeEmuPeCoffLibExtraActionConstructor
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32
|
||||
#
|
||||
|
||||
[Sources]
|
||||
DxeEmuPeCoffExtraActionLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
EmulatorPkg/EmulatorPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
DebugLib
|
||||
HobLib
|
||||
BaseMemoryLib
|
||||
|
||||
[Protocols]
|
||||
gEmuThunkProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
|
||||
|
@ -69,7 +69,7 @@ SerialPortWrite (
|
||||
if (gEmuThunk == NULL) {
|
||||
return NumberOfBytes;
|
||||
}
|
||||
|
||||
|
||||
return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);
|
||||
}
|
||||
|
||||
|
@ -47,4 +47,4 @@ KeyMapBreak (
|
||||
)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
@ -89,16 +89,16 @@ PeiServicesTablePointerLibConstructor (
|
||||
}
|
||||
|
||||
/**
|
||||
Perform CPU specific actions required to migrate the PEI Services Table
|
||||
Perform CPU specific actions required to migrate the PEI Services Table
|
||||
pointer from temporary RAM to permanent RAM.
|
||||
|
||||
For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
|
||||
For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
|
||||
immediately preceding the Interrupt Descriptor Table (IDT) in memory.
|
||||
For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
|
||||
For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
|
||||
immediately preceding the Interrupt Descriptor Table (IDT) in memory.
|
||||
For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
|
||||
a dedicated CPU register. This means that there is no memory storage
|
||||
associated with storing the PEI Services Table pointer, so no additional
|
||||
a dedicated CPU register. This means that there is no memory storage
|
||||
associated with storing the PEI Services Table pointer, so no additional
|
||||
migration actions are required for Itanium or ARM CPUs.
|
||||
|
||||
**/
|
||||
@ -109,7 +109,7 @@ MigratePeiServicesTablePointer (
|
||||
)
|
||||
{
|
||||
//
|
||||
// PEI Services Table pointer is cached in the global variable. No additional
|
||||
// PEI Services Table pointer is cached in the global variable. No additional
|
||||
// migration actions are required.
|
||||
//
|
||||
return;
|
||||
|
@ -1,49 +1,49 @@
|
||||
## @file
|
||||
# PeCoff extra action libary for Pei phase that run Emu emulator.
|
||||
#
|
||||
# Lib to provide memory journal status code reporting Routines
|
||||
# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
# Portions copyright (c) 2011, Apple Inc. All rights reserved.
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = PeiEmuPeCoffExtraActionLib
|
||||
FILE_GUID = 79C4E72A-730B-F040-8129-95877B3A97A8
|
||||
MODULE_TYPE = PEIM
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = PeCoffExtraActionLib|PEI_CORE PEIM
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32
|
||||
#
|
||||
|
||||
[Sources]
|
||||
PeiEmuPeCoffExtraActionLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
EmulatorPkg/EmulatorPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
PeiServicesLib
|
||||
DebugLib
|
||||
|
||||
[Ppis]
|
||||
gEmuThunkPpiGuid # PPI ALWAYS_CONSUMED
|
||||
|
||||
[Pcd]
|
||||
gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
|
||||
## @file
|
||||
# PeCoff extra action libary for Pei phase that run Emu emulator.
|
||||
#
|
||||
# Lib to provide memory journal status code reporting Routines
|
||||
# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
# Portions copyright (c) 2011, Apple Inc. All rights reserved.
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = PeiEmuPeCoffExtraActionLib
|
||||
FILE_GUID = 79C4E72A-730B-F040-8129-95877B3A97A8
|
||||
MODULE_TYPE = PEIM
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = PeCoffExtraActionLib|PEI_CORE PEIM
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32
|
||||
#
|
||||
|
||||
[Sources]
|
||||
PeiEmuPeCoffExtraActionLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
EmulatorPkg/EmulatorPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
PeiServicesLib
|
||||
DebugLib
|
||||
|
||||
[Ppis]
|
||||
gEmuThunkPpiGuid # PPI ALWAYS_CONSUMED
|
||||
|
||||
[Pcd]
|
||||
gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
|
||||
|
@ -134,16 +134,16 @@ PeiServicesTablePointerLibConstructor (
|
||||
}
|
||||
|
||||
/**
|
||||
Perform CPU specific actions required to migrate the PEI Services Table
|
||||
Perform CPU specific actions required to migrate the PEI Services Table
|
||||
pointer from temporary RAM to permanent RAM.
|
||||
|
||||
For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
|
||||
For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
|
||||
immediately preceding the Interrupt Descriptor Table (IDT) in memory.
|
||||
For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
|
||||
For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
|
||||
immediately preceding the Interrupt Descriptor Table (IDT) in memory.
|
||||
For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
|
||||
a dedicated CPU register. This means that there is no memory storage
|
||||
associated with storing the PEI Services Table pointer, so no additional
|
||||
a dedicated CPU register. This means that there is no memory storage
|
||||
associated with storing the PEI Services Table pointer, so no additional
|
||||
migration actions are required for Itanium or ARM CPUs.
|
||||
|
||||
**/
|
||||
@ -154,7 +154,7 @@ MigratePeiServicesTablePointer (
|
||||
)
|
||||
{
|
||||
//
|
||||
// PEI Services Table pointer is cached in the global variable. No additional
|
||||
// PEI Services Table pointer is cached in the global variable. No additional
|
||||
// migration actions are required.
|
||||
//
|
||||
return;
|
||||
|
@ -72,16 +72,16 @@ GetPeiServicesTablePointer (
|
||||
}
|
||||
|
||||
/**
|
||||
Perform CPU specific actions required to migrate the PEI Services Table
|
||||
Perform CPU specific actions required to migrate the PEI Services Table
|
||||
pointer from temporary RAM to permanent RAM.
|
||||
|
||||
For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
|
||||
For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
|
||||
immediately preceding the Interrupt Descriptor Table (IDT) in memory.
|
||||
For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
|
||||
For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
|
||||
immediately preceding the Interrupt Descriptor Table (IDT) in memory.
|
||||
For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
|
||||
a dedicated CPU register. This means that there is no memory storage
|
||||
associated with storing the PEI Services Table pointer, so no additional
|
||||
a dedicated CPU register. This means that there is no memory storage
|
||||
associated with storing the PEI Services Table pointer, so no additional
|
||||
migration actions are required for Itanium or ARM CPUs.
|
||||
|
||||
**/
|
||||
@ -92,7 +92,7 @@ MigratePeiServicesTablePointer (
|
||||
)
|
||||
{
|
||||
//
|
||||
// PEI Services Table pointer is cached in SRAM. No additional
|
||||
// PEI Services Table pointer is cached in SRAM. No additional
|
||||
// migration actions are required.
|
||||
//
|
||||
return;
|
||||
|
@ -44,4 +44,4 @@
|
||||
PeiServicesLib
|
||||
|
||||
[Ppis]
|
||||
gEmuThunkPpiGuid
|
||||
gEmuThunkPpiGuid
|
||||
|
@ -1,281 +1,281 @@
|
||||
/*++ @file
|
||||
A simple FV stack so the SEC can extract the SEC Core from an
|
||||
FV.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
|
||||
|
||||
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
|
||||
(ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
|
||||
|
||||
EFI_FFS_FILE_STATE
|
||||
GetFileState (
|
||||
IN UINT8 ErasePolarity,
|
||||
IN EFI_FFS_FILE_HEADER *FfsHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Returns the highest bit set of the State field
|
||||
|
||||
Arguments:
|
||||
ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
|
||||
in the Attributes field.
|
||||
FfsHeader - Pointer to FFS File Header.
|
||||
|
||||
Returns:
|
||||
Returns the highest bit in the State field
|
||||
|
||||
**/
|
||||
{
|
||||
EFI_FFS_FILE_STATE FileState;
|
||||
EFI_FFS_FILE_STATE HighestBit;
|
||||
|
||||
FileState = FfsHeader->State;
|
||||
|
||||
if (ErasePolarity != 0) {
|
||||
FileState = (EFI_FFS_FILE_STATE)~FileState;
|
||||
}
|
||||
|
||||
HighestBit = 0x80;
|
||||
while (HighestBit != 0 && (HighestBit & FileState) == 0) {
|
||||
HighestBit >>= 1;
|
||||
}
|
||||
|
||||
return HighestBit;
|
||||
}
|
||||
|
||||
UINT8
|
||||
CalculateHeaderChecksum (
|
||||
IN EFI_FFS_FILE_HEADER *FileHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Calculates the checksum of the header of a file.
|
||||
|
||||
Arguments:
|
||||
FileHeader - Pointer to FFS File Header.
|
||||
|
||||
Returns:
|
||||
Checksum of the header.
|
||||
|
||||
**/
|
||||
{
|
||||
UINT8 *ptr;
|
||||
UINTN Index;
|
||||
UINT8 Sum;
|
||||
|
||||
Sum = 0;
|
||||
ptr = (UINT8 *) FileHeader;
|
||||
|
||||
for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
|
||||
Sum = (UINT8) (Sum + ptr[Index]);
|
||||
Sum = (UINT8) (Sum + ptr[Index + 1]);
|
||||
Sum = (UINT8) (Sum + ptr[Index + 2]);
|
||||
Sum = (UINT8) (Sum + ptr[Index + 3]);
|
||||
}
|
||||
|
||||
for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
|
||||
Sum = (UINT8) (Sum + ptr[Index]);
|
||||
}
|
||||
//
|
||||
// State field (since this indicates the different state of file).
|
||||
//
|
||||
Sum = (UINT8) (Sum - FileHeader->State);
|
||||
//
|
||||
// Checksum field of the file is not part of the header checksum.
|
||||
//
|
||||
Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
|
||||
|
||||
return Sum;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
SecFfsFindNextFile (
|
||||
IN EFI_FV_FILETYPE SearchType,
|
||||
IN EFI_PEI_FV_HANDLE FvHandle,
|
||||
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Given the input file pointer, search for the next matching file in the
|
||||
FFS volume as defined by SearchType. The search starts from FileHeader inside
|
||||
the Firmware Volume defined by FwVolHeader.
|
||||
|
||||
Arguments:
|
||||
SearchType - Filter to find only files of this type.
|
||||
Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
|
||||
FwVolHeader - Pointer to the FV header of the volume to search.
|
||||
This parameter must point to a valid FFS volume.
|
||||
FileHeader - Pointer to the current file from which to begin searching.
|
||||
This pointer will be updated upon return to reflect the file
|
||||
found.
|
||||
|
||||
Returns:
|
||||
EFI_NOT_FOUND - No files matching the search criteria were found
|
||||
EFI_SUCCESS
|
||||
|
||||
**/
|
||||
{
|
||||
EFI_FFS_FILE_HEADER *FfsFileHeader;
|
||||
UINT32 FileLength;
|
||||
UINT32 FileOccupiedSize;
|
||||
UINT32 FileOffset;
|
||||
UINT64 FvLength;
|
||||
UINT8 ErasePolarity;
|
||||
UINT8 FileState;
|
||||
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
||||
EFI_FFS_FILE_HEADER **FileHeader;
|
||||
|
||||
//
|
||||
// Convert the handle of FV to FV header for memory-mapped firmware volume
|
||||
//
|
||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
|
||||
FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
|
||||
|
||||
FvLength = FwVolHeader->FvLength;
|
||||
if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
|
||||
ErasePolarity = 1;
|
||||
} else {
|
||||
ErasePolarity = 0;
|
||||
}
|
||||
//
|
||||
// If FileHeader is not specified (NULL) start with the first file in the
|
||||
// firmware volume. Otherwise, start from the FileHeader.
|
||||
//
|
||||
if (*FileHeader == NULL) {
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);
|
||||
} else {
|
||||
//
|
||||
// Length is 24 bits wide so mask upper 8 bits
|
||||
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||
//
|
||||
FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
|
||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
|
||||
}
|
||||
|
||||
FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
|
||||
|
||||
while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
|
||||
//
|
||||
// Get FileState which is the highest bit of the State
|
||||
//
|
||||
FileState = GetFileState (ErasePolarity, FfsFileHeader);
|
||||
|
||||
switch (FileState) {
|
||||
|
||||
case EFI_FILE_HEADER_INVALID:
|
||||
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
|
||||
break;
|
||||
|
||||
case EFI_FILE_DATA_VALID:
|
||||
case EFI_FILE_MARKED_FOR_UPDATE:
|
||||
if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
|
||||
FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||
|
||||
if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
|
||||
|
||||
*FileHeader = FfsFileHeader;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
FileOffset += FileOccupiedSize;
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
|
||||
} else {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
break;
|
||||
|
||||
case EFI_FILE_DELETED:
|
||||
FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||
FileOffset += FileOccupiedSize;
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
|
||||
break;
|
||||
|
||||
default:
|
||||
return EFI_NOT_FOUND;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
SecFfsFindSectionData (
|
||||
IN EFI_SECTION_TYPE SectionType,
|
||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||
IN OUT VOID **SectionData
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Given the input file pointer, search for the next matching section in the
|
||||
FFS volume.
|
||||
|
||||
Arguments:
|
||||
SearchType - Filter to find only sections of this type.
|
||||
FfsFileHeader - Pointer to the current file to search.
|
||||
SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
|
||||
NULL if section not found
|
||||
|
||||
Returns:
|
||||
EFI_NOT_FOUND - No files matching the search criteria were found
|
||||
EFI_SUCCESS
|
||||
|
||||
**/
|
||||
{
|
||||
UINT32 FileSize;
|
||||
EFI_COMMON_SECTION_HEADER *Section;
|
||||
UINT32 SectionLength;
|
||||
UINT32 ParsedLength;
|
||||
|
||||
//
|
||||
// Size is 24 bits wide so mask upper 8 bits.
|
||||
// Does not include FfsFileHeader header size
|
||||
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||
//
|
||||
Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
|
||||
FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
||||
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
|
||||
|
||||
*SectionData = NULL;
|
||||
ParsedLength = 0;
|
||||
while (ParsedLength < FileSize) {
|
||||
if (Section->Type == SectionType) {
|
||||
*SectionData = (VOID *) (Section + 1);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
//
|
||||
// Size is 24 bits wide so mask upper 8 bits.
|
||||
// SectionLength is adjusted it is 4 byte aligned.
|
||||
// Go to the next section
|
||||
//
|
||||
SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
|
||||
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
|
||||
|
||||
ParsedLength += SectionLength;
|
||||
Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/*++ @file
|
||||
A simple FV stack so the SEC can extract the SEC Core from an
|
||||
FV.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
|
||||
|
||||
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
|
||||
(ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
|
||||
|
||||
EFI_FFS_FILE_STATE
|
||||
GetFileState (
|
||||
IN UINT8 ErasePolarity,
|
||||
IN EFI_FFS_FILE_HEADER *FfsHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Returns the highest bit set of the State field
|
||||
|
||||
Arguments:
|
||||
ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
|
||||
in the Attributes field.
|
||||
FfsHeader - Pointer to FFS File Header.
|
||||
|
||||
Returns:
|
||||
Returns the highest bit in the State field
|
||||
|
||||
**/
|
||||
{
|
||||
EFI_FFS_FILE_STATE FileState;
|
||||
EFI_FFS_FILE_STATE HighestBit;
|
||||
|
||||
FileState = FfsHeader->State;
|
||||
|
||||
if (ErasePolarity != 0) {
|
||||
FileState = (EFI_FFS_FILE_STATE)~FileState;
|
||||
}
|
||||
|
||||
HighestBit = 0x80;
|
||||
while (HighestBit != 0 && (HighestBit & FileState) == 0) {
|
||||
HighestBit >>= 1;
|
||||
}
|
||||
|
||||
return HighestBit;
|
||||
}
|
||||
|
||||
UINT8
|
||||
CalculateHeaderChecksum (
|
||||
IN EFI_FFS_FILE_HEADER *FileHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Calculates the checksum of the header of a file.
|
||||
|
||||
Arguments:
|
||||
FileHeader - Pointer to FFS File Header.
|
||||
|
||||
Returns:
|
||||
Checksum of the header.
|
||||
|
||||
**/
|
||||
{
|
||||
UINT8 *ptr;
|
||||
UINTN Index;
|
||||
UINT8 Sum;
|
||||
|
||||
Sum = 0;
|
||||
ptr = (UINT8 *) FileHeader;
|
||||
|
||||
for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
|
||||
Sum = (UINT8) (Sum + ptr[Index]);
|
||||
Sum = (UINT8) (Sum + ptr[Index + 1]);
|
||||
Sum = (UINT8) (Sum + ptr[Index + 2]);
|
||||
Sum = (UINT8) (Sum + ptr[Index + 3]);
|
||||
}
|
||||
|
||||
for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
|
||||
Sum = (UINT8) (Sum + ptr[Index]);
|
||||
}
|
||||
//
|
||||
// State field (since this indicates the different state of file).
|
||||
//
|
||||
Sum = (UINT8) (Sum - FileHeader->State);
|
||||
//
|
||||
// Checksum field of the file is not part of the header checksum.
|
||||
//
|
||||
Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
|
||||
|
||||
return Sum;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
SecFfsFindNextFile (
|
||||
IN EFI_FV_FILETYPE SearchType,
|
||||
IN EFI_PEI_FV_HANDLE FvHandle,
|
||||
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Given the input file pointer, search for the next matching file in the
|
||||
FFS volume as defined by SearchType. The search starts from FileHeader inside
|
||||
the Firmware Volume defined by FwVolHeader.
|
||||
|
||||
Arguments:
|
||||
SearchType - Filter to find only files of this type.
|
||||
Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
|
||||
FwVolHeader - Pointer to the FV header of the volume to search.
|
||||
This parameter must point to a valid FFS volume.
|
||||
FileHeader - Pointer to the current file from which to begin searching.
|
||||
This pointer will be updated upon return to reflect the file
|
||||
found.
|
||||
|
||||
Returns:
|
||||
EFI_NOT_FOUND - No files matching the search criteria were found
|
||||
EFI_SUCCESS
|
||||
|
||||
**/
|
||||
{
|
||||
EFI_FFS_FILE_HEADER *FfsFileHeader;
|
||||
UINT32 FileLength;
|
||||
UINT32 FileOccupiedSize;
|
||||
UINT32 FileOffset;
|
||||
UINT64 FvLength;
|
||||
UINT8 ErasePolarity;
|
||||
UINT8 FileState;
|
||||
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
||||
EFI_FFS_FILE_HEADER **FileHeader;
|
||||
|
||||
//
|
||||
// Convert the handle of FV to FV header for memory-mapped firmware volume
|
||||
//
|
||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
|
||||
FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
|
||||
|
||||
FvLength = FwVolHeader->FvLength;
|
||||
if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
|
||||
ErasePolarity = 1;
|
||||
} else {
|
||||
ErasePolarity = 0;
|
||||
}
|
||||
//
|
||||
// If FileHeader is not specified (NULL) start with the first file in the
|
||||
// firmware volume. Otherwise, start from the FileHeader.
|
||||
//
|
||||
if (*FileHeader == NULL) {
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);
|
||||
} else {
|
||||
//
|
||||
// Length is 24 bits wide so mask upper 8 bits
|
||||
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||
//
|
||||
FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
|
||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
|
||||
}
|
||||
|
||||
FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
|
||||
|
||||
while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
|
||||
//
|
||||
// Get FileState which is the highest bit of the State
|
||||
//
|
||||
FileState = GetFileState (ErasePolarity, FfsFileHeader);
|
||||
|
||||
switch (FileState) {
|
||||
|
||||
case EFI_FILE_HEADER_INVALID:
|
||||
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
|
||||
break;
|
||||
|
||||
case EFI_FILE_DATA_VALID:
|
||||
case EFI_FILE_MARKED_FOR_UPDATE:
|
||||
if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
|
||||
FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||
|
||||
if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
|
||||
|
||||
*FileHeader = FfsFileHeader;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
FileOffset += FileOccupiedSize;
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
|
||||
} else {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
break;
|
||||
|
||||
case EFI_FILE_DELETED:
|
||||
FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||
FileOffset += FileOccupiedSize;
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
|
||||
break;
|
||||
|
||||
default:
|
||||
return EFI_NOT_FOUND;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
SecFfsFindSectionData (
|
||||
IN EFI_SECTION_TYPE SectionType,
|
||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||
IN OUT VOID **SectionData
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Given the input file pointer, search for the next matching section in the
|
||||
FFS volume.
|
||||
|
||||
Arguments:
|
||||
SearchType - Filter to find only sections of this type.
|
||||
FfsFileHeader - Pointer to the current file to search.
|
||||
SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
|
||||
NULL if section not found
|
||||
|
||||
Returns:
|
||||
EFI_NOT_FOUND - No files matching the search criteria were found
|
||||
EFI_SUCCESS
|
||||
|
||||
**/
|
||||
{
|
||||
UINT32 FileSize;
|
||||
EFI_COMMON_SECTION_HEADER *Section;
|
||||
UINT32 SectionLength;
|
||||
UINT32 ParsedLength;
|
||||
|
||||
//
|
||||
// Size is 24 bits wide so mask upper 8 bits.
|
||||
// Does not include FfsFileHeader header size
|
||||
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||
//
|
||||
Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
|
||||
FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
|
||||
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
|
||||
|
||||
*SectionData = NULL;
|
||||
ParsedLength = 0;
|
||||
while (ParsedLength < FileSize) {
|
||||
if (Section->Type == SectionType) {
|
||||
*SectionData = (VOID *) (Section + 1);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
//
|
||||
// Size is 24 bits wide so mask upper 8 bits.
|
||||
// SectionLength is adjusted it is 4 byte aligned.
|
||||
// Go to the next section
|
||||
//
|
||||
SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
|
||||
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
|
||||
|
||||
ParsedLength += SectionLength;
|
||||
Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
@ -1,17 +1,17 @@
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
|
||||
CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
|
||||
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
|
||||
CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
|
||||
|
||||
|
@ -1,352 +1,352 @@
|
||||
/** @file
|
||||
Provides library functions for common SMBIOS operations. Only available to DXE
|
||||
and UEFI module types.
|
||||
|
||||
|
||||
Copyright (c) 2012, Apple Inc. All rights reserved.
|
||||
Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials are licensed and made available under
|
||||
the terms and conditions of the BSD License that accompanies this distribution.
|
||||
The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiDxe.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/SmbiosLib.h>
|
||||
|
||||
|
||||
EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
|
||||
|
||||
|
||||
/**
|
||||
Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
|
||||
entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
|
||||
|
||||
@param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
|
||||
|
||||
@retval EFI_SUCCESS New SMBIOS tables were created.
|
||||
@retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibInitializeFromTemplate (
|
||||
IN SMBIOS_TEMPLATE_ENTRY *Template
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Index;
|
||||
|
||||
if (Template == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
for (Index = 0; Template[Index].Entry != NULL; Index++) {
|
||||
Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Create SMBIOS record.
|
||||
|
||||
Converts a fixed SMBIOS structure and an array of pointers to strings into
|
||||
an SMBIOS record where the strings are cat'ed on the end of the fixed record
|
||||
and terminated via a double NULL and add to SMBIOS table.
|
||||
|
||||
SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
|
||||
{ EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
|
||||
1 // StringCount
|
||||
};
|
||||
CHAR8 *gSmbiosType12Strings[] = {
|
||||
"Not Found",
|
||||
NULL
|
||||
};
|
||||
|
||||
...
|
||||
CreateSmbiosEntry (
|
||||
(EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
|
||||
gSmbiosType12Strings
|
||||
);
|
||||
|
||||
@param SmbiosEntry Fixed SMBIOS structure
|
||||
@param StringArray Array of strings to convert to an SMBIOS string pack.
|
||||
NULL is OK.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibCreateEntry (
|
||||
IN SMBIOS_STRUCTURE *SmbiosEntry,
|
||||
IN CHAR8 **StringArray
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||
UINTN Index;
|
||||
UINTN StringSize;
|
||||
UINTN Size;
|
||||
CHAR8 *Str;
|
||||
|
||||
// Calculate the size of the fixed record and optional string pack
|
||||
Size = SmbiosEntry->Length;
|
||||
if (StringArray == NULL) {
|
||||
Size += 2; // Min string section is double null
|
||||
} else if (StringArray[0] == NULL) {
|
||||
Size += 2; // Min string section is double null
|
||||
} else {
|
||||
for (Index = 0; StringArray[Index] != NULL; Index++) {
|
||||
StringSize = AsciiStrSize (StringArray[Index]);
|
||||
Size += StringSize;
|
||||
}
|
||||
// Don't forget the terminating double null
|
||||
Size += 1;
|
||||
}
|
||||
|
||||
// Copy over Template
|
||||
Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
|
||||
if (Record == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
|
||||
|
||||
if (StringArray != NULL) {
|
||||
// Append string pack
|
||||
Str = ((CHAR8 *)Record) + Record->Length;
|
||||
for (Index = 0; StringArray[Index] != NULL; Index++) {
|
||||
StringSize = AsciiStrSize (StringArray[Index]);
|
||||
CopyMem (Str, StringArray[Index], StringSize);
|
||||
Str += StringSize;
|
||||
}
|
||||
*Str = 0;
|
||||
}
|
||||
|
||||
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||
Status = gSmbios->Add (
|
||||
gSmbios,
|
||||
gImageHandle,
|
||||
&SmbiosHandle,
|
||||
Record
|
||||
);
|
||||
|
||||
FreePool (Record);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Update the string associated with an existing SMBIOS record.
|
||||
|
||||
This function allows the update of specific SMBIOS strings. The number of valid strings for any
|
||||
SMBIOS record is defined by how many strings were present when Add() was called.
|
||||
|
||||
@param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
|
||||
@param[in] StringNumber The non-zero string number of the string to update.
|
||||
@param[in] String Update the StringNumber string with String.
|
||||
|
||||
@retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
|
||||
@retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
|
||||
@retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibUpdateString (
|
||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||
IN SMBIOS_TABLE_STRING StringNumber,
|
||||
IN CHAR8 *String
|
||||
)
|
||||
{
|
||||
UINTN StringIndex;
|
||||
|
||||
if (String == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (*String == '\0') {
|
||||
// A string with no data is not legal in SMBIOS
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
StringIndex = StringNumber;
|
||||
return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Update the string associated with an existing SMBIOS record.
|
||||
|
||||
This function allows the update of specific SMBIOS strings. The number of valid strings for any
|
||||
SMBIOS record is defined by how many strings were present when Add() was called.
|
||||
|
||||
@param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
|
||||
@param[in] StringNumber The non-zero string number of the string to update.
|
||||
@param[in] String Update the StringNumber string with String.
|
||||
|
||||
@retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
|
||||
@retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
|
||||
@retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibUpdateUnicodeString (
|
||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||
IN SMBIOS_TABLE_STRING StringNumber,
|
||||
IN CHAR16 *String
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN StringIndex;
|
||||
CHAR8 *Ascii;
|
||||
|
||||
if (String == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (*String == '\0') {
|
||||
// A string with no data is not legal in SMBIOS
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Ascii = AllocateZeroPool (StrSize (String));
|
||||
if (Ascii == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
UnicodeStrToAsciiStr (String, Ascii);
|
||||
|
||||
StringIndex = StringNumber;
|
||||
Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);
|
||||
|
||||
FreePool (Ascii);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allow caller to read a specific SMBIOS string
|
||||
|
||||
@param[in] Header SMBIOS record that contains the string.
|
||||
@param[in[ StringNumber Instance of SMBIOS string 1 - N.
|
||||
|
||||
@retval NULL Instance of Type SMBIOS string was not found.
|
||||
@retval Other Pointer to matching SMBIOS string.
|
||||
**/
|
||||
CHAR8 *
|
||||
EFIAPI
|
||||
SmbiosLibReadString (
|
||||
IN SMBIOS_STRUCTURE *Header,
|
||||
IN EFI_SMBIOS_STRING StringNumber
|
||||
)
|
||||
{
|
||||
CHAR8 *Data;
|
||||
UINTN Match;
|
||||
|
||||
Data = (CHAR8 *)Header + Header->Length;
|
||||
for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
|
||||
if (StringNumber == Match) {
|
||||
return Data;
|
||||
}
|
||||
Data++;
|
||||
if (*(Data - 1) == '\0') {
|
||||
Match++;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
|
||||
|
||||
@param[in] Type Type of the next SMBIOS record to return.
|
||||
@param[in[ Instance Instance of SMBIOS record 0 - N-1.
|
||||
@param[out] SmbiosHandle Returns SMBIOS handle for the matching record.
|
||||
|
||||
@retval NULL Instance of Type SMBIOS record was not found.
|
||||
@retval Other Pointer to matching SMBIOS record.
|
||||
**/
|
||||
SMBIOS_STRUCTURE *
|
||||
EFIAPI
|
||||
SmbiosLibGetRecord (
|
||||
IN EFI_SMBIOS_TYPE Type,
|
||||
IN UINTN Instance,
|
||||
OUT EFI_SMBIOS_HANDLE *SmbiosHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||
UINTN Match;
|
||||
|
||||
Match = 0;
|
||||
*SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||
do {
|
||||
Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, NULL);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if (Match == Instance) {
|
||||
return (SMBIOS_STRUCTURE *)Record;
|
||||
}
|
||||
Match++;
|
||||
}
|
||||
} while (!EFI_ERROR (Status));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Remove an SMBIOS record.
|
||||
|
||||
This function removes an SMBIOS record using the handle specified by SmbiosHandle.
|
||||
|
||||
@param[in] SmbiosHandle The handle of the SMBIOS record to remove.
|
||||
|
||||
@retval EFI_SUCCESS SMBIOS record was removed.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibRemove (
|
||||
OUT EFI_SMBIOS_HANDLE SmbiosHandle
|
||||
)
|
||||
{
|
||||
return gSmbios->Remove (gSmbios, SmbiosHandle);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@param ImageHandle ImageHandle of the loaded driver.
|
||||
@param SystemTable Pointer to the EFI System Table.
|
||||
|
||||
@retval EFI_SUCCESS Register successfully.
|
||||
@retval EFI_OUT_OF_RESOURCES No enough memory to register this handler.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibConstructor (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);
|
||||
}
|
||||
|
||||
/** @file
|
||||
Provides library functions for common SMBIOS operations. Only available to DXE
|
||||
and UEFI module types.
|
||||
|
||||
|
||||
Copyright (c) 2012, Apple Inc. All rights reserved.
|
||||
Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials are licensed and made available under
|
||||
the terms and conditions of the BSD License that accompanies this distribution.
|
||||
The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiDxe.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/SmbiosLib.h>
|
||||
|
||||
|
||||
EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
|
||||
|
||||
|
||||
/**
|
||||
Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
|
||||
entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
|
||||
|
||||
@param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
|
||||
|
||||
@retval EFI_SUCCESS New SMBIOS tables were created.
|
||||
@retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibInitializeFromTemplate (
|
||||
IN SMBIOS_TEMPLATE_ENTRY *Template
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Index;
|
||||
|
||||
if (Template == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
for (Index = 0; Template[Index].Entry != NULL; Index++) {
|
||||
Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Create SMBIOS record.
|
||||
|
||||
Converts a fixed SMBIOS structure and an array of pointers to strings into
|
||||
an SMBIOS record where the strings are cat'ed on the end of the fixed record
|
||||
and terminated via a double NULL and add to SMBIOS table.
|
||||
|
||||
SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
|
||||
{ EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
|
||||
1 // StringCount
|
||||
};
|
||||
CHAR8 *gSmbiosType12Strings[] = {
|
||||
"Not Found",
|
||||
NULL
|
||||
};
|
||||
|
||||
...
|
||||
CreateSmbiosEntry (
|
||||
(EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
|
||||
gSmbiosType12Strings
|
||||
);
|
||||
|
||||
@param SmbiosEntry Fixed SMBIOS structure
|
||||
@param StringArray Array of strings to convert to an SMBIOS string pack.
|
||||
NULL is OK.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibCreateEntry (
|
||||
IN SMBIOS_STRUCTURE *SmbiosEntry,
|
||||
IN CHAR8 **StringArray
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||
UINTN Index;
|
||||
UINTN StringSize;
|
||||
UINTN Size;
|
||||
CHAR8 *Str;
|
||||
|
||||
// Calculate the size of the fixed record and optional string pack
|
||||
Size = SmbiosEntry->Length;
|
||||
if (StringArray == NULL) {
|
||||
Size += 2; // Min string section is double null
|
||||
} else if (StringArray[0] == NULL) {
|
||||
Size += 2; // Min string section is double null
|
||||
} else {
|
||||
for (Index = 0; StringArray[Index] != NULL; Index++) {
|
||||
StringSize = AsciiStrSize (StringArray[Index]);
|
||||
Size += StringSize;
|
||||
}
|
||||
// Don't forget the terminating double null
|
||||
Size += 1;
|
||||
}
|
||||
|
||||
// Copy over Template
|
||||
Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
|
||||
if (Record == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
|
||||
|
||||
if (StringArray != NULL) {
|
||||
// Append string pack
|
||||
Str = ((CHAR8 *)Record) + Record->Length;
|
||||
for (Index = 0; StringArray[Index] != NULL; Index++) {
|
||||
StringSize = AsciiStrSize (StringArray[Index]);
|
||||
CopyMem (Str, StringArray[Index], StringSize);
|
||||
Str += StringSize;
|
||||
}
|
||||
*Str = 0;
|
||||
}
|
||||
|
||||
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||
Status = gSmbios->Add (
|
||||
gSmbios,
|
||||
gImageHandle,
|
||||
&SmbiosHandle,
|
||||
Record
|
||||
);
|
||||
|
||||
FreePool (Record);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Update the string associated with an existing SMBIOS record.
|
||||
|
||||
This function allows the update of specific SMBIOS strings. The number of valid strings for any
|
||||
SMBIOS record is defined by how many strings were present when Add() was called.
|
||||
|
||||
@param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
|
||||
@param[in] StringNumber The non-zero string number of the string to update.
|
||||
@param[in] String Update the StringNumber string with String.
|
||||
|
||||
@retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
|
||||
@retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
|
||||
@retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibUpdateString (
|
||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||
IN SMBIOS_TABLE_STRING StringNumber,
|
||||
IN CHAR8 *String
|
||||
)
|
||||
{
|
||||
UINTN StringIndex;
|
||||
|
||||
if (String == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (*String == '\0') {
|
||||
// A string with no data is not legal in SMBIOS
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
StringIndex = StringNumber;
|
||||
return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Update the string associated with an existing SMBIOS record.
|
||||
|
||||
This function allows the update of specific SMBIOS strings. The number of valid strings for any
|
||||
SMBIOS record is defined by how many strings were present when Add() was called.
|
||||
|
||||
@param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
|
||||
@param[in] StringNumber The non-zero string number of the string to update.
|
||||
@param[in] String Update the StringNumber string with String.
|
||||
|
||||
@retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
|
||||
@retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
|
||||
@retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibUpdateUnicodeString (
|
||||
IN EFI_SMBIOS_HANDLE SmbiosHandle,
|
||||
IN SMBIOS_TABLE_STRING StringNumber,
|
||||
IN CHAR16 *String
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN StringIndex;
|
||||
CHAR8 *Ascii;
|
||||
|
||||
if (String == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (*String == '\0') {
|
||||
// A string with no data is not legal in SMBIOS
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Ascii = AllocateZeroPool (StrSize (String));
|
||||
if (Ascii == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
UnicodeStrToAsciiStr (String, Ascii);
|
||||
|
||||
StringIndex = StringNumber;
|
||||
Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);
|
||||
|
||||
FreePool (Ascii);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allow caller to read a specific SMBIOS string
|
||||
|
||||
@param[in] Header SMBIOS record that contains the string.
|
||||
@param[in[ StringNumber Instance of SMBIOS string 1 - N.
|
||||
|
||||
@retval NULL Instance of Type SMBIOS string was not found.
|
||||
@retval Other Pointer to matching SMBIOS string.
|
||||
**/
|
||||
CHAR8 *
|
||||
EFIAPI
|
||||
SmbiosLibReadString (
|
||||
IN SMBIOS_STRUCTURE *Header,
|
||||
IN EFI_SMBIOS_STRING StringNumber
|
||||
)
|
||||
{
|
||||
CHAR8 *Data;
|
||||
UINTN Match;
|
||||
|
||||
Data = (CHAR8 *)Header + Header->Length;
|
||||
for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
|
||||
if (StringNumber == Match) {
|
||||
return Data;
|
||||
}
|
||||
Data++;
|
||||
if (*(Data - 1) == '\0') {
|
||||
Match++;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
|
||||
|
||||
@param[in] Type Type of the next SMBIOS record to return.
|
||||
@param[in[ Instance Instance of SMBIOS record 0 - N-1.
|
||||
@param[out] SmbiosHandle Returns SMBIOS handle for the matching record.
|
||||
|
||||
@retval NULL Instance of Type SMBIOS record was not found.
|
||||
@retval Other Pointer to matching SMBIOS record.
|
||||
**/
|
||||
SMBIOS_STRUCTURE *
|
||||
EFIAPI
|
||||
SmbiosLibGetRecord (
|
||||
IN EFI_SMBIOS_TYPE Type,
|
||||
IN UINTN Instance,
|
||||
OUT EFI_SMBIOS_HANDLE *SmbiosHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||
UINTN Match;
|
||||
|
||||
Match = 0;
|
||||
*SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||
do {
|
||||
Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, NULL);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if (Match == Instance) {
|
||||
return (SMBIOS_STRUCTURE *)Record;
|
||||
}
|
||||
Match++;
|
||||
}
|
||||
} while (!EFI_ERROR (Status));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Remove an SMBIOS record.
|
||||
|
||||
This function removes an SMBIOS record using the handle specified by SmbiosHandle.
|
||||
|
||||
@param[in] SmbiosHandle The handle of the SMBIOS record to remove.
|
||||
|
||||
@retval EFI_SUCCESS SMBIOS record was removed.
|
||||
@retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibRemove (
|
||||
OUT EFI_SMBIOS_HANDLE SmbiosHandle
|
||||
)
|
||||
{
|
||||
return gSmbios->Remove (gSmbios, SmbiosHandle);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@param ImageHandle ImageHandle of the loaded driver.
|
||||
@param SystemTable Pointer to the EFI System Table.
|
||||
|
||||
@retval EFI_SUCCESS Register successfully.
|
||||
@retval EFI_OUT_OF_RESOURCES No enough memory to register this handler.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmbiosLibConstructor (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);
|
||||
}
|
||||
|
||||
|
@ -1,47 +1,47 @@
|
||||
## @file
|
||||
# SMBIOS Library
|
||||
#
|
||||
# Copyright (c) 2012, Apple Inc. All rights reserved.
|
||||
# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = SmbiosLib
|
||||
FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER
|
||||
|
||||
CONSTRUCTOR = SmbiosLibConstructor
|
||||
|
||||
|
||||
[Sources]
|
||||
SmbiosLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
EmulatorPkg/EmulatorPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
MemoryAllocationLib
|
||||
UefiBootServicesTableLib
|
||||
UefiLib
|
||||
|
||||
[Protocols]
|
||||
gEfiSmbiosProtocolGuid
|
||||
|
||||
[Depex]
|
||||
gEfiSmbiosProtocolGuid
|
||||
## @file
|
||||
# SMBIOS Library
|
||||
#
|
||||
# Copyright (c) 2012, Apple Inc. All rights reserved.
|
||||
# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = SmbiosLib
|
||||
FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER
|
||||
|
||||
CONSTRUCTOR = SmbiosLibConstructor
|
||||
|
||||
|
||||
[Sources]
|
||||
SmbiosLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
EmulatorPkg/EmulatorPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
MemoryAllocationLib
|
||||
UefiBootServicesTableLib
|
||||
UefiLib
|
||||
|
||||
[Protocols]
|
||||
gEfiSmbiosProtocolGuid
|
||||
|
||||
[Depex]
|
||||
gEfiSmbiosProtocolGuid
|
||||
|
@ -112,8 +112,8 @@ extern EFI_HII_HANDLE mHiiHandle;
|
||||
@param Smbios The EFI_SMBIOS_PROTOCOL instance.
|
||||
@param SmbiosHandle A unique handle will be assigned to the SMBIOS record.
|
||||
@param Record The data for the fixed portion of the SMBIOS record. The format of the record is
|
||||
determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
|
||||
by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
|
||||
determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
|
||||
by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
|
||||
a set of null terminated strings and a null.
|
||||
|
||||
@retval EFI_SUCCESS Record was added.
|
||||
|
@ -174,8 +174,8 @@ Returns:
|
||||
@param Smbios The EFI_SMBIOS_PROTOCOL instance.
|
||||
@param SmbiosHandle A unique handle will be assigned to the SMBIOS record.
|
||||
@param Record The data for the fixed portion of the SMBIOS record. The format of the record is
|
||||
determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
|
||||
by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
|
||||
determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
|
||||
by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
|
||||
a set of null terminated strings and a null.
|
||||
|
||||
@retval EFI_SUCCESS Record was added.
|
||||
|
@ -66,10 +66,10 @@ CreatePlatformSmbiosMemoryRecords (
|
||||
while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, HobPtr.Raw)) != NULL) {
|
||||
if (HobPtr.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
|
||||
gSmbiosType19Template.ExtendedStartingAddress = HobPtr.ResourceDescriptor->PhysicalStart;
|
||||
gSmbiosType19Template.ExtendedEndingAddress =
|
||||
HobPtr.ResourceDescriptor->PhysicalStart +
|
||||
gSmbiosType19Template.ExtendedEndingAddress =
|
||||
HobPtr.ResourceDescriptor->PhysicalStart +
|
||||
HobPtr.ResourceDescriptor->ResourceLength - 1;
|
||||
|
||||
|
||||
SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, NULL);
|
||||
}
|
||||
HobPtr.Raw = GET_NEXT_HOB (HobPtr);
|
||||
@ -97,7 +97,7 @@ PlatfomrSmbiosDriverEntryPoint (
|
||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||
SMBIOS_STRUCTURE_POINTER Smbios;
|
||||
|
||||
// Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
|
||||
// Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
|
||||
// to an early version of the specification.
|
||||
|
||||
// Phase 1 - Initialize SMBIOS tables from template
|
||||
@ -112,18 +112,18 @@ PlatfomrSmbiosDriverEntryPoint (
|
||||
Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64 (PcdEmuFirmwareFdSize), 64*1024) - 1;
|
||||
|
||||
SmbiosLibUpdateUnicodeString (
|
||||
SmbiosHandle,
|
||||
Smbios.Type0->BiosVersion,
|
||||
SmbiosHandle,
|
||||
Smbios.Type0->BiosVersion,
|
||||
(CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)
|
||||
);
|
||||
SmbiosLibUpdateUnicodeString (
|
||||
SmbiosHandle,
|
||||
Smbios.Type0->BiosReleaseDate,
|
||||
SmbiosHandle,
|
||||
Smbios.Type0->BiosReleaseDate,
|
||||
(CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)
|
||||
);
|
||||
}
|
||||
|
||||
// Phase 3 - Create tables from scratch
|
||||
// Phase 3 - Create tables from scratch
|
||||
|
||||
// Create Type 13 record from EFI Variables
|
||||
// Do we need this record for EFI as the info is available from EFI varaibles
|
||||
|
@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# Platform SMBIOS driver that fills in SMBIOS table entries.
|
||||
#
|
||||
# Copyright (c) 2012, Apple Inc. All rights reserved.
|
||||
# Copyright (c) 2012, Apple Inc. All rights reserved.
|
||||
# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
@ -52,4 +52,4 @@
|
||||
gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
TRUE
|
||||
|
@ -8,7 +8,7 @@
|
||||
Processor Information (Type 4) - CPU Driver
|
||||
Cache Information (Type 7) - For cache that is external to processor
|
||||
System Slots (Type 9) - If system has slots
|
||||
Physical Memory Array (Type 16)
|
||||
Physical Memory Array (Type 16)
|
||||
Memory Device (Type 17) - For each socketed system-memory Device
|
||||
Memory Array Mapped Address (Type 19) - One per contiguous block per Physical Memroy Array
|
||||
System Boot Information (Type 32)
|
||||
@ -69,9 +69,9 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
|
||||
0, // PrinterIsSupported :1;
|
||||
0, // CgaMonoIsSupported :1;
|
||||
0, // NecPc98 :1;
|
||||
0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
|
||||
///< and bits 48-63 reserved for System Vendor.
|
||||
},
|
||||
0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
|
||||
///< and bits 48-63 reserved for System Vendor.
|
||||
},
|
||||
{ // BIOSCharacteristicsExtensionBytes[]
|
||||
0x81, // AcpiIsSupported :1;
|
||||
// UsbLegacyIsSupported :1;
|
||||
@ -108,7 +108,7 @@ SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
|
||||
3, // Version String
|
||||
4, // SerialNumber String
|
||||
{ 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02 } },
|
||||
SystemWakeupTypePowerSwitch,
|
||||
SystemWakeupTypePowerSwitch,
|
||||
5, // SKUNumber String
|
||||
6, // Family String
|
||||
};
|
||||
@ -119,7 +119,7 @@ CHAR8 *gSmbiosType1Strings[] = {
|
||||
"System Serial#",
|
||||
"System SKU#",
|
||||
"edk2",
|
||||
NULL
|
||||
NULL
|
||||
};
|
||||
|
||||
SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
|
||||
@ -139,7 +139,7 @@ SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
|
||||
},
|
||||
6, // LocationInChassis String
|
||||
0, // ChassisHandle;
|
||||
BaseBoardTypeMotherBoard, // BoardType;
|
||||
BaseBoardTypeMotherBoard, // BoardType;
|
||||
0, // NumberOfContainedObjectHandles;
|
||||
{ 0 } // ContainedObjectHandles[1];
|
||||
};
|
||||
@ -150,7 +150,7 @@ CHAR8 *gSmbiosType2Strings[] = {
|
||||
"Base Board Serial#",
|
||||
"Base Board Asset Tag#",
|
||||
"Part Component",
|
||||
NULL
|
||||
NULL
|
||||
};
|
||||
|
||||
SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
|
||||
@ -160,10 +160,10 @@ SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
|
||||
2, // Version String
|
||||
3, // SerialNumber String
|
||||
4, // AssetTag String
|
||||
ChassisStateSafe, // BootupState;
|
||||
ChassisStateSafe, // PowerSupplyState;
|
||||
ChassisStateSafe, // ThermalState;
|
||||
ChassisSecurityStatusNone,// SecurityStatus;
|
||||
ChassisStateSafe, // BootupState;
|
||||
ChassisStateSafe, // PowerSupplyState;
|
||||
ChassisStateSafe, // ThermalState;
|
||||
ChassisSecurityStatusNone,// SecurityStatus;
|
||||
{ 0, 0, 0, 0 }, // OemDefined[4];
|
||||
0, // Height;
|
||||
0, // NumberofPowerCords;
|
||||
@ -176,7 +176,7 @@ CHAR8 *gSmbiosType3Strings[] = {
|
||||
"EmulatorPkg",
|
||||
"Chassis Board Serial#",
|
||||
"Chassis Board Asset Tag#",
|
||||
NULL
|
||||
NULL
|
||||
};
|
||||
|
||||
SMBIOS_TABLE_TYPE8 gSmbiosType8Template1 = {
|
||||
|
@ -22,7 +22,7 @@
|
||||
.586p
|
||||
.model flat,C
|
||||
.code
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; VOID
|
||||
; EFIAPI
|
||||
@ -30,7 +30,7 @@
|
||||
; UINT32 TemporaryMemoryBase,
|
||||
; UINT32 PermenentMemoryBase
|
||||
; );
|
||||
;------------------------------------------------------------------------------
|
||||
;------------------------------------------------------------------------------
|
||||
SecSwitchStack PROC
|
||||
;
|
||||
; Save three register: eax, ebx, ecx
|
||||
@ -39,16 +39,16 @@ SecSwitchStack PROC
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
|
||||
;
|
||||
; !!CAUTION!! this function address's is pushed into stack after
|
||||
; migration of whole temporary memory, so need save it to permenent
|
||||
; memory at first!
|
||||
;
|
||||
|
||||
|
||||
mov ebx, [esp + 20] ; Save the first parameter
|
||||
mov ecx, [esp + 24] ; Save the second parameter
|
||||
|
||||
|
||||
;
|
||||
; Save this function's return address into permenent memory at first.
|
||||
; Then, Fixup the esp point to permenent memory
|
||||
@ -57,17 +57,17 @@ SecSwitchStack PROC
|
||||
sub eax, ebx
|
||||
add eax, ecx
|
||||
mov edx, dword ptr [esp] ; copy pushed register's value to permenent memory
|
||||
mov dword ptr [eax], edx
|
||||
mov dword ptr [eax], edx
|
||||
mov edx, dword ptr [esp + 4]
|
||||
mov dword ptr [eax + 4], edx
|
||||
mov dword ptr [eax + 4], edx
|
||||
mov edx, dword ptr [esp + 8]
|
||||
mov dword ptr [eax + 8], edx
|
||||
mov dword ptr [eax + 8], edx
|
||||
mov edx, dword ptr [esp + 12]
|
||||
mov dword ptr [eax + 12], edx
|
||||
mov dword ptr [eax + 12], edx
|
||||
mov edx, dword ptr [esp + 16] ; Update this function's return address into permenent memory
|
||||
mov dword ptr [eax + 16], edx
|
||||
mov dword ptr [eax + 16], edx
|
||||
mov esp, eax ; From now, esp is pointed to permenent memory
|
||||
|
||||
|
||||
;
|
||||
; Fixup the ebp point to permenent memory
|
||||
;
|
||||
@ -75,7 +75,7 @@ SecSwitchStack PROC
|
||||
sub eax, ebx
|
||||
add eax, ecx
|
||||
mov ebp, eax ; From now, ebp is pointed to permenent memory
|
||||
|
||||
|
||||
;
|
||||
; Fixup callee's ebp point for PeiDispatch
|
||||
;
|
||||
@ -83,7 +83,7 @@ SecSwitchStack PROC
|
||||
sub eax, ebx
|
||||
add eax, ecx
|
||||
mov dword ptr [ebp], eax ; From now, Temporary's PPI caller's stack is in permenent memory
|
||||
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
|
@ -1,149 +1,149 @@
|
||||
/*++ @file
|
||||
Stub SEC that is called from the OS appliation that is the root of the emulator.
|
||||
|
||||
The OS application will call the SEC with the PEI Entry Point API.
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "Sec.h"
|
||||
|
||||
|
||||
|
||||
EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
|
||||
SecTemporaryRamSupport
|
||||
};
|
||||
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
|
||||
{
|
||||
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
||||
&gEfiTemporaryRamSupportPpiGuid,
|
||||
&mSecTemporaryRamSupportPpi
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
|
||||
SEC that sits on top of an OS application. So the entry and exit of this module
|
||||
has the same API.
|
||||
|
||||
This function is the entry point for the PEI Foundation, which allows the SEC phase
|
||||
to pass information about the stack, temporary RAM and the Boot Firmware Volume.
|
||||
In addition, it also allows the SEC phase to pass services and data forward for use
|
||||
during the PEI phase in the form of one or more PPIs.
|
||||
There is no limit to the number of additional PPIs that can be passed from SEC into
|
||||
the PEI Foundation. As part of its initialization phase, the PEI Foundation will add
|
||||
these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any
|
||||
modules can leverage the associated service calls and/or code in these early PPIs.
|
||||
This function is required to call ProcessModuleEntryPointList() with the Context
|
||||
parameter set to NULL. ProcessModuleEntryPoint() is never expected to return.
|
||||
The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon as
|
||||
the PEI Services Table and the file handle for the PEI Core itself have been established.
|
||||
If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
|
||||
|
||||
@param SecCoreData Points to a data structure containing information about the PEI
|
||||
core's operating environment, such as the size and location of
|
||||
temporary RAM, the stack location and the BFV location.
|
||||
|
||||
@param PpiList Points to a list of one or more PPI descriptors to be installed
|
||||
initially by the PEI core. An empty PPI list consists of a single
|
||||
descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
|
||||
As part of its initialization phase, the PEI Foundation will add
|
||||
these SEC-hosted PPIs to its PPI database such that both the PEI
|
||||
Foundation and any modules can leverage the associated service calls
|
||||
and/or code in these early PPIs.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
_ModuleEntryPoint (
|
||||
IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
|
||||
IN EFI_PEI_PPI_DESCRIPTOR *PpiList
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PEI_FV_HANDLE VolumeHandle;
|
||||
EFI_PEI_FILE_HANDLE FileHandle;
|
||||
VOID *PeCoffImage;
|
||||
EFI_PEI_CORE_ENTRY_POINT EntryPoint;
|
||||
EFI_PEI_PPI_DESCRIPTOR *Ppi;
|
||||
EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
|
||||
UINTN SecReseveredMemorySize;
|
||||
UINTN Index;
|
||||
|
||||
EMU_MAGIC_PAGE()->PpiList = PpiList;
|
||||
ProcessLibraryConstructorList ();
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
|
||||
|
||||
//
|
||||
// Add Our PPIs to the list
|
||||
//
|
||||
SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
|
||||
for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
|
||||
SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
|
||||
|
||||
if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
|
||||
// Since we are appending, need to clear out privious list terminator.
|
||||
Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Keep everything on a good alignment
|
||||
SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
|
||||
|
||||
#if 0
|
||||
// Tell the PEI Core to not use our buffer in temp RAM
|
||||
SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
|
||||
SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
|
||||
SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
|
||||
#else
|
||||
{
|
||||
//
|
||||
// When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
|
||||
// or I don't understand temp RAM correctly?
|
||||
//
|
||||
EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
|
||||
|
||||
SecPpiList = &PpiArray[0];
|
||||
ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
|
||||
}
|
||||
#endif
|
||||
// Copy existing list, and append our entries.
|
||||
CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
|
||||
CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
|
||||
|
||||
// Find PEI Core and transfer control
|
||||
VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
|
||||
FileHandle = NULL;
|
||||
Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
// Transfer control to PEI Core
|
||||
EntryPoint (SecCoreData, SecPpiList);
|
||||
|
||||
// PEI Core never returns
|
||||
ASSERT (FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*++ @file
|
||||
Stub SEC that is called from the OS appliation that is the root of the emulator.
|
||||
|
||||
The OS application will call the SEC with the PEI Entry Point API.
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "Sec.h"
|
||||
|
||||
|
||||
|
||||
EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
|
||||
SecTemporaryRamSupport
|
||||
};
|
||||
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
|
||||
{
|
||||
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
||||
&gEfiTemporaryRamSupportPpiGuid,
|
||||
&mSecTemporaryRamSupportPpi
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
|
||||
SEC that sits on top of an OS application. So the entry and exit of this module
|
||||
has the same API.
|
||||
|
||||
This function is the entry point for the PEI Foundation, which allows the SEC phase
|
||||
to pass information about the stack, temporary RAM and the Boot Firmware Volume.
|
||||
In addition, it also allows the SEC phase to pass services and data forward for use
|
||||
during the PEI phase in the form of one or more PPIs.
|
||||
There is no limit to the number of additional PPIs that can be passed from SEC into
|
||||
the PEI Foundation. As part of its initialization phase, the PEI Foundation will add
|
||||
these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any
|
||||
modules can leverage the associated service calls and/or code in these early PPIs.
|
||||
This function is required to call ProcessModuleEntryPointList() with the Context
|
||||
parameter set to NULL. ProcessModuleEntryPoint() is never expected to return.
|
||||
The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon as
|
||||
the PEI Services Table and the file handle for the PEI Core itself have been established.
|
||||
If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
|
||||
|
||||
@param SecCoreData Points to a data structure containing information about the PEI
|
||||
core's operating environment, such as the size and location of
|
||||
temporary RAM, the stack location and the BFV location.
|
||||
|
||||
@param PpiList Points to a list of one or more PPI descriptors to be installed
|
||||
initially by the PEI core. An empty PPI list consists of a single
|
||||
descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
|
||||
As part of its initialization phase, the PEI Foundation will add
|
||||
these SEC-hosted PPIs to its PPI database such that both the PEI
|
||||
Foundation and any modules can leverage the associated service calls
|
||||
and/or code in these early PPIs.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
_ModuleEntryPoint (
|
||||
IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
|
||||
IN EFI_PEI_PPI_DESCRIPTOR *PpiList
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PEI_FV_HANDLE VolumeHandle;
|
||||
EFI_PEI_FILE_HANDLE FileHandle;
|
||||
VOID *PeCoffImage;
|
||||
EFI_PEI_CORE_ENTRY_POINT EntryPoint;
|
||||
EFI_PEI_PPI_DESCRIPTOR *Ppi;
|
||||
EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
|
||||
UINTN SecReseveredMemorySize;
|
||||
UINTN Index;
|
||||
|
||||
EMU_MAGIC_PAGE()->PpiList = PpiList;
|
||||
ProcessLibraryConstructorList ();
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
|
||||
|
||||
//
|
||||
// Add Our PPIs to the list
|
||||
//
|
||||
SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
|
||||
for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
|
||||
SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
|
||||
|
||||
if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
|
||||
// Since we are appending, need to clear out privious list terminator.
|
||||
Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Keep everything on a good alignment
|
||||
SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
|
||||
|
||||
#if 0
|
||||
// Tell the PEI Core to not use our buffer in temp RAM
|
||||
SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
|
||||
SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
|
||||
SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
|
||||
#else
|
||||
{
|
||||
//
|
||||
// When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
|
||||
// or I don't understand temp RAM correctly?
|
||||
//
|
||||
EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
|
||||
|
||||
SecPpiList = &PpiArray[0];
|
||||
ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
|
||||
}
|
||||
#endif
|
||||
// Copy existing list, and append our entries.
|
||||
CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
|
||||
CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
|
||||
|
||||
// Find PEI Core and transfer control
|
||||
VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
|
||||
FileHandle = NULL;
|
||||
Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
// Transfer control to PEI Core
|
||||
EntryPoint (SecCoreData, SecPpiList);
|
||||
|
||||
// PEI Core never returns
|
||||
ASSERT (FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1,51 +1,51 @@
|
||||
/*++ @file
|
||||
Stub SEC that is called from the OS appliation that is the root of the emulator.
|
||||
|
||||
The OS application will call the SEC with the PEI Entry Point API.
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __SEC_H___
|
||||
#define __SEC_H___
|
||||
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Library/EmuMagicPageLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PeiServicesLib.h>
|
||||
#include <Library/PeCoffGetEntryPointLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
|
||||
#include <Ppi/TemporaryRamSupport.h>
|
||||
|
||||
|
||||
//
|
||||
// I think this shold be defined in a MdePkg include file?
|
||||
//
|
||||
VOID
|
||||
EFIAPI
|
||||
ProcessLibraryConstructorList (
|
||||
VOID
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecTemporaryRamSupport (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||
IN UINTN CopySize
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/*++ @file
|
||||
Stub SEC that is called from the OS appliation that is the root of the emulator.
|
||||
|
||||
The OS application will call the SEC with the PEI Entry Point API.
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __SEC_H___
|
||||
#define __SEC_H___
|
||||
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Library/EmuMagicPageLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PeiServicesLib.h>
|
||||
#include <Library/PeCoffGetEntryPointLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
|
||||
#include <Ppi/TemporaryRamSupport.h>
|
||||
|
||||
|
||||
//
|
||||
// I think this shold be defined in a MdePkg include file?
|
||||
//
|
||||
VOID
|
||||
EFIAPI
|
||||
ProcessLibraryConstructorList (
|
||||
VOID
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecTemporaryRamSupport (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||
IN UINTN CopySize
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -47,8 +47,8 @@ typedef struct {
|
||||
VOID *CurrentReadPointer;
|
||||
VOID *EndReadPointer;
|
||||
|
||||
UINT32 ReceivedPackets;
|
||||
UINT32 DroppedPackets;
|
||||
UINT32 ReceivedPackets;
|
||||
UINT32 DroppedPackets;
|
||||
|
||||
} EMU_SNP_PRIVATE;
|
||||
|
||||
@ -200,8 +200,8 @@ EmuSnpStart (
|
||||
struct ifreq BoundIf;
|
||||
struct bpf_program BpfProgram;
|
||||
struct bpf_insn *FilterProgram;
|
||||
u_int Value;
|
||||
u_int ReadBufferSize;
|
||||
u_int Value;
|
||||
u_int ReadBufferSize;
|
||||
UINT16 Temp16;
|
||||
UINT32 Temp32;
|
||||
|
||||
@ -229,23 +229,23 @@ EmuSnpStart (
|
||||
}
|
||||
|
||||
//
|
||||
// Get the read buffer size.
|
||||
//
|
||||
if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
|
||||
goto DeviceErrorExit;
|
||||
}
|
||||
// Get the read buffer size.
|
||||
//
|
||||
if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
|
||||
goto DeviceErrorExit;
|
||||
}
|
||||
|
||||
//
|
||||
// Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.
|
||||
//
|
||||
if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
|
||||
ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
|
||||
if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
|
||||
goto DeviceErrorExit;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.
|
||||
//
|
||||
if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
|
||||
ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
|
||||
if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
|
||||
goto DeviceErrorExit;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
// Associate our interface with this BPF file descriptor.
|
||||
//
|
||||
AsciiStrCpy (BoundIf.ifr_name, Private->InterfaceName);
|
||||
@ -254,7 +254,7 @@ EmuSnpStart (
|
||||
}
|
||||
|
||||
//
|
||||
// Enable immediate mode.
|
||||
// Enable immediate mode.
|
||||
//
|
||||
Value = 1;
|
||||
if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) {
|
||||
@ -286,8 +286,8 @@ EmuSnpStart (
|
||||
//
|
||||
// Allocate read buffer.
|
||||
//
|
||||
Private->ReadBufferSize = ReadBufferSize;
|
||||
Private->ReadBuffer = malloc (Private->ReadBufferSize);
|
||||
Private->ReadBufferSize = ReadBufferSize;
|
||||
Private->ReadBuffer = malloc (Private->ReadBufferSize);
|
||||
if (Private->ReadBuffer == NULL) {
|
||||
goto ErrorExit;
|
||||
}
|
||||
@ -295,7 +295,7 @@ EmuSnpStart (
|
||||
Private->CurrentReadPointer = Private->EndReadPointer = Private->ReadBuffer;
|
||||
|
||||
//
|
||||
// Install our packet filter: successful reads should only produce broadcast or unicast
|
||||
// Install our packet filter: successful reads should only produce broadcast or unicast
|
||||
// packets directed to our fake MAC address.
|
||||
//
|
||||
FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;
|
||||
@ -906,7 +906,7 @@ EmuSnpReceive (
|
||||
{
|
||||
EMU_SNP_PRIVATE *Private;
|
||||
struct bpf_hdr *BpfHeader;
|
||||
struct bpf_stat BpfStats;
|
||||
struct bpf_stat BpfStats;
|
||||
ETHERNET_HEADER *EnetHeader;
|
||||
ssize_t Result;
|
||||
|
||||
@ -916,19 +916,19 @@ 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;
|
||||
if (BpfStats.bs_drop > Private->DroppedPackets) {
|
||||
printf (
|
||||
"SNP: STATS: RCVD = %d DROPPED = %d. Probably need to increase BPF PcdNetworkPacketFilterSize?\n",
|
||||
BpfStats.bs_recv,
|
||||
BpfStats.bs_drop - Private->DroppedPackets
|
||||
);
|
||||
Private->DroppedPackets = BpfStats.bs_drop;
|
||||
}
|
||||
}
|
||||
if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
|
||||
Private->ReceivedPackets += BpfStats.bs_recv;
|
||||
if (BpfStats.bs_drop > Private->DroppedPackets) {
|
||||
printf (
|
||||
"SNP: STATS: RCVD = %d DROPPED = %d. Probably need to increase BPF PcdNetworkPacketFilterSize?\n",
|
||||
BpfStats.bs_recv,
|
||||
BpfStats.bs_drop - Private->DroppedPackets
|
||||
);
|
||||
Private->DroppedPackets = BpfStats.bs_drop;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Do we have any remaining packets from the previous read?
|
||||
@ -1004,7 +1004,7 @@ GetInterfaceMacAddr (
|
||||
EMU_SNP_PRIVATE *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
struct ifaddrs *IfAddrs;
|
||||
struct ifaddrs *If;
|
||||
struct sockaddr_dl *IfSdl;
|
||||
|
@ -347,7 +347,7 @@ EmuBlockIoReadWriteCommon (
|
||||
@param[in] MediaId Id of the media, changes every time the media is
|
||||
replaced.
|
||||
@param[in] Lba The starting Logical Block Address to read from.
|
||||
@param[in, out] Token A pointer to the token associated with the transaction.
|
||||
@param[in, out] Token A pointer to the token associated with the transaction.
|
||||
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param[out] Buffer A pointer to the destination buffer for the data. The
|
||||
caller is responsible for either having implicit or
|
||||
|
@ -1,440 +1,440 @@
|
||||
/*++ @file
|
||||
Since the SEC is the only program in our emulation we
|
||||
must use a UEFI/PI mechanism to export APIs to other modules.
|
||||
This is the role of the EFI_EMU_THUNK_PROTOCOL.
|
||||
|
||||
The mUnixThunkTable exists so that a change to EFI_EMU_THUNK_PROTOCOL
|
||||
will cause an error in initializing the array if all the member functions
|
||||
are not added. It looks like adding a element to end and not initializing
|
||||
it may cause the table to be initaliized with the members at the end being
|
||||
set to zero. This is bad as jumping to zero will crash.
|
||||
|
||||
Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
#define DebugAssert _Mangle__DebugAssert
|
||||
|
||||
#include <assert.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_time.h>
|
||||
|
||||
#undef DebugAssert
|
||||
#endif
|
||||
|
||||
int settimer_initialized;
|
||||
struct timeval settimer_timeval;
|
||||
void (*settimer_callback)(UINT64 delta);
|
||||
|
||||
BOOLEAN gEmulatorInterruptEnabled = FALSE;
|
||||
|
||||
|
||||
UINTN
|
||||
SecWriteStdErr (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
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;
|
||||
|
||||
//
|
||||
// Need to turn off line buffering, ECHO, and make it unbuffered.
|
||||
//
|
||||
tcgetattr (STDIN_FILENO, &tty);
|
||||
tty.c_lflag &= ~(ICANON | ECHO);
|
||||
tcsetattr (STDIN_FILENO, TCSANOW, &tty);
|
||||
|
||||
// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
|
||||
|
||||
// now ioctl FIONREAD will do what we need
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
UINTN
|
||||
SecWriteStdOut (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
ssize_t Return;
|
||||
|
||||
Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
|
||||
|
||||
return (Return == -1) ? 0 : Return;
|
||||
}
|
||||
|
||||
UINTN
|
||||
SecReadStdIn (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
ssize_t Return;
|
||||
|
||||
Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
|
||||
|
||||
return (Return == -1) ? 0 : Return;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
SecPollStdIn (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
int Result;
|
||||
int Bytes;
|
||||
|
||||
Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
|
||||
if (Result == -1) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return (BOOLEAN)(Bytes > 0);
|
||||
}
|
||||
|
||||
|
||||
VOID *
|
||||
SecMalloc (
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
return malloc ((size_t)Size);
|
||||
}
|
||||
|
||||
VOID *
|
||||
SecValloc (
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
return valloc ((size_t)Size);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
SecFree (
|
||||
IN VOID *Ptr
|
||||
)
|
||||
{
|
||||
if (EfiSystemMemoryRange (Ptr)) {
|
||||
// If an address range is in the EFI memory map it was alloced via EFI.
|
||||
// So don't free those ranges and let the caller know.
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
free (Ptr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
settimer_handler (int sig)
|
||||
{
|
||||
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);
|
||||
settimer_timeval = timeval;
|
||||
|
||||
if (settimer_callback) {
|
||||
ReverseGasketUint64 (settimer_callback, delta);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
SecSetTimer (
|
||||
IN UINT64 PeriodMs,
|
||||
IN EMU_SET_TIMER_CALLBACK CallBack
|
||||
)
|
||||
{
|
||||
struct itimerval timerval;
|
||||
UINT32 remainder;
|
||||
|
||||
if (!settimer_initialized) {
|
||||
struct sigaction act;
|
||||
|
||||
settimer_initialized = 1;
|
||||
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_usec = remainder * 1000;
|
||||
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 = CallBack;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecEnableInterrupt (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
sigset_t sigset;
|
||||
|
||||
gEmulatorInterruptEnabled = TRUE;
|
||||
// Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
|
||||
// by enabling/disabling SIGALRM.
|
||||
sigemptyset (&sigset);
|
||||
sigaddset (&sigset, SIGALRM);
|
||||
pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecDisableInterrupt (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
sigset_t sigset;
|
||||
|
||||
// Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
|
||||
// by enabling/disabling SIGALRM.
|
||||
sigemptyset (&sigset);
|
||||
sigaddset (&sigset, SIGALRM);
|
||||
pthread_sigmask (SIG_BLOCK, &sigset, NULL);
|
||||
gEmulatorInterruptEnabled = FALSE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
SecInterruptEanbled (void)
|
||||
{
|
||||
return gEmulatorInterruptEnabled;
|
||||
}
|
||||
|
||||
|
||||
UINT64
|
||||
QueryPerformanceFrequency (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// Hard code to nanoseconds
|
||||
return 1000000000ULL;
|
||||
}
|
||||
|
||||
UINT64
|
||||
QueryPerformanceCounter (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
#if __APPLE__
|
||||
UINT64 Start;
|
||||
static mach_timebase_info_data_t sTimebaseInfo;
|
||||
|
||||
|
||||
Start = mach_absolute_time ();
|
||||
|
||||
// Convert to nanoseconds.
|
||||
|
||||
// If this is the first time we've run, get the timebase.
|
||||
// We can use denom == 0 to indicate that sTimebaseInfo is
|
||||
// uninitialised because it makes no sense to have a zero
|
||||
// denominator is a fraction.
|
||||
|
||||
if ( sTimebaseInfo.denom == 0 ) {
|
||||
(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
|
||||
// Need to figure out what to do for Linux?
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
SecSleep (
|
||||
IN UINT64 Nanoseconds
|
||||
)
|
||||
{
|
||||
struct timespec rq, rm;
|
||||
struct timeval start, end;
|
||||
unsigned long MicroSec;
|
||||
|
||||
rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
|
||||
rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
|
||||
|
||||
//
|
||||
// nanosleep gets interrupted by our timer tic.
|
||||
// we need to track wall clock time or we will stall for way too long
|
||||
//
|
||||
gettimeofday (&start, NULL);
|
||||
end.tv_sec = start.tv_sec + rq.tv_sec;
|
||||
MicroSec = (start.tv_usec + rq.tv_nsec/1000);
|
||||
end.tv_usec = MicroSec % 1000000;
|
||||
if (MicroSec > 1000000) {
|
||||
end.tv_sec++;
|
||||
}
|
||||
|
||||
while (nanosleep (&rq, &rm) == -1) {
|
||||
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)) {
|
||||
break;
|
||||
}
|
||||
rq = rm;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecCpuSleep (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
struct timespec rq, rm;
|
||||
|
||||
// nanosleep gets interrupted by the timer tic
|
||||
rq.tv_sec = 1;
|
||||
rq.tv_nsec = 0;
|
||||
|
||||
nanosleep (&rq, &rm);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecExit (
|
||||
UINTN Status
|
||||
)
|
||||
{
|
||||
exit (Status);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecGetTime (
|
||||
OUT EFI_TIME *Time,
|
||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||
)
|
||||
{
|
||||
struct tm *tm;
|
||||
time_t t;
|
||||
|
||||
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->Nanosecond = 0;
|
||||
Time->TimeZone = timezone;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
SecSetTime (
|
||||
IN EFI_TIME *Time
|
||||
)
|
||||
{
|
||||
// Don't change the time on the system
|
||||
// We could save delta to localtime() and have SecGetTime adjust return values?
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
SecGetNextProtocol (
|
||||
IN BOOLEAN EmuBusDriver,
|
||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||
)
|
||||
{
|
||||
return GetNextThunkProtocol (EmuBusDriver, Instance);
|
||||
}
|
||||
|
||||
|
||||
EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
|
||||
GasketSecWriteStdErr,
|
||||
GasketSecConfigStdIn,
|
||||
GasketSecWriteStdOut,
|
||||
GasketSecReadStdIn,
|
||||
GasketSecPollStdIn,
|
||||
GasketSecMalloc,
|
||||
GasketSecValloc,
|
||||
GasketSecFree,
|
||||
GasketSecPeCoffGetEntryPoint,
|
||||
GasketSecPeCoffRelocateImageExtraAction,
|
||||
GasketSecPeCoffUnloadImageExtraAction,
|
||||
GasketSecEnableInterrupt,
|
||||
GasketSecDisableInterrupt,
|
||||
GasketQueryPerformanceFrequency,
|
||||
GasketQueryPerformanceCounter,
|
||||
GasketSecSleep,
|
||||
GasketSecCpuSleep,
|
||||
GasketSecExit,
|
||||
GasketSecGetTime,
|
||||
GasketSecSetTime,
|
||||
GasketSecSetTimer,
|
||||
GasketSecGetNextProtocol
|
||||
};
|
||||
|
||||
|
||||
VOID
|
||||
SecInitThunkProtocol (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// timezone and daylight lib globals depend on tzset be called 1st.
|
||||
tzset ();
|
||||
}
|
||||
|
||||
/*++ @file
|
||||
Since the SEC is the only program in our emulation we
|
||||
must use a UEFI/PI mechanism to export APIs to other modules.
|
||||
This is the role of the EFI_EMU_THUNK_PROTOCOL.
|
||||
|
||||
The mUnixThunkTable exists so that a change to EFI_EMU_THUNK_PROTOCOL
|
||||
will cause an error in initializing the array if all the member functions
|
||||
are not added. It looks like adding a element to end and not initializing
|
||||
it may cause the table to be initaliized with the members at the end being
|
||||
set to zero. This is bad as jumping to zero will crash.
|
||||
|
||||
Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
#define DebugAssert _Mangle__DebugAssert
|
||||
|
||||
#include <assert.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_time.h>
|
||||
|
||||
#undef DebugAssert
|
||||
#endif
|
||||
|
||||
int settimer_initialized;
|
||||
struct timeval settimer_timeval;
|
||||
void (*settimer_callback)(UINT64 delta);
|
||||
|
||||
BOOLEAN gEmulatorInterruptEnabled = FALSE;
|
||||
|
||||
|
||||
UINTN
|
||||
SecWriteStdErr (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
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;
|
||||
|
||||
//
|
||||
// Need to turn off line buffering, ECHO, and make it unbuffered.
|
||||
//
|
||||
tcgetattr (STDIN_FILENO, &tty);
|
||||
tty.c_lflag &= ~(ICANON | ECHO);
|
||||
tcsetattr (STDIN_FILENO, TCSANOW, &tty);
|
||||
|
||||
// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
|
||||
|
||||
// now ioctl FIONREAD will do what we need
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
UINTN
|
||||
SecWriteStdOut (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
ssize_t Return;
|
||||
|
||||
Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
|
||||
|
||||
return (Return == -1) ? 0 : Return;
|
||||
}
|
||||
|
||||
UINTN
|
||||
SecReadStdIn (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
ssize_t Return;
|
||||
|
||||
Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
|
||||
|
||||
return (Return == -1) ? 0 : Return;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
SecPollStdIn (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
int Result;
|
||||
int Bytes;
|
||||
|
||||
Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
|
||||
if (Result == -1) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return (BOOLEAN)(Bytes > 0);
|
||||
}
|
||||
|
||||
|
||||
VOID *
|
||||
SecMalloc (
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
return malloc ((size_t)Size);
|
||||
}
|
||||
|
||||
VOID *
|
||||
SecValloc (
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
return valloc ((size_t)Size);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
SecFree (
|
||||
IN VOID *Ptr
|
||||
)
|
||||
{
|
||||
if (EfiSystemMemoryRange (Ptr)) {
|
||||
// If an address range is in the EFI memory map it was alloced via EFI.
|
||||
// So don't free those ranges and let the caller know.
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
free (Ptr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
settimer_handler (int sig)
|
||||
{
|
||||
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);
|
||||
settimer_timeval = timeval;
|
||||
|
||||
if (settimer_callback) {
|
||||
ReverseGasketUint64 (settimer_callback, delta);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
SecSetTimer (
|
||||
IN UINT64 PeriodMs,
|
||||
IN EMU_SET_TIMER_CALLBACK CallBack
|
||||
)
|
||||
{
|
||||
struct itimerval timerval;
|
||||
UINT32 remainder;
|
||||
|
||||
if (!settimer_initialized) {
|
||||
struct sigaction act;
|
||||
|
||||
settimer_initialized = 1;
|
||||
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_usec = remainder * 1000;
|
||||
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 = CallBack;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecEnableInterrupt (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
sigset_t sigset;
|
||||
|
||||
gEmulatorInterruptEnabled = TRUE;
|
||||
// Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
|
||||
// by enabling/disabling SIGALRM.
|
||||
sigemptyset (&sigset);
|
||||
sigaddset (&sigset, SIGALRM);
|
||||
pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecDisableInterrupt (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
sigset_t sigset;
|
||||
|
||||
// Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
|
||||
// by enabling/disabling SIGALRM.
|
||||
sigemptyset (&sigset);
|
||||
sigaddset (&sigset, SIGALRM);
|
||||
pthread_sigmask (SIG_BLOCK, &sigset, NULL);
|
||||
gEmulatorInterruptEnabled = FALSE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
SecInterruptEanbled (void)
|
||||
{
|
||||
return gEmulatorInterruptEnabled;
|
||||
}
|
||||
|
||||
|
||||
UINT64
|
||||
QueryPerformanceFrequency (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// Hard code to nanoseconds
|
||||
return 1000000000ULL;
|
||||
}
|
||||
|
||||
UINT64
|
||||
QueryPerformanceCounter (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
#if __APPLE__
|
||||
UINT64 Start;
|
||||
static mach_timebase_info_data_t sTimebaseInfo;
|
||||
|
||||
|
||||
Start = mach_absolute_time ();
|
||||
|
||||
// Convert to nanoseconds.
|
||||
|
||||
// If this is the first time we've run, get the timebase.
|
||||
// We can use denom == 0 to indicate that sTimebaseInfo is
|
||||
// uninitialised because it makes no sense to have a zero
|
||||
// denominator is a fraction.
|
||||
|
||||
if ( sTimebaseInfo.denom == 0 ) {
|
||||
(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
|
||||
// Need to figure out what to do for Linux?
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
SecSleep (
|
||||
IN UINT64 Nanoseconds
|
||||
)
|
||||
{
|
||||
struct timespec rq, rm;
|
||||
struct timeval start, end;
|
||||
unsigned long MicroSec;
|
||||
|
||||
rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
|
||||
rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
|
||||
|
||||
//
|
||||
// nanosleep gets interrupted by our timer tic.
|
||||
// we need to track wall clock time or we will stall for way too long
|
||||
//
|
||||
gettimeofday (&start, NULL);
|
||||
end.tv_sec = start.tv_sec + rq.tv_sec;
|
||||
MicroSec = (start.tv_usec + rq.tv_nsec/1000);
|
||||
end.tv_usec = MicroSec % 1000000;
|
||||
if (MicroSec > 1000000) {
|
||||
end.tv_sec++;
|
||||
}
|
||||
|
||||
while (nanosleep (&rq, &rm) == -1) {
|
||||
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)) {
|
||||
break;
|
||||
}
|
||||
rq = rm;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecCpuSleep (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
struct timespec rq, rm;
|
||||
|
||||
// nanosleep gets interrupted by the timer tic
|
||||
rq.tv_sec = 1;
|
||||
rq.tv_nsec = 0;
|
||||
|
||||
nanosleep (&rq, &rm);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecExit (
|
||||
UINTN Status
|
||||
)
|
||||
{
|
||||
exit (Status);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
SecGetTime (
|
||||
OUT EFI_TIME *Time,
|
||||
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||
)
|
||||
{
|
||||
struct tm *tm;
|
||||
time_t t;
|
||||
|
||||
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->Nanosecond = 0;
|
||||
Time->TimeZone = timezone;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
SecSetTime (
|
||||
IN EFI_TIME *Time
|
||||
)
|
||||
{
|
||||
// Don't change the time on the system
|
||||
// We could save delta to localtime() and have SecGetTime adjust return values?
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
SecGetNextProtocol (
|
||||
IN BOOLEAN EmuBusDriver,
|
||||
OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
|
||||
)
|
||||
{
|
||||
return GetNextThunkProtocol (EmuBusDriver, Instance);
|
||||
}
|
||||
|
||||
|
||||
EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
|
||||
GasketSecWriteStdErr,
|
||||
GasketSecConfigStdIn,
|
||||
GasketSecWriteStdOut,
|
||||
GasketSecReadStdIn,
|
||||
GasketSecPollStdIn,
|
||||
GasketSecMalloc,
|
||||
GasketSecValloc,
|
||||
GasketSecFree,
|
||||
GasketSecPeCoffGetEntryPoint,
|
||||
GasketSecPeCoffRelocateImageExtraAction,
|
||||
GasketSecPeCoffUnloadImageExtraAction,
|
||||
GasketSecEnableInterrupt,
|
||||
GasketSecDisableInterrupt,
|
||||
GasketQueryPerformanceFrequency,
|
||||
GasketQueryPerformanceCounter,
|
||||
GasketSecSleep,
|
||||
GasketSecCpuSleep,
|
||||
GasketSecExit,
|
||||
GasketSecGetTime,
|
||||
GasketSecSetTime,
|
||||
GasketSecSetTimer,
|
||||
GasketSecGetNextProtocol
|
||||
};
|
||||
|
||||
|
||||
VOID
|
||||
SecInitThunkProtocol (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// timezone and daylight lib globals depend on tzset be called 1st.
|
||||
tzset ();
|
||||
}
|
||||
|
||||
|
@ -1148,7 +1148,7 @@ GdbScriptAddImage (
|
||||
|
||||
if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {
|
||||
FILE *GdbTempFile;
|
||||
if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
|
||||
if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
|
||||
GdbTempFile = fopen (gGdbWorkingFileName, "a");
|
||||
if (GdbTempFile != NULL) {
|
||||
long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);
|
||||
@ -1170,13 +1170,13 @@ GdbScriptAddImage (
|
||||
GdbTempFile = fopen (gGdbWorkingFileName, "w");
|
||||
if (GdbTempFile != NULL) {
|
||||
fprintf (
|
||||
GdbTempFile,
|
||||
"add-symbol-file %s 0x%08lx\n",
|
||||
ImageContext->PdbPointer,
|
||||
GdbTempFile,
|
||||
"add-symbol-file %s 0x%08lx\n",
|
||||
ImageContext->PdbPointer,
|
||||
(long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)
|
||||
);
|
||||
fclose (GdbTempFile);
|
||||
|
||||
|
||||
//
|
||||
// Target for gdb breakpoint in a script that uses gGdbWorkingFileName to set a breakpoint.
|
||||
// Hey what can you say scripting in gdb is not that great....
|
||||
@ -1225,7 +1225,7 @@ GdbScriptRemoveImage (
|
||||
return;
|
||||
}
|
||||
|
||||
if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
|
||||
if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
|
||||
//
|
||||
// Write the file we need for the gdb script
|
||||
//
|
||||
@ -1256,7 +1256,7 @@ GdbScriptRemoveImage (
|
||||
SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext->PdbPointer) + 1, 0, 0);
|
||||
} else {
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,7 +82,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#undef NTOHS
|
||||
#undef HTONS
|
||||
#undef B0
|
||||
#undef CR3
|
||||
#undef CR3
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Uefi.h>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,74 +1,74 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
|
||||
--*/
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
|
||||
/**
|
||||
Transfers control to a function starting with a new stack.
|
||||
|
||||
Transfers control to the function specified by EntryPoint using the new stack
|
||||
specified by NewStack and passing in the parameters specified by Context1 and
|
||||
Context2. Context1 and Context2 are optional and may be NULL. The function
|
||||
EntryPoint must never return.
|
||||
|
||||
If EntryPoint is NULL, then ASSERT().
|
||||
If NewStack is NULL, then ASSERT().
|
||||
|
||||
@param EntryPoint A pointer to function to call with the new stack.
|
||||
@param Context1 A pointer to the context to pass into the EntryPoint
|
||||
function.
|
||||
@param Context2 A pointer to the context to pass into the EntryPoint
|
||||
function.
|
||||
@param NewStack A pointer to the new stack to use for the EntryPoint
|
||||
function.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
PeiSwitchStacks (
|
||||
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
|
||||
IN VOID *Context1, OPTIONAL
|
||||
IN VOID *Context2, OPTIONAL
|
||||
IN VOID *NewStack
|
||||
)
|
||||
{
|
||||
BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
|
||||
|
||||
ASSERT (EntryPoint != NULL);
|
||||
ASSERT (NewStack != NULL);
|
||||
|
||||
//
|
||||
// Stack should be aligned with CPU_STACK_ALIGNMENT
|
||||
//
|
||||
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;
|
||||
|
||||
LongJump (&JumpBuffer, (UINTN)-1);
|
||||
|
||||
|
||||
//
|
||||
// PeiSwitchStacks () will never return
|
||||
//
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*++
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
|
||||
--*/
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
|
||||
/**
|
||||
Transfers control to a function starting with a new stack.
|
||||
|
||||
Transfers control to the function specified by EntryPoint using the new stack
|
||||
specified by NewStack and passing in the parameters specified by Context1 and
|
||||
Context2. Context1 and Context2 are optional and may be NULL. The function
|
||||
EntryPoint must never return.
|
||||
|
||||
If EntryPoint is NULL, then ASSERT().
|
||||
If NewStack is NULL, then ASSERT().
|
||||
|
||||
@param EntryPoint A pointer to function to call with the new stack.
|
||||
@param Context1 A pointer to the context to pass into the EntryPoint
|
||||
function.
|
||||
@param Context2 A pointer to the context to pass into the EntryPoint
|
||||
function.
|
||||
@param NewStack A pointer to the new stack to use for the EntryPoint
|
||||
function.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
PeiSwitchStacks (
|
||||
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
|
||||
IN VOID *Context1, OPTIONAL
|
||||
IN VOID *Context2, OPTIONAL
|
||||
IN VOID *NewStack
|
||||
)
|
||||
{
|
||||
BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
|
||||
|
||||
ASSERT (EntryPoint != NULL);
|
||||
ASSERT (NewStack != NULL);
|
||||
|
||||
//
|
||||
// Stack should be aligned with CPU_STACK_ALIGNMENT
|
||||
//
|
||||
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;
|
||||
|
||||
LongJump (&JumpBuffer, (UINTN)-1);
|
||||
|
||||
|
||||
//
|
||||
// PeiSwitchStacks () will never return
|
||||
//
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1,145 +1,145 @@
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "Base.h"
|
||||
#include "Library/BaseMemoryLib.h"
|
||||
#include "Library/MemoryAllocationLib.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfiBootServicesData.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
|
||||
pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
|
||||
returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocatePool (
|
||||
IN UINTN AllocationSize
|
||||
)
|
||||
{
|
||||
return (VOID*) malloc (AllocationSize);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiBootServicesData.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
|
||||
buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
|
||||
valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
|
||||
request, then NULL is returned.
|
||||
|
||||
@param AllocationSize The number of bytes to allocate and zero.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateZeroPool (
|
||||
IN UINTN AllocationSize
|
||||
)
|
||||
{
|
||||
VOID *Buffer;
|
||||
|
||||
Buffer = AllocatePool (AllocationSize);
|
||||
if (Buffer == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem (Buffer, AllocationSize);
|
||||
|
||||
return Buffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reallocates a buffer of type EfiBootServicesData.
|
||||
|
||||
Allocates and zeros the number bytes specified by NewSize from memory of type
|
||||
EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize and
|
||||
NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
|
||||
OldBuffer is freed. A pointer to the newly allocated buffer is returned.
|
||||
If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
|
||||
enough memory remaining to satisfy the request, then NULL is returned.
|
||||
|
||||
If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
|
||||
is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
|
||||
|
||||
@param OldSize The size, in bytes, of OldBuffer.
|
||||
@param NewSize The size, in bytes, of the buffer to reallocate.
|
||||
@param OldBuffer The buffer to copy to the allocated buffer. This is an optional
|
||||
parameter that may be NULL.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
ReallocatePool (
|
||||
IN UINTN OldSize,
|
||||
IN UINTN NewSize,
|
||||
IN VOID *OldBuffer OPTIONAL
|
||||
)
|
||||
{
|
||||
VOID *NewBuffer;
|
||||
|
||||
NewBuffer = AllocatePool (NewSize);
|
||||
if (NewBuffer == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (OldBuffer != NULL) {
|
||||
if (OldSize > 0) {
|
||||
CopyMem (NewBuffer, OldBuffer, OldSize);
|
||||
}
|
||||
|
||||
FreePool (OldBuffer);
|
||||
}
|
||||
|
||||
return NewBuffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Frees a buffer that was previously allocated with one of the pool allocation functions in the
|
||||
Memory Allocation Library.
|
||||
|
||||
Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
|
||||
pool allocation services of the Memory Allocation Library. If it is not possible to free pool
|
||||
resources, then this function will perform no actions.
|
||||
|
||||
If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
|
||||
then ASSERT().
|
||||
|
||||
@param Buffer Pointer to the buffer to free.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FreePool (
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
free ((void *) Buffer);
|
||||
}
|
||||
|
||||
/*++ @file
|
||||
|
||||
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "Base.h"
|
||||
#include "Library/BaseMemoryLib.h"
|
||||
#include "Library/MemoryAllocationLib.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfiBootServicesData.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
|
||||
pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
|
||||
returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocatePool (
|
||||
IN UINTN AllocationSize
|
||||
)
|
||||
{
|
||||
return (VOID*) malloc (AllocationSize);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiBootServicesData.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
|
||||
buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
|
||||
valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
|
||||
request, then NULL is returned.
|
||||
|
||||
@param AllocationSize The number of bytes to allocate and zero.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateZeroPool (
|
||||
IN UINTN AllocationSize
|
||||
)
|
||||
{
|
||||
VOID *Buffer;
|
||||
|
||||
Buffer = AllocatePool (AllocationSize);
|
||||
if (Buffer == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem (Buffer, AllocationSize);
|
||||
|
||||
return Buffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reallocates a buffer of type EfiBootServicesData.
|
||||
|
||||
Allocates and zeros the number bytes specified by NewSize from memory of type
|
||||
EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize and
|
||||
NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
|
||||
OldBuffer is freed. A pointer to the newly allocated buffer is returned.
|
||||
If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
|
||||
enough memory remaining to satisfy the request, then NULL is returned.
|
||||
|
||||
If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
|
||||
is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
|
||||
|
||||
@param OldSize The size, in bytes, of OldBuffer.
|
||||
@param NewSize The size, in bytes, of the buffer to reallocate.
|
||||
@param OldBuffer The buffer to copy to the allocated buffer. This is an optional
|
||||
parameter that may be NULL.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
ReallocatePool (
|
||||
IN UINTN OldSize,
|
||||
IN UINTN NewSize,
|
||||
IN VOID *OldBuffer OPTIONAL
|
||||
)
|
||||
{
|
||||
VOID *NewBuffer;
|
||||
|
||||
NewBuffer = AllocatePool (NewSize);
|
||||
if (NewBuffer == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (OldBuffer != NULL) {
|
||||
if (OldSize > 0) {
|
||||
CopyMem (NewBuffer, OldBuffer, OldSize);
|
||||
}
|
||||
|
||||
FreePool (OldBuffer);
|
||||
}
|
||||
|
||||
return NewBuffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Frees a buffer that was previously allocated with one of the pool allocation functions in the
|
||||
Memory Allocation Library.
|
||||
|
||||
Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
|
||||
pool allocation services of the Memory Allocation Library. If it is not possible to free pool
|
||||
resources, then this function will perform no actions.
|
||||
|
||||
If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
|
||||
then ASSERT().
|
||||
|
||||
@param Buffer Pointer to the buffer to free.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FreePool (
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
free ((void *) Buffer);
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,235 +1,235 @@
|
||||
/*++ @file
|
||||
POSIX Pthreads to emulate APs and implement threads
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.
|
||||
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
|
||||
**/
|
||||
|
||||
#include "Host.h"
|
||||
#include <pthread.h>
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexLock (
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexUnLock (
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexTryLock (
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
VOID *
|
||||
PthreadMutexInit (
|
||||
IN VOID
|
||||
)
|
||||
{
|
||||
pthread_mutex_t *Mutex;
|
||||
int err;
|
||||
|
||||
Mutex = malloc (sizeof (pthread_mutex_t));
|
||||
err = pthread_mutex_init (Mutex, NULL);
|
||||
if (err == 0) {
|
||||
return Mutex;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
PthreadMutexDestroy (
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
if (Mutex != NULL) {
|
||||
return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Can't store this data on PthreadCreate stack so we need a global
|
||||
typedef struct {
|
||||
pthread_mutex_t Mutex;
|
||||
THREAD_THUNK_THREAD_ENTRY Start;
|
||||
} THREAD_MANGLE;
|
||||
|
||||
THREAD_MANGLE mThreadMangle = {
|
||||
PTHREAD_MUTEX_INITIALIZER,
|
||||
NULL
|
||||
};
|
||||
|
||||
VOID *
|
||||
SecFakePthreadStart (
|
||||
VOID *Context
|
||||
)
|
||||
{
|
||||
THREAD_THUNK_THREAD_ENTRY Start;
|
||||
sigset_t SigMask;
|
||||
|
||||
// Save global on the stack before we unlock
|
||||
Start = mThreadMangle.Start;
|
||||
pthread_mutex_unlock (&mThreadMangle.Mutex);
|
||||
|
||||
// Mask all signals to the APs
|
||||
sigfillset (&SigMask);
|
||||
pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
|
||||
|
||||
//
|
||||
// We have to start the thread in SEC as we need to follow
|
||||
// OS X calling conventions. We can then call back into
|
||||
// to the callers Start.
|
||||
//
|
||||
// This is a great example of how all problems in computer
|
||||
// science can be solved by adding another level of indirection
|
||||
//
|
||||
return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
|
||||
}
|
||||
|
||||
UINTN
|
||||
PthreadCreate (
|
||||
IN VOID *Thread,
|
||||
IN VOID *Attribute,
|
||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
int err;
|
||||
BOOLEAN EnabledOnEntry;
|
||||
|
||||
//
|
||||
// Threads inherit interrupt state so disable interrupts before we start thread
|
||||
//
|
||||
if (SecInterruptEanbled ()) {
|
||||
SecDisableInterrupt ();
|
||||
EnabledOnEntry = TRUE;
|
||||
} else {
|
||||
EnabledOnEntry = FALSE;
|
||||
}
|
||||
|
||||
// Aquire lock for global, SecFakePthreadStart runs in a different thread.
|
||||
pthread_mutex_lock (&mThreadMangle.Mutex);
|
||||
mThreadMangle.Start = Start;
|
||||
|
||||
err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
|
||||
if (err != 0) {
|
||||
// Thread failed to launch so release the lock;
|
||||
pthread_mutex_unlock (&mThreadMangle.Mutex);
|
||||
}
|
||||
|
||||
if (EnabledOnEntry) {
|
||||
// Restore interrupt state
|
||||
SecEnableInterrupt ();
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
PthreadExit (
|
||||
IN VOID *ValuePtr
|
||||
)
|
||||
{
|
||||
pthread_exit (ValuePtr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
PthreadSelf (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// POSIX currently allows pthread_t to be a structure or arithmetic type.
|
||||
// Check out sys/types.h to make sure this will work if you are porting.
|
||||
// On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
|
||||
return (UINTN)pthread_self ();
|
||||
}
|
||||
|
||||
|
||||
EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
|
||||
GasketPthreadMutexLock,
|
||||
GasketPthreadMutexUnLock,
|
||||
GasketPthreadMutexTryLock,
|
||||
GasketPthreadMutexInit,
|
||||
GasketPthreadMutexDestroy,
|
||||
GasketPthreadCreate,
|
||||
GasketPthreadExit,
|
||||
GasketPthreadSelf
|
||||
};
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
PthreadOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
if (This->Instance != 0) {
|
||||
// Only single instance is supported
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
if (This->ConfigString[0] == L'0') {
|
||||
// If AP count is zero no need for threads
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
This->Interface = &gPthreadThunk;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
PthreadClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
|
||||
&gEmuThreadThunkProtocolGuid,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
GasketPthreadOpen,
|
||||
GasketPthreadClose,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
/*++ @file
|
||||
POSIX Pthreads to emulate APs and implement threads
|
||||
|
||||
Copyright (c) 2011, Apple Inc. All rights reserved.
|
||||
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
|
||||
**/
|
||||
|
||||
#include "Host.h"
|
||||
#include <pthread.h>
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexLock (
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexUnLock (
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
PthreadMutexTryLock (
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
|
||||
VOID *
|
||||
PthreadMutexInit (
|
||||
IN VOID
|
||||
)
|
||||
{
|
||||
pthread_mutex_t *Mutex;
|
||||
int err;
|
||||
|
||||
Mutex = malloc (sizeof (pthread_mutex_t));
|
||||
err = pthread_mutex_init (Mutex, NULL);
|
||||
if (err == 0) {
|
||||
return Mutex;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
PthreadMutexDestroy (
|
||||
IN VOID *Mutex
|
||||
)
|
||||
{
|
||||
if (Mutex != NULL) {
|
||||
return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Can't store this data on PthreadCreate stack so we need a global
|
||||
typedef struct {
|
||||
pthread_mutex_t Mutex;
|
||||
THREAD_THUNK_THREAD_ENTRY Start;
|
||||
} THREAD_MANGLE;
|
||||
|
||||
THREAD_MANGLE mThreadMangle = {
|
||||
PTHREAD_MUTEX_INITIALIZER,
|
||||
NULL
|
||||
};
|
||||
|
||||
VOID *
|
||||
SecFakePthreadStart (
|
||||
VOID *Context
|
||||
)
|
||||
{
|
||||
THREAD_THUNK_THREAD_ENTRY Start;
|
||||
sigset_t SigMask;
|
||||
|
||||
// Save global on the stack before we unlock
|
||||
Start = mThreadMangle.Start;
|
||||
pthread_mutex_unlock (&mThreadMangle.Mutex);
|
||||
|
||||
// Mask all signals to the APs
|
||||
sigfillset (&SigMask);
|
||||
pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
|
||||
|
||||
//
|
||||
// We have to start the thread in SEC as we need to follow
|
||||
// OS X calling conventions. We can then call back into
|
||||
// to the callers Start.
|
||||
//
|
||||
// This is a great example of how all problems in computer
|
||||
// science can be solved by adding another level of indirection
|
||||
//
|
||||
return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
|
||||
}
|
||||
|
||||
UINTN
|
||||
PthreadCreate (
|
||||
IN VOID *Thread,
|
||||
IN VOID *Attribute,
|
||||
IN THREAD_THUNK_THREAD_ENTRY Start,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
int err;
|
||||
BOOLEAN EnabledOnEntry;
|
||||
|
||||
//
|
||||
// Threads inherit interrupt state so disable interrupts before we start thread
|
||||
//
|
||||
if (SecInterruptEanbled ()) {
|
||||
SecDisableInterrupt ();
|
||||
EnabledOnEntry = TRUE;
|
||||
} else {
|
||||
EnabledOnEntry = FALSE;
|
||||
}
|
||||
|
||||
// Aquire lock for global, SecFakePthreadStart runs in a different thread.
|
||||
pthread_mutex_lock (&mThreadMangle.Mutex);
|
||||
mThreadMangle.Start = Start;
|
||||
|
||||
err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
|
||||
if (err != 0) {
|
||||
// Thread failed to launch so release the lock;
|
||||
pthread_mutex_unlock (&mThreadMangle.Mutex);
|
||||
}
|
||||
|
||||
if (EnabledOnEntry) {
|
||||
// Restore interrupt state
|
||||
SecEnableInterrupt ();
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
PthreadExit (
|
||||
IN VOID *ValuePtr
|
||||
)
|
||||
{
|
||||
pthread_exit (ValuePtr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
PthreadSelf (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// POSIX currently allows pthread_t to be a structure or arithmetic type.
|
||||
// Check out sys/types.h to make sure this will work if you are porting.
|
||||
// On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
|
||||
return (UINTN)pthread_self ();
|
||||
}
|
||||
|
||||
|
||||
EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
|
||||
GasketPthreadMutexLock,
|
||||
GasketPthreadMutexUnLock,
|
||||
GasketPthreadMutexTryLock,
|
||||
GasketPthreadMutexInit,
|
||||
GasketPthreadMutexDestroy,
|
||||
GasketPthreadCreate,
|
||||
GasketPthreadExit,
|
||||
GasketPthreadSelf
|
||||
};
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
PthreadOpen (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
if (This->Instance != 0) {
|
||||
// Only single instance is supported
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
if (This->ConfigString[0] == L'0') {
|
||||
// If AP count is zero no need for threads
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
This->Interface = &gPthreadThunk;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
PthreadClose (
|
||||
IN EMU_IO_THUNK_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
|
||||
&gEmuThreadThunkProtocolGuid,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
GasketPthreadOpen,
|
||||
GasketPthreadClose,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -270,7 +270,7 @@ WinNtSignalToken (
|
||||
@param[in] MediaId Id of the media, changes every time the media is
|
||||
replaced.
|
||||
@param[in] Lba The starting Logical Block Address to read from.
|
||||
@param[in, out] Token A pointer to the token associated with the transaction.
|
||||
@param[in, out] Token A pointer to the token associated with the transaction.
|
||||
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param[out] Buffer A pointer to the destination buffer for the data. The
|
||||
caller is responsible for either having implicit or
|
||||
|
@ -206,4 +206,4 @@ extern EMU_THUNK_PROTOCOL gEmuThunkProtocol;
|
||||
extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo;
|
||||
extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo;
|
||||
extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo;
|
||||
#endif
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user