EmbeddedPkg: Apply uncrustify changes

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

Apply uncrustify changes to .c/.h files in the EmbeddedPkg package

Cc: Andrew Fish <afish@apple.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Reviewed-by: Andrew Fish <afish@apple.com>
This commit is contained in:
Michael Kubacki
2021-12-05 14:53:56 -08:00
committed by mergify[bot]
parent 731c67e1d7
commit e7108d0e96
106 changed files with 9242 additions and 7648 deletions

View File

@ -20,28 +20,31 @@
/* Validate the node is media hard drive type */ /* Validate the node is media hard drive type */
EFI_STATUS EFI_STATUS
ValidateAndroidMediaDevicePath ( ValidateAndroidMediaDevicePath (
IN EFI_DEVICE_PATH *DevicePath IN EFI_DEVICE_PATH *DevicePath
) )
{ {
EFI_DEVICE_PATH_PROTOCOL *Node, *NextNode; EFI_DEVICE_PATH_PROTOCOL *Node, *NextNode;
NextNode = DevicePath; NextNode = DevicePath;
while (NextNode != NULL) { while (NextNode != NULL) {
Node = NextNode; Node = NextNode;
if (Node->Type == MEDIA_DEVICE_PATH && if ((Node->Type == MEDIA_DEVICE_PATH) &&
Node->SubType == MEDIA_HARDDRIVE_DP) { (Node->SubType == MEDIA_HARDDRIVE_DP))
{
return EFI_SUCCESS; return EFI_SUCCESS;
} }
NextNode = NextDevicePathNode (Node); NextNode = NextDevicePathNode (Node);
} }
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AndroidBootAppEntryPoint ( AndroidBootAppEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -56,9 +59,12 @@ AndroidBootAppEntryPoint (
BootPathStr = (CHAR16 *)PcdGetPtr (PcdAndroidBootDevicePath); BootPathStr = (CHAR16 *)PcdGetPtr (PcdAndroidBootDevicePath);
ASSERT (BootPathStr != NULL); ASSERT (BootPathStr != NULL);
Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **)&EfiDevicePathFromTextProtocol); &gEfiDevicePathFromTextProtocolGuid,
ASSERT_EFI_ERROR(Status); NULL,
(VOID **)&EfiDevicePathFromTextProtocol
);
ASSERT_EFI_ERROR (Status);
DevicePath = (EFI_DEVICE_PATH *)EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (BootPathStr); DevicePath = (EFI_DEVICE_PATH *)EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (BootPathStr);
ASSERT (DevicePath != NULL); ASSERT (DevicePath != NULL);
@ -67,8 +73,11 @@ AndroidBootAppEntryPoint (
return Status; return Status;
} }
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, Status = gBS->LocateDevicePath (
&DevicePath, &Handle); &gEfiDevicePathProtocolGuid,
&DevicePath,
&Handle
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -76,7 +85,7 @@ AndroidBootAppEntryPoint (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiBlockIoProtocolGuid, &gEfiBlockIoProtocolGuid,
(VOID **) &BlockIo, (VOID **)&BlockIo,
gImageHandle, gImageHandle,
NULL, NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -86,12 +95,13 @@ AndroidBootAppEntryPoint (
return Status; return Status;
} }
MediaId = BlockIo->Media->MediaId; MediaId = BlockIo->Media->MediaId;
BlockSize = BlockIo->Media->BlockSize; BlockSize = BlockIo->Media->BlockSize;
Buffer = AllocatePages (EFI_SIZE_TO_PAGES (sizeof(ANDROID_BOOTIMG_HEADER))); Buffer = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ANDROID_BOOTIMG_HEADER)));
if (Buffer == NULL) { if (Buffer == NULL) {
return EFI_BUFFER_TOO_SMALL; return EFI_BUFFER_TOO_SMALL;
} }
/* Load header of boot.img */ /* Load header of boot.img */
Status = BlockIo->ReadBlocks ( Status = BlockIo->ReadBlocks (
BlockIo, BlockIo,
@ -105,8 +115,9 @@ AndroidBootAppEntryPoint (
DEBUG ((DEBUG_ERROR, "Failed to get AndroidBootImg Size: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Failed to get AndroidBootImg Size: %r\n", Status));
return Status; return Status;
} }
BootImgSize = ALIGN_VALUE (BootImgSize, BlockSize); BootImgSize = ALIGN_VALUE (BootImgSize, BlockSize);
FreePages (Buffer, EFI_SIZE_TO_PAGES (sizeof(ANDROID_BOOTIMG_HEADER))); FreePages (Buffer, EFI_SIZE_TO_PAGES (sizeof (ANDROID_BOOTIMG_HEADER)));
/* Both PartitionStart and PartitionSize are counted as block size. */ /* Both PartitionStart and PartitionSize are counted as block size. */
Buffer = AllocatePages (EFI_SIZE_TO_PAGES (BootImgSize)); Buffer = AllocatePages (EFI_SIZE_TO_PAGES (BootImgSize));

View File

@ -16,24 +16,28 @@
// present, but RamdiskSize will be set to 0. // present, but RamdiskSize will be set to 0.
EFI_STATUS EFI_STATUS
ParseAndroidBootImg ( ParseAndroidBootImg (
IN VOID *BootImg, IN VOID *BootImg,
OUT VOID **Kernel, OUT VOID **Kernel,
OUT UINTN *KernelSize, OUT UINTN *KernelSize,
OUT VOID **Ramdisk, OUT VOID **Ramdisk,
OUT UINTN *RamdiskSize, OUT UINTN *RamdiskSize,
OUT CHAR8 *KernelArgs OUT CHAR8 *KernelArgs
) )
{ {
ANDROID_BOOTIMG_HEADER *Header; ANDROID_BOOTIMG_HEADER *Header;
UINT8 *BootImgBytePtr; UINT8 *BootImgBytePtr;
// Cast to UINT8 so we can do pointer arithmetic // Cast to UINT8 so we can do pointer arithmetic
BootImgBytePtr = (UINT8 *) BootImg; BootImgBytePtr = (UINT8 *)BootImg;
Header = (ANDROID_BOOTIMG_HEADER *) BootImg; Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC, if (AsciiStrnCmp (
ANDROID_BOOT_MAGIC_LENGTH) != 0) { (CONST CHAR8 *)Header->BootMagic,
ANDROID_BOOT_MAGIC,
ANDROID_BOOT_MAGIC_LENGTH
) != 0)
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -43,18 +47,22 @@ ParseAndroidBootImg (
ASSERT (IS_VALID_ANDROID_PAGE_SIZE (Header->PageSize)); ASSERT (IS_VALID_ANDROID_PAGE_SIZE (Header->PageSize));
*KernelSize = Header->KernelSize; *KernelSize = Header->KernelSize;
*Kernel = BootImgBytePtr + Header->PageSize; *Kernel = BootImgBytePtr + Header->PageSize;
*RamdiskSize = Header->RamdiskSize; *RamdiskSize = Header->RamdiskSize;
if (Header->RamdiskSize != 0) { if (Header->RamdiskSize != 0) {
*Ramdisk = (VOID *) (BootImgBytePtr *Ramdisk = (VOID *)(BootImgBytePtr
+ Header->PageSize + Header->PageSize
+ ALIGN_VALUE (Header->KernelSize, Header->PageSize)); + ALIGN_VALUE (Header->KernelSize, Header->PageSize));
} }
AsciiStrnCpyS (KernelArgs, ANDROID_BOOTIMG_KERNEL_ARGS_SIZE, Header->KernelArgs, AsciiStrnCpyS (
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE); KernelArgs,
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE,
Header->KernelArgs,
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE
);
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -25,10 +25,10 @@
* FASTBOOT_PLATFORM_PROTOCOL to implement the Android Fastboot protocol. * FASTBOOT_PLATFORM_PROTOCOL to implement the Android Fastboot protocol.
*/ */
STATIC FASTBOOT_TRANSPORT_PROTOCOL *mTransport; STATIC FASTBOOT_TRANSPORT_PROTOCOL *mTransport;
STATIC FASTBOOT_PLATFORM_PROTOCOL *mPlatform; STATIC FASTBOOT_PLATFORM_PROTOCOL *mPlatform;
STATIC EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *mTextOut; STATIC EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *mTextOut;
typedef enum { typedef enum {
ExpectCmdState, ExpectCmdState,
@ -36,45 +36,45 @@ typedef enum {
FastbootStateMax FastbootStateMax
} ANDROID_FASTBOOT_STATE; } ANDROID_FASTBOOT_STATE;
STATIC ANDROID_FASTBOOT_STATE mState = ExpectCmdState; STATIC ANDROID_FASTBOOT_STATE mState = ExpectCmdState;
// When in ExpectDataState, the number of bytes of data to expect: // When in ExpectDataState, the number of bytes of data to expect:
STATIC UINT64 mNumDataBytes; STATIC UINT64 mNumDataBytes;
// .. and the number of bytes so far received this data phase // .. and the number of bytes so far received this data phase
STATIC UINT64 mBytesReceivedSoFar; STATIC UINT64 mBytesReceivedSoFar;
// .. and the buffer to save data into // .. and the buffer to save data into
STATIC UINT8 *mDataBuffer = NULL; STATIC UINT8 *mDataBuffer = NULL;
// Event notify functions, from which gBS->Exit shouldn't be called, can signal // Event notify functions, from which gBS->Exit shouldn't be called, can signal
// this event when the application should exit // this event when the application should exit
STATIC EFI_EVENT mFinishedEvent; STATIC EFI_EVENT mFinishedEvent;
STATIC EFI_EVENT mFatalSendErrorEvent; STATIC EFI_EVENT mFatalSendErrorEvent;
// This macro uses sizeof - only use it on arrays (i.e. string literals) // This macro uses sizeof - only use it on arrays (i.e. string literals)
#define SEND_LITERAL(Str) mTransport->Send ( \ #define SEND_LITERAL(Str) mTransport->Send ( \
sizeof (Str) - 1, \ sizeof (Str) - 1, \
Str, \ Str, \
&mFatalSendErrorEvent \ &mFatalSendErrorEvent \
) )
#define MATCH_CMD_LITERAL(Cmd, Buf) !AsciiStrnCmp (Cmd, Buf, sizeof (Cmd) - 1) #define MATCH_CMD_LITERAL(Cmd, Buf) !AsciiStrnCmp (Cmd, Buf, sizeof (Cmd) - 1)
#define IS_LOWERCASE_ASCII(Char) (Char >= 'a' && Char <= 'z') #define IS_LOWERCASE_ASCII(Char) (Char >= 'a' && Char <= 'z')
#define FASTBOOT_STRING_MAX_LENGTH 256 #define FASTBOOT_STRING_MAX_LENGTH 256
#define FASTBOOT_COMMAND_MAX_LENGTH 64 #define FASTBOOT_COMMAND_MAX_LENGTH 64
STATIC STATIC
VOID VOID
HandleGetVar ( HandleGetVar (
IN CHAR8 *CmdArg IN CHAR8 *CmdArg
) )
{ {
CHAR8 Response[FASTBOOT_COMMAND_MAX_LENGTH + 1] = "OKAY"; CHAR8 Response[FASTBOOT_COMMAND_MAX_LENGTH + 1] = "OKAY";
EFI_STATUS Status; EFI_STATUS Status;
// Respond to getvar:version with 0.4 (version of Fastboot protocol) // Respond to getvar:version with 0.4 (version of Fastboot protocol)
if (!AsciiStrnCmp ("version", CmdArg, sizeof ("version") - 1 )) { if (!AsciiStrnCmp ("version", CmdArg, sizeof ("version") - 1)) {
SEND_LITERAL ("OKAY" ANDROID_FASTBOOT_VERSION); SEND_LITERAL ("OKAY" ANDROID_FASTBOOT_VERSION);
} else { } else {
// All other variables are assumed to be platform specific // All other variables are assumed to be platform specific
@ -90,11 +90,11 @@ HandleGetVar (
STATIC STATIC
VOID VOID
HandleDownload ( HandleDownload (
IN CHAR8 *NumBytesString IN CHAR8 *NumBytesString
) )
{ {
CHAR8 Response[13]; CHAR8 Response[13];
CHAR16 OutputString[FASTBOOT_STRING_MAX_LENGTH]; CHAR16 OutputString[FASTBOOT_STRING_MAX_LENGTH];
// Argument is 8-character ASCII string hex representation of number of bytes // Argument is 8-character ASCII string hex representation of number of bytes
// that will be sent in the data phase. // that will be sent in the data phase.
@ -122,11 +122,15 @@ HandleDownload (
SEND_LITERAL ("FAILNot enough memory"); SEND_LITERAL ("FAILNot enough memory");
} else { } else {
ZeroMem (Response, sizeof Response); ZeroMem (Response, sizeof Response);
AsciiSPrint (Response, sizeof Response, "DATA%x", AsciiSPrint (
(UINT32)mNumDataBytes); Response,
sizeof Response,
"DATA%x",
(UINT32)mNumDataBytes
);
mTransport->Send (sizeof Response - 1, Response, &mFatalSendErrorEvent); mTransport->Send (sizeof Response - 1, Response, &mFatalSendErrorEvent);
mState = ExpectDataState; mState = ExpectDataState;
mBytesReceivedSoFar = 0; mBytesReceivedSoFar = 0;
} }
} }
@ -134,7 +138,7 @@ HandleDownload (
STATIC STATIC
VOID VOID
HandleFlash ( HandleFlash (
IN CHAR8 *PartitionName IN CHAR8 *PartitionName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -171,7 +175,7 @@ HandleFlash (
STATIC STATIC
VOID VOID
HandleErase ( HandleErase (
IN CHAR8 *PartitionName IN CHAR8 *PartitionName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -196,7 +200,7 @@ HandleBoot (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
mTextOut->OutputString (mTextOut, L"Booting downloaded image\r\n"); mTextOut->OutputString (mTextOut, L"Booting downloaded image\r\n");
@ -214,13 +218,14 @@ HandleBoot (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Failed to boot downloaded image: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Failed to boot downloaded image: %r\n", Status));
} }
// We shouldn't get here // We shouldn't get here
} }
STATIC STATIC
VOID VOID
HandleOemCommand ( HandleOemCommand (
IN CHAR8 *Command IN CHAR8 *Command
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -241,10 +246,10 @@ STATIC
VOID VOID
AcceptCmd ( AcceptCmd (
IN UINTN Size, IN UINTN Size,
IN CONST CHAR8 *Data IN CONST CHAR8 *Data
) )
{ {
CHAR8 Command[FASTBOOT_COMMAND_MAX_LENGTH + 1]; CHAR8 Command[FASTBOOT_COMMAND_MAX_LENGTH + 1];
// Max command size is 64 bytes // Max command size is 64 bytes
if (Size > FASTBOOT_COMMAND_MAX_LENGTH) { if (Size > FASTBOOT_COMMAND_MAX_LENGTH) {
@ -282,6 +287,7 @@ AcceptCmd (
// Here we just reboot normally. // Here we just reboot normally.
SEND_LITERAL ("INFOreboot-bootloader not supported, rebooting normally."); SEND_LITERAL ("INFOreboot-bootloader not supported, rebooting normally.");
} }
SEND_LITERAL ("OKAY"); SEND_LITERAL ("OKAY");
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
@ -313,12 +319,12 @@ STATIC
VOID VOID
AcceptData ( AcceptData (
IN UINTN Size, IN UINTN Size,
IN VOID *Data IN VOID *Data
) )
{ {
UINT32 RemainingBytes = mNumDataBytes - mBytesReceivedSoFar; UINT32 RemainingBytes = mNumDataBytes - mBytesReceivedSoFar;
CHAR16 OutputString[FASTBOOT_STRING_MAX_LENGTH]; CHAR16 OutputString[FASTBOOT_STRING_MAX_LENGTH];
STATIC UINTN Count = 0; STATIC UINTN Count = 0;
// Protocol doesn't say anything about sending extra data so just ignore it. // Protocol doesn't say anything about sending extra data so just ignore it.
if (Size > RemainingBytes) { if (Size > RemainingBytes) {
@ -331,7 +337,7 @@ AcceptData (
// Show download progress. Don't do it for every packet as outputting text // Show download progress. Don't do it for every packet as outputting text
// might be time consuming - do it on the last packet and on every 32nd packet // might be time consuming - do it on the last packet and on every 32nd packet
if ((Count++ % 32) == 0 || Size == RemainingBytes) { if (((Count++ % 32) == 0) || (Size == RemainingBytes)) {
// (Note no newline in format string - it will overwrite the line each time) // (Note no newline in format string - it will overwrite the line each time)
UnicodeSPrint ( UnicodeSPrint (
OutputString, OutputString,
@ -363,23 +369,24 @@ STATIC
VOID VOID
DataReady ( DataReady (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
UINTN Size; UINTN Size;
VOID *Data; VOID *Data;
EFI_STATUS Status; EFI_STATUS Status;
do { do {
Status = mTransport->Receive (&Size, &Data); Status = mTransport->Receive (&Size, &Data);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
if (mState == ExpectCmdState) { if (mState == ExpectCmdState) {
AcceptCmd (Size, (CHAR8 *) Data); AcceptCmd (Size, (CHAR8 *)Data);
} else if (mState == ExpectDataState) { } else if (mState == ExpectDataState) {
AcceptData (Size, Data); AcceptData (Size, Data);
} else { } else {
ASSERT (FALSE); ASSERT (FALSE);
} }
FreePool (Data); FreePool (Data);
} }
} while (!EFI_ERROR (Status)); } while (!EFI_ERROR (Status));
@ -401,7 +408,7 @@ STATIC
VOID VOID
FatalErrorNotify ( FatalErrorNotify (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
mTextOut->OutputString (mTextOut, L"Fatal error sending command response. Exiting.\r\n"); mTextOut->OutputString (mTextOut, L"Fatal error sending command response. Exiting.\r\n");
@ -411,30 +418,30 @@ FatalErrorNotify (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FastbootAppEntryPoint ( FastbootAppEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_EVENT ReceiveEvent; EFI_EVENT ReceiveEvent;
EFI_EVENT WaitEventArray[2]; EFI_EVENT WaitEventArray[2];
UINTN EventIndex; UINTN EventIndex;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextIn; EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextIn;
EFI_INPUT_KEY Key; EFI_INPUT_KEY Key;
mDataBuffer = NULL; mDataBuffer = NULL;
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gAndroidFastbootTransportProtocolGuid, &gAndroidFastbootTransportProtocolGuid,
NULL, NULL,
(VOID **) &mTransport (VOID **)&mTransport
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Fastboot: Couldn't open Fastboot Transport Protocol: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Fastboot: Couldn't open Fastboot Transport Protocol: %r\n", Status));
return Status; return Status;
} }
Status = gBS->LocateProtocol (&gAndroidFastbootPlatformProtocolGuid, NULL, (VOID **) &mPlatform); Status = gBS->LocateProtocol (&gAndroidFastbootPlatformProtocolGuid, NULL, (VOID **)&mPlatform);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Fastboot: Couldn't open Fastboot Platform Protocol: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Fastboot: Couldn't open Fastboot Platform Protocol: %r\n", Status));
return Status; return Status;
@ -446,15 +453,17 @@ FastbootAppEntryPoint (
return Status; return Status;
} }
Status = gBS->LocateProtocol (&gEfiSimpleTextOutProtocolGuid, NULL, (VOID **) &mTextOut); Status = gBS->LocateProtocol (&gEfiSimpleTextOutProtocolGuid, NULL, (VOID **)&mTextOut);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
"Fastboot: Couldn't open Text Output Protocol: %r\n", Status DEBUG_ERROR,
"Fastboot: Couldn't open Text Output Protocol: %r\n",
Status
)); ));
return Status; return Status;
} }
Status = gBS->LocateProtocol (&gEfiSimpleTextInProtocolGuid, NULL, (VOID **) &TextIn); Status = gBS->LocateProtocol (&gEfiSimpleTextInProtocolGuid, NULL, (VOID **)&TextIn);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Fastboot: Couldn't open Text Input Protocol: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Fastboot: Couldn't open Text Input Protocol: %r\n", Status));
return Status; return Status;
@ -483,27 +492,28 @@ FastbootAppEntryPoint (
// Create event to pass to FASTBOOT_TRANSPORT_PROTOCOL.Send, signalling a // Create event to pass to FASTBOOT_TRANSPORT_PROTOCOL.Send, signalling a
// fatal error // fatal error
Status = gBS->CreateEvent ( Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL, EVT_NOTIFY_SIGNAL,
TPL_CALLBACK, TPL_CALLBACK,
FatalErrorNotify, FatalErrorNotify,
NULL, NULL,
&mFatalSendErrorEvent &mFatalSendErrorEvent
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// Start listening for data // Start listening for data
Status = mTransport->Start ( Status = mTransport->Start (
ReceiveEvent ReceiveEvent
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Fastboot: Couldn't start transport: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Fastboot: Couldn't start transport: %r\n", Status));
return Status; return Status;
} }
// Talk to the user // Talk to the user
mTextOut->OutputString (mTextOut, mTextOut->OutputString (
L"Android Fastboot mode - version " ANDROID_FASTBOOT_VERSION ". Press RETURN or SPACE key to quit.\r\n"); mTextOut,
L"Android Fastboot mode - version " ANDROID_FASTBOOT_VERSION ". Press RETURN or SPACE key to quit.\r\n"
);
// Quit when the user presses any key, or mFinishedEvent is signalled // Quit when the user presses any key, or mFinishedEvent is signalled
WaitEventArray[0] = mFinishedEvent; WaitEventArray[0] = mFinishedEvent;
@ -513,7 +523,8 @@ FastbootAppEntryPoint (
Status = TextIn->ReadKeyStroke (gST->ConIn, &Key); Status = TextIn->ReadKeyStroke (gST->ConIn, &Key);
if (Key.ScanCode == SCAN_NULL) { if (Key.ScanCode == SCAN_NULL) {
if ((Key.UnicodeChar == CHAR_CARRIAGE_RETURN) || if ((Key.UnicodeChar == CHAR_CARRIAGE_RETURN) ||
(Key.UnicodeChar == L' ')) { (Key.UnicodeChar == L' '))
{
break; break;
} }
} }
@ -523,6 +534,7 @@ FastbootAppEntryPoint (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Warning: Fastboot Transport Stop: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Warning: Fastboot Transport Stop: %r\n", Status));
} }
mPlatform->UnInit (); mPlatform->UnInit ();
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -14,24 +14,24 @@
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#define BOOTIMG_KERNEL_ARGS_SIZE 512 #define BOOTIMG_KERNEL_ARGS_SIZE 512
#define ANDROID_FASTBOOT_VERSION "0.4" #define ANDROID_FASTBOOT_VERSION "0.4"
EFI_STATUS EFI_STATUS
BootAndroidBootImg ( BootAndroidBootImg (
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
); );
EFI_STATUS EFI_STATUS
ParseAndroidBootImg ( ParseAndroidBootImg (
IN VOID *BootImg, IN VOID *BootImg,
OUT VOID **Kernel, OUT VOID **Kernel,
OUT UINTN *KernelSize, OUT UINTN *KernelSize,
OUT VOID **Ramdisk, OUT VOID **Ramdisk,
OUT UINTN *RamdiskSize, OUT UINTN *RamdiskSize,
OUT CHAR8 *KernelArgs OUT CHAR8 *KernelArgs
); );
#endif //ifdef __ANDROID_FASTBOOT_APP_H__ #endif //ifdef __ANDROID_FASTBOOT_APP_H__

View File

@ -18,12 +18,12 @@
// Device Path representing an image in memory // Device Path representing an image in memory
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
MEMMAP_DEVICE_PATH Node1; MEMMAP_DEVICE_PATH Node1;
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
} MEMORY_DEVICE_PATH; } MEMORY_DEVICE_PATH;
#pragma pack() #pragma pack()
STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate = STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate =
{ {
{ {
{ {
@ -44,7 +44,6 @@ STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate =
} // End } // End
}; };
/** /**
Start an EFI Application from a Device Path Start an EFI Application from a Device Path
@ -59,19 +58,25 @@ STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate =
STATIC STATIC
EFI_STATUS EFI_STATUS
StartEfiApplication ( StartEfiApplication (
IN EFI_HANDLE ParentImageHandle, IN EFI_HANDLE ParentImageHandle,
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN UINTN LoadOptionsSize, IN UINTN LoadOptionsSize,
IN VOID* LoadOptions IN VOID *LoadOptions
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE ImageHandle; EFI_HANDLE ImageHandle;
EFI_LOADED_IMAGE_PROTOCOL* LoadedImage; EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
// Load the image from the device path with Boot Services function // Load the image from the device path with Boot Services function
Status = gBS->LoadImage (TRUE, ParentImageHandle, DevicePath, NULL, 0, Status = gBS->LoadImage (
&ImageHandle); TRUE,
ParentImageHandle,
DevicePath,
NULL,
0,
&ImageHandle
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
// With EFI_SECURITY_VIOLATION retval, the Image was loaded and an ImageHandle was created // With EFI_SECURITY_VIOLATION retval, the Image was loaded and an ImageHandle was created
@ -82,19 +87,23 @@ StartEfiApplication (
if (Status == EFI_SECURITY_VIOLATION) { if (Status == EFI_SECURITY_VIOLATION) {
gBS->UnloadImage (ImageHandle); gBS->UnloadImage (ImageHandle);
} }
return Status; return Status;
} }
// Passed LoadOptions to the EFI Application // Passed LoadOptions to the EFI Application
if (LoadOptionsSize != 0) { if (LoadOptionsSize != 0) {
Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, Status = gBS->HandleProtocol (
(VOID **) &LoadedImage); ImageHandle,
&gEfiLoadedImageProtocolGuid,
(VOID **)&LoadedImage
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
LoadedImage->LoadOptionsSize = LoadOptionsSize; LoadedImage->LoadOptionsSize = LoadOptionsSize;
LoadedImage->LoadOptions = LoadOptions; LoadedImage->LoadOptions = LoadOptions;
} }
// Before calling the image, enable the Watchdog Timer for the 5 Minute period // Before calling the image, enable the Watchdog Timer for the 5 Minute period
@ -109,27 +118,27 @@ StartEfiApplication (
EFI_STATUS EFI_STATUS
BootAndroidBootImg ( BootAndroidBootImg (
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
CHAR8 KernelArgs[ANDROID_BOOTIMG_KERNEL_ARGS_SIZE]; CHAR8 KernelArgs[ANDROID_BOOTIMG_KERNEL_ARGS_SIZE];
VOID *Kernel; VOID *Kernel;
UINTN KernelSize; UINTN KernelSize;
VOID *Ramdisk; VOID *Ramdisk;
UINTN RamdiskSize; UINTN RamdiskSize;
MEMORY_DEVICE_PATH KernelDevicePath; MEMORY_DEVICE_PATH KernelDevicePath;
CHAR16 *LoadOptions, *NewLoadOptions; CHAR16 *LoadOptions, *NewLoadOptions;
Status = ParseAndroidBootImg ( Status = ParseAndroidBootImg (
Buffer, Buffer,
&Kernel, &Kernel,
&KernelSize, &KernelSize,
&Ramdisk, &Ramdisk,
&RamdiskSize, &RamdiskSize,
KernelArgs KernelArgs
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -138,8 +147,8 @@ BootAndroidBootImg (
// Have to cast to UINTN before casting to EFI_PHYSICAL_ADDRESS in order to // Have to cast to UINTN before casting to EFI_PHYSICAL_ADDRESS in order to
// appease GCC. // appease GCC.
KernelDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel; KernelDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Kernel;
KernelDevicePath.Node1.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel + KernelSize; KernelDevicePath.Node1.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Kernel + KernelSize;
// Initialize Linux command line // Initialize Linux command line
LoadOptions = CatSPrint (NULL, L"%a", KernelArgs); LoadOptions = CatSPrint (NULL, L"%a", KernelArgs);
@ -148,19 +157,26 @@ BootAndroidBootImg (
} }
if (RamdiskSize != 0) { if (RamdiskSize != 0) {
NewLoadOptions = CatSPrint (LoadOptions, L" initrd=0x%x,0x%x", NewLoadOptions = CatSPrint (
(UINTN)Ramdisk, RamdiskSize); LoadOptions,
L" initrd=0x%x,0x%x",
(UINTN)Ramdisk,
RamdiskSize
);
FreePool (LoadOptions); FreePool (LoadOptions);
if (NewLoadOptions == NULL) { if (NewLoadOptions == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
LoadOptions = NewLoadOptions; LoadOptions = NewLoadOptions;
} }
Status = StartEfiApplication (gImageHandle, Status = StartEfiApplication (
(EFI_DEVICE_PATH_PROTOCOL *) &KernelDevicePath, gImageHandle,
(EFI_DEVICE_PATH_PROTOCOL *)&KernelDevicePath,
StrSize (LoadOptions), StrSize (LoadOptions),
LoadOptions); LoadOptions
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Couldn't Boot Linux: %d\n", Status)); DEBUG ((DEBUG_ERROR, "Couldn't Boot Linux: %d\n", Status));
Status = EFI_DEVICE_ERROR; Status = EFI_DEVICE_ERROR;

View File

@ -22,7 +22,7 @@
#include <Library/UefiDriverEntryPoint.h> #include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiRuntimeServicesTableLib.h> #include <Library/UefiRuntimeServicesTableLib.h>
#define IP4_ADDR_TO_STRING(IpAddr, IpAddrString) UnicodeSPrint ( \ #define IP4_ADDR_TO_STRING(IpAddr, IpAddrString) UnicodeSPrint ( \
IpAddrString, \ IpAddrString, \
16 * 2, \ 16 * 2, \
L"%d.%d.%d.%d", \ L"%d.%d.%d.%d", \
@ -37,49 +37,49 @@
// (This isn't actually a packet size - it's just the size of the buffers we // (This isn't actually a packet size - it's just the size of the buffers we
// pass to the TCP driver to fill with received data.) // pass to the TCP driver to fill with received data.)
// We can achieve much better performance by doing this in larger chunks. // We can achieve much better performance by doing this in larger chunks.
#define RX_FRAGMENT_SIZE 2048 #define RX_FRAGMENT_SIZE 2048
STATIC EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *mTextOut; STATIC EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *mTextOut;
STATIC EFI_TCP4_PROTOCOL *mTcpConnection; STATIC EFI_TCP4_PROTOCOL *mTcpConnection;
STATIC EFI_TCP4_PROTOCOL *mTcpListener; STATIC EFI_TCP4_PROTOCOL *mTcpListener;
STATIC EFI_EVENT mReceiveEvent; STATIC EFI_EVENT mReceiveEvent;
STATIC EFI_SERVICE_BINDING_PROTOCOL *mTcpServiceBinding; STATIC EFI_SERVICE_BINDING_PROTOCOL *mTcpServiceBinding;
STATIC EFI_HANDLE mTcpHandle = NULL; STATIC EFI_HANDLE mTcpHandle = NULL;
// We only ever use one IO token for receive and one for transmit. To save // We only ever use one IO token for receive and one for transmit. To save
// repeatedly allocating and freeing, just allocate statically and re-use. // repeatedly allocating and freeing, just allocate statically and re-use.
#define NUM_RX_TOKENS 16 #define NUM_RX_TOKENS 16
#define TOKEN_NEXT(Index) (((Index) + 1) % NUM_RX_TOKENS) #define TOKEN_NEXT(Index) (((Index) + 1) % NUM_RX_TOKENS)
STATIC UINTN mNextSubmitIndex; STATIC UINTN mNextSubmitIndex;
STATIC UINTN mNextReceiveIndex; STATIC UINTN mNextReceiveIndex;
STATIC EFI_TCP4_IO_TOKEN mReceiveToken[NUM_RX_TOKENS]; STATIC EFI_TCP4_IO_TOKEN mReceiveToken[NUM_RX_TOKENS];
STATIC EFI_TCP4_RECEIVE_DATA mRxData[NUM_RX_TOKENS]; STATIC EFI_TCP4_RECEIVE_DATA mRxData[NUM_RX_TOKENS];
STATIC EFI_TCP4_IO_TOKEN mTransmitToken; STATIC EFI_TCP4_IO_TOKEN mTransmitToken;
STATIC EFI_TCP4_TRANSMIT_DATA mTxData; STATIC EFI_TCP4_TRANSMIT_DATA mTxData;
// We also reuse the accept token // We also reuse the accept token
STATIC EFI_TCP4_LISTEN_TOKEN mAcceptToken; STATIC EFI_TCP4_LISTEN_TOKEN mAcceptToken;
// .. and the close token // .. and the close token
STATIC EFI_TCP4_CLOSE_TOKEN mCloseToken; STATIC EFI_TCP4_CLOSE_TOKEN mCloseToken;
// List type for queued received packets // List type for queued received packets
typedef struct _FASTBOOT_TCP_PACKET_LIST { typedef struct _FASTBOOT_TCP_PACKET_LIST {
LIST_ENTRY Link; LIST_ENTRY Link;
VOID *Buffer; VOID *Buffer;
UINTN BufferSize; UINTN BufferSize;
} FASTBOOT_TCP_PACKET_LIST; } FASTBOOT_TCP_PACKET_LIST;
STATIC LIST_ENTRY mPacketListHead; STATIC LIST_ENTRY mPacketListHead;
STATIC STATIC
VOID VOID
EFIAPI EFIAPI
DataReceived ( DataReceived (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/* /*
@ -91,8 +91,8 @@ SubmitRecieveToken (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VOID *FragmentBuffer; VOID *FragmentBuffer;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
@ -103,12 +103,12 @@ SubmitRecieveToken (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
mRxData[mNextSubmitIndex].DataLength = RX_FRAGMENT_SIZE; mRxData[mNextSubmitIndex].DataLength = RX_FRAGMENT_SIZE;
mRxData[mNextSubmitIndex].FragmentTable[0].FragmentLength = RX_FRAGMENT_SIZE; mRxData[mNextSubmitIndex].FragmentTable[0].FragmentLength = RX_FRAGMENT_SIZE;
mRxData[mNextSubmitIndex].FragmentTable[0].FragmentBuffer = FragmentBuffer; mRxData[mNextSubmitIndex].FragmentTable[0].FragmentBuffer = FragmentBuffer;
Status = mTcpConnection->Receive (mTcpConnection, &mReceiveToken[mNextSubmitIndex]); Status = mTcpConnection->Receive (mTcpConnection, &mReceiveToken[mNextSubmitIndex]);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "TCP Receive: %r\n", Status)); DEBUG ((DEBUG_ERROR, "TCP Receive: %r\n", Status));
FreePool (FragmentBuffer); FreePool (FragmentBuffer);
} }
@ -125,10 +125,10 @@ STATIC
VOID VOID
ConnectionClosed ( ConnectionClosed (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// Possible bug in EDK2 TCP4 driver: closing a connection doesn't remove its // Possible bug in EDK2 TCP4 driver: closing a connection doesn't remove its
// PCB from the list of live connections. Subsequent attempts to Configure() // PCB from the list of live connections. Subsequent attempts to Configure()
@ -150,7 +150,7 @@ CloseReceiveEvents (
VOID VOID
) )
{ {
UINTN Index; UINTN Index;
for (Index = 0; Index < NUM_RX_TOKENS; Index++) { for (Index = 0; Index < NUM_RX_TOKENS; Index++) {
gBS->CloseEvent (mReceiveToken[Index].CompletionToken.Event); gBS->CloseEvent (mReceiveToken[Index].CompletionToken.Event);
@ -164,11 +164,11 @@ STATIC
VOID VOID
EFIAPI EFIAPI
DataReceived ( DataReceived (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
FASTBOOT_TCP_PACKET_LIST *NewEntry; FASTBOOT_TCP_PACKET_LIST *NewEntry;
EFI_TCP4_IO_TOKEN *ReceiveToken; EFI_TCP4_IO_TOKEN *ReceiveToken;
@ -208,11 +208,11 @@ DataReceived (
= ReceiveToken->Packet.RxData->FragmentTable[0].FragmentLength; = ReceiveToken->Packet.RxData->FragmentTable[0].FragmentLength;
// Prepare to receive more data // Prepare to receive more data
SubmitRecieveToken(); SubmitRecieveToken ();
} else { } else {
// Fatal receive error. Put an entry with NULL in the queue, signifying // Fatal receive error. Put an entry with NULL in the queue, signifying
// to return EFI_DEVICE_ERROR from TcpFastbootTransportReceive. // to return EFI_DEVICE_ERROR from TcpFastbootTransportReceive.
NewEntry->Buffer = NULL; NewEntry->Buffer = NULL;
NewEntry->BufferSize = 0; NewEntry->BufferSize = 0;
DEBUG ((DEBUG_ERROR, "\nTCP Fastboot Receive error: %r\n", Status)); DEBUG ((DEBUG_ERROR, "\nTCP Fastboot Receive error: %r\n", Status));
@ -224,7 +224,6 @@ DataReceived (
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
/* /*
Event notify function to be called when we accept an incoming TCP connection. Event notify function to be called when we accept an incoming TCP connection.
*/ */
@ -232,21 +231,22 @@ STATIC
VOID VOID
EFIAPI EFIAPI
ConnectionAccepted ( ConnectionAccepted (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
EFI_TCP4_LISTEN_TOKEN *AcceptToken; EFI_TCP4_LISTEN_TOKEN *AcceptToken;
EFI_STATUS Status; EFI_STATUS Status;
UINTN Index; UINTN Index;
AcceptToken = (EFI_TCP4_LISTEN_TOKEN *) Context; AcceptToken = (EFI_TCP4_LISTEN_TOKEN *)Context;
Status = AcceptToken->CompletionToken.Status; Status = AcceptToken->CompletionToken.Status;
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "TCP Fastboot: Connection Error: %r\n", Status)); DEBUG ((DEBUG_ERROR, "TCP Fastboot: Connection Error: %r\n", Status));
return; return;
} }
DEBUG ((DEBUG_ERROR, "TCP Fastboot: Connection Received.\n")); DEBUG ((DEBUG_ERROR, "TCP Fastboot: Connection Received.\n"));
// //
@ -257,7 +257,7 @@ ConnectionAccepted (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
AcceptToken->NewChildHandle, AcceptToken->NewChildHandle,
&gEfiTcp4ProtocolGuid, &gEfiTcp4ProtocolGuid,
(VOID **) &mTcpConnection, (VOID **)&mTcpConnection,
gImageHandle, gImageHandle,
NULL, NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -267,7 +267,7 @@ ConnectionAccepted (
return; return;
} }
mNextSubmitIndex = 0; mNextSubmitIndex = 0;
mNextReceiveIndex = 0; mNextReceiveIndex = 0;
for (Index = 0; Index < NUM_RX_TOKENS; Index++) { for (Index = 0; Index < NUM_RX_TOKENS; Index++) {
@ -282,7 +282,7 @@ ConnectionAccepted (
} }
for (Index = 0; Index < NUM_RX_TOKENS; Index++) { for (Index = 0; Index < NUM_RX_TOKENS; Index++) {
SubmitRecieveToken(); SubmitRecieveToken ();
} }
} }
@ -292,26 +292,32 @@ ConnectionAccepted (
*/ */
EFI_STATUS EFI_STATUS
TcpFastbootTransportStart ( TcpFastbootTransportStart (
EFI_EVENT ReceiveEvent EFI_EVENT ReceiveEvent
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE NetDeviceHandle; EFI_HANDLE NetDeviceHandle;
EFI_HANDLE *HandleBuffer; EFI_HANDLE *HandleBuffer;
EFI_IP4_MODE_DATA Ip4ModeData; EFI_IP4_MODE_DATA Ip4ModeData;
UINTN NumHandles; UINTN NumHandles;
CHAR16 IpAddrString[16]; CHAR16 IpAddrString[16];
UINTN Index; UINTN Index;
EFI_TCP4_CONFIG_DATA TcpConfigData = { EFI_TCP4_CONFIG_DATA TcpConfigData = {
0x00, // IPv4 Type of Service 0x00, // IPv4 Type of Service
255, // IPv4 Time to Live 255, // IPv4 Time to Live
{ // AccessPoint: { // AccessPoint:
TRUE, // Use default address TRUE, // Use default address
{ {0, 0, 0, 0} }, // IP Address (ignored - use default) {
{ {0, 0, 0, 0} }, // Subnet mask (ignored - use default) { 0, 0, 0, 0 }
}, // IP Address (ignored - use default)
{
{ 0, 0, 0, 0 }
}, // Subnet mask (ignored - use default)
FixedPcdGet32 (PcdAndroidFastbootTcpPort), // Station port FixedPcdGet32 (PcdAndroidFastbootTcpPort), // Station port
{ {0, 0, 0, 0} }, // Remote address: accept any {
{ 0, 0, 0, 0 }
}, // Remote address: accept any
0, // Remote Port: accept any 0, // Remote Port: accept any
FALSE // ActiveFlag: be a "server" FALSE // ActiveFlag: be a "server"
}, },
@ -343,13 +349,13 @@ TcpFastbootTransportStart (
NetDeviceHandle = HandleBuffer[0]; NetDeviceHandle = HandleBuffer[0];
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
NetDeviceHandle, NetDeviceHandle,
&gEfiTcp4ServiceBindingProtocolGuid, &gEfiTcp4ServiceBindingProtocolGuid,
(VOID **) &mTcpServiceBinding, (VOID **)&mTcpServiceBinding,
gImageHandle, gImageHandle,
NULL, NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Open TCP Service Binding: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Open TCP Service Binding: %r\n", Status));
return Status; return Status;
@ -362,13 +368,13 @@ TcpFastbootTransportStart (
} }
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
mTcpHandle, mTcpHandle,
&gEfiTcp4ProtocolGuid, &gEfiTcp4ProtocolGuid,
(VOID **) &mTcpListener, (VOID **)&mTcpListener,
gImageHandle, gImageHandle,
NULL, NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Open TCP Protocol: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Open TCP Protocol: %r\n", Status));
} }
@ -378,14 +384,14 @@ TcpFastbootTransportStart (
// //
for (Index = 0; Index < NUM_RX_TOKENS; Index++) { for (Index = 0; Index < NUM_RX_TOKENS; Index++) {
mRxData[Index].UrgentFlag = FALSE; mRxData[Index].UrgentFlag = FALSE;
mRxData[Index].FragmentCount = 1; mRxData[Index].FragmentCount = 1;
mReceiveToken[Index].Packet.RxData = &mRxData[Index]; mReceiveToken[Index].Packet.RxData = &mRxData[Index];
} }
mTxData.Push = TRUE; mTxData.Push = TRUE;
mTxData.Urgent = FALSE; mTxData.Urgent = FALSE;
mTxData.FragmentCount = 1; mTxData.FragmentCount = 1;
mTransmitToken.Packet.TxData = &mTxData; mTransmitToken.Packet.TxData = &mTxData;
Status = gBS->CreateEvent ( Status = gBS->CreateEvent (
@ -414,13 +420,17 @@ TcpFastbootTransportStart (
if (Status == EFI_NO_MAPPING) { if (Status == EFI_NO_MAPPING) {
// Wait until the IP configuration process (probably DHCP) has finished // Wait until the IP configuration process (probably DHCP) has finished
do { do {
Status = mTcpListener->GetModeData (mTcpListener, Status = mTcpListener->GetModeData (
NULL, NULL, mTcpListener,
NULL,
NULL,
&Ip4ModeData, &Ip4ModeData,
NULL, NULL NULL,
NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} while (!Ip4ModeData.IsConfigured); } while (!Ip4ModeData.IsConfigured);
Status = mTcpListener->Configure (mTcpListener, &TcpConfigData); Status = mTcpListener->Configure (mTcpListener, &TcpConfigData);
} else if (EFI_ERROR (Status)) { } else if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "TCP Configure: %r\n", Status)); DEBUG ((DEBUG_ERROR, "TCP Configure: %r\n", Status));
@ -434,7 +444,7 @@ TcpFastbootTransportStart (
mTextOut->OutputString (mTextOut, L"TCP Fastboot transport configured."); mTextOut->OutputString (mTextOut, L"TCP Fastboot transport configured.");
mTextOut->OutputString (mTextOut, L"\r\nIP address: "); mTextOut->OutputString (mTextOut, L"\r\nIP address: ");
mTextOut->OutputString (mTextOut ,IpAddrString); mTextOut->OutputString (mTextOut, IpAddrString);
mTextOut->OutputString (mTextOut, L"\r\n"); mTextOut->OutputString (mTextOut, L"\r\n");
// //
@ -462,8 +472,8 @@ TcpFastbootTransportStop (
EFI_TCP4_CLOSE_TOKEN CloseToken; EFI_TCP4_CLOSE_TOKEN CloseToken;
EFI_STATUS Status; EFI_STATUS Status;
UINTN EventIndex; UINTN EventIndex;
FASTBOOT_TCP_PACKET_LIST *Entry; FASTBOOT_TCP_PACKET_LIST *Entry;
FASTBOOT_TCP_PACKET_LIST *NextEntry; FASTBOOT_TCP_PACKET_LIST *NextEntry;
// Close any existing TCP connection, blocking until it's done. // Close any existing TCP connection, blocking until it's done.
if (mTcpConnection != NULL) { if (mTcpConnection != NULL) {
@ -494,7 +504,6 @@ TcpFastbootTransportStop (
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
gBS->CloseEvent (mAcceptToken.CompletionToken.Event); gBS->CloseEvent (mAcceptToken.CompletionToken.Event);
// Stop listening for connections. // Stop listening for connections.
@ -506,14 +515,15 @@ TcpFastbootTransportStop (
Status = mTcpServiceBinding->DestroyChild (mTcpServiceBinding, mTcpHandle); Status = mTcpServiceBinding->DestroyChild (mTcpServiceBinding, mTcpHandle);
// Free any data the user didn't pick up // Free any data the user didn't pick up
Entry = (FASTBOOT_TCP_PACKET_LIST *) GetFirstNode (&mPacketListHead); Entry = (FASTBOOT_TCP_PACKET_LIST *)GetFirstNode (&mPacketListHead);
while (!IsNull (&mPacketListHead, &Entry->Link)) { while (!IsNull (&mPacketListHead, &Entry->Link)) {
NextEntry = (FASTBOOT_TCP_PACKET_LIST *) GetNextNode (&mPacketListHead, &Entry->Link); NextEntry = (FASTBOOT_TCP_PACKET_LIST *)GetNextNode (&mPacketListHead, &Entry->Link);
RemoveEntryList (&Entry->Link); RemoveEntryList (&Entry->Link);
if (Entry->Buffer) { if (Entry->Buffer) {
FreePool (Entry->Buffer); FreePool (Entry->Buffer);
} }
FreePool (Entry); FreePool (Entry);
Entry = NextEntry; Entry = NextEntry;
@ -531,16 +541,16 @@ TcpFastbootTransportStop (
STATIC STATIC
VOID VOID
DataSent ( DataSent (
EFI_EVENT Event, EFI_EVENT Event,
VOID *Context VOID *Context
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = mTransmitToken.CompletionToken.Status; Status = mTransmitToken.CompletionToken.Status;
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "TCP Fastboot transmit result: %r\n", Status)); DEBUG ((DEBUG_ERROR, "TCP Fastboot transmit result: %r\n", Status));
gBS->SignalEvent (*(EFI_EVENT *) Context); gBS->SignalEvent (*(EFI_EVENT *)Context);
} }
FreePool (mTransmitToken.Packet.TxData->FragmentTable[0].FragmentBuffer); FreePool (mTransmitToken.Packet.TxData->FragmentTable[0].FragmentBuffer);
@ -549,11 +559,11 @@ DataSent (
EFI_STATUS EFI_STATUS
TcpFastbootTransportSend ( TcpFastbootTransportSend (
IN UINTN BufferSize, IN UINTN BufferSize,
IN CONST VOID *Buffer, IN CONST VOID *Buffer,
IN EFI_EVENT *FatalErrorEvent IN EFI_EVENT *FatalErrorEvent
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
if (BufferSize > 512) { if (BufferSize > 512) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -578,9 +588,9 @@ TcpFastbootTransportSend (
mTxData.FragmentTable[0].FragmentLength = BufferSize; mTxData.FragmentTable[0].FragmentLength = BufferSize;
mTxData.FragmentTable[0].FragmentBuffer = AllocateCopyPool ( mTxData.FragmentTable[0].FragmentBuffer = AllocateCopyPool (
BufferSize, BufferSize,
Buffer Buffer
); );
Status = mTcpConnection->Transmit (mTcpConnection, &mTransmitToken); Status = mTcpConnection->Transmit (mTcpConnection, &mTransmitToken);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -591,27 +601,26 @@ TcpFastbootTransportSend (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
TcpFastbootTransportReceive ( TcpFastbootTransportReceive (
OUT UINTN *BufferSize, OUT UINTN *BufferSize,
OUT VOID **Buffer OUT VOID **Buffer
) )
{ {
FASTBOOT_TCP_PACKET_LIST *Entry; FASTBOOT_TCP_PACKET_LIST *Entry;
if (IsListEmpty (&mPacketListHead)) { if (IsListEmpty (&mPacketListHead)) {
return EFI_NOT_READY; return EFI_NOT_READY;
} }
Entry = (FASTBOOT_TCP_PACKET_LIST *) GetFirstNode (&mPacketListHead); Entry = (FASTBOOT_TCP_PACKET_LIST *)GetFirstNode (&mPacketListHead);
if (Entry->Buffer == NULL) { if (Entry->Buffer == NULL) {
// There was an error receiving this packet. // There was an error receiving this packet.
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
*Buffer = Entry->Buffer; *Buffer = Entry->Buffer;
*BufferSize = Entry->BufferSize; *BufferSize = Entry->BufferSize;
RemoveEntryList (&Entry->Link); RemoveEntryList (&Entry->Link);
@ -620,7 +629,7 @@ TcpFastbootTransportReceive (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
FASTBOOT_TRANSPORT_PROTOCOL mTransportProtocol = { FASTBOOT_TRANSPORT_PROTOCOL mTransportProtocol = {
TcpFastbootTransportStart, TcpFastbootTransportStart,
TcpFastbootTransportStop, TcpFastbootTransportStop,
TcpFastbootTransportSend, TcpFastbootTransportSend,
@ -630,17 +639,16 @@ FASTBOOT_TRANSPORT_PROTOCOL mTransportProtocol = {
EFI_STATUS EFI_STATUS
TcpFastbootTransportEntryPoint ( TcpFastbootTransportEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = gBS->LocateProtocol (
Status = gBS->LocateProtocol( &gEfiSimpleTextOutProtocolGuid,
&gEfiSimpleTextOutProtocolGuid, NULL,
NULL, (VOID **)&mTextOut
(VOID **) &mTextOut );
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Fastboot: Open Text Output Protocol: %r\n", Status)); DEBUG ((DEBUG_ERROR, "Fastboot: Open Text Output Protocol: %r\n", Status));
return Status; return Status;

View File

@ -21,45 +21,44 @@
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiDriverEntryPoint.h> #include <Library/UefiDriverEntryPoint.h>
STATIC USB_DEVICE_PROTOCOL *mUsbDevice; STATIC USB_DEVICE_PROTOCOL *mUsbDevice;
// Configuration attributes: // Configuration attributes:
// bit 7 reserved and must be 1, bit 6 means self-powered. // bit 7 reserved and must be 1, bit 6 means self-powered.
#define CONFIG_DESC_ATTRIBUTES (BIT7 | BIT6) #define CONFIG_DESC_ATTRIBUTES (BIT7 | BIT6)
#define MAX_PACKET_SIZE_BULK 512 #define MAX_PACKET_SIZE_BULK 512
STATIC USB_DEVICE_PROTOCOL *mUsbDevice; STATIC USB_DEVICE_PROTOCOL *mUsbDevice;
STATIC EFI_EVENT mReceiveEvent = NULL; STATIC EFI_EVENT mReceiveEvent = NULL;
STATIC LIST_ENTRY mPacketList; STATIC LIST_ENTRY mPacketList;
// List type for queued received packets // List type for queued received packets
typedef struct _FASTBOOT_USB_PACKET_LIST { typedef struct _FASTBOOT_USB_PACKET_LIST {
LIST_ENTRY Link; LIST_ENTRY Link;
VOID *Buffer; VOID *Buffer;
UINTN BufferSize; UINTN BufferSize;
} FASTBOOT_USB_PACKET_LIST; } FASTBOOT_USB_PACKET_LIST;
/* /*
No string descriptors - all string descriptor members are set to 0 No string descriptors - all string descriptor members are set to 0
*/ */
STATIC USB_DEVICE_DESCRIPTOR mDeviceDescriptor = { STATIC USB_DEVICE_DESCRIPTOR mDeviceDescriptor = {
sizeof (USB_DEVICE_DESCRIPTOR), //Length sizeof (USB_DEVICE_DESCRIPTOR), // Length
USB_DESC_TYPE_DEVICE, //DescriptorType USB_DESC_TYPE_DEVICE, // DescriptorType
0x0200, //BcdUSB 0x0200, // BcdUSB
0xFF, //DeviceClass 0xFF, // DeviceClass
0, //DeviceSubClass 0, // DeviceSubClass
0, //DeviceProtocol 0, // DeviceProtocol
64, //MaxPacketSize0 64, // MaxPacketSize0
FixedPcdGet32 (PcdAndroidFastbootUsbVendorId), //IdVendor FixedPcdGet32 (PcdAndroidFastbootUsbVendorId), // IdVendor
FixedPcdGet32 (PcdAndroidFastbootUsbProductId), //IdProduct FixedPcdGet32 (PcdAndroidFastbootUsbProductId), // IdProduct
0, //BcdDevice 0, // BcdDevice
0, //StrManufacturer 0, // StrManufacturer
0, //StrProduct 0, // StrProduct
0, //StrSerialNumber 0, // StrSerialNumber
1 //NumConfigurations 1 // NumConfigurations
}; };
/* /*
@ -71,69 +70,69 @@ STATIC USB_DEVICE_DESCRIPTOR mDeviceDescriptor = {
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
USB_CONFIG_DESCRIPTOR ConfigDescriptor; USB_CONFIG_DESCRIPTOR ConfigDescriptor;
USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
USB_ENDPOINT_DESCRIPTOR EndpointDescriptor1; USB_ENDPOINT_DESCRIPTOR EndpointDescriptor1;
USB_ENDPOINT_DESCRIPTOR EndpointDescriptor2; USB_ENDPOINT_DESCRIPTOR EndpointDescriptor2;
} GET_CONFIG_DESCRIPTOR_RESPONSE; } GET_CONFIG_DESCRIPTOR_RESPONSE;
#pragma pack() #pragma pack()
STATIC GET_CONFIG_DESCRIPTOR_RESPONSE mGetConfigDescriptorResponse = { STATIC GET_CONFIG_DESCRIPTOR_RESPONSE mGetConfigDescriptorResponse = {
{ // USB_CONFIG_DESCRIPTOR { // USB_CONFIG_DESCRIPTOR
sizeof (USB_CONFIG_DESCRIPTOR), //Length; sizeof (USB_CONFIG_DESCRIPTOR), // Length;
USB_DESC_TYPE_CONFIG, //DescriptorType; USB_DESC_TYPE_CONFIG, // DescriptorType;
sizeof (GET_CONFIG_DESCRIPTOR_RESPONSE), //TotalLength; sizeof (GET_CONFIG_DESCRIPTOR_RESPONSE), // TotalLength;
1, //NumInterfaces; 1, // NumInterfaces;
1, //ConfigurationValue; 1, // ConfigurationValue;
0, //Configuration; 0, // Configuration;
CONFIG_DESC_ATTRIBUTES, //Attributes; CONFIG_DESC_ATTRIBUTES, // Attributes;
0 //MaxPower; 0 // MaxPower;
}, },
{ // USB_INTERFACE_DESCRIPTOR { // USB_INTERFACE_DESCRIPTOR
sizeof (USB_INTERFACE_DESCRIPTOR), //Length; sizeof (USB_INTERFACE_DESCRIPTOR), // Length;
USB_DESC_TYPE_INTERFACE, //DescriptorType; USB_DESC_TYPE_INTERFACE, // DescriptorType;
0, //InterfaceNumber; 0, // InterfaceNumber;
0, //AlternateSetting; 0, // AlternateSetting;
2, //NumEndpoints; 2, // NumEndpoints;
0xFF, //InterfaceClass; 0xFF, // InterfaceClass;
// Vendor specific interface subclass and protocol codes. // Vendor specific interface subclass and protocol codes.
// I found these values in the Fastboot code // I found these values in the Fastboot code
// (in match_fastboot_with_serial in fastboot.c). // (in match_fastboot_with_serial in fastboot.c).
0x42, //InterfaceSubClass; 0x42, // InterfaceSubClass;
0x03, //InterfaceProtocol; 0x03, // InterfaceProtocol;
0 //Interface; 0 // Interface;
}, },
{ // USB_ENDPOINT_DESCRIPTOR (In Endpoint) { // USB_ENDPOINT_DESCRIPTOR (In Endpoint)
sizeof (USB_ENDPOINT_DESCRIPTOR), //Length; sizeof (USB_ENDPOINT_DESCRIPTOR), // Length;
USB_DESC_TYPE_ENDPOINT, //DescriptorType; USB_DESC_TYPE_ENDPOINT, // DescriptorType;
1 | BIT7, //EndpointAddress; 1 | BIT7, // EndpointAddress;
0x2, //Attributes; 0x2, // Attributes;
MAX_PACKET_SIZE_BULK, //MaxPacketSize; MAX_PACKET_SIZE_BULK, // MaxPacketSize;
16 //Interval; 16 // Interval;
}, },
{ // STATIC USB_ENDPOINT_DESCRIPTOR (Out Endpoint) { // STATIC USB_ENDPOINT_DESCRIPTOR (Out Endpoint)
sizeof (USB_ENDPOINT_DESCRIPTOR), //Length; sizeof (USB_ENDPOINT_DESCRIPTOR), // Length;
USB_DESC_TYPE_ENDPOINT, //DescriptorType; USB_DESC_TYPE_ENDPOINT, // DescriptorType;
1, //EndpointAddress; 1, // EndpointAddress;
0x2, //Attributes; 0x2, // Attributes;
MAX_PACKET_SIZE_BULK, //MaxPacketSize; MAX_PACKET_SIZE_BULK, // MaxPacketSize;
16 //Interval; 16 // Interval;
} }
}; };
STATIC STATIC
VOID VOID
DataReceived ( DataReceived (
IN UINTN Size, IN UINTN Size,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
FASTBOOT_USB_PACKET_LIST *NewEntry; FASTBOOT_USB_PACKET_LIST *NewEntry;
NewEntry = AllocatePool (sizeof (*NewEntry)); NewEntry = AllocatePool (sizeof (*NewEntry));
ASSERT (NewEntry != NULL); ASSERT (NewEntry != NULL);
NewEntry->Buffer = Buffer; NewEntry->Buffer = Buffer;
NewEntry->BufferSize = Size; NewEntry->BufferSize = Size;
InsertTailList (&mPacketList, &NewEntry->Link); InsertTailList (&mPacketList, &NewEntry->Link);
@ -146,7 +145,7 @@ DataReceived (
STATIC STATIC
VOID VOID
DataSent ( DataSent (
IN UINT8 EndpointIndex IN UINT8 EndpointIndex
) )
{ {
// Don't care. // Don't care.
@ -158,7 +157,7 @@ DataSent (
*/ */
EFI_STATUS EFI_STATUS
FastbootTransportUsbStart ( FastbootTransportUsbStart (
EFI_EVENT ReceiveEvent EFI_EVENT ReceiveEvent
) )
{ {
GET_CONFIG_DESCRIPTOR_RESPONSE *Responses; GET_CONFIG_DESCRIPTOR_RESPONSE *Responses;
@ -166,11 +165,11 @@ FastbootTransportUsbStart (
mReceiveEvent = ReceiveEvent; mReceiveEvent = ReceiveEvent;
mGetConfigDescriptorResponse.ConfigDescriptor.TotalLength = sizeof (GET_CONFIG_DESCRIPTOR_RESPONSE); mGetConfigDescriptorResponse.ConfigDescriptor.TotalLength = sizeof (GET_CONFIG_DESCRIPTOR_RESPONSE);
Responses = &mGetConfigDescriptorResponse; Responses = &mGetConfigDescriptorResponse;
InitializeListHead (&mPacketList); InitializeListHead (&mPacketList);
return mUsbDevice->Start (&mDeviceDescriptor, (VOID **) &Responses, DataReceived, DataSent); return mUsbDevice->Start (&mDeviceDescriptor, (VOID **)&Responses, DataReceived, DataSent);
} }
/* /*
@ -196,12 +195,12 @@ FastbootTransportUsbStop (
EFI_STATUS EFI_STATUS
FastbootTransportUsbSend ( FastbootTransportUsbSend (
IN UINTN BufferSize, IN UINTN BufferSize,
IN CONST VOID *Buffer, IN CONST VOID *Buffer,
IN EFI_EVENT *FatalErrorEvent IN EFI_EVENT *FatalErrorEvent
) )
{ {
// Current USB protocol is blocking, so ignore FatalErrorEvent // Current USB protocol is blocking, so ignore FatalErrorEvent
return mUsbDevice->Send(1, BufferSize, Buffer); return mUsbDevice->Send (1, BufferSize, Buffer);
} }
/* /*
@ -221,19 +220,19 @@ FastbootTransportUsbSend (
EFI_STATUS EFI_STATUS
FastbootTransportUsbReceive ( FastbootTransportUsbReceive (
OUT UINTN *BufferSize, OUT UINTN *BufferSize,
OUT VOID **Buffer OUT VOID **Buffer
) )
{ {
FASTBOOT_USB_PACKET_LIST *Entry; FASTBOOT_USB_PACKET_LIST *Entry;
if (IsListEmpty (&mPacketList)) { if (IsListEmpty (&mPacketList)) {
return EFI_NOT_READY; return EFI_NOT_READY;
} }
Entry = (FASTBOOT_USB_PACKET_LIST *) GetFirstNode (&mPacketList); Entry = (FASTBOOT_USB_PACKET_LIST *)GetFirstNode (&mPacketList);
*BufferSize = Entry->BufferSize; *BufferSize = Entry->BufferSize;
*Buffer = Entry->Buffer; *Buffer = Entry->Buffer;
RemoveEntryList (&Entry->Link); RemoveEntryList (&Entry->Link);
FreePool (Entry); FreePool (Entry);
@ -241,7 +240,7 @@ FastbootTransportUsbReceive (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
STATIC FASTBOOT_TRANSPORT_PROTOCOL mTransportProtocol = { STATIC FASTBOOT_TRANSPORT_PROTOCOL mTransportProtocol = {
FastbootTransportUsbStart, FastbootTransportUsbStart,
FastbootTransportUsbStop, FastbootTransportUsbStop,
FastbootTransportUsbSend, FastbootTransportUsbSend,
@ -251,13 +250,13 @@ STATIC FASTBOOT_TRANSPORT_PROTOCOL mTransportProtocol = {
EFI_STATUS EFI_STATUS
FastbootTransportUsbEntryPoint ( FastbootTransportUsbEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// Assume there's only one USB peripheral controller. // Assume there's only one USB peripheral controller.
Status = gBS->LocateProtocol (&gUsbDeviceProtocolGuid, NULL, (VOID **) &mUsbDevice); Status = gBS->LocateProtocol (&gUsbDeviceProtocolGuid, NULL, (VOID **)&mUsbDevice);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }

View File

@ -24,24 +24,24 @@
#include "ConsolePrefDxe.h" #include "ConsolePrefDxe.h"
#define SPCR_SIG EFI_ACPI_2_0_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE #define SPCR_SIG EFI_ACPI_2_0_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE
extern UINT8 ConsolePrefHiiBin[]; extern UINT8 ConsolePrefHiiBin[];
extern UINT8 ConsolePrefDxeStrings[]; extern UINT8 ConsolePrefDxeStrings[];
typedef struct { typedef struct {
VENDOR_DEVICE_PATH VendorDevicePath; VENDOR_DEVICE_PATH VendorDevicePath;
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
} HII_VENDOR_DEVICE_PATH; } HII_VENDOR_DEVICE_PATH;
STATIC HII_VENDOR_DEVICE_PATH mConsolePrefDxeVendorDevicePath = { STATIC HII_VENDOR_DEVICE_PATH mConsolePrefDxeVendorDevicePath = {
{ {
{ {
HARDWARE_DEVICE_PATH, HARDWARE_DEVICE_PATH,
HW_VENDOR_DP, HW_VENDOR_DP,
{ {
(UINT8) (sizeof (VENDOR_DEVICE_PATH)), (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
} }
}, },
CONSOLE_PREF_FORMSET_GUID CONSOLE_PREF_FORMSET_GUID
@ -50,13 +50,13 @@ STATIC HII_VENDOR_DEVICE_PATH mConsolePrefDxeVendorDevicePath = {
END_DEVICE_PATH_TYPE, END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ {
(UINT8) (END_DEVICE_PATH_LENGTH), (UINT8)(END_DEVICE_PATH_LENGTH),
(UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
} }
} }
}; };
STATIC EFI_EVENT mReadyToBootEvent; STATIC EFI_EVENT mReadyToBootEvent;
STATIC STATIC
EFI_STATUS EFI_STATUS
@ -64,32 +64,39 @@ InstallHiiPages (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HII_HANDLE HiiHandle; EFI_HII_HANDLE HiiHandle;
EFI_HANDLE DriverHandle; EFI_HANDLE DriverHandle;
DriverHandle = NULL; DriverHandle = NULL;
Status = gBS->InstallMultipleProtocolInterfaces (&DriverHandle, Status = gBS->InstallMultipleProtocolInterfaces (
&gEfiDevicePathProtocolGuid, &DriverHandle,
&mConsolePrefDxeVendorDevicePath, &gEfiDevicePathProtocolGuid,
NULL); &mConsolePrefDxeVendorDevicePath,
NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
HiiHandle = HiiAddPackages (&gConsolePrefFormSetGuid, HiiHandle = HiiAddPackages (
DriverHandle, &gConsolePrefFormSetGuid,
ConsolePrefDxeStrings, DriverHandle,
ConsolePrefHiiBin, ConsolePrefDxeStrings,
NULL); ConsolePrefHiiBin,
NULL
);
if (HiiHandle == NULL) { if (HiiHandle == NULL) {
gBS->UninstallMultipleProtocolInterfaces (DriverHandle, gBS->UninstallMultipleProtocolInterfaces (
DriverHandle,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
&mConsolePrefDxeVendorDevicePath, &mConsolePrefDxeVendorDevicePath,
NULL); NULL
);
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -97,7 +104,7 @@ STATIC
VOID VOID
RemoveDtStdoutPath ( RemoveDtStdoutPath (
VOID VOID
) )
{ {
VOID *Dtb; VOID *Dtb;
INT32 Node; INT32 Node;
@ -106,8 +113,12 @@ RemoveDtStdoutPath (
Status = EfiGetSystemConfigurationTable (&gFdtTableGuid, &Dtb); Status = EfiGetSystemConfigurationTable (&gFdtTableGuid, &Dtb);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, "%a: could not retrieve DT blob - %r\n", __FUNCTION__, DEBUG ((
Status)); DEBUG_INFO,
"%a: could not retrieve DT blob - %r\n",
__FUNCTION__,
Status
));
return; return;
} }
@ -118,8 +129,12 @@ RemoveDtStdoutPath (
Error = fdt_delprop (Dtb, Node, "stdout-path"); Error = fdt_delprop (Dtb, Node, "stdout-path");
if (Error) { if (Error) {
DEBUG ((DEBUG_INFO, "%a: Failed to delete 'stdout-path' property: %a\n", DEBUG ((
__FUNCTION__, fdt_strerror (Error))); DEBUG_INFO,
"%a: Failed to delete 'stdout-path' property: %a\n",
__FUNCTION__,
fdt_strerror (Error)
));
} }
} }
@ -129,16 +144,19 @@ RemoveSpcrTable (
VOID VOID
) )
{ {
EFI_ACPI_SDT_PROTOCOL *Sdt; EFI_ACPI_SDT_PROTOCOL *Sdt;
EFI_ACPI_TABLE_PROTOCOL *AcpiTable; EFI_ACPI_TABLE_PROTOCOL *AcpiTable;
EFI_STATUS Status; EFI_STATUS Status;
UINTN TableIndex; UINTN TableIndex;
EFI_ACPI_SDT_HEADER *TableHeader; EFI_ACPI_SDT_HEADER *TableHeader;
EFI_ACPI_TABLE_VERSION TableVersion; EFI_ACPI_TABLE_VERSION TableVersion;
UINTN TableKey; UINTN TableKey;
Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **)&AcpiTable); &gEfiAcpiTableProtocolGuid,
NULL,
(VOID **)&AcpiTable
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return; return;
} }
@ -153,8 +171,12 @@ RemoveSpcrTable (
TableHeader = NULL; TableHeader = NULL;
do { do {
Status = Sdt->GetAcpiTable (TableIndex++, &TableHeader, &TableVersion, Status = Sdt->GetAcpiTable (
&TableKey); TableIndex++,
&TableHeader,
&TableVersion,
&TableKey
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
break; break;
} }
@ -165,9 +187,14 @@ RemoveSpcrTable (
Status = AcpiTable->UninstallAcpiTable (AcpiTable, TableKey); Status = AcpiTable->UninstallAcpiTable (AcpiTable, TableKey);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: failed to uninstall SPCR table - %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_WARN,
"%a: failed to uninstall SPCR table - %r\n",
__FUNCTION__,
Status
));
} }
break; break;
} while (TRUE); } while (TRUE);
} }
@ -180,24 +207,35 @@ OnReadyToBoot (
IN VOID *Context IN VOID *Context
) )
{ {
CONSOLE_PREF_VARSTORE_DATA ConsolePref; CONSOLE_PREF_VARSTORE_DATA ConsolePref;
UINTN BufferSize; UINTN BufferSize;
EFI_STATUS Status; EFI_STATUS Status;
VOID *Gop; VOID *Gop;
BufferSize = sizeof (ConsolePref); BufferSize = sizeof (ConsolePref);
Status = gRT->GetVariable (CONSOLE_PREF_VARIABLE_NAME, Status = gRT->GetVariable (
&gConsolePrefFormSetGuid, NULL, &BufferSize, &ConsolePref); CONSOLE_PREF_VARIABLE_NAME,
&gConsolePrefFormSetGuid,
NULL,
&BufferSize,
&ConsolePref
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
"%a: variable '%s' could not be read - bailing!\n", __FUNCTION__, DEBUG_ERROR,
CONSOLE_PREF_VARIABLE_NAME)); "%a: variable '%s' could not be read - bailing!\n",
__FUNCTION__,
CONSOLE_PREF_VARIABLE_NAME
));
return; return;
} }
if (ConsolePref.Console == CONSOLE_PREF_SERIAL) { if (ConsolePref.Console == CONSOLE_PREF_SERIAL) {
DEBUG ((DEBUG_INFO, DEBUG ((
"%a: serial console preferred - doing nothing\n", __FUNCTION__)); DEBUG_INFO,
"%a: serial console preferred - doing nothing\n",
__FUNCTION__
));
return; return;
} }
@ -206,9 +244,12 @@ OnReadyToBoot (
// //
Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, &Gop); Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, &Gop);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, DEBUG ((
"%a: no GOP instances found - doing nothing (%r)\n", __FUNCTION__, DEBUG_INFO,
Status)); "%a: no GOP instances found - doing nothing (%r)\n",
__FUNCTION__,
Status
));
return; return;
} }
@ -232,34 +273,46 @@ OnReadyToBoot (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ConsolePrefDxeEntryPoint ( ConsolePrefDxeEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
CONSOLE_PREF_VARSTORE_DATA ConsolePref; CONSOLE_PREF_VARSTORE_DATA ConsolePref;
UINTN BufferSize; UINTN BufferSize;
// //
// Get the current console preference from the ConsolePref variable. // Get the current console preference from the ConsolePref variable.
// //
BufferSize = sizeof (ConsolePref); BufferSize = sizeof (ConsolePref);
Status = gRT->GetVariable (CONSOLE_PREF_VARIABLE_NAME, Status = gRT->GetVariable (
&gConsolePrefFormSetGuid, NULL, &BufferSize, &ConsolePref); CONSOLE_PREF_VARIABLE_NAME,
&gConsolePrefFormSetGuid,
NULL,
&BufferSize,
&ConsolePref
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, DEBUG ((
DEBUG_INFO,
"%a: no console preference found, defaulting to graphical\n", "%a: no console preference found, defaulting to graphical\n",
__FUNCTION__)); __FUNCTION__
));
ConsolePref.Console = CONSOLE_PREF_GRAPHICAL; ConsolePref.Console = CONSOLE_PREF_GRAPHICAL;
} }
if (!EFI_ERROR (Status) && if (!EFI_ERROR (Status) &&
ConsolePref.Console != CONSOLE_PREF_GRAPHICAL && (ConsolePref.Console != CONSOLE_PREF_GRAPHICAL) &&
ConsolePref.Console != CONSOLE_PREF_SERIAL) { (ConsolePref.Console != CONSOLE_PREF_SERIAL))
DEBUG ((DEBUG_WARN, "%a: invalid value for %s, defaulting to graphical\n", {
__FUNCTION__, CONSOLE_PREF_VARIABLE_NAME)); DEBUG ((
DEBUG_WARN,
"%a: invalid value for %s, defaulting to graphical\n",
__FUNCTION__,
CONSOLE_PREF_VARIABLE_NAME
));
ConsolePref.Console = CONSOLE_PREF_GRAPHICAL; ConsolePref.Console = CONSOLE_PREF_GRAPHICAL;
Status = EFI_INVALID_PARAMETER; // trigger setvar below Status = EFI_INVALID_PARAMETER; // trigger setvar below
} }
// //
@ -267,21 +320,33 @@ ConsolePrefDxeEntryPoint (
// //
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
ZeroMem (&ConsolePref.Reserved, sizeof (ConsolePref.Reserved)); ZeroMem (&ConsolePref.Reserved, sizeof (ConsolePref.Reserved));
Status = gRT->SetVariable (CONSOLE_PREF_VARIABLE_NAME, Status = gRT->SetVariable (
CONSOLE_PREF_VARIABLE_NAME,
&gConsolePrefFormSetGuid, &gConsolePrefFormSetGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
sizeof (ConsolePref), &ConsolePref); sizeof (ConsolePref),
&ConsolePref
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: gRT->SetVariable () failed - %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_ERROR,
"%a: gRT->SetVariable () failed - %r\n",
__FUNCTION__,
Status
));
return Status; return Status;
} }
} }
Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, Status = gBS->CreateEventEx (
OnReadyToBoot, NULL, &gEfiEventReadyToBootGuid, EVT_NOTIFY_SIGNAL,
&mReadyToBootEvent); TPL_CALLBACK,
OnReadyToBoot,
NULL,
&gEfiEventReadyToBootGuid,
&mReadyToBootEvent
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return InstallHiiPages (); return InstallHiiPages ();

View File

@ -12,14 +12,14 @@
#include <Guid/HiiPlatformSetupFormset.h> #include <Guid/HiiPlatformSetupFormset.h>
#include <Guid/ConsolePrefFormSet.h> #include <Guid/ConsolePrefFormSet.h>
#define CONSOLE_PREF_GRAPHICAL 0x0 #define CONSOLE_PREF_GRAPHICAL 0x0
#define CONSOLE_PREF_SERIAL 0x1 #define CONSOLE_PREF_SERIAL 0x1
#define CONSOLE_PREF_VARIABLE_NAME L"ConsolePref" #define CONSOLE_PREF_VARIABLE_NAME L"ConsolePref"
typedef struct { typedef struct {
UINT8 Console; UINT8 Console;
UINT8 Reserved[3]; UINT8 Reserved[3];
} CONSOLE_PREF_VARSTORE_DATA; } CONSOLE_PREF_VARSTORE_DATA;
#endif #endif

View File

@ -18,22 +18,22 @@
#include "DtPlatformDxe.h" #include "DtPlatformDxe.h"
extern UINT8 DtPlatformHiiBin[]; extern UINT8 DtPlatformHiiBin[];
extern UINT8 DtPlatformDxeStrings[]; extern UINT8 DtPlatformDxeStrings[];
typedef struct { typedef struct {
VENDOR_DEVICE_PATH VendorDevicePath; VENDOR_DEVICE_PATH VendorDevicePath;
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
} HII_VENDOR_DEVICE_PATH; } HII_VENDOR_DEVICE_PATH;
STATIC HII_VENDOR_DEVICE_PATH mDtPlatformDxeVendorDevicePath = { STATIC HII_VENDOR_DEVICE_PATH mDtPlatformDxeVendorDevicePath = {
{ {
{ {
HARDWARE_DEVICE_PATH, HARDWARE_DEVICE_PATH,
HW_VENDOR_DP, HW_VENDOR_DP,
{ {
(UINT8) (sizeof (VENDOR_DEVICE_PATH)), (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
} }
}, },
DT_PLATFORM_FORMSET_GUID DT_PLATFORM_FORMSET_GUID
@ -42,8 +42,8 @@ STATIC HII_VENDOR_DEVICE_PATH mDtPlatformDxeVendorDevicePath = {
END_DEVICE_PATH_TYPE, END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ {
(UINT8) (END_DEVICE_PATH_LENGTH), (UINT8)(END_DEVICE_PATH_LENGTH),
(UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
} }
} }
}; };
@ -54,32 +54,39 @@ InstallHiiPages (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HII_HANDLE HiiHandle; EFI_HII_HANDLE HiiHandle;
EFI_HANDLE DriverHandle; EFI_HANDLE DriverHandle;
DriverHandle = NULL; DriverHandle = NULL;
Status = gBS->InstallMultipleProtocolInterfaces (&DriverHandle, Status = gBS->InstallMultipleProtocolInterfaces (
&gEfiDevicePathProtocolGuid, &DriverHandle,
&mDtPlatformDxeVendorDevicePath, &gEfiDevicePathProtocolGuid,
NULL); &mDtPlatformDxeVendorDevicePath,
NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
HiiHandle = HiiAddPackages (&gDtPlatformFormSetGuid, HiiHandle = HiiAddPackages (
DriverHandle, &gDtPlatformFormSetGuid,
DtPlatformDxeStrings, DriverHandle,
DtPlatformHiiBin, DtPlatformDxeStrings,
NULL); DtPlatformHiiBin,
NULL
);
if (HiiHandle == NULL) { if (HiiHandle == NULL) {
gBS->UninstallMultipleProtocolInterfaces (DriverHandle, gBS->UninstallMultipleProtocolInterfaces (
&gEfiDevicePathProtocolGuid, DriverHandle,
&mDtPlatformDxeVendorDevicePath, &gEfiDevicePathProtocolGuid,
NULL); &mDtPlatformDxeVendorDevicePath,
NULL
);
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -99,44 +106,61 @@ InstallHiiPages (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DtPlatformDxeEntryPoint ( DtPlatformDxeEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
DT_ACPI_VARSTORE_DATA DtAcpiPref; DT_ACPI_VARSTORE_DATA DtAcpiPref;
UINTN BufferSize; UINTN BufferSize;
VOID *Dtb; VOID *Dtb;
UINTN DtbSize; UINTN DtbSize;
Dtb = NULL; Dtb = NULL;
Status = DtPlatformLoadDtb (&Dtb, &DtbSize); Status = DtPlatformLoadDtb (&Dtb, &DtbSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, DEBUG ((
DEBUG_WARN,
"%a: no DTB blob could be loaded, defaulting to ACPI (Status == %r)\n", "%a: no DTB blob could be loaded, defaulting to ACPI (Status == %r)\n",
__FUNCTION__, Status)); __FUNCTION__,
Status
));
DtAcpiPref.Pref = DT_ACPI_SELECT_ACPI; DtAcpiPref.Pref = DT_ACPI_SELECT_ACPI;
} else { } else {
// //
// Get the current DT/ACPI preference from the DtAcpiPref variable. // Get the current DT/ACPI preference from the DtAcpiPref variable.
// //
BufferSize = sizeof (DtAcpiPref); BufferSize = sizeof (DtAcpiPref);
Status = gRT->GetVariable(DT_ACPI_VARIABLE_NAME, &gDtPlatformFormSetGuid, Status = gRT->GetVariable (
NULL, &BufferSize, &DtAcpiPref); DT_ACPI_VARIABLE_NAME,
&gDtPlatformFormSetGuid,
NULL,
&BufferSize,
&DtAcpiPref
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: no DT/ACPI preference found, defaulting to %a\n", DEBUG ((
__FUNCTION__, PcdGetBool (PcdDefaultDtPref) ? "DT" : "ACPI")); DEBUG_WARN,
"%a: no DT/ACPI preference found, defaulting to %a\n",
__FUNCTION__,
PcdGetBool (PcdDefaultDtPref) ? "DT" : "ACPI"
));
DtAcpiPref.Pref = PcdGetBool (PcdDefaultDtPref) ? DT_ACPI_SELECT_DT DtAcpiPref.Pref = PcdGetBool (PcdDefaultDtPref) ? DT_ACPI_SELECT_DT
: DT_ACPI_SELECT_ACPI; : DT_ACPI_SELECT_ACPI;
} }
} }
if (!EFI_ERROR (Status) && if (!EFI_ERROR (Status) &&
DtAcpiPref.Pref != DT_ACPI_SELECT_ACPI && (DtAcpiPref.Pref != DT_ACPI_SELECT_ACPI) &&
DtAcpiPref.Pref != DT_ACPI_SELECT_DT) { (DtAcpiPref.Pref != DT_ACPI_SELECT_DT))
DEBUG ((DEBUG_WARN, "%a: invalid value for %s, defaulting to %a\n", {
__FUNCTION__, DT_ACPI_VARIABLE_NAME, DEBUG ((
PcdGetBool (PcdDefaultDtPref) ? "DT" : "ACPI")); DEBUG_WARN,
"%a: invalid value for %s, defaulting to %a\n",
__FUNCTION__,
DT_ACPI_VARIABLE_NAME,
PcdGetBool (PcdDefaultDtPref) ? "DT" : "ACPI"
));
DtAcpiPref.Pref = PcdGetBool (PcdDefaultDtPref) ? DT_ACPI_SELECT_DT DtAcpiPref.Pref = PcdGetBool (PcdDefaultDtPref) ? DT_ACPI_SELECT_DT
: DT_ACPI_SELECT_ACPI; : DT_ACPI_SELECT_ACPI;
Status = EFI_INVALID_PARAMETER; // trigger setvar below Status = EFI_INVALID_PARAMETER; // trigger setvar below
@ -146,9 +170,13 @@ DtPlatformDxeEntryPoint (
// Write the newly selected default value back to the variable store. // Write the newly selected default value back to the variable store.
// //
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = gRT->SetVariable(DT_ACPI_VARIABLE_NAME, &gDtPlatformFormSetGuid, Status = gRT->SetVariable (
DT_ACPI_VARIABLE_NAME,
&gDtPlatformFormSetGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
sizeof (DtAcpiPref), &DtAcpiPref); sizeof (DtAcpiPref),
&DtAcpiPref
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreeDtb; goto FreeDtb;
} }
@ -159,12 +187,18 @@ DtPlatformDxeEntryPoint (
// ACPI was selected: install the gEdkiiPlatformHasAcpiGuid GUID as a // ACPI was selected: install the gEdkiiPlatformHasAcpiGuid GUID as a
// NULL protocol to unlock dispatch of ACPI related drivers. // NULL protocol to unlock dispatch of ACPI related drivers.
// //
Status = gBS->InstallMultipleProtocolInterfaces (&ImageHandle, Status = gBS->InstallMultipleProtocolInterfaces (
&gEdkiiPlatformHasAcpiGuid, NULL, NULL); &ImageHandle,
&gEdkiiPlatformHasAcpiGuid,
NULL,
NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: failed to install gEdkiiPlatformHasAcpiGuid as a protocol\n", "%a: failed to install gEdkiiPlatformHasAcpiGuid as a protocol\n",
__FUNCTION__)); __FUNCTION__
));
goto FreeDtb; goto FreeDtb;
} }
} else if (DtAcpiPref.Pref == DT_ACPI_SELECT_DT) { } else if (DtAcpiPref.Pref == DT_ACPI_SELECT_DT) {
@ -174,8 +208,11 @@ DtPlatformDxeEntryPoint (
// //
Status = gBS->InstallConfigurationTable (&gFdtTableGuid, Dtb); Status = gBS->InstallConfigurationTable (&gFdtTableGuid, Dtb);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: failed to install FDT configuration table\n", DEBUG ((
__FUNCTION__)); DEBUG_ERROR,
"%a: failed to install FDT configuration table\n",
__FUNCTION__
));
goto FreeDtb; goto FreeDtb;
} }
} else { } else {

View File

@ -12,14 +12,14 @@
#include <Guid/HiiPlatformSetupFormset.h> #include <Guid/HiiPlatformSetupFormset.h>
#include <Guid/DtPlatformFormSet.h> #include <Guid/DtPlatformFormSet.h>
#define DT_ACPI_SELECT_DT 0x0 #define DT_ACPI_SELECT_DT 0x0
#define DT_ACPI_SELECT_ACPI 0x1 #define DT_ACPI_SELECT_ACPI 0x1
#define DT_ACPI_VARIABLE_NAME L"DtAcpiPref" #define DT_ACPI_VARIABLE_NAME L"DtAcpiPref"
typedef struct { typedef struct {
UINT8 Pref; UINT8 Pref;
UINT8 Reserved[3]; UINT8 Reserved[3];
} DT_ACPI_VARSTORE_DATA; } DT_ACPI_VARSTORE_DATA;
#endif #endif

View File

@ -26,14 +26,14 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GetNodeProperty ( GetNodeProperty (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN INT32 Node, IN INT32 Node,
IN CONST CHAR8 *PropertyName, IN CONST CHAR8 *PropertyName,
OUT CONST VOID **Prop, OUT CONST VOID **Prop,
OUT UINT32 *PropSize OPTIONAL OUT UINT32 *PropSize OPTIONAL
) )
{ {
INT32 Len; INT32 Len;
ASSERT (mDeviceTreeBase != NULL); ASSERT (mDeviceTreeBase != NULL);
ASSERT (Prop != NULL); ASSERT (Prop != NULL);
@ -46,6 +46,7 @@ GetNodeProperty (
if (PropSize != NULL) { if (PropSize != NULL) {
*PropSize = Len; *PropSize = Len;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -53,14 +54,14 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetNodeProperty ( SetNodeProperty (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN INT32 Node, IN INT32 Node,
IN CONST CHAR8 *PropertyName, IN CONST CHAR8 *PropertyName,
IN CONST VOID *Prop, IN CONST VOID *Prop,
IN UINT32 PropSize IN UINT32 PropSize
) )
{ {
INT32 Ret; INT32 Ret;
ASSERT (mDeviceTreeBase != NULL); ASSERT (mDeviceTreeBase != NULL);
@ -75,11 +76,11 @@ SetNodeProperty (
STATIC STATIC
BOOLEAN BOOLEAN
IsNodeEnabled ( IsNodeEnabled (
INT32 Node INT32 Node
) )
{ {
CONST CHAR8 *NodeStatus; CONST CHAR8 *NodeStatus;
INT32 Len; INT32 Len;
// //
// A missing status property implies 'ok' so ignore any errors that // A missing status property implies 'ok' so ignore any errors that
@ -90,12 +91,15 @@ IsNodeEnabled (
if (NodeStatus == NULL) { if (NodeStatus == NULL) {
return TRUE; return TRUE;
} }
if (Len >= 5 && AsciiStrCmp (NodeStatus, "okay") == 0) {
if ((Len >= 5) && (AsciiStrCmp (NodeStatus, "okay") == 0)) {
return TRUE; return TRUE;
} }
if (Len >= 3 && AsciiStrCmp (NodeStatus, "ok") == 0) {
if ((Len >= 3) && (AsciiStrCmp (NodeStatus, "ok") == 0)) {
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
@ -103,20 +107,20 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FindNextCompatibleNode ( FindNextCompatibleNode (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN CONST CHAR8 *CompatibleString, IN CONST CHAR8 *CompatibleString,
IN INT32 PrevNode, IN INT32 PrevNode,
OUT INT32 *Node OUT INT32 *Node
) )
{ {
INT32 Prev, Next; INT32 Prev, Next;
CONST CHAR8 *Type, *Compatible; CONST CHAR8 *Type, *Compatible;
INT32 Len; INT32 Len;
ASSERT (mDeviceTreeBase != NULL); ASSERT (mDeviceTreeBase != NULL);
ASSERT (Node != NULL); ASSERT (Node != NULL);
for (Prev = PrevNode;; Prev = Next) { for (Prev = PrevNode; ; Prev = Next) {
Next = fdt_next_node (mDeviceTreeBase, Prev, NULL); Next = fdt_next_node (mDeviceTreeBase, Prev, NULL);
if (Next < 0) { if (Next < 0) {
break; break;
@ -136,13 +140,15 @@ FindNextCompatibleNode (
// compatible strings so check each one // compatible strings so check each one
// //
for (Compatible = Type; Compatible < Type + Len && *Compatible; for (Compatible = Type; Compatible < Type + Len && *Compatible;
Compatible += 1 + AsciiStrLen (Compatible)) { Compatible += 1 + AsciiStrLen (Compatible))
{
if (AsciiStrCmp (CompatibleString, Compatible) == 0) { if (AsciiStrCmp (CompatibleString, Compatible) == 0) {
*Node = Next; *Node = Next;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} }
} }
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -150,9 +156,9 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FindCompatibleNode ( FindCompatibleNode (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN CONST CHAR8 *CompatibleString, IN CONST CHAR8 *CompatibleString,
OUT INT32 *Node OUT INT32 *Node
) )
{ {
return FindNextCompatibleNode (This, CompatibleString, 0, Node); return FindNextCompatibleNode (This, CompatibleString, 0, Node);
@ -162,15 +168,15 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FindCompatibleNodeProperty ( FindCompatibleNodeProperty (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN CONST CHAR8 *CompatibleString, IN CONST CHAR8 *CompatibleString,
IN CONST CHAR8 *PropertyName, IN CONST CHAR8 *PropertyName,
OUT CONST VOID **Prop, OUT CONST VOID **Prop,
OUT UINT32 *PropSize OPTIONAL OUT UINT32 *PropSize OPTIONAL
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
INT32 Node; INT32 Node;
Status = FindCompatibleNode (This, CompatibleString, &Node); Status = FindCompatibleNode (This, CompatibleString, &Node);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -184,15 +190,15 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FindCompatibleNodeReg ( FindCompatibleNodeReg (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN CONST CHAR8 *CompatibleString, IN CONST CHAR8 *CompatibleString,
OUT CONST VOID **Reg, OUT CONST VOID **Reg,
OUT UINTN *AddressCells, OUT UINTN *AddressCells,
OUT UINTN *SizeCells, OUT UINTN *SizeCells,
OUT UINT32 *RegSize OUT UINT32 *RegSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ASSERT (RegSize != NULL); ASSERT (RegSize != NULL);
@ -201,21 +207,30 @@ FindCompatibleNodeReg (
// 8 byte quantities for base and size, respectively. // 8 byte quantities for base and size, respectively.
// TODO use #cells root properties instead // TODO use #cells root properties instead
// //
Status = FindCompatibleNodeProperty (This, CompatibleString, "reg", Reg, Status = FindCompatibleNodeProperty (
RegSize); This,
CompatibleString,
"reg",
Reg,
RegSize
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
if ((*RegSize % 16) != 0) { if ((*RegSize % 16) != 0) {
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: '%a' compatible node has invalid 'reg' property (size == 0x%x)\n", "%a: '%a' compatible node has invalid 'reg' property (size == 0x%x)\n",
__FUNCTION__, CompatibleString, *RegSize)); __FUNCTION__,
CompatibleString,
*RegSize
));
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
*AddressCells = 2; *AddressCells = 2;
*SizeCells = 2; *SizeCells = 2;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -224,24 +239,24 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FindNextMemoryNodeReg ( FindNextMemoryNodeReg (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN INT32 PrevNode, IN INT32 PrevNode,
OUT INT32 *Node, OUT INT32 *Node,
OUT CONST VOID **Reg, OUT CONST VOID **Reg,
OUT UINTN *AddressCells, OUT UINTN *AddressCells,
OUT UINTN *SizeCells, OUT UINTN *SizeCells,
OUT UINT32 *RegSize OUT UINT32 *RegSize
) )
{ {
INT32 Prev, Next; INT32 Prev, Next;
CONST CHAR8 *DeviceType; CONST CHAR8 *DeviceType;
INT32 Len; INT32 Len;
EFI_STATUS Status; EFI_STATUS Status;
ASSERT (mDeviceTreeBase != NULL); ASSERT (mDeviceTreeBase != NULL);
ASSERT (Node != NULL); ASSERT (Node != NULL);
for (Prev = PrevNode;; Prev = Next) { for (Prev = PrevNode; ; Prev = Next) {
Next = fdt_next_node (mDeviceTreeBase, Prev, NULL); Next = fdt_next_node (mDeviceTreeBase, Prev, NULL);
if (Next < 0) { if (Next < 0) {
break; break;
@ -253,7 +268,7 @@ FindNextMemoryNodeReg (
} }
DeviceType = fdt_getprop (mDeviceTreeBase, Next, "device_type", &Len); DeviceType = fdt_getprop (mDeviceTreeBase, Next, "device_type", &Len);
if (DeviceType != NULL && AsciiStrCmp (DeviceType, "memory") == 0) { if ((DeviceType != NULL) && (AsciiStrCmp (DeviceType, "memory") == 0)) {
// //
// Get the 'reg' property of this memory node. For now, we will assume // Get the 'reg' property of this memory node. For now, we will assume
// 8 byte quantities for base and size, respectively. // 8 byte quantities for base and size, respectively.
@ -261,24 +276,31 @@ FindNextMemoryNodeReg (
// //
Status = GetNodeProperty (This, Next, "reg", Reg, RegSize); Status = GetNodeProperty (This, Next, "reg", Reg, RegSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, DEBUG ((
DEBUG_WARN,
"%a: ignoring memory node with no 'reg' property\n", "%a: ignoring memory node with no 'reg' property\n",
__FUNCTION__)); __FUNCTION__
continue; ));
}
if ((*RegSize % 16) != 0) {
DEBUG ((DEBUG_WARN,
"%a: ignoring memory node with invalid 'reg' property (size == 0x%x)\n",
__FUNCTION__, *RegSize));
continue; continue;
} }
*Node = Next; if ((*RegSize % 16) != 0) {
DEBUG ((
DEBUG_WARN,
"%a: ignoring memory node with invalid 'reg' property (size == 0x%x)\n",
__FUNCTION__,
*RegSize
));
continue;
}
*Node = Next;
*AddressCells = 2; *AddressCells = 2;
*SizeCells = 2; *SizeCells = 2;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} }
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -286,27 +308,34 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FindMemoryNodeReg ( FindMemoryNodeReg (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
OUT INT32 *Node, OUT INT32 *Node,
OUT CONST VOID **Reg, OUT CONST VOID **Reg,
OUT UINTN *AddressCells, OUT UINTN *AddressCells,
OUT UINTN *SizeCells, OUT UINTN *SizeCells,
OUT UINT32 *RegSize OUT UINT32 *RegSize
) )
{ {
return FindNextMemoryNodeReg (This, 0, Node, Reg, AddressCells, SizeCells, return FindNextMemoryNodeReg (
RegSize); This,
0,
Node,
Reg,
AddressCells,
SizeCells,
RegSize
);
} }
STATIC STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GetOrInsertChosenNode ( GetOrInsertChosenNode (
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
OUT INT32 *Node OUT INT32 *Node
) )
{ {
INT32 NewNode; INT32 NewNode;
ASSERT (mDeviceTreeBase != NULL); ASSERT (mDeviceTreeBase != NULL);
ASSERT (Node != NULL); ASSERT (Node != NULL);
@ -325,7 +354,7 @@ GetOrInsertChosenNode (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
STATIC FDT_CLIENT_PROTOCOL mFdtClientProtocol = { STATIC FDT_CLIENT_PROTOCOL mFdtClientProtocol = {
GetNodeProperty, GetNodeProperty,
SetNodeProperty, SetNodeProperty,
FindCompatibleNode, FindCompatibleNode,
@ -341,13 +370,13 @@ STATIC
VOID VOID
EFIAPI EFIAPI
OnPlatformHasDeviceTree ( OnPlatformHasDeviceTree (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VOID *Interface; VOID *Interface;
VOID *DeviceTreeBase; VOID *DeviceTreeBase;
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEdkiiPlatformHasDeviceTreeGuid, &gEdkiiPlatformHasDeviceTreeGuid,
@ -374,25 +403,30 @@ OnPlatformHasDeviceTree (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeFdtClientDxe ( InitializeFdtClientDxe (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
VOID *Hob; VOID *Hob;
VOID *DeviceTreeBase; VOID *DeviceTreeBase;
EFI_STATUS Status; EFI_STATUS Status;
EFI_EVENT PlatformHasDeviceTreeEvent; EFI_EVENT PlatformHasDeviceTreeEvent;
VOID *Registration; VOID *Registration;
Hob = GetFirstGuidHob (&gFdtHobGuid); Hob = GetFirstGuidHob (&gFdtHobGuid);
if (Hob == NULL || GET_GUID_HOB_DATA_SIZE (Hob) != sizeof (UINT64)) { if ((Hob == NULL) || (GET_GUID_HOB_DATA_SIZE (Hob) != sizeof (UINT64))) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
DeviceTreeBase = (VOID *)(UINTN)*(UINT64 *)GET_GUID_HOB_DATA (Hob); DeviceTreeBase = (VOID *)(UINTN)*(UINT64 *)GET_GUID_HOB_DATA (Hob);
if (fdt_check_header (DeviceTreeBase) != 0) { if (fdt_check_header (DeviceTreeBase) != 0) {
DEBUG ((DEBUG_ERROR, "%a: No DTB found @ 0x%p\n", __FUNCTION__, DEBUG ((
DeviceTreeBase)); DEBUG_ERROR,
"%a: No DTB found @ 0x%p\n",
__FUNCTION__,
DeviceTreeBase
));
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }

View File

@ -107,15 +107,15 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonCoherentIoMmuMap ( NonCoherentIoMmuMap (
IN EDKII_IOMMU_PROTOCOL *This, IN EDKII_IOMMU_PROTOCOL *This,
IN EDKII_IOMMU_OPERATION Operation, IN EDKII_IOMMU_OPERATION Operation,
IN VOID *HostAddress, IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes, IN OUT UINTN *NumberOfBytes,
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping OUT VOID **Mapping
) )
{ {
DMA_MAP_OPERATION DmaOperation; DMA_MAP_OPERATION DmaOperation;
switch (Operation) { switch (Operation) {
case EdkiiIoMmuOperationBusMasterRead: case EdkiiIoMmuOperationBusMasterRead:
@ -138,8 +138,13 @@ NonCoherentIoMmuMap (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
return DmaMap (DmaOperation, HostAddress, NumberOfBytes, return DmaMap (
DeviceAddress, Mapping); DmaOperation,
HostAddress,
NumberOfBytes,
DeviceAddress,
Mapping
);
} }
/** /**
@ -158,8 +163,8 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonCoherentIoMmuUnmap ( NonCoherentIoMmuUnmap (
IN EDKII_IOMMU_PROTOCOL *This, IN EDKII_IOMMU_PROTOCOL *This,
IN VOID *Mapping IN VOID *Mapping
) )
{ {
return DmaUnmap (Mapping); return DmaUnmap (Mapping);
@ -191,12 +196,12 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonCoherentIoMmuAllocateBuffer ( NonCoherentIoMmuAllocateBuffer (
IN EDKII_IOMMU_PROTOCOL *This, IN EDKII_IOMMU_PROTOCOL *This,
IN EFI_ALLOCATE_TYPE Type, IN EFI_ALLOCATE_TYPE Type,
IN EFI_MEMORY_TYPE MemoryType, IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Pages, IN UINTN Pages,
IN OUT VOID **HostAddress, IN OUT VOID **HostAddress,
IN UINT64 Attributes IN UINT64 Attributes
) )
{ {
return DmaAllocateBuffer (MemoryType, Pages, HostAddress); return DmaAllocateBuffer (MemoryType, Pages, HostAddress);
@ -219,9 +224,9 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonCoherentIoMmuFreeBuffer ( NonCoherentIoMmuFreeBuffer (
IN EDKII_IOMMU_PROTOCOL *This, IN EDKII_IOMMU_PROTOCOL *This,
IN UINTN Pages, IN UINTN Pages,
IN VOID *HostAddress IN VOID *HostAddress
) )
{ {
return DmaFreeBuffer (Pages, HostAddress); return DmaFreeBuffer (Pages, HostAddress);
@ -236,15 +241,17 @@ STATIC EDKII_IOMMU_PROTOCOL mNonCoherentIoMmuOps = {
NonCoherentIoMmuFreeBuffer, NonCoherentIoMmuFreeBuffer,
}; };
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonCoherentIoMmuDxeEntryPoint ( NonCoherentIoMmuDxeEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
return gBS->InstallMultipleProtocolInterfaces (&ImageHandle, return gBS->InstallMultipleProtocolInterfaces (
&gEdkiiIoMmuProtocolGuid, &mNonCoherentIoMmuOps, &ImageHandle,
NULL); &gEdkiiIoMmuProtocolGuid,
&mNonCoherentIoMmuOps,
NULL
);
} }

View File

@ -21,14 +21,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gVirtualKeyboardCompo
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) VirtualKeyboardComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)VirtualKeyboardComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) VirtualKeyboardComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)VirtualKeyboardComponentNameGetControllerName,
"en" "en"
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mVirtualKeyboardDriverNameTable[] = {
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mVirtualKeyboardDriverNameTable[] = {
{ {
"eng;en", "eng;en",
L"Virtual Keyboard Driver" L"Virtual Keyboard Driver"
@ -170,11 +169,11 @@ VirtualKeyboardComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
VirtualKeyboardComponentNameGetControllerName ( VirtualKeyboardComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;

View File

@ -10,13 +10,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _VIRTUAL_KEYBOARD_COMPONENT_NAME_H_ #ifndef _VIRTUAL_KEYBOARD_COMPONENT_NAME_H_
#define _VIRTUAL_KEYBOARD_COMPONENT_NAME_H_ #define _VIRTUAL_KEYBOARD_COMPONENT_NAME_H_
extern EFI_COMPONENT_NAME_PROTOCOL gVirtualKeyboardComponentName; extern EFI_COMPONENT_NAME_PROTOCOL gVirtualKeyboardComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2;
// //
// EFI Component Name Functions // EFI Component Name Functions
// //
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -64,7 +64,6 @@ VirtualKeyboardComponentNameGetDriverName (
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -136,12 +135,11 @@ VirtualKeyboardComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
VirtualKeyboardComponentNameGetControllerName ( VirtualKeyboardComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
#endif #endif

View File

@ -13,7 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// //
// RAM Keyboard Driver Binding Protocol Instance // RAM Keyboard Driver Binding Protocol Instance
// //
EFI_DRIVER_BINDING_PROTOCOL gVirtualKeyboardDriverBinding = { EFI_DRIVER_BINDING_PROTOCOL gVirtualKeyboardDriverBinding = {
VirtualKeyboardDriverBindingSupported, VirtualKeyboardDriverBindingSupported,
VirtualKeyboardDriverBindingStart, VirtualKeyboardDriverBindingStart,
VirtualKeyboardDriverBindingStop, VirtualKeyboardDriverBindingStop,
@ -45,13 +45,13 @@ VirtualKeyboardDriverBindingSupported (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
PLATFORM_VIRTUAL_KBD_PROTOCOL *PlatformVirtual; PLATFORM_VIRTUAL_KBD_PROTOCOL *PlatformVirtual;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gPlatformVirtualKeyboardProtocolGuid, &gPlatformVirtualKeyboardProtocolGuid,
(VOID **) &PlatformVirtual, (VOID **)&PlatformVirtual,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -59,6 +59,7 @@ VirtualKeyboardDriverBindingSupported (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gPlatformVirtualKeyboardProtocolGuid, &gPlatformVirtualKeyboardProtocolGuid,
@ -88,14 +89,14 @@ VirtualKeyboardDriverBindingStart (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
PLATFORM_VIRTUAL_KBD_PROTOCOL *PlatformVirtual; PLATFORM_VIRTUAL_KBD_PROTOCOL *PlatformVirtual;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gPlatformVirtualKeyboardProtocolGuid, &gPlatformVirtualKeyboardProtocolGuid,
(VOID **) &PlatformVirtual, (VOID **)&PlatformVirtual,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -107,7 +108,7 @@ VirtualKeyboardDriverBindingStart (
// //
// Allocate the private device structure // Allocate the private device structure
// //
VirtualKeyboardPrivate = (VIRTUAL_KEYBOARD_DEV *) AllocateZeroPool (sizeof (VIRTUAL_KEYBOARD_DEV)); VirtualKeyboardPrivate = (VIRTUAL_KEYBOARD_DEV *)AllocateZeroPool (sizeof (VIRTUAL_KEYBOARD_DEV));
if (VirtualKeyboardPrivate == NULL) { if (VirtualKeyboardPrivate == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto Done; goto Done;
@ -116,20 +117,20 @@ VirtualKeyboardDriverBindingStart (
// //
// Initialize the private device structure // Initialize the private device structure
// //
VirtualKeyboardPrivate->Signature = VIRTUAL_KEYBOARD_DEV_SIGNATURE; VirtualKeyboardPrivate->Signature = VIRTUAL_KEYBOARD_DEV_SIGNATURE;
VirtualKeyboardPrivate->Handle = Controller; VirtualKeyboardPrivate->Handle = Controller;
VirtualKeyboardPrivate->PlatformVirtual = PlatformVirtual; VirtualKeyboardPrivate->PlatformVirtual = PlatformVirtual;
VirtualKeyboardPrivate->Queue.Front = 0; VirtualKeyboardPrivate->Queue.Front = 0;
VirtualKeyboardPrivate->Queue.Rear = 0; VirtualKeyboardPrivate->Queue.Rear = 0;
VirtualKeyboardPrivate->QueueForNotify.Front = 0; VirtualKeyboardPrivate->QueueForNotify.Front = 0;
VirtualKeyboardPrivate->QueueForNotify.Rear = 0; VirtualKeyboardPrivate->QueueForNotify.Rear = 0;
VirtualKeyboardPrivate->SimpleTextIn.Reset = VirtualKeyboardReset; VirtualKeyboardPrivate->SimpleTextIn.Reset = VirtualKeyboardReset;
VirtualKeyboardPrivate->SimpleTextIn.ReadKeyStroke = VirtualKeyboardReadKeyStroke; VirtualKeyboardPrivate->SimpleTextIn.ReadKeyStroke = VirtualKeyboardReadKeyStroke;
VirtualKeyboardPrivate->SimpleTextInputEx.Reset = VirtualKeyboardResetEx; VirtualKeyboardPrivate->SimpleTextInputEx.Reset = VirtualKeyboardResetEx;
VirtualKeyboardPrivate->SimpleTextInputEx.ReadKeyStrokeEx = VirtualKeyboardReadKeyStrokeEx; VirtualKeyboardPrivate->SimpleTextInputEx.ReadKeyStrokeEx = VirtualKeyboardReadKeyStrokeEx;
VirtualKeyboardPrivate->SimpleTextInputEx.SetState = VirtualKeyboardSetState; VirtualKeyboardPrivate->SimpleTextInputEx.SetState = VirtualKeyboardSetState;
VirtualKeyboardPrivate->SimpleTextInputEx.RegisterKeyNotify = VirtualKeyboardRegisterKeyNotify; VirtualKeyboardPrivate->SimpleTextInputEx.RegisterKeyNotify = VirtualKeyboardRegisterKeyNotify;
VirtualKeyboardPrivate->SimpleTextInputEx.UnregisterKeyNotify = VirtualKeyboardUnregisterKeyNotify; VirtualKeyboardPrivate->SimpleTextInputEx.UnregisterKeyNotify = VirtualKeyboardUnregisterKeyNotify;
@ -162,6 +163,7 @@ VirtualKeyboardDriverBindingStart (
(VirtualKeyboardPrivate->SimpleTextIn).WaitForKey = NULL; (VirtualKeyboardPrivate->SimpleTextIn).WaitForKey = NULL;
goto Done; goto Done;
} }
Status = gBS->CreateEvent ( Status = gBS->CreateEvent (
EVT_NOTIFY_WAIT, EVT_NOTIFY_WAIT,
TPL_NOTIFY, TPL_NOTIFY,
@ -215,13 +217,14 @@ VirtualKeyboardDriverBindingStart (
// Reset the keyboard device // Reset the keyboard device
// //
Status = VirtualKeyboardPrivate->SimpleTextInputEx.Reset ( Status = VirtualKeyboardPrivate->SimpleTextInputEx.Reset (
&VirtualKeyboardPrivate->SimpleTextInputEx, &VirtualKeyboardPrivate->SimpleTextInputEx,
FALSE FALSE
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "[KBD]Reset Failed. Status - %r\n", Status)); DEBUG ((DEBUG_ERROR, "[KBD]Reset Failed. Status - %r\n", Status));
goto Done; goto Done;
} }
// //
// Install protocol interfaces for the keyboard device. // Install protocol interfaces for the keyboard device.
// //
@ -256,6 +259,7 @@ Done:
if (VirtualKeyboardPrivate->TimerEvent != NULL) { if (VirtualKeyboardPrivate->TimerEvent != NULL) {
gBS->CloseEvent (VirtualKeyboardPrivate->TimerEvent); gBS->CloseEvent (VirtualKeyboardPrivate->TimerEvent);
} }
FreePool (VirtualKeyboardPrivate); FreePool (VirtualKeyboardPrivate);
} }
} }
@ -297,7 +301,6 @@ VirtualKeyboardDriverBindingStop (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Enqueue the key. Enqueue the key.
@ -310,8 +313,8 @@ VirtualKeyboardDriverBindingStop (
**/ **/
EFI_STATUS EFI_STATUS
Enqueue ( Enqueue (
IN SIMPLE_QUEUE *Queue, IN SIMPLE_QUEUE *Queue,
IN EFI_KEY_DATA *KeyData IN EFI_KEY_DATA *KeyData
) )
{ {
if ((Queue->Rear + 1) % QUEUE_MAX_COUNT == Queue->Front) { if ((Queue->Rear + 1) % QUEUE_MAX_COUNT == Queue->Front) {
@ -336,8 +339,8 @@ Enqueue (
**/ **/
EFI_STATUS EFI_STATUS
Dequeue ( Dequeue (
IN SIMPLE_QUEUE *Queue, IN SIMPLE_QUEUE *Queue,
IN EFI_KEY_DATA *KeyData IN EFI_KEY_DATA *KeyData
) )
{ {
if (Queue->Front == Queue->Rear) { if (Queue->Front == Queue->Rear) {
@ -345,7 +348,7 @@ Dequeue (
} }
CopyMem (KeyData, &Queue->Buffer[Queue->Front], sizeof (EFI_KEY_DATA)); CopyMem (KeyData, &Queue->Buffer[Queue->Front], sizeof (EFI_KEY_DATA));
Queue->Front = (Queue->Front + 1) % QUEUE_MAX_COUNT; Queue->Front = (Queue->Front + 1) % QUEUE_MAX_COUNT;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -361,7 +364,7 @@ Dequeue (
**/ **/
EFI_STATUS EFI_STATUS
CheckQueue ( CheckQueue (
IN SIMPLE_QUEUE *Queue IN SIMPLE_QUEUE *Queue
) )
{ {
if (Queue->Front == Queue->Rear) { if (Queue->Front == Queue->Rear) {
@ -386,7 +389,7 @@ VirtualKeyboardCheckForKey (
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This
) )
{ {
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
VirtualKeyboardPrivate = VIRTUAL_KEYBOARD_DEV_FROM_THIS (This); VirtualKeyboardPrivate = VIRTUAL_KEYBOARD_DEV_FROM_THIS (This);
@ -404,14 +407,15 @@ VirtualKeyboardCheckForKey (
**/ **/
EFI_STATUS EFI_STATUS
VirtualKeyboardFreeNotifyList ( VirtualKeyboardFreeNotifyList (
IN OUT LIST_ENTRY *ListHead IN OUT LIST_ENTRY *ListHead
) )
{ {
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *NotifyNode; VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *NotifyNode;
if (ListHead == NULL) { if (ListHead == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
while (!IsListEmpty (ListHead)) { while (!IsListEmpty (ListHead)) {
NotifyNode = CR ( NotifyNode = CR (
ListHead->ForwardLink, ListHead->ForwardLink,
@ -450,7 +454,8 @@ IsKeyRegistered (
ASSERT (RegsiteredData != NULL && InputData != NULL); ASSERT (RegsiteredData != NULL && InputData != NULL);
if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) || if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) { (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar))
{
return FALSE; return FALSE;
} }
@ -459,16 +464,18 @@ IsKeyRegistered (
// these state could be ignored. // these state could be ignored.
// //
if ((RegsiteredData->KeyState.KeyShiftState != 0) && if ((RegsiteredData->KeyState.KeyShiftState != 0) &&
(RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState)) { (RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState))
{
return FALSE; return FALSE;
} }
if ((RegsiteredData->KeyState.KeyToggleState != 0) && if ((RegsiteredData->KeyState.KeyToggleState != 0) &&
(RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState)) { (RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState))
{
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
/** /**
@ -482,8 +489,8 @@ IsKeyRegistered (
VOID VOID
EFIAPI EFIAPI
VirtualKeyboardWaitForKey ( VirtualKeyboardWaitForKey (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
// //
@ -519,21 +526,21 @@ VirtualKeyboardWaitForKey (
VOID VOID
EFIAPI EFIAPI
VirtualKeyboardWaitForKeyEx ( VirtualKeyboardWaitForKeyEx (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
VirtualKeyboardPrivate = TEXT_INPUT_EX_VIRTUAL_KEYBOARD_DEV_FROM_THIS (Context); VirtualKeyboardPrivate = TEXT_INPUT_EX_VIRTUAL_KEYBOARD_DEV_FROM_THIS (Context);
VirtualKeyboardWaitForKey (Event, &VirtualKeyboardPrivate->SimpleTextIn); VirtualKeyboardWaitForKey (Event, &VirtualKeyboardPrivate->SimpleTextIn);
} }
// //
// EFI Simple Text In Protocol Functions // EFI Simple Text In Protocol Functions
// //
/** /**
Reset the Keyboard and do BAT test for it, if (ExtendedVerification == TRUE) Reset the Keyboard and do BAT test for it, if (ExtendedVerification == TRUE)
then do some extra keyboard validations. then do some extra keyboard validations.
@ -553,9 +560,9 @@ VirtualKeyboardReset (
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
) )
{ {
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
EFI_STATUS Status; EFI_STATUS Status;
EFI_TPL OldTpl; EFI_TPL OldTpl;
VirtualKeyboardPrivate = VIRTUAL_KEYBOARD_DEV_FROM_THIS (This); VirtualKeyboardPrivate = VIRTUAL_KEYBOARD_DEV_FROM_THIS (This);
@ -565,7 +572,8 @@ VirtualKeyboardReset (
OldTpl = gBS->RaiseTPL (TPL_NOTIFY); OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
if (VirtualKeyboardPrivate->PlatformVirtual && if (VirtualKeyboardPrivate->PlatformVirtual &&
VirtualKeyboardPrivate->PlatformVirtual->Reset) { VirtualKeyboardPrivate->PlatformVirtual->Reset)
{
Status = VirtualKeyboardPrivate->PlatformVirtual->Reset (); Status = VirtualKeyboardPrivate->PlatformVirtual->Reset ();
} else { } else {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
@ -597,16 +605,16 @@ VirtualKeyboardResetEx (
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
) )
{ {
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
EFI_STATUS Status; EFI_STATUS Status;
EFI_TPL OldTpl; EFI_TPL OldTpl;
VirtualKeyboardPrivate = TEXT_INPUT_EX_VIRTUAL_KEYBOARD_DEV_FROM_THIS (This); VirtualKeyboardPrivate = TEXT_INPUT_EX_VIRTUAL_KEYBOARD_DEV_FROM_THIS (This);
Status = VirtualKeyboardPrivate->SimpleTextIn.Reset ( Status = VirtualKeyboardPrivate->SimpleTextIn.Reset (
&VirtualKeyboardPrivate->SimpleTextIn, &VirtualKeyboardPrivate->SimpleTextIn,
ExtendedVerification ExtendedVerification
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
@ -616,7 +624,6 @@ VirtualKeyboardResetEx (
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
@ -638,11 +645,12 @@ VirtualKeyboardResetEx (
EFI_STATUS EFI_STATUS
KeyboardReadKeyStrokeWorker ( KeyboardReadKeyStrokeWorker (
IN VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate, IN VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate,
OUT EFI_KEY_DATA *KeyData OUT EFI_KEY_DATA *KeyData
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_TPL OldTpl; EFI_TPL OldTpl;
if (KeyData == NULL) { if (KeyData == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -700,9 +708,9 @@ VirtualKeyboardReadKeyStroke (
OUT EFI_INPUT_KEY *Key OUT EFI_INPUT_KEY *Key
) )
{ {
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
EFI_STATUS Status; EFI_STATUS Status;
EFI_KEY_DATA KeyData; EFI_KEY_DATA KeyData;
VirtualKeyboardPrivate = VIRTUAL_KEYBOARD_DEV_FROM_THIS (This); VirtualKeyboardPrivate = VIRTUAL_KEYBOARD_DEV_FROM_THIS (This);
@ -715,12 +723,14 @@ VirtualKeyboardReadKeyStroke (
// Convert the Ctrl+[a-z] to Ctrl+[1-26] // Convert the Ctrl+[a-z] to Ctrl+[1-26]
// //
if ((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) { if ((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) {
if (KeyData.Key.UnicodeChar >= L'a' && if ((KeyData.Key.UnicodeChar >= L'a') &&
KeyData.Key.UnicodeChar <= L'z') { (KeyData.Key.UnicodeChar <= L'z'))
KeyData.Key.UnicodeChar = (CHAR16) (KeyData.Key.UnicodeChar - L'a' + 1); {
} else if (KeyData.Key.UnicodeChar >= L'A' && KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'a' + 1);
KeyData.Key.UnicodeChar <= L'Z') { } else if ((KeyData.Key.UnicodeChar >= L'A') &&
KeyData.Key.UnicodeChar = (CHAR16) (KeyData.Key.UnicodeChar - L'A' + 1); (KeyData.Key.UnicodeChar <= L'Z'))
{
KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'A' + 1);
} }
} }
@ -747,11 +757,11 @@ VirtualKeyboardReadKeyStroke (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
VirtualKeyboardReadKeyStrokeEx ( VirtualKeyboardReadKeyStrokeEx (
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
OUT EFI_KEY_DATA *KeyData OUT EFI_KEY_DATA *KeyData
) )
{ {
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
if (KeyData == NULL) { if (KeyData == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -760,7 +770,6 @@ VirtualKeyboardReadKeyStrokeEx (
VirtualKeyboardPrivate = TEXT_INPUT_EX_VIRTUAL_KEYBOARD_DEV_FROM_THIS (This); VirtualKeyboardPrivate = TEXT_INPUT_EX_VIRTUAL_KEYBOARD_DEV_FROM_THIS (This);
return KeyboardReadKeyStrokeWorker (VirtualKeyboardPrivate, KeyData); return KeyboardReadKeyStrokeWorker (VirtualKeyboardPrivate, KeyData);
} }
/** /**
@ -822,16 +831,17 @@ VirtualKeyboardRegisterKeyNotify (
OUT VOID **NotifyHandle OUT VOID **NotifyHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
EFI_TPL OldTpl; EFI_TPL OldTpl;
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify; VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify;
LIST_ENTRY *Link; LIST_ENTRY *Link;
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
if (KeyData == NULL || if ((KeyData == NULL) ||
NotifyHandle == NULL || (NotifyHandle == NULL) ||
KeyNotificationFunction == NULL) { (KeyNotificationFunction == NULL))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -848,7 +858,8 @@ VirtualKeyboardRegisterKeyNotify (
// //
for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink; for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink;
Link != &VirtualKeyboardPrivate->NotifyList; Link != &VirtualKeyboardPrivate->NotifyList;
Link = Link->ForwardLink) { Link = Link->ForwardLink)
{
CurrentNotify = CR ( CurrentNotify = CR (
Link, Link,
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY, VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY,
@ -858,7 +869,7 @@ VirtualKeyboardRegisterKeyNotify (
if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) { if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) { if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
*NotifyHandle = CurrentNotify; *NotifyHandle = CurrentNotify;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
goto Exit; goto Exit;
} }
} }
@ -868,7 +879,7 @@ VirtualKeyboardRegisterKeyNotify (
// Allocate resource to save the notification function // Allocate resource to save the notification function
// //
NewNotify = (VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *) AllocateZeroPool (sizeof (VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY)); NewNotify = (VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *)AllocateZeroPool (sizeof (VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY));
if (NewNotify == NULL) { if (NewNotify == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto Exit; goto Exit;
@ -879,8 +890,8 @@ VirtualKeyboardRegisterKeyNotify (
CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA)); CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA));
InsertTailList (&VirtualKeyboardPrivate->NotifyList, &NewNotify->NotifyEntry); InsertTailList (&VirtualKeyboardPrivate->NotifyList, &NewNotify->NotifyEntry);
*NotifyHandle = NewNotify; *NotifyHandle = NewNotify;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
Exit: Exit:
// //
@ -888,7 +899,6 @@ Exit:
// //
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
return Status; return Status;
} }
/** /**
@ -910,11 +920,11 @@ VirtualKeyboardUnregisterKeyNotify (
IN VOID *NotificationHandle IN VOID *NotificationHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
EFI_TPL OldTpl; EFI_TPL OldTpl;
LIST_ENTRY *Link; LIST_ENTRY *Link;
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
// //
// Check incoming notification handle // Check incoming notification handle
@ -923,8 +933,9 @@ VirtualKeyboardUnregisterKeyNotify (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (((VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *) NotificationHandle)->Signature != if (((VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *)NotificationHandle)->Signature !=
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE) { VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE)
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -937,7 +948,8 @@ VirtualKeyboardUnregisterKeyNotify (
for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink; for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink;
Link != &VirtualKeyboardPrivate->NotifyList; Link != &VirtualKeyboardPrivate->NotifyList;
Link = Link->ForwardLink) { Link = Link->ForwardLink)
{
CurrentNotify = CR ( CurrentNotify = CR (
Link, Link,
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY, VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY,
@ -982,8 +994,8 @@ Exit:
VOID VOID
EFIAPI EFIAPI
VirtualKeyboardTimerHandler ( VirtualKeyboardTimerHandler (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
EFI_TPL OldTpl; EFI_TPL OldTpl;
@ -1001,14 +1013,17 @@ VirtualKeyboardTimerHandler (
OldTpl = gBS->RaiseTPL (TPL_NOTIFY); OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
if (VirtualKeyboardPrivate->PlatformVirtual && if (VirtualKeyboardPrivate->PlatformVirtual &&
VirtualKeyboardPrivate->PlatformVirtual->Query) { VirtualKeyboardPrivate->PlatformVirtual->Query)
{
if (VirtualKeyboardPrivate->PlatformVirtual->Query (&VirtualKey) == if (VirtualKeyboardPrivate->PlatformVirtual->Query (&VirtualKey) ==
FALSE) { FALSE)
{
goto Exit; goto Exit;
} }
// Found key // Found key
KeyData.Key.ScanCode = VirtualKey.Key.ScanCode; KeyData.Key.ScanCode = VirtualKey.Key.ScanCode;
KeyData.Key.UnicodeChar = VirtualKey.Key.UnicodeChar; KeyData.Key.UnicodeChar = VirtualKey.Key.UnicodeChar;
KeyData.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID; KeyData.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
KeyData.KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID; KeyData.KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;
if (VirtualKeyboardPrivate->PlatformVirtual->Clear) { if (VirtualKeyboardPrivate->PlatformVirtual->Clear) {
@ -1023,7 +1038,8 @@ VirtualKeyboardTimerHandler (
// //
for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink; for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink;
Link != &VirtualKeyboardPrivate->NotifyList; Link != &VirtualKeyboardPrivate->NotifyList;
Link = Link->ForwardLink) { Link = Link->ForwardLink)
{
CurrentNotify = CR ( CurrentNotify = CR (
Link, Link,
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY, VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY,
@ -1060,19 +1076,19 @@ Exit:
VOID VOID
EFIAPI EFIAPI
KeyNotifyProcessHandler ( KeyNotifyProcessHandler (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate; VIRTUAL_KEYBOARD_DEV *VirtualKeyboardPrivate;
EFI_KEY_DATA KeyData; EFI_KEY_DATA KeyData;
LIST_ENTRY *Link; LIST_ENTRY *Link;
LIST_ENTRY *NotifyList; LIST_ENTRY *NotifyList;
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
EFI_TPL OldTpl; EFI_TPL OldTpl;
VirtualKeyboardPrivate = (VIRTUAL_KEYBOARD_DEV *) Context; VirtualKeyboardPrivate = (VIRTUAL_KEYBOARD_DEV *)Context;
// //
// Invoke notification functions. // Invoke notification functions.
@ -1091,10 +1107,13 @@ KeyNotifyProcessHandler (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
break; break;
} }
for (Link = GetFirstNode (NotifyList); for (Link = GetFirstNode (NotifyList);
!IsNull (NotifyList, Link); !IsNull (NotifyList, Link);
Link = GetNextNode (NotifyList, Link)) { Link = GetNextNode (NotifyList, Link))
CurrentNotify = CR (Link, {
CurrentNotify = CR (
Link,
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY, VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY,
NotifyEntry, NotifyEntry,
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE
@ -1119,12 +1138,12 @@ KeyNotifyProcessHandler (
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeVirtualKeyboard( InitializeVirtualKeyboard (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Install driver model protocol(s). // Install driver model protocol(s).

View File

@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _VIRTUAL_KEYBOARD_H_ #ifndef _VIRTUAL_KEYBOARD_H_
#define _VIRTUAL_KEYBOARD_H_ #define _VIRTUAL_KEYBOARD_H_
#include <Guid/StatusCodeDataTypeId.h> #include <Guid/StatusCodeDataTypeId.h>
#include <Protocol/DevicePath.h> #include <Protocol/DevicePath.h>
#include <Protocol/PlatformVirtualKeyboard.h> #include <Protocol/PlatformVirtualKeyboard.h>
@ -31,70 +30,69 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// //
// Driver Binding Externs // Driver Binding Externs
// //
extern EFI_DRIVER_BINDING_PROTOCOL gVirtualKeyboardDriverBinding; extern EFI_DRIVER_BINDING_PROTOCOL gVirtualKeyboardDriverBinding;
extern EFI_COMPONENT_NAME_PROTOCOL gVirtualKeyboardComponentName; extern EFI_COMPONENT_NAME_PROTOCOL gVirtualKeyboardComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2;
// //
// VIRTUAL Keyboard Defines // VIRTUAL Keyboard Defines
// //
#define CHAR_SCANCODE 0xe0 #define CHAR_SCANCODE 0xe0
#define CHAR_ESC 0x1b #define CHAR_ESC 0x1b
#define KEYBOARD_TIMEOUT 65536 // 0.07s #define KEYBOARD_TIMEOUT 65536 // 0.07s
#define KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s #define KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s
#define KEYBOARD_BAT_TIMEOUT 4000000 // 4s #define KEYBOARD_BAT_TIMEOUT 4000000 // 4s
#define KEYBOARD_TIMER_INTERVAL 500000 // 0.5s #define KEYBOARD_TIMER_INTERVAL 500000 // 0.5s
#define QUEUE_MAX_COUNT 32 #define QUEUE_MAX_COUNT 32
#define KEYBOARD_SCAN_CODE_MAX_COUNT 32 #define KEYBOARD_SCAN_CODE_MAX_COUNT 32
// //
// VIRTUAL Keyboard Device Structure // VIRTUAL Keyboard Device Structure
// //
#define VIRTUAL_KEYBOARD_DEV_SIGNATURE SIGNATURE_32 ('V', 'K', 'B', 'D') #define VIRTUAL_KEYBOARD_DEV_SIGNATURE SIGNATURE_32 ('V', 'K', 'B', 'D')
#define VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('v', 'k', 'c', 'n') #define VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('v', 'k', 'c', 'n')
typedef struct _VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY { typedef struct _VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY {
UINTN Signature; UINTN Signature;
EFI_KEY_DATA KeyData; EFI_KEY_DATA KeyData;
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn; EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
LIST_ENTRY NotifyEntry; LIST_ENTRY NotifyEntry;
} VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY; } VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY;
typedef struct { typedef struct {
UINTN Front; UINTN Front;
UINTN Rear; UINTN Rear;
EFI_KEY_DATA Buffer[QUEUE_MAX_COUNT]; EFI_KEY_DATA Buffer[QUEUE_MAX_COUNT];
} SIMPLE_QUEUE; } SIMPLE_QUEUE;
typedef struct { typedef struct {
UINT8 Buffer[KEYBOARD_SCAN_CODE_MAX_COUNT]; UINT8 Buffer[KEYBOARD_SCAN_CODE_MAX_COUNT];
UINTN Head; UINTN Head;
UINTN Tail; UINTN Tail;
} SCAN_CODE_QUEUE; } SCAN_CODE_QUEUE;
typedef struct { typedef struct {
UINTN Signature; UINTN Signature;
EFI_HANDLE Handle; EFI_HANDLE Handle;
PLATFORM_VIRTUAL_KBD_PROTOCOL *PlatformVirtual; PLATFORM_VIRTUAL_KBD_PROTOCOL *PlatformVirtual;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn; EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInputEx; EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInputEx;
// //
// Buffer storing EFI_KEY_DATA // Buffer storing EFI_KEY_DATA
// //
SIMPLE_QUEUE Queue; SIMPLE_QUEUE Queue;
SIMPLE_QUEUE QueueForNotify; SIMPLE_QUEUE QueueForNotify;
// //
// Notification Function List // Notification Function List
// //
LIST_ENTRY NotifyList; LIST_ENTRY NotifyList;
EFI_EVENT KeyNotifyProcessEvent; EFI_EVENT KeyNotifyProcessEvent;
EFI_EVENT TimerEvent; EFI_EVENT TimerEvent;
} VIRTUAL_KEYBOARD_DEV; } VIRTUAL_KEYBOARD_DEV;
#define VIRTUAL_KEYBOARD_DEV_FROM_THIS(a) CR (a, VIRTUAL_KEYBOARD_DEV, SimpleTextIn, VIRTUAL_KEYBOARD_DEV_SIGNATURE) #define VIRTUAL_KEYBOARD_DEV_FROM_THIS(a) CR (a, VIRTUAL_KEYBOARD_DEV, SimpleTextIn, VIRTUAL_KEYBOARD_DEV_SIGNATURE)
@ -108,7 +106,7 @@ typedef struct {
// //
// Global Variables // Global Variables
// //
extern EFI_DRIVER_BINDING_PROTOCOL gVirtualKeyboardDriverBinding; extern EFI_DRIVER_BINDING_PROTOCOL gVirtualKeyboardDriverBinding;
// //
// Driver Binding Protocol functions // Driver Binding Protocol functions
@ -222,7 +220,6 @@ VirtualKeyboardComponentNameGetDriverName (
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -294,17 +291,17 @@ VirtualKeyboardComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
VirtualKeyboardComponentNameGetControllerName ( VirtualKeyboardComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
// //
// Simple Text Input Protocol functions // Simple Text Input Protocol functions
// //
/** /**
Reset the Keyboard and do BAT test for it, if (ExtendedVerification == TRUE) then do some extra keyboard validations. Reset the Keyboard and do BAT test for it, if (ExtendedVerification == TRUE) then do some extra keyboard validations.
@ -406,6 +403,7 @@ VirtualKeyboardUnregisterKeyNotify (
// //
// Private worker functions // Private worker functions
// //
/** /**
Free keyboard notify list. Free keyboard notify list.
@ -417,7 +415,7 @@ VirtualKeyboardUnregisterKeyNotify (
**/ **/
EFI_STATUS EFI_STATUS
VirtualKeyboardFreeNotifyList ( VirtualKeyboardFreeNotifyList (
IN OUT LIST_ENTRY *ListHead IN OUT LIST_ENTRY *ListHead
); );
/** /**
@ -478,8 +476,8 @@ VirtualKeyboardWaitForKeyEx (
VOID VOID
EFIAPI EFIAPI
VirtualKeyboardTimerHandler ( VirtualKeyboardTimerHandler (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/** /**
@ -491,8 +489,8 @@ VirtualKeyboardTimerHandler (
VOID VOID
EFIAPI EFIAPI
KeyNotifyProcessHandler ( KeyNotifyProcessHandler (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/** /**
@ -530,8 +528,8 @@ VirtualKeyboardReadKeyStroke (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
VirtualKeyboardReadKeyStrokeEx ( VirtualKeyboardReadKeyStrokeEx (
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
OUT EFI_KEY_DATA *KeyData OUT EFI_KEY_DATA *KeyData
); );
#endif /* _VIRTUAL_KEYBOARD_H_ */ #endif /* _VIRTUAL_KEYBOARD_H_ */

View File

@ -15,7 +15,7 @@
#include <Protocol/MonotonicCounter.h> #include <Protocol/MonotonicCounter.h>
UINT64 gCurrentMonotonicCount = 0; UINT64 gCurrentMonotonicCount = 0;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -48,7 +48,6 @@ GetNextHighMonotonicCount (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
MonotonicCounterDriverInitialize ( MonotonicCounterDriverInitialize (
@ -60,7 +59,7 @@ MonotonicCounterDriverInitialize (
EFI_HANDLE Handle = NULL; EFI_HANDLE Handle = NULL;
// Make sure the Monotonic Counter Architectural Protocol is not already installed in the system // Make sure the Monotonic Counter Architectural Protocol is not already installed in the system
ASSERT_PROTOCOL_ALREADY_INSTALLED(NULL, &gEfiMonotonicCounterArchProtocolGuid); ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiMonotonicCounterArchProtocolGuid);
// Fill in the EFI Boot Services and EFI Runtime Services Monotonic Counter Fields // Fill in the EFI Boot Services and EFI Runtime Services Monotonic Counter Fields
gBS->GetNextMonotonicCount = GetNextMonotonicCount; gBS->GetNextMonotonicCount = GetNextMonotonicCount;
@ -69,7 +68,8 @@ MonotonicCounterDriverInitialize (
// Install the Monotonic Counter Architectural Protocol onto a new handle // Install the Monotonic Counter Architectural Protocol onto a new handle
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&Handle, &Handle,
&gEfiMonotonicCounterArchProtocolGuid, NULL, &gEfiMonotonicCounterArchProtocolGuid,
NULL,
NULL NULL
); );
return Status; return Status;

View File

@ -15,67 +15,67 @@
// Array of exception types that need to be hooked by the debugger // Array of exception types that need to be hooked by the debugger
// (efi, gdb) //efi number // (efi, gdb) //efi number
// //
EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = { EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
{ EXCEPT_ARM_SOFTWARE_INTERRUPT, GDB_SIGTRAP } { EXCEPT_ARM_SOFTWARE_INTERRUPT, GDB_SIGTRAP }
// { EXCEPT_ARM_UNDEFINED_INSTRUCTION, GDB_SIGTRAP }, // { EXCEPT_ARM_UNDEFINED_INSTRUCTION, GDB_SIGTRAP },
// { EXCEPT_ARM_PREFETCH_ABORT, GDB_SIGTRAP }, // { EXCEPT_ARM_PREFETCH_ABORT, GDB_SIGTRAP },
// { EXCEPT_ARM_DATA_ABORT, GDB_SIGEMT }, // { EXCEPT_ARM_DATA_ABORT, GDB_SIGEMT },
// { EXCEPT_ARM_RESERVED, GDB_SIGILL } // { EXCEPT_ARM_RESERVED, GDB_SIGILL }
}; };
// Shut up some annoying RVCT warnings // Shut up some annoying RVCT warnings
#ifdef __CC_ARM #ifdef __CC_ARM
#pragma diag_suppress 1296 #pragma diag_suppress 1296
#endif #endif
UINTN gRegisterOffsets[] = { UINTN gRegisterOffsets[] = {
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R0), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R0),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R1), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R1),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R2), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R2),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R3), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R3),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R4), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R4),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R5), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R5),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R6), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R6),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R7), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R7),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R8), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R8),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R9), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R9),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R10), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R10),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R11), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R11),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R12), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R12),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, SP), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, SP),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, LR), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, LR),
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, PC), OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, PC),
0x00000F01, // f0 0x00000F01, // f0
0x00000F02, 0x00000F02,
0x00000F03, 0x00000F03,
0x00000F11, // f1 0x00000F11, // f1
0x00000F12, 0x00000F12,
0x00000F13, 0x00000F13,
0x00000F21, // f2 0x00000F21, // f2
0x00000F22, 0x00000F22,
0x00000F23, 0x00000F23,
0x00000F31, // f3 0x00000F31, // f3
0x00000F32, 0x00000F32,
0x00000F33, 0x00000F33,
0x00000F41, // f4 0x00000F41, // f4
0x00000F42, 0x00000F42,
0x00000F43, 0x00000F43,
0x00000F51, // f5 0x00000F51, // f5
0x00000F52, 0x00000F52,
0x00000F53, 0x00000F53,
0x00000F61, // f6 0x00000F61, // f6
0x00000F62, 0x00000F62,
0x00000F63, 0x00000F63,
0x00000F71, // f7 0x00000F71, // f7
0x00000F72, 0x00000F72,
0x00000F73, 0x00000F73,
0x00000FFF, // fps 0x00000FFF, // fps
OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, CPSR) OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, CPSR)
}; };
// restore warnings for RVCT // restore warnings for RVCT
#ifdef __CC_ARM #ifdef __CC_ARM
#pragma diag_default 1296 #pragma diag_default 1296
#endif #endif
/** /**
@ -91,7 +91,6 @@ MaxEfiException (
return sizeof (gExceptionType) / sizeof (EFI_EXCEPTION_TYPE_ENTRY); return sizeof (gExceptionType) / sizeof (EFI_EXCEPTION_TYPE_ENTRY);
} }
/** /**
Return the number of entries in the gRegisters[] Return the number of entries in the gRegisters[]
@ -105,7 +104,6 @@ MaxRegisterCount (
return sizeof (gRegisterOffsets) / sizeof (UINTN); return sizeof (gRegisterOffsets) / sizeof (UINTN);
} }
/** /**
Check to see if the ISA is supported. Check to see if the ISA is supported.
ISA = Instruction Set Architecture ISA = Instruction Set Architecture
@ -125,7 +123,6 @@ CheckIsa (
} }
} }
/** /**
This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering
It is, by default, set to find the register pointer of the ARM member It is, by default, set to find the register pointer of the ARM member
@ -135,17 +132,17 @@ CheckIsa (
**/ **/
UINTN * UINTN *
FindPointerToRegister ( FindPointerToRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN RegNumber IN UINTN RegNumber
) )
{ {
UINT8 *TempPtr; UINT8 *TempPtr;
ASSERT(gRegisterOffsets[RegNumber] < 0xF00);
ASSERT (gRegisterOffsets[RegNumber] < 0xF00);
TempPtr = ((UINT8 *)SystemContext.SystemContextArm) + gRegisterOffsets[RegNumber]; TempPtr = ((UINT8 *)SystemContext.SystemContextArm) + gRegisterOffsets[RegNumber];
return (UINT32 *)TempPtr; return (UINT32 *)TempPtr;
} }
/** /**
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -160,8 +157,8 @@ BasicReadRegister (
IN CHAR8 *OutBufPtr IN CHAR8 *OutBufPtr
) )
{ {
UINTN RegSize; UINTN RegSize;
CHAR8 Char; CHAR8 Char;
if (gRegisterOffsets[RegNumber] > 0xF00) { if (gRegisterOffsets[RegNumber] > 0xF00) {
AsciiSPrint (OutBufPtr, 9, "00000000"); AsciiSPrint (OutBufPtr, 9, "00000000");
@ -175,20 +172,22 @@ BasicReadRegister (
if ((Char >= 'A') && (Char <= 'F')) { if ((Char >= 'A') && (Char <= 'F')) {
Char = Char - 'A' + 'a'; Char = Char - 'A' + 'a';
} }
*OutBufPtr++ = Char; *OutBufPtr++ = Char;
Char = mHexToStr[(UINT8)((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)]; Char = mHexToStr[(UINT8)((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
if ((Char >= 'A') && (Char <= 'F')) { if ((Char >= 'A') && (Char <= 'F')) {
Char = Char - 'A' + 'a'; Char = Char - 'A' + 'a';
} }
*OutBufPtr++ = Char; *OutBufPtr++ = Char;
RegSize = RegSize + 8; RegSize = RegSize + 8;
} }
return OutBufPtr; return OutBufPtr;
} }
/** /**
Reads the n-th register's value into an output buffer and sends it as a packet Reads the n-th register's value into an output buffer and sends it as a packet
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -200,9 +199,9 @@ ReadNthRegister (
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
) )
{ {
UINTN RegNumber; UINTN RegNumber;
CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq) CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq)
CHAR8 *OutBufPtr; // pointer to the output buffer CHAR8 *OutBufPtr; // pointer to the output buffer
RegNumber = AsciiStrHexToUintn (&InBuffer[1]); RegNumber = AsciiStrHexToUintn (&InBuffer[1]);
@ -218,7 +217,6 @@ ReadNthRegister (
SendPacket (OutBuffer); SendPacket (OutBuffer);
} }
/** /**
Reads the general registers into an output buffer and sends it as a packet Reads the general registers into an output buffer and sends it as a packet
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -226,13 +224,13 @@ ReadNthRegister (
VOID VOID
EFIAPI EFIAPI
ReadGeneralRegisters ( ReadGeneralRegisters (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
UINTN Index; UINTN Index;
CHAR8 *OutBuffer; CHAR8 *OutBuffer;
CHAR8 *OutBufPtr; CHAR8 *OutBufPtr;
UINTN RegisterCount = MaxRegisterCount (); UINTN RegisterCount = MaxRegisterCount ();
// It is not safe to allocate pool here.... // It is not safe to allocate pool here....
OutBuffer = AllocatePool ((RegisterCount * 8) + 1); // 8 bytes per register in string format plus a null to terminate OutBuffer = AllocatePool ((RegisterCount * 8) + 1); // 8 bytes per register in string format plus a null to terminate
@ -246,7 +244,6 @@ ReadGeneralRegisters (
FreePool (OutBuffer); FreePool (OutBuffer);
} }
/** /**
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -255,22 +252,23 @@ ReadGeneralRegisters (
@retval the pointer to the next character of the input buffer that can be used @retval the pointer to the next character of the input buffer that can be used
**/ **/
CHAR8 CHAR8
*BasicWriteRegister ( *
IN EFI_SYSTEM_CONTEXT SystemContext, BasicWriteRegister (
IN UINTN RegNumber, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *InBufPtr IN UINTN RegNumber,
IN CHAR8 *InBufPtr
) )
{ {
UINTN RegSize; UINTN RegSize;
UINTN TempValue; // the value transferred from a hex char UINTN TempValue; // the value transferred from a hex char
UINT32 NewValue; // the new value of the RegNumber-th Register UINT32 NewValue; // the new value of the RegNumber-th Register
if (gRegisterOffsets[RegNumber] > 0xF00) { if (gRegisterOffsets[RegNumber] > 0xF00) {
return InBufPtr + 8; return InBufPtr + 8;
} }
NewValue = 0; NewValue = 0;
RegSize = 0; RegSize = 0;
while (RegSize < 32) { while (RegSize < 32) {
TempValue = HexCharToInt (*InBufPtr++); TempValue = HexCharToInt (*InBufPtr++);
@ -288,13 +286,13 @@ CHAR8
} }
NewValue += (TempValue << RegSize); NewValue += (TempValue << RegSize);
RegSize = RegSize + 8; RegSize = RegSize + 8;
} }
*(FindPointerToRegister (SystemContext, RegNumber)) = NewValue; *(FindPointerToRegister (SystemContext, RegNumber)) = NewValue;
return InBufPtr; return InBufPtr;
} }
/** P n...=r... /** P n...=r...
Writes the new value of n-th register received into the input buffer to the n-th register Writes the new value of n-th register received into the input buffer to the n-th register
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -302,41 +300,41 @@ CHAR8
**/ **/
VOID VOID
WriteNthRegister ( WriteNthRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
) )
{ {
UINTN RegNumber; UINTN RegNumber;
CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array
CHAR8 *RegNumBufPtr; CHAR8 *RegNumBufPtr;
CHAR8 *InBufPtr; // pointer to the input buffer CHAR8 *InBufPtr; // pointer to the input buffer
// find the register number to write // find the register number to write
InBufPtr = &InBuffer[1]; InBufPtr = &InBuffer[1];
RegNumBufPtr = RegNumBuffer; RegNumBufPtr = RegNumBuffer;
while (*InBufPtr != '=') { while (*InBufPtr != '=') {
*RegNumBufPtr++ = *InBufPtr++; *RegNumBufPtr++ = *InBufPtr++;
} }
*RegNumBufPtr = '\0'; *RegNumBufPtr = '\0';
RegNumber = AsciiStrHexToUintn (RegNumBuffer); RegNumber = AsciiStrHexToUintn (RegNumBuffer);
// check if this is a valid Register Number // check if this is a valid Register Number
if (RegNumber >= MaxRegisterCount ()) { if (RegNumber >= MaxRegisterCount ()) {
SendError (GDB_EINVALIDREGNUM); SendError (GDB_EINVALIDREGNUM);
return; return;
} }
InBufPtr++; // skips the '=' character InBufPtr++; // skips the '=' character
BasicWriteRegister (SystemContext, RegNumber, InBufPtr); BasicWriteRegister (SystemContext, RegNumber, InBufPtr);
SendSuccess(); SendSuccess ();
} }
/** G XX... /** G XX...
Writes the new values received into the input buffer to the general registers Writes the new values received into the input buffer to the general registers
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@param InBuffer Pointer to the input buffer received from gdb server @param InBuffer Pointer to the input buffer received from gdb server
**/ **/
VOID VOID
EFIAPI EFIAPI
WriteGeneralRegisters ( WriteGeneralRegisters (
@ -352,7 +350,7 @@ WriteGeneralRegisters (
MinLength = (RegisterCount * 8) + 1; // 'G' plus the registers in ASCII format MinLength = (RegisterCount * 8) + 1; // 'G' plus the registers in ASCII format
if (AsciiStrLen (InBuffer) < MinLength) { if (AsciiStrLen (InBuffer) < MinLength) {
//Bad message. Message is not the right length // Bad message. Message is not the right length
SendError (GDB_EBADBUFSIZE); SendError (GDB_EBADBUFSIZE);
return; return;
} }
@ -370,21 +368,21 @@ WriteGeneralRegisters (
// What about Thumb? // What about Thumb?
// Use SWI 0xdbdbdb as the debug instruction // Use SWI 0xdbdbdb as the debug instruction
#define GDB_ARM_BKPT 0xefdbdbdb #define GDB_ARM_BKPT 0xefdbdbdb
BOOLEAN mSingleStepActive = FALSE; BOOLEAN mSingleStepActive = FALSE;
UINT32 mSingleStepPC; UINT32 mSingleStepPC;
UINT32 mSingleStepData; UINT32 mSingleStepData;
UINTN mSingleStepDataSize; UINTN mSingleStepDataSize;
typedef struct { typedef struct {
LIST_ENTRY Link; LIST_ENTRY Link;
UINT64 Signature; UINT64 Signature;
UINT32 Address; UINT32 Address;
UINT32 Instruction; UINT32 Instruction;
} ARM_SOFTWARE_BREAKPOINT; } ARM_SOFTWARE_BREAKPOINT;
#define ARM_SOFTWARE_BREAKPOINT_SIGNATURE SIGNATURE_64('A', 'R', 'M', 'B', 'R', 'K', 'P', 'T') #define ARM_SOFTWARE_BREAKPOINT_SIGNATURE SIGNATURE_64('A', 'R', 'M', 'B', 'R', 'K', 'P', 'T')
#define ARM_SOFTWARE_BREAKPOINT_FROM_LINK(a) CR(a, ARM_SOFTWARE_BREAKPOINT, Link, ARM_SOFTWARE_BREAKPOINT_SIGNATURE) #define ARM_SOFTWARE_BREAKPOINT_FROM_LINK(a) CR(a, ARM_SOFTWARE_BREAKPOINT, Link, ARM_SOFTWARE_BREAKPOINT_SIGNATURE)
LIST_ENTRY BreakpointList; LIST_ENTRY BreakpointList;
@ -396,19 +394,20 @@ LIST_ENTRY BreakpointList;
**/ **/
VOID VOID
AddSingleStep ( AddSingleStep (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
if (mSingleStepActive) { if (mSingleStepActive) {
// Currently don't support nesting // Currently don't support nesting
return; return;
} }
mSingleStepActive = TRUE; mSingleStepActive = TRUE;
mSingleStepPC = SystemContext.SystemContextArm->PC; mSingleStepPC = SystemContext.SystemContextArm->PC;
mSingleStepDataSize = sizeof (UINT32); mSingleStepDataSize = sizeof (UINT32);
mSingleStepData = (*(UINT32 *)mSingleStepPC); mSingleStepData = (*(UINT32 *)mSingleStepPC);
*(UINT32 *)mSingleStepPC = GDB_ARM_BKPT; *(UINT32 *)mSingleStepPC = GDB_ARM_BKPT;
if (*(UINT32 *)mSingleStepPC != GDB_ARM_BKPT) { if (*(UINT32 *)mSingleStepPC != GDB_ARM_BKPT) {
// For some reason our breakpoint did not take // For some reason our breakpoint did not take
@ -416,10 +415,9 @@ AddSingleStep (
} }
InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize); InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize);
//DEBUG((DEBUG_ERROR, "AddSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, mSingleStepData, *(UINT32 *)mSingleStepPC)); // DEBUG((DEBUG_ERROR, "AddSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, mSingleStepData, *(UINT32 *)mSingleStepPC));
} }
/** /**
Remove Single Step in the SystemContext Remove Single Step in the SystemContext
@ -437,15 +435,14 @@ RemoveSingleStep (
if (mSingleStepDataSize == sizeof (UINT16)) { if (mSingleStepDataSize == sizeof (UINT16)) {
*(UINT16 *)mSingleStepPC = (UINT16)mSingleStepData; *(UINT16 *)mSingleStepPC = (UINT16)mSingleStepData;
} else { } else {
//DEBUG((DEBUG_ERROR, "RemoveSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, *(UINT32 *)mSingleStepPC, mSingleStepData)); // DEBUG((DEBUG_ERROR, "RemoveSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, *(UINT32 *)mSingleStepPC, mSingleStepData));
*(UINT32 *)mSingleStepPC = mSingleStepData; *(UINT32 *)mSingleStepPC = mSingleStepData;
} }
InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize); InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize);
mSingleStepActive = FALSE; mSingleStepActive = FALSE;
} }
/** /**
Continue. addr is Address to resume. If addr is omitted, resume at current Continue. addr is Address to resume. If addr is omitted, resume at current
Address. Address.
@ -455,8 +452,8 @@ RemoveSingleStep (
VOID VOID
EFIAPI EFIAPI
ContinueAtAddress ( ContinueAtAddress (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
if (PacketData[1] != '\0') { if (PacketData[1] != '\0') {
@ -464,7 +461,6 @@ ContinueAtAddress (
} }
} }
/** s [addr ] /** s [addr ]
Single step. addr is the Address at which to resume. If addr is omitted, resume Single step. addr is the Address at which to resume. If addr is omitted, resume
at same Address. at same Address.
@ -474,8 +470,8 @@ ContinueAtAddress (
VOID VOID
EFIAPI EFIAPI
SingleStep ( SingleStep (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
SendNotSupported (); SendNotSupported ();
@ -512,12 +508,12 @@ SearchBreakpointList (
IN UINT32 Address IN UINT32 Address
) )
{ {
LIST_ENTRY *Current; LIST_ENTRY *Current;
ARM_SOFTWARE_BREAKPOINT *Breakpoint; ARM_SOFTWARE_BREAKPOINT *Breakpoint;
Current = GetFirstNode (&BreakpointList); Current = GetFirstNode (&BreakpointList);
while (!IsNull (&BreakpointList, Current)) { while (!IsNull (&BreakpointList, Current)) {
Breakpoint = ARM_SOFTWARE_BREAKPOINT_FROM_LINK(Current); Breakpoint = ARM_SOFTWARE_BREAKPOINT_FROM_LINK (Current);
if (Address == Breakpoint->Address) { if (Address == Breakpoint->Address) {
return Breakpoint; return Breakpoint;
@ -531,10 +527,10 @@ SearchBreakpointList (
VOID VOID
SetBreakpoint ( SetBreakpoint (
IN UINT32 Address IN UINT32 Address
) )
{ {
ARM_SOFTWARE_BREAKPOINT *Breakpoint; ARM_SOFTWARE_BREAKPOINT *Breakpoint;
Breakpoint = SearchBreakpointList (Address); Breakpoint = SearchBreakpointList (Address);
@ -543,7 +539,7 @@ SetBreakpoint (
} }
// create and fill breakpoint structure // create and fill breakpoint structure
Breakpoint = AllocatePool (sizeof(ARM_SOFTWARE_BREAKPOINT)); Breakpoint = AllocatePool (sizeof (ARM_SOFTWARE_BREAKPOINT));
Breakpoint->Signature = ARM_SOFTWARE_BREAKPOINT_SIGNATURE; Breakpoint->Signature = ARM_SOFTWARE_BREAKPOINT_SIGNATURE;
Breakpoint->Address = Address; Breakpoint->Address = Address;
@ -556,15 +552,15 @@ SetBreakpoint (
*(UINT32 *)Address = GDB_ARM_BKPT; *(UINT32 *)Address = GDB_ARM_BKPT;
InvalidateInstructionCacheRange ((VOID *)Address, 4); InvalidateInstructionCacheRange ((VOID *)Address, 4);
//DEBUG((DEBUG_ERROR, "SetBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, Breakpoint->Instruction, *(UINT32 *)Address)); // DEBUG((DEBUG_ERROR, "SetBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, Breakpoint->Instruction, *(UINT32 *)Address));
} }
VOID VOID
ClearBreakpoint ( ClearBreakpoint (
IN UINT32 Address IN UINT32 Address
) )
{ {
ARM_SOFTWARE_BREAKPOINT *Breakpoint; ARM_SOFTWARE_BREAKPOINT *Breakpoint;
Breakpoint = SearchBreakpointList (Address); Breakpoint = SearchBreakpointList (Address);
@ -579,7 +575,7 @@ ClearBreakpoint (
*(UINT32 *)Address = Breakpoint->Instruction; *(UINT32 *)Address = Breakpoint->Instruction;
InvalidateInstructionCacheRange ((VOID *)Address, 4); InvalidateInstructionCacheRange ((VOID *)Address, 4);
//DEBUG((DEBUG_ERROR, "ClearBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, GDB_ARM_BKPT, *(UINT32 *)Address)); // DEBUG((DEBUG_ERROR, "ClearBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, GDB_ARM_BKPT, *(UINT32 *)Address));
FreePool (Breakpoint); FreePool (Breakpoint);
} }
@ -588,13 +584,13 @@ VOID
EFIAPI EFIAPI
InsertBreakPoint ( InsertBreakPoint (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
UINTN Type; UINTN Type;
UINTN Address; UINTN Address;
UINTN Length; UINTN Length;
UINTN ErrorCode; UINTN ErrorCode;
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length); ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
if (ErrorCode > 0) { if (ErrorCode > 0) {
@ -603,11 +599,11 @@ InsertBreakPoint (
} }
switch (Type) { switch (Type) {
case 0: //Software breakpoint case 0: // Software breakpoint
break; break;
default : default:
DEBUG((DEBUG_ERROR, "Insert breakpoint default: %x\n", Type)); DEBUG ((DEBUG_ERROR, "Insert breakpoint default: %x\n", Type));
SendError (GDB_EINVALIDBRKPOINTTYPE); SendError (GDB_EINVALIDBRKPOINTTYPE);
return; return;
} }
@ -624,12 +620,12 @@ RemoveBreakPoint (
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
UINTN Type; UINTN Type;
UINTN Address; UINTN Address;
UINTN Length; UINTN Length;
UINTN ErrorCode; UINTN ErrorCode;
//Parse breakpoint packet data // Parse breakpoint packet data
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length); ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
if (ErrorCode > 0) { if (ErrorCode > 0) {
SendError ((UINT8)ErrorCode); SendError ((UINT8)ErrorCode);
@ -637,7 +633,7 @@ RemoveBreakPoint (
} }
switch (Type) { switch (Type) {
case 0: //Software breakpoint case 0: // Software breakpoint
break; break;
default: default:
@ -673,8 +669,8 @@ ValidateAddress (
BOOLEAN BOOLEAN
ValidateException ( ValidateException (
IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext IN OUT EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
UINT32 ExceptionAddress; UINT32 ExceptionAddress;

File diff suppressed because it is too large Load Diff

View File

@ -28,54 +28,51 @@
#include <Guid/DebugImageInfoTable.h> #include <Guid/DebugImageInfoTable.h>
#include <IndustryStandard/PeImage.h> #include <IndustryStandard/PeImage.h>
extern CONST CHAR8 mHexToStr[]; extern CONST CHAR8 mHexToStr[];
// maximum size of input and output buffers // maximum size of input and output buffers
// This value came from the show remote command of the gdb we tested against // This value came from the show remote command of the gdb we tested against
#define MAX_BUF_SIZE 2000 #define MAX_BUF_SIZE 2000
// maximum size of address buffer // maximum size of address buffer
#define MAX_ADDR_SIZE 32 #define MAX_ADDR_SIZE 32
// maximum size of register number buffer // maximum size of register number buffer
#define MAX_REG_NUM_BUF_SIZE 32 #define MAX_REG_NUM_BUF_SIZE 32
// maximum size of length buffer // maximum size of length buffer
#define MAX_LENGTH_SIZE 32 #define MAX_LENGTH_SIZE 32
// maximum size of T signal members // maximum size of T signal members
#define MAX_T_SIGNAL_SIZE 64 #define MAX_T_SIGNAL_SIZE 64
// the mask used to clear all the cache // the mask used to clear all the cache
#define TF_BIT 0x00000100 #define TF_BIT 0x00000100
// //
// GDB Signal definitions - generic names for interrupts // GDB Signal definitions - generic names for interrupts
// //
#define GDB_SIGILL 4 // Illegal instruction #define GDB_SIGILL 4 // Illegal instruction
#define GDB_SIGTRAP 5 // Trace Trap (Breakpoint and SingleStep) #define GDB_SIGTRAP 5 // Trace Trap (Breakpoint and SingleStep)
#define GDB_SIGEMT 7 // Emulator Trap #define GDB_SIGEMT 7 // Emulator Trap
#define GDB_SIGFPE 8 // Floating point exception #define GDB_SIGFPE 8 // Floating point exception
#define GDB_SIGSEGV 11 // Segment violation, page fault #define GDB_SIGSEGV 11 // Segment violation, page fault
// //
// GDB File I/O Error values, zero means no error // GDB File I/O Error values, zero means no error
// Includes all general GDB Unix like error values // Includes all general GDB Unix like error values
// //
#define GDB_EBADMEMADDRBUFSIZE 11 // the buffer that stores memory Address to be read from/written to is not the right size #define GDB_EBADMEMADDRBUFSIZE 11 // the buffer that stores memory Address to be read from/written to is not the right size
#define GDB_EBADMEMLENGBUFSIZE 12 // the buffer that stores Length is not the right size #define GDB_EBADMEMLENGBUFSIZE 12 // the buffer that stores Length is not the right size
#define GDB_EBADMEMLENGTH 13 // Length, the given number of bytes to read or write, is not the right size #define GDB_EBADMEMLENGTH 13 // Length, the given number of bytes to read or write, is not the right size
#define GDB_EBADMEMDATA 14 // one of the bytes or nibbles of the memory is less than 0 #define GDB_EBADMEMDATA 14 // one of the bytes or nibbles of the memory is less than 0
#define GDB_EBADMEMDATASIZE 15 // the memory data, 'XX..', is too short or too long #define GDB_EBADMEMDATASIZE 15 // the memory data, 'XX..', is too short or too long
#define GDB_EBADBUFSIZE 21 // the buffer created is not the correct size #define GDB_EBADBUFSIZE 21 // the buffer created is not the correct size
#define GDB_EINVALIDARG 31 // argument is invalid #define GDB_EINVALIDARG 31 // argument is invalid
#define GDB_ENOSPACE 41 // #define GDB_ENOSPACE 41 //
#define GDB_EINVALIDBRKPOINTTYPE 51 // the breakpoint type is not recognized #define GDB_EINVALIDBRKPOINTTYPE 51 // the breakpoint type is not recognized
#define GDB_EINVALIDREGNUM 61 // given register number is not valid: either <0 or >=Number of Registers #define GDB_EINVALIDREGNUM 61 // given register number is not valid: either <0 or >=Number of Registers
#define GDB_EUNKNOWN 255 // unknown #define GDB_EUNKNOWN 255 // unknown
// //
// These devices are open by GDB so we can just read and write to them // These devices are open by GDB so we can just read and write to them
@ -85,7 +82,7 @@ extern CONST CHAR8 mHexToStr[];
#define GDB_STDERR 0x02 #define GDB_STDERR 0x02
// //
//Define Register size for different architectures // Define Register size for different architectures
// //
#if defined (MDE_CPU_IA32) #if defined (MDE_CPU_IA32)
#define REG_SIZE 32 #define REG_SIZE 32
@ -95,12 +92,12 @@ extern CONST CHAR8 mHexToStr[];
#define REG_SIZE 32 #define REG_SIZE 32
#endif #endif
#define GDB_SERIAL_DEV_SIGNATURE SIGNATURE_32 ('g', 'd', 'b', 's') #define GDB_SERIAL_DEV_SIGNATURE SIGNATURE_32 ('g', 'd', 'b', 's')
typedef struct { typedef struct {
VENDOR_DEVICE_PATH VendorDevice; VENDOR_DEVICE_PATH VendorDevice;
UINT32 Index; // Support more than one UINT32 Index; // Support more than one
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
} GDB_SERIAL_DEVICE_PATH; } GDB_SERIAL_DEVICE_PATH;
// //
@ -113,25 +110,22 @@ typedef struct {
// DevicePath EFI_DEVICE_PATH_PROTOCOL *: Device path of the serial device // DevicePath EFI_DEVICE_PATH_PROTOCOL *: Device path of the serial device
// //
typedef struct { typedef struct {
UINTN Signature; UINTN Signature;
EFI_HANDLE Handle; EFI_HANDLE Handle;
EFI_SERIAL_IO_PROTOCOL SerialIo; EFI_SERIAL_IO_PROTOCOL SerialIo;
EFI_SERIAL_IO_MODE SerialMode; EFI_SERIAL_IO_MODE SerialMode;
GDB_SERIAL_DEVICE_PATH DevicePath; GDB_SERIAL_DEVICE_PATH DevicePath;
INTN InFileDescriptor; INTN InFileDescriptor;
INTN OutFileDescriptor; INTN OutFileDescriptor;
} GDB_SERIAL_DEV; } GDB_SERIAL_DEV;
#define GDB_SERIAL_DEV_FROM_THIS(a) CR (a, GDB_SERIAL_DEV, SerialIo, GDB_SERIAL_DEV_SIGNATURE)
#define GDB_SERIAL_DEV_FROM_THIS(a) CR (a, GDB_SERIAL_DEV, SerialIo, GDB_SERIAL_DEV_SIGNATURE)
typedef struct { typedef struct {
EFI_EXCEPTION_TYPE Exception; EFI_EXCEPTION_TYPE Exception;
UINT8 SignalNo; UINT8 SignalNo;
} EFI_EXCEPTION_TYPE_ENTRY; } EFI_EXCEPTION_TYPE_ENTRY;
#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
// //
@ -141,17 +135,17 @@ typedef struct {
// //
typedef union { typedef union {
struct { struct {
UINT32 B0:1; // Breakpoint condition detected UINT32 B0 : 1; // Breakpoint condition detected
UINT32 B1:1; // Breakpoint condition detected UINT32 B1 : 1; // Breakpoint condition detected
UINT32 B2:1; // Breakpoint condition detected UINT32 B2 : 1; // Breakpoint condition detected
UINT32 B3:1; // Breakpoint condition detected UINT32 B3 : 1; // Breakpoint condition detected
UINT32 Reserved_1:9; // Reserved UINT32 Reserved_1 : 9; // Reserved
UINT32 BD:1; // Debug register access detected UINT32 BD : 1; // Debug register access detected
UINT32 BS:1; // Single step UINT32 BS : 1; // Single step
UINT32 BT:1; // Task switch UINT32 BT : 1; // Task switch
UINT32 Reserved_2:16; // Reserved UINT32 Reserved_2 : 16; // Reserved
} Bits; } Bits;
UINTN UintN; UINTN UintN;
} IA32_DR6; } IA32_DR6;
// //
@ -161,65 +155,64 @@ typedef union {
// //
typedef union { typedef union {
struct { struct {
UINT32 L0:1; // Local breakpoint enable UINT32 L0 : 1; // Local breakpoint enable
UINT32 G0:1; // Global breakpoint enable UINT32 G0 : 1; // Global breakpoint enable
UINT32 L1:1; // Local breakpoint enable UINT32 L1 : 1; // Local breakpoint enable
UINT32 G1:1; // Global breakpoint enable UINT32 G1 : 1; // Global breakpoint enable
UINT32 L2:1; // Local breakpoint enable UINT32 L2 : 1; // Local breakpoint enable
UINT32 G2:1; // Global breakpoint enable UINT32 G2 : 1; // Global breakpoint enable
UINT32 L3:1; // Local breakpoint enable UINT32 L3 : 1; // Local breakpoint enable
UINT32 G3:1; // Global breakpoint enable UINT32 G3 : 1; // Global breakpoint enable
UINT32 LE:1; // Local exact breakpoint enable UINT32 LE : 1; // Local exact breakpoint enable
UINT32 GE:1; // Global exact breakpoint enable UINT32 GE : 1; // Global exact breakpoint enable
UINT32 Reserved_1:3; // Reserved UINT32 Reserved_1 : 3; // Reserved
UINT32 GD:1; // Global detect enable UINT32 GD : 1; // Global detect enable
UINT32 Reserved_2:2; // Reserved UINT32 Reserved_2 : 2; // Reserved
UINT32 RW0:2; // Read/Write field UINT32 RW0 : 2; // Read/Write field
UINT32 LEN0:2; // Length field UINT32 LEN0 : 2; // Length field
UINT32 RW1:2; // Read/Write field UINT32 RW1 : 2; // Read/Write field
UINT32 LEN1:2; // Length field UINT32 LEN1 : 2; // Length field
UINT32 RW2:2; // Read/Write field UINT32 RW2 : 2; // Read/Write field
UINT32 LEN2:2; // Length field UINT32 LEN2 : 2; // Length field
UINT32 RW3:2; // Read/Write field UINT32 RW3 : 2; // Read/Write field
UINT32 LEN3:2; // Length field UINT32 LEN3 : 2; // Length field
} Bits; } Bits;
UINTN UintN; UINTN UintN;
} IA32_DR7; } IA32_DR7;
#endif /* if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) */ #endif /* if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) */
typedef enum { typedef enum {
InstructionExecution, //Hardware breakpoint InstructionExecution, // Hardware breakpoint
DataWrite, //watch DataWrite, // watch
DataRead, //rwatch DataRead, // rwatch
DataReadWrite, //awatch DataReadWrite, // awatch
SoftwareBreakpoint, //Software breakpoint SoftwareBreakpoint, // Software breakpoint
NotSupported NotSupported
} BREAK_TYPE; } BREAK_TYPE;
// //
// Array of exception types that need to be hooked by the debugger // Array of exception types that need to be hooked by the debugger
// //
extern EFI_EXCEPTION_TYPE_ENTRY gExceptionType[]; extern EFI_EXCEPTION_TYPE_ENTRY gExceptionType[];
// //
// Set TRUE if F Reply package signals a ctrl-c. We can not process the Ctrl-c // Set TRUE if F Reply package signals a ctrl-c. We can not process the Ctrl-c
// here we need to wait for the periodic callback to do this. // here we need to wait for the periodic callback to do this.
// //
extern BOOLEAN gCtrlCBreakFlag; extern BOOLEAN gCtrlCBreakFlag;
// //
// If the periodic callback is called while we are processing an F packet we need // If the periodic callback is called while we are processing an F packet we need
// to let the callback know to not read from the serial stream as it could steal // to let the callback know to not read from the serial stream as it could steal
// characters from the F response packet // characters from the F response packet
// //
extern BOOLEAN gProcessingFPacket; extern BOOLEAN gProcessingFPacket;
// The offsets of registers SystemContext. // The offsets of registers SystemContext.
// The fields in the array are in the gdb ordering. // The fields in the array are in the gdb ordering.
// //
extern UINTN gRegisterOffsets[]; extern UINTN gRegisterOffsets[];
/** /**
Return the number of entries in the gExceptionType[] Return the number of entries in the gExceptionType[]
@ -231,7 +224,6 @@ MaxEfiException (
VOID VOID
); );
/** /**
Return the number of entries in the gRegisters[] Return the number of entries in the gRegisters[]
@ -242,7 +234,6 @@ MaxRegisterCount (
VOID VOID
); );
/** /**
Check to see if the ISA is supported. Check to see if the ISA is supported.
ISA = Instruction Set Architecture ISA = Instruction Set Architecture
@ -252,10 +243,9 @@ MaxRegisterCount (
**/ **/
BOOLEAN BOOLEAN
CheckIsa ( CheckIsa (
IN EFI_INSTRUCTION_SET_ARCHITECTURE Isa IN EFI_INSTRUCTION_SET_ARCHITECTURE Isa
); );
/** /**
Send the T signal with the given exception type (in gdb order) and possibly with n:r pairs related to the watchpoints Send the T signal with the given exception type (in gdb order) and possibly with n:r pairs related to the watchpoints
@ -269,7 +259,6 @@ GdbSendTSignal (
IN UINT8 GdbExceptionType IN UINT8 GdbExceptionType
); );
/** /**
Translates the EFI mapping to GDB mapping Translates the EFI mapping to GDB mapping
@ -278,10 +267,9 @@ GdbSendTSignal (
**/ **/
UINT8 UINT8
ConvertEFItoGDBtype ( ConvertEFItoGDBtype (
IN EFI_EXCEPTION_TYPE EFIExceptionType IN EFI_EXCEPTION_TYPE EFIExceptionType
); );
/** /**
Empties the given buffer Empties the given buffer
@param *Buf pointer to the first element in buffer to be emptied @param *Buf pointer to the first element in buffer to be emptied
@ -291,7 +279,6 @@ EmptyBuffer (
IN CHAR8 *Buf IN CHAR8 *Buf
); );
/** /**
Converts an 8-bit Hex Char into a INTN. Converts an 8-bit Hex Char into a INTN.
@ -301,10 +288,9 @@ EmptyBuffer (
**/ **/
INTN INTN
HexCharToInt ( HexCharToInt (
IN CHAR8 Char IN CHAR8 Char
); );
/** 'E NN' /** 'E NN'
Send an error with the given error number after converting to hex. Send an error with the given error number after converting to hex.
The error number is put into the buffer in hex. '255' is the biggest errno we can send. The error number is put into the buffer in hex. '255' is the biggest errno we can send.
@ -315,10 +301,9 @@ HexCharToInt (
VOID VOID
EFIAPI EFIAPI
SendError ( SendError (
IN UINT8 ErrorNum IN UINT8 ErrorNum
); );
/** /**
Send 'OK' when the function is done executing successfully. Send 'OK' when the function is done executing successfully.
**/ **/
@ -328,7 +313,6 @@ SendSuccess (
VOID VOID
); );
/** /**
Send empty packet to specify that particular command/functionality is not supported. Send empty packet to specify that particular command/functionality is not supported.
**/ **/
@ -349,7 +333,6 @@ ReadNthRegister (
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
); );
/** g /** g
Reads the general registers into an output buffer and sends it as a packet Reads the general registers into an output buffer and sends it as a packet
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -360,7 +343,6 @@ ReadGeneralRegisters (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
); );
/** P n...=r... /** P n...=r...
Writes the new value of n-th register received into the input buffer to the n-th register Writes the new value of n-th register received into the input buffer to the n-th register
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -373,7 +355,6 @@ WriteNthRegister (
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
); );
/** G XX... /** G XX...
Writes the new values received into the input buffer to the general registers Writes the new values received into the input buffer to the general registers
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -387,7 +368,6 @@ WriteGeneralRegisters (
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
); );
/** m addr,length /** m addr,length
Find the Length of the area to read and the start address. Finally, pass them to Find the Length of the area to read and the start address. Finally, pass them to
another function, TransferFromMemToOutBufAndSend, that will read from that memory space and another function, TransferFromMemToOutBufAndSend, that will read from that memory space and
@ -401,7 +381,6 @@ ReadFromMemory (
IN CHAR8 *PacketData IN CHAR8 *PacketData
); );
/** M addr,length :XX... /** M addr,length :XX...
Find the Length of the area in bytes to write and the start address. Finally, pass them to Find the Length of the area in bytes to write and the start address. Finally, pass them to
another function, TransferFromInBufToMem, that will write to that memory space the info in another function, TransferFromInBufToMem, that will write to that memory space the info in
@ -412,10 +391,9 @@ ReadFromMemory (
VOID VOID
EFIAPI EFIAPI
WriteToMemory ( WriteToMemory (
IN CHAR8 *PacketData IN CHAR8 *PacketData
); );
/** c [addr ] /** c [addr ]
Continue. addr is Address to resume. If addr is omitted, resume at current Continue. addr is Address to resume. If addr is omitted, resume at current
Address. Address.
@ -427,11 +405,10 @@ WriteToMemory (
VOID VOID
EFIAPI EFIAPI
ContinueAtAddress ( ContinueAtAddress (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
); );
/** s [addr ] /** s [addr ]
Single step. addr is the Address at which to resume. If addr is omitted, resume Single step. addr is the Address at which to resume. If addr is omitted, resume
at same Address. at same Address.
@ -466,7 +443,6 @@ RemoveSingleStep (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
); );
/** /**
Z1, [addr], [length] Z1, [addr], [length]
Z2, [addr], [length] Z2, [addr], [length]
@ -481,12 +457,11 @@ RemoveSingleStep (
**/ **/
VOID VOID
EFIAPI EFIAPI
InsertBreakPoint( InsertBreakPoint (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
); );
/** /**
z1, [addr], [length] z1, [addr], [length]
z2, [addr], [length] z2, [addr], [length]
@ -501,12 +476,11 @@ InsertBreakPoint(
**/ **/
VOID VOID
EFIAPI EFIAPI
RemoveBreakPoint( RemoveBreakPoint (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
); );
/** /**
Exception Handler for GDB. It will be called for all exceptions Exception Handler for GDB. It will be called for all exceptions
registered via the gExceptionType[] array. registered via the gExceptionType[] array.
@ -522,7 +496,6 @@ GdbExceptionHandler (
IN OUT EFI_SYSTEM_CONTEXT SystemContext IN OUT EFI_SYSTEM_CONTEXT SystemContext
); );
/** /**
Periodic callback for GDB. This function is used to catch a ctrl-c or other Periodic callback for GDB. This function is used to catch a ctrl-c or other
break in type command from GDB. break in type command from GDB.
@ -536,7 +509,6 @@ GdbPeriodicCallBack (
IN OUT EFI_SYSTEM_CONTEXT SystemContext IN OUT EFI_SYSTEM_CONTEXT SystemContext
); );
/** /**
Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB. Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
@ -549,7 +521,6 @@ GdbInitializeSerialConsole (
VOID VOID
); );
/** /**
Send a GDB Remote Serial Protocol Packet Send a GDB Remote Serial Protocol Packet
@ -566,10 +537,9 @@ GdbInitializeSerialConsole (
**/ **/
UINTN UINTN
SendPacket ( SendPacket (
IN CHAR8 *PacketData IN CHAR8 *PacketData
); );
/** /**
Receive a GDB Remote Serial Protocol Packet Receive a GDB Remote Serial Protocol Packet
@ -588,10 +558,9 @@ SendPacket (
**/ **/
UINTN UINTN
ReceivePacket ( ReceivePacket (
OUT CHAR8 *PacketData, OUT CHAR8 *PacketData,
IN UINTN PacketDataSize IN UINTN PacketDataSize
); );
/** /**
Read data from a FileDescriptor. On success number of bytes read is returned. Zero indicates Read data from a FileDescriptor. On success number of bytes read is returned. Zero indicates
@ -607,12 +576,11 @@ ReceivePacket (
**/ **/
INTN INTN
GdbRead ( GdbRead (
IN INTN FileDescriptor, IN INTN FileDescriptor,
OUT VOID *Buffer, OUT VOID *Buffer,
IN UINTN Count IN UINTN Count
); );
/** /**
Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates
nothing was written. On error -1 is returned. nothing was written. On error -1 is returned.
@ -627,29 +595,29 @@ GdbRead (
**/ **/
INTN INTN
GdbWrite ( GdbWrite (
IN INTN FileDescriptor, IN INTN FileDescriptor,
OUT CONST VOID *Buffer, OUT CONST VOID *Buffer,
IN UINTN Count IN UINTN Count
); );
UINTN * UINTN *
FindPointerToRegister ( FindPointerToRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN RegNumber IN UINTN RegNumber
); );
CHAR8 * CHAR8 *
BasicReadRegister ( BasicReadRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN RegNumber, IN UINTN RegNumber,
IN CHAR8 *OutBufPtr IN CHAR8 *OutBufPtr
); );
VOID VOID
TransferFromInBufToMem ( TransferFromInBufToMem (
IN UINTN Length, IN UINTN Length,
IN UINT8 *Address, IN UINT8 *Address,
IN CHAR8 *NewData IN CHAR8 *NewData
); );
VOID VOID
@ -660,22 +628,22 @@ TransferFromMemToOutBufAndSend (
CHAR8 * CHAR8 *
BasicWriteRegister ( BasicWriteRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN RegNumber, IN UINTN RegNumber,
IN CHAR8 *InBufPtr IN CHAR8 *InBufPtr
); );
VOID VOID
PrintReg ( PrintReg (
EFI_SYSTEM_CONTEXT SystemContext EFI_SYSTEM_CONTEXT SystemContext
); );
UINTN UINTN
ParseBreakpointPacket ( ParseBreakpointPacket (
IN CHAR8 *PacketData, IN CHAR8 *PacketData,
OUT UINTN *Type, OUT UINTN *Type,
OUT UINTN *Address, OUT UINTN *Address,
OUT UINTN *Length OUT UINTN *Length
); );
UINTN UINTN
@ -717,18 +685,18 @@ EnableDebugRegister (
EFI_STATUS EFI_STATUS
FindMatchingDebugRegister ( FindMatchingDebugRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN Address, IN UINTN Address,
IN UINTN Length, IN UINTN Length,
IN UINTN Type, IN UINTN Type,
OUT UINTN *Register OUT UINTN *Register
); );
EFI_STATUS EFI_STATUS
DisableDebugRegister ( DisableDebugRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN Register IN UINTN Register
); );
VOID VOID
InitializeProcessor ( InitializeProcessor (
@ -742,8 +710,8 @@ ValidateAddress (
BOOLEAN BOOLEAN
ValidateException ( ValidateException (
IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext IN OUT EFI_SYSTEM_CONTEXT SystemContext
); );
#endif #endif

View File

@ -13,52 +13,50 @@
// Array of exception types that need to be hooked by the debugger // Array of exception types that need to be hooked by the debugger
// {EFI mapping, GDB mapping} // {EFI mapping, GDB mapping}
// //
EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = { EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
{ EXCEPT_IA32_DIVIDE_ERROR, GDB_SIGFPE }, { EXCEPT_IA32_DIVIDE_ERROR, GDB_SIGFPE },
{ EXCEPT_IA32_DEBUG, GDB_SIGTRAP }, { EXCEPT_IA32_DEBUG, GDB_SIGTRAP },
{ EXCEPT_IA32_NMI, GDB_SIGEMT }, { EXCEPT_IA32_NMI, GDB_SIGEMT },
{ EXCEPT_IA32_BREAKPOINT, GDB_SIGTRAP }, { EXCEPT_IA32_BREAKPOINT, GDB_SIGTRAP },
{ EXCEPT_IA32_OVERFLOW, GDB_SIGSEGV }, { EXCEPT_IA32_OVERFLOW, GDB_SIGSEGV },
{ EXCEPT_IA32_BOUND, GDB_SIGSEGV }, { EXCEPT_IA32_BOUND, GDB_SIGSEGV },
{ EXCEPT_IA32_INVALID_OPCODE, GDB_SIGILL }, { EXCEPT_IA32_INVALID_OPCODE, GDB_SIGILL },
{ EXCEPT_IA32_DOUBLE_FAULT, GDB_SIGEMT }, { EXCEPT_IA32_DOUBLE_FAULT, GDB_SIGEMT },
{ EXCEPT_IA32_STACK_FAULT, GDB_SIGSEGV }, { EXCEPT_IA32_STACK_FAULT, GDB_SIGSEGV },
{ EXCEPT_IA32_GP_FAULT, GDB_SIGSEGV }, { EXCEPT_IA32_GP_FAULT, GDB_SIGSEGV },
{ EXCEPT_IA32_PAGE_FAULT, GDB_SIGSEGV }, { EXCEPT_IA32_PAGE_FAULT, GDB_SIGSEGV },
{ EXCEPT_IA32_FP_ERROR, GDB_SIGEMT }, { EXCEPT_IA32_FP_ERROR, GDB_SIGEMT },
{ EXCEPT_IA32_ALIGNMENT_CHECK, GDB_SIGEMT }, { EXCEPT_IA32_ALIGNMENT_CHECK, GDB_SIGEMT },
{ EXCEPT_IA32_MACHINE_CHECK, GDB_SIGEMT } { EXCEPT_IA32_MACHINE_CHECK, GDB_SIGEMT }
}; };
// The offsets of registers SystemContext. // The offsets of registers SystemContext.
// The fields in the array are in the gdb ordering. // The fields in the array are in the gdb ordering.
// //
//16 regs // 16 regs
UINTN gRegisterOffsets[] = { UINTN gRegisterOffsets[] = {
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Eax), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Eax),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ecx), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ecx),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Edx), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Edx),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ebx), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ebx),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Esp), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Esp),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ebp), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ebp),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Esi), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Esi),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Edi), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Edi),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Eip), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Eip),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Eflags), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Eflags),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Cs), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Cs),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ss), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ss),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ds), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ds),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Es), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Es),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Fs), OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Fs),
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Gs) OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Gs)
}; };
// Debug only..
//Debug only..
VOID VOID
PrintReg ( PrintReg (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
Print ((CHAR16 *)L"EAX: %x ", SystemContext.SystemContextIa32->Eax); Print ((CHAR16 *)L"EAX: %x ", SystemContext.SystemContextIa32->Eax);
@ -73,10 +71,10 @@ PrintReg (
Print ((CHAR16 *)L"EFlags: %x\n", SystemContext.SystemContextIa32->Eflags); Print ((CHAR16 *)L"EFlags: %x\n", SystemContext.SystemContextIa32->Eflags);
} }
//Debug only.. // Debug only..
VOID VOID
PrintDRreg ( PrintDRreg (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
Print ((CHAR16 *)L"DR0: %x ", SystemContext.SystemContextIa32->Dr0); Print ((CHAR16 *)L"DR0: %x ", SystemContext.SystemContextIa32->Dr0);
@ -87,7 +85,6 @@ PrintDRreg (
Print ((CHAR16 *)L"DR7: %x\n", SystemContext.SystemContextIa32->Dr7); Print ((CHAR16 *)L"DR7: %x\n", SystemContext.SystemContextIa32->Dr7);
} }
/** /**
Return the number of entries in the gExceptionType[] Return the number of entries in the gExceptionType[]
@ -101,7 +98,6 @@ MaxEfiException (
return sizeof (gExceptionType)/sizeof (EFI_EXCEPTION_TYPE_ENTRY); return sizeof (gExceptionType)/sizeof (EFI_EXCEPTION_TYPE_ENTRY);
} }
/** /**
Return the number of entries in the gRegisters[] Return the number of entries in the gRegisters[]
@ -115,7 +111,6 @@ MaxRegisterCount (
return sizeof (gRegisterOffsets)/sizeof (UINTN); return sizeof (gRegisterOffsets)/sizeof (UINTN);
} }
/** /**
Check to see if the ISA is supported. Check to see if the ISA is supported.
ISA = Instruction Set Architecture ISA = Instruction Set Architecture
@ -131,7 +126,6 @@ CheckIsa (
return (BOOLEAN)(Isa == IsaIa32); return (BOOLEAN)(Isa == IsaIa32);
} }
/** /**
This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering
It is, by default, set to find the register pointer of the IA32 member It is, by default, set to find the register pointer of the IA32 member
@ -146,12 +140,12 @@ FindPointerToRegister (
IN UINTN RegNumber IN UINTN RegNumber
) )
{ {
UINT8 *TempPtr; UINT8 *TempPtr;
TempPtr = ((UINT8 *)SystemContext.SystemContextIa32) + gRegisterOffsets[RegNumber]; TempPtr = ((UINT8 *)SystemContext.SystemContextIa32) + gRegisterOffsets[RegNumber];
return (UINTN *)TempPtr; return (UINTN *)TempPtr;
} }
/** /**
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
@ -162,23 +156,23 @@ FindPointerToRegister (
**/ **/
CHAR8 * CHAR8 *
BasicReadRegister ( BasicReadRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN RegNumber, IN UINTN RegNumber,
IN CHAR8 *OutBufPtr IN CHAR8 *OutBufPtr
) )
{ {
UINTN RegSize; UINTN RegSize;
RegSize = 0; RegSize = 0;
while (RegSize < REG_SIZE) { while (RegSize < REG_SIZE) {
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> (RegSize+4)) & 0xf)]; *OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> (RegSize+4)) & 0xf)];
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)]; *OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
RegSize = RegSize + 8; RegSize = RegSize + 8;
} }
return OutBufPtr; return OutBufPtr;
} }
/** p n /** p n
Reads the n-th register's value into an output buffer and sends it as a packet Reads the n-th register's value into an output buffer and sends it as a packet
@ -188,17 +182,17 @@ BasicReadRegister (
VOID VOID
EFIAPI EFIAPI
ReadNthRegister ( ReadNthRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
) )
{ {
UINTN RegNumber; UINTN RegNumber;
CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq) CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq)
CHAR8 *OutBufPtr; // pointer to the output buffer CHAR8 *OutBufPtr; // pointer to the output buffer
RegNumber = AsciiStrHexToUintn (&InBuffer[1]); RegNumber = AsciiStrHexToUintn (&InBuffer[1]);
if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount())) { if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount ())) {
SendError (GDB_EINVALIDREGNUM); SendError (GDB_EINVALIDREGNUM);
return; return;
} }
@ -207,10 +201,9 @@ ReadNthRegister (
OutBufPtr = BasicReadRegister (SystemContext, RegNumber, OutBufPtr); OutBufPtr = BasicReadRegister (SystemContext, RegNumber, OutBufPtr);
*OutBufPtr = '\0'; // the end of the buffer *OutBufPtr = '\0'; // the end of the buffer
SendPacket(OutBuffer); SendPacket (OutBuffer);
} }
/** g /** g
Reads the general registers into an output buffer and sends it as a packet Reads the general registers into an output buffer and sends it as a packet
@ -219,23 +212,23 @@ ReadNthRegister (
VOID VOID
EFIAPI EFIAPI
ReadGeneralRegisters ( ReadGeneralRegisters (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
UINTN i; UINTN i;
CHAR8 OutBuffer[129]; // 16 regs, 8 hex chars each, and the end '\0' (escape seq) CHAR8 OutBuffer[129]; // 16 regs, 8 hex chars each, and the end '\0' (escape seq)
CHAR8 *OutBufPtr; // pointer to the output buffer CHAR8 *OutBufPtr; // pointer to the output buffer
OutBufPtr = OutBuffer; OutBufPtr = OutBuffer;
for (i = 0 ; i < MaxRegisterCount() ; i++) { // there are only 16 registers to read for (i = 0; i < MaxRegisterCount (); i++) {
// there are only 16 registers to read
OutBufPtr = BasicReadRegister (SystemContext, i, OutBufPtr); OutBufPtr = BasicReadRegister (SystemContext, i, OutBufPtr);
} }
*OutBufPtr = '\0'; // the end of the buffer *OutBufPtr = '\0'; // the end of the buffer
SendPacket(OutBuffer); SendPacket (OutBuffer);
} }
/** /**
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
@ -246,27 +239,27 @@ ReadGeneralRegisters (
**/ **/
CHAR8 * CHAR8 *
BasicWriteRegister ( BasicWriteRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN RegNumber, IN UINTN RegNumber,
IN CHAR8 *InBufPtr IN CHAR8 *InBufPtr
) )
{ {
UINTN RegSize; UINTN RegSize;
UINTN TempValue; // the value transferred from a hex char UINTN TempValue; // the value transferred from a hex char
UINT32 NewValue; // the new value of the RegNumber-th Register UINT32 NewValue; // the new value of the RegNumber-th Register
NewValue = 0; NewValue = 0;
RegSize = 0; RegSize = 0;
while (RegSize < REG_SIZE) { while (RegSize < REG_SIZE) {
TempValue = HexCharToInt(*InBufPtr++); TempValue = HexCharToInt (*InBufPtr++);
if (TempValue < 0) { if (TempValue < 0) {
SendError (GDB_EBADMEMDATA); SendError (GDB_EBADMEMDATA);
return NULL; return NULL;
} }
NewValue += (TempValue << (RegSize+4)); NewValue += (TempValue << (RegSize+4));
TempValue = HexCharToInt(*InBufPtr++); TempValue = HexCharToInt (*InBufPtr++);
if (TempValue < 0) { if (TempValue < 0) {
SendError (GDB_EBADMEMDATA); SendError (GDB_EBADMEMDATA);
@ -274,13 +267,13 @@ BasicWriteRegister (
} }
NewValue += (TempValue << RegSize); NewValue += (TempValue << RegSize);
RegSize = RegSize + 8; RegSize = RegSize + 8;
} }
*(FindPointerToRegister (SystemContext, RegNumber)) = NewValue; *(FindPointerToRegister (SystemContext, RegNumber)) = NewValue;
return InBufPtr; return InBufPtr;
} }
/** P n...=r... /** P n...=r...
Writes the new value of n-th register received into the input buffer to the n-th register Writes the new value of n-th register received into the input buffer to the n-th register
@ -290,35 +283,36 @@ BasicWriteRegister (
VOID VOID
EFIAPI EFIAPI
WriteNthRegister ( WriteNthRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
) )
{ {
UINTN RegNumber; UINTN RegNumber;
CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array
CHAR8 *RegNumBufPtr; CHAR8 *RegNumBufPtr;
CHAR8 *InBufPtr; // pointer to the input buffer CHAR8 *InBufPtr; // pointer to the input buffer
// find the register number to write // find the register number to write
InBufPtr = &InBuffer[1]; InBufPtr = &InBuffer[1];
RegNumBufPtr = RegNumBuffer; RegNumBufPtr = RegNumBuffer;
while (*InBufPtr != '=') { while (*InBufPtr != '=') {
*RegNumBufPtr++ = *InBufPtr++; *RegNumBufPtr++ = *InBufPtr++;
} }
*RegNumBufPtr = '\0'; *RegNumBufPtr = '\0';
RegNumber = AsciiStrHexToUintn (RegNumBuffer); RegNumber = AsciiStrHexToUintn (RegNumBuffer);
// check if this is a valid Register Number // check if this is a valid Register Number
if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount())) { if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount ())) {
SendError (GDB_EINVALIDREGNUM); SendError (GDB_EINVALIDREGNUM);
return; return;
} }
InBufPtr++; // skips the '=' character InBufPtr++; // skips the '=' character
BasicWriteRegister (SystemContext, RegNumber, InBufPtr); BasicWriteRegister (SystemContext, RegNumber, InBufPtr);
SendSuccess(); SendSuccess ();
} }
/** G XX... /** G XX...
Writes the new values received into the input buffer to the general registers Writes the new values received into the input buffer to the general registers
@ -328,17 +322,18 @@ WriteNthRegister (
VOID VOID
EFIAPI EFIAPI
WriteGeneralRegisters ( WriteGeneralRegisters (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
) )
{ {
UINTN i; UINTN i;
CHAR8 *InBufPtr; /// pointer to the input buffer CHAR8 *InBufPtr; /// pointer to the input buffer
// check to see if the buffer is the right size which is // check to see if the buffer is the right size which is
// 1 (for 'G') + 16 (for 16 registers) * 8 ( for 8 hex chars each) = 129 // 1 (for 'G') + 16 (for 16 registers) * 8 ( for 8 hex chars each) = 129
if (AsciiStrLen(InBuffer) != 129) { // 16 regs, 8 hex chars each, and the end '\0' (escape seq) if (AsciiStrLen (InBuffer) != 129) {
//Bad message. Message is not the right length // 16 regs, 8 hex chars each, and the end '\0' (escape seq)
// Bad message. Message is not the right length
SendError (GDB_EBADBUFSIZE); SendError (GDB_EBADBUFSIZE);
return; return;
} }
@ -347,14 +342,14 @@ WriteGeneralRegisters (
// Read the new values for the registers from the input buffer to an array, NewValueArray. // Read the new values for the registers from the input buffer to an array, NewValueArray.
// The values in the array are in the gdb ordering // The values in the array are in the gdb ordering
for (i=0; i < MaxRegisterCount(); i++) { // there are only 16 registers to write for (i = 0; i < MaxRegisterCount (); i++) {
// there are only 16 registers to write
InBufPtr = BasicWriteRegister (SystemContext, i, InBufPtr); InBufPtr = BasicWriteRegister (SystemContext, i, InBufPtr);
} }
SendSuccess(); SendSuccess ();
} }
/** /**
Insert Single Step in the SystemContext Insert Single Step in the SystemContext
@ -365,10 +360,9 @@ AddSingleStep (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
SystemContext.SystemContextIa32->Eflags |= TF_BIT; //Setting the TF bit. SystemContext.SystemContextIa32->Eflags |= TF_BIT; // Setting the TF bit.
} }
/** /**
Remove Single Step in the SystemContext Remove Single Step in the SystemContext
@ -382,8 +376,6 @@ RemoveSingleStep (
SystemContext.SystemContextIa32->Eflags &= ~TF_BIT; // clearing the TF bit. SystemContext.SystemContextIa32->Eflags &= ~TF_BIT; // clearing the TF bit.
} }
/** c [addr ] /** c [addr ]
Continue. addr is Address to resume. If addr is omitted, resume at current Continue. addr is Address to resume. If addr is omitted, resume at current
Address. Address.
@ -393,8 +385,8 @@ RemoveSingleStep (
VOID VOID
EFIAPI EFIAPI
ContinueAtAddress ( ContinueAtAddress (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
if (PacketData[1] != '\0') { if (PacketData[1] != '\0') {
@ -402,7 +394,6 @@ ContinueAtAddress (
} }
} }
/** s [addr ] /** s [addr ]
Single step. addr is the Address at which to resume. If addr is omitted, resume Single step. addr is the Address at which to resume. If addr is omitted, resume
at same Address. at same Address.
@ -412,8 +403,8 @@ ContinueAtAddress (
VOID VOID
EFIAPI EFIAPI
SingleStep ( SingleStep (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
if (PacketData[1] != '\0') { if (PacketData[1] != '\0') {
@ -423,7 +414,6 @@ SingleStep (
AddSingleStep (SystemContext); AddSingleStep (SystemContext);
} }
/** /**
Returns breakpoint data address from DR0-DR3 based on the input breakpoint number Returns breakpoint data address from DR0-DR3 based on the input breakpoint number
@ -439,7 +429,7 @@ GetBreakpointDataAddress (
IN UINTN BreakpointNumber IN UINTN BreakpointNumber
) )
{ {
UINTN Address; UINTN Address;
if (BreakpointNumber == 1) { if (BreakpointNumber == 1) {
Address = SystemContext.SystemContextIa32->Dr0; Address = SystemContext.SystemContextIa32->Dr0;
@ -456,7 +446,6 @@ GetBreakpointDataAddress (
return Address; return Address;
} }
/** /**
Returns currently detected breakpoint value based on the register DR6 B0-B3 field. Returns currently detected breakpoint value based on the register DR6 B0-B3 field.
If no breakpoint is detected then it returns 0. If no breakpoint is detected then it returns 0.
@ -472,8 +461,8 @@ GetBreakpointDetected (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
IA32_DR6 Dr6; IA32_DR6 Dr6;
UINTN BreakpointNumber; UINTN BreakpointNumber;
Dr6.UintN = SystemContext.SystemContextIa32->Dr6; Dr6.UintN = SystemContext.SystemContextIa32->Dr6;
@ -486,13 +475,12 @@ GetBreakpointDetected (
} else if (Dr6.Bits.B3 == 1) { } else if (Dr6.Bits.B3 == 1) {
BreakpointNumber = 4; BreakpointNumber = 4;
} else { } else {
BreakpointNumber = 0; //No breakpoint detected BreakpointNumber = 0; // No breakpoint detected
} }
return BreakpointNumber; return BreakpointNumber;
} }
/** /**
Returns Breakpoint type (InstructionExecution, DataWrite, DataRead or DataReadWrite) Returns Breakpoint type (InstructionExecution, DataWrite, DataRead or DataReadWrite)
based on the Breakpoint number based on the Breakpoint number
@ -510,25 +498,24 @@ GetBreakpointType (
IN UINTN BreakpointNumber IN UINTN BreakpointNumber
) )
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
BREAK_TYPE Type = NotSupported; //Default is NotSupported type BREAK_TYPE Type = NotSupported; // Default is NotSupported type
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
if (BreakpointNumber == 1) { if (BreakpointNumber == 1) {
Type = (BREAK_TYPE) Dr7.Bits.RW0; Type = (BREAK_TYPE)Dr7.Bits.RW0;
} else if (BreakpointNumber == 2) { } else if (BreakpointNumber == 2) {
Type = (BREAK_TYPE) Dr7.Bits.RW1; Type = (BREAK_TYPE)Dr7.Bits.RW1;
} else if (BreakpointNumber == 3) { } else if (BreakpointNumber == 3) {
Type = (BREAK_TYPE) Dr7.Bits.RW2; Type = (BREAK_TYPE)Dr7.Bits.RW2;
} else if (BreakpointNumber == 4) { } else if (BreakpointNumber == 4) {
Type = (BREAK_TYPE) Dr7.Bits.RW3; Type = (BREAK_TYPE)Dr7.Bits.RW3;
} }
return Type; return Type;
} }
/** /**
Parses Length and returns the length which DR7 LENn field accepts. Parses Length and returns the length which DR7 LENn field accepts.
For example: If we receive 1-Byte length then we should return 0. For example: If we receive 1-Byte length then we should return 0.
@ -541,21 +528,24 @@ GetBreakpointType (
**/ **/
UINTN UINTN
ConvertLengthData ( ConvertLengthData (
IN UINTN Length IN UINTN Length
) )
{ {
if (Length == 1) { //1-Byte length if (Length == 1) {
// 1-Byte length
return 0; return 0;
} else if (Length == 2) { //2-Byte length } else if (Length == 2) {
// 2-Byte length
return 1; return 1;
} else if (Length == 4) { //4-Byte length } else if (Length == 4) {
// 4-Byte length
return 3; return 3;
} else { //Undefined or 8-byte length } else {
// Undefined or 8-byte length
return 2; return 2;
} }
} }
/** /**
Finds the next free debug register. If all the registers are occupied then Finds the next free debug register. If all the registers are occupied then
EFI_OUT_OF_RESOURCES is returned. EFI_OUT_OF_RESOURCES is returned.
@ -572,7 +562,7 @@ FindNextFreeDebugRegister (
OUT UINTN *Register OUT UINTN *Register
) )
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
@ -591,7 +581,6 @@ FindNextFreeDebugRegister (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Enables the debug register. Writes Address value to appropriate DR0-3 register. Enables the debug register. Writes Address value to appropriate DR0-3 register.
Sets LENn, Gn, RWn bits in DR7 register. Sets LENn, Gn, RWn bits in DR7 register.
@ -616,56 +605,56 @@ EnableDebugRegister (
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
//Convert length data // Convert length data
Length = ConvertLengthData (Length); Length = ConvertLengthData (Length);
//For Instruction execution, length should be 0 // For Instruction execution, length should be 0
//(Ref. Intel reference manual 18.2.4) // (Ref. Intel reference manual 18.2.4)
if ((Type == 0) && (Length != 0)) { if ((Type == 0) && (Length != 0)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
//Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle // Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
//software breakpoint. We should send empty packet in both these cases. // software breakpoint. We should send empty packet in both these cases.
if ((Type == (BREAK_TYPE)DataRead) || if ((Type == (BREAK_TYPE)DataRead) ||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) { (Type == (BREAK_TYPE)SoftwareBreakpoint))
{
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
//Read DR7 so appropriate Gn, RWn and LENn bits can be modified. // Read DR7 so appropriate Gn, RWn and LENn bits can be modified.
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
if (Register == 0) { if (Register == 0) {
SystemContext.SystemContextIa32->Dr0 = Address; SystemContext.SystemContextIa32->Dr0 = Address;
Dr7.Bits.G0 = 1; Dr7.Bits.G0 = 1;
Dr7.Bits.RW0 = Type; Dr7.Bits.RW0 = Type;
Dr7.Bits.LEN0 = Length; Dr7.Bits.LEN0 = Length;
} else if (Register == 1) { } else if (Register == 1) {
SystemContext.SystemContextIa32->Dr1 = Address; SystemContext.SystemContextIa32->Dr1 = Address;
Dr7.Bits.G1 = 1; Dr7.Bits.G1 = 1;
Dr7.Bits.RW1 = Type; Dr7.Bits.RW1 = Type;
Dr7.Bits.LEN1 = Length; Dr7.Bits.LEN1 = Length;
} else if (Register == 2) { } else if (Register == 2) {
SystemContext.SystemContextIa32->Dr2 = Address; SystemContext.SystemContextIa32->Dr2 = Address;
Dr7.Bits.G2 = 1; Dr7.Bits.G2 = 1;
Dr7.Bits.RW2 = Type; Dr7.Bits.RW2 = Type;
Dr7.Bits.LEN2 = Length; Dr7.Bits.LEN2 = Length;
} else if (Register == 3) { } else if (Register == 3) {
SystemContext.SystemContextIa32->Dr3 = Address; SystemContext.SystemContextIa32->Dr3 = Address;
Dr7.Bits.G3 = 1; Dr7.Bits.G3 = 1;
Dr7.Bits.RW3 = Type; Dr7.Bits.RW3 = Type;
Dr7.Bits.LEN3 = Length; Dr7.Bits.LEN3 = Length;
} else { } else {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
//Update Dr7 with appropriate Gn, RWn and LENn bits // Update Dr7 with appropriate Gn, RWn and LENn bits
SystemContext.SystemContextIa32->Dr7 = Dr7.UintN; SystemContext.SystemContextIa32->Dr7 = Dr7.UintN;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Returns register number 0 - 3 for the matching debug register. Returns register number 0 - 3 for the matching debug register.
This function compares incoming Address, Type, Length and This function compares incoming Address, Type, Length and
@ -684,46 +673,51 @@ EnableDebugRegister (
**/ **/
EFI_STATUS EFI_STATUS
FindMatchingDebugRegister ( FindMatchingDebugRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN Address, IN UINTN Address,
IN UINTN Length, IN UINTN Length,
IN UINTN Type, IN UINTN Type,
OUT UINTN *Register OUT UINTN *Register
) )
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
//Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle // Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
//software breakpoint. We should send empty packet in both these cases. // software breakpoint. We should send empty packet in both these cases.
if ((Type == (BREAK_TYPE)DataRead) || if ((Type == (BREAK_TYPE)DataRead) ||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) { (Type == (BREAK_TYPE)SoftwareBreakpoint))
{
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
//Convert length data // Convert length data
Length = ConvertLengthData(Length); Length = ConvertLengthData (Length);
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
if ((Dr7.Bits.G0 == 1) && if ((Dr7.Bits.G0 == 1) &&
(Dr7.Bits.LEN0 == Length) && (Dr7.Bits.LEN0 == Length) &&
(Dr7.Bits.RW0 == Type) && (Dr7.Bits.RW0 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr0)) { (Address == SystemContext.SystemContextIa32->Dr0))
{
*Register = 0; *Register = 0;
} else if ((Dr7.Bits.G1 == 1) && } else if ((Dr7.Bits.G1 == 1) &&
(Dr7.Bits.LEN1 == Length) && (Dr7.Bits.LEN1 == Length) &&
(Dr7.Bits.RW1 == Type) && (Dr7.Bits.RW1 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr1)) { (Address == SystemContext.SystemContextIa32->Dr1))
{
*Register = 1; *Register = 1;
} else if ((Dr7.Bits.G2 == 1) && } else if ((Dr7.Bits.G2 == 1) &&
(Dr7.Bits.LEN2 == Length) && (Dr7.Bits.LEN2 == Length) &&
(Dr7.Bits.RW2 == Type) && (Dr7.Bits.RW2 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr2)) { (Address == SystemContext.SystemContextIa32->Dr2))
{
*Register = 2; *Register = 2;
} else if ((Dr7.Bits.G3 == 1) && } else if ((Dr7.Bits.G3 == 1) &&
(Dr7.Bits.LEN3 == Length) && (Dr7.Bits.LEN3 == Length) &&
(Dr7.Bits.RW3 == Type) && (Dr7.Bits.RW3 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr3)) { (Address == SystemContext.SystemContextIa32->Dr3))
{
*Register = 3; *Register = 3;
} else { } else {
Print ((CHAR16 *)L"No match found..\n"); Print ((CHAR16 *)L"No match found..\n");
@ -733,7 +727,6 @@ FindMatchingDebugRegister (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Disables the particular debug register. Disables the particular debug register.
@ -745,47 +738,46 @@ FindMatchingDebugRegister (
**/ **/
EFI_STATUS EFI_STATUS
DisableDebugRegister ( DisableDebugRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN Register IN UINTN Register
) )
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
UINTN Address = 0; UINTN Address = 0;
//Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off. // Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
if (Register == 0) { if (Register == 0) {
SystemContext.SystemContextIa32->Dr0 = Address; SystemContext.SystemContextIa32->Dr0 = Address;
Dr7.Bits.G0 = 0; Dr7.Bits.G0 = 0;
Dr7.Bits.RW0 = 0; Dr7.Bits.RW0 = 0;
Dr7.Bits.LEN0 = 0; Dr7.Bits.LEN0 = 0;
} else if (Register == 1) { } else if (Register == 1) {
SystemContext.SystemContextIa32->Dr1 = Address; SystemContext.SystemContextIa32->Dr1 = Address;
Dr7.Bits.G1 = 0; Dr7.Bits.G1 = 0;
Dr7.Bits.RW1 = 0; Dr7.Bits.RW1 = 0;
Dr7.Bits.LEN1 = 0; Dr7.Bits.LEN1 = 0;
} else if (Register == 2) { } else if (Register == 2) {
SystemContext.SystemContextIa32->Dr2 = Address; SystemContext.SystemContextIa32->Dr2 = Address;
Dr7.Bits.G2 = 0; Dr7.Bits.G2 = 0;
Dr7.Bits.RW2 = 0; Dr7.Bits.RW2 = 0;
Dr7.Bits.LEN2 = 0; Dr7.Bits.LEN2 = 0;
} else if (Register == 3) { } else if (Register == 3) {
SystemContext.SystemContextIa32->Dr3 = Address; SystemContext.SystemContextIa32->Dr3 = Address;
Dr7.Bits.G3 = 0; Dr7.Bits.G3 = 0;
Dr7.Bits.RW3 = 0; Dr7.Bits.RW3 = 0;
Dr7.Bits.LEN3 = 0; Dr7.Bits.LEN3 = 0;
} else { } else {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
//Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off. // Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
SystemContext.SystemContextIa32->Dr7 = Dr7.UintN; SystemContext.SystemContextIa32->Dr7 = Dr7.UintN;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Z1, [addr], [length] Z1, [addr], [length]
Z2, [addr], [length] Z2, [addr], [length]
@ -802,16 +794,16 @@ VOID
EFIAPI EFIAPI
InsertBreakPoint ( InsertBreakPoint (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
UINTN Type; UINTN Type;
UINTN Address; UINTN Address;
UINTN Length; UINTN Length;
UINTN Register; UINTN Register;
EFI_STATUS Status; EFI_STATUS Status;
BREAK_TYPE BreakType = NotSupported; BREAK_TYPE BreakType = NotSupported;
UINTN ErrorCode; UINTN ErrorCode;
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length); ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
if (ErrorCode > 0) { if (ErrorCode > 0) {
@ -820,28 +812,27 @@ InsertBreakPoint (
} }
switch (Type) { switch (Type) {
case 0: // Software breakpoint
case 0: //Software breakpoint
BreakType = SoftwareBreakpoint; BreakType = SoftwareBreakpoint;
break; break;
case 1: //Hardware breakpoint case 1: // Hardware breakpoint
BreakType = InstructionExecution; BreakType = InstructionExecution;
break; break;
case 2: //Write watchpoint case 2: // Write watchpoint
BreakType = DataWrite; BreakType = DataWrite;
break; break;
case 3: //Read watchpoint case 3: // Read watchpoint
BreakType = DataRead; BreakType = DataRead;
break; break;
case 4: //Access watchpoint case 4: // Access watchpoint
BreakType = DataReadWrite; BreakType = DataReadWrite;
break; break;
default : default:
Print ((CHAR16 *)L"Insert breakpoint default: %x\n", Type); Print ((CHAR16 *)L"Insert breakpoint default: %x\n", Type);
SendError (GDB_EINVALIDBRKPOINTTYPE); SendError (GDB_EINVALIDBRKPOINTTYPE);
return; return;
@ -849,7 +840,7 @@ InsertBreakPoint (
// Find next free debug register // Find next free debug register
Status = FindNextFreeDebugRegister (SystemContext, &Register); Status = FindNextFreeDebugRegister (SystemContext, &Register);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print ((CHAR16 *)L"No space left on device\n"); Print ((CHAR16 *)L"No space left on device\n");
SendError (GDB_ENOSPACE); SendError (GDB_ENOSPACE);
return; return;
@ -857,8 +848,7 @@ InsertBreakPoint (
// Write Address, length data at particular DR register // Write Address, length data at particular DR register
Status = EnableDebugRegister (SystemContext, Register, Address, Length, (UINTN)BreakType); Status = EnableDebugRegister (SystemContext, Register, Address, Length, (UINTN)BreakType);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
if (Status == EFI_UNSUPPORTED) { if (Status == EFI_UNSUPPORTED) {
Print ((CHAR16 *)L"Not supported\n"); Print ((CHAR16 *)L"Not supported\n");
SendNotSupported (); SendNotSupported ();
@ -873,7 +863,6 @@ InsertBreakPoint (
SendSuccess (); SendSuccess ();
} }
/** /**
z1, [addr], [length] z1, [addr], [length]
z2, [addr], [length] z2, [addr], [length]
@ -892,15 +881,15 @@ RemoveBreakPoint (
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
UINTN Type; UINTN Type;
UINTN Address; UINTN Address;
UINTN Length; UINTN Length;
UINTN Register; UINTN Register;
BREAK_TYPE BreakType = NotSupported; BREAK_TYPE BreakType = NotSupported;
EFI_STATUS Status; EFI_STATUS Status;
UINTN ErrorCode; UINTN ErrorCode;
//Parse breakpoint packet data // Parse breakpoint packet data
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length); ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
if (ErrorCode > 0) { if (ErrorCode > 0) {
SendError ((UINT8)ErrorCode); SendError ((UINT8)ErrorCode);
@ -908,36 +897,34 @@ RemoveBreakPoint (
} }
switch (Type) { switch (Type) {
case 0: // Software breakpoint
case 0: //Software breakpoint
BreakType = SoftwareBreakpoint; BreakType = SoftwareBreakpoint;
break; break;
case 1: //Hardware breakpoint case 1: // Hardware breakpoint
BreakType = InstructionExecution; BreakType = InstructionExecution;
break; break;
case 2: //Write watchpoint case 2: // Write watchpoint
BreakType = DataWrite; BreakType = DataWrite;
break; break;
case 3: //Read watchpoint case 3: // Read watchpoint
BreakType = DataRead; BreakType = DataRead;
break; break;
case 4: //Access watchpoint case 4: // Access watchpoint
BreakType = DataReadWrite; BreakType = DataReadWrite;
break; break;
default : default:
SendError (GDB_EINVALIDBRKPOINTTYPE); SendError (GDB_EINVALIDBRKPOINTTYPE);
return; return;
} }
//Find matching debug register // Find matching debug register
Status = FindMatchingDebugRegister (SystemContext, Address, Length, (UINTN)BreakType, &Register); Status = FindMatchingDebugRegister (SystemContext, Address, Length, (UINTN)BreakType, &Register);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
if (Status == EFI_UNSUPPORTED) { if (Status == EFI_UNSUPPORTED) {
Print ((CHAR16 *)L"Not supported.\n"); Print ((CHAR16 *)L"Not supported.\n");
SendNotSupported (); SendNotSupported ();
@ -949,9 +936,9 @@ RemoveBreakPoint (
return; return;
} }
//Remove breakpoint // Remove breakpoint
Status = DisableDebugRegister (SystemContext, Register); Status = DisableDebugRegister (SystemContext, Register);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print ((CHAR16 *)L"Invalid argument.\n"); Print ((CHAR16 *)L"Invalid argument.\n");
SendError (GDB_EINVALIDARG); SendError (GDB_EINVALIDARG);
return; return;
@ -960,7 +947,6 @@ RemoveBreakPoint (
SendSuccess (); SendSuccess ();
} }
VOID VOID
InitializeProcessor ( InitializeProcessor (
VOID VOID
@ -978,10 +964,9 @@ ValidateAddress (
BOOLEAN BOOLEAN
ValidateException ( ValidateException (
IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext IN OUT EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
return TRUE; return TRUE;
} }

View File

@ -18,14 +18,14 @@
// Set TRUE if F Reply package signals a ctrl-c. We can not process the Ctrl-c // Set TRUE if F Reply package signals a ctrl-c. We can not process the Ctrl-c
// here we need to wait for the periodic callback to do this. // here we need to wait for the periodic callback to do this.
// //
BOOLEAN gCtrlCBreakFlag = FALSE; BOOLEAN gCtrlCBreakFlag = FALSE;
// //
// If the periodic callback is called while we are processing an F packet we need // If the periodic callback is called while we are processing an F packet we need
// to let the callback know to not read from the serial stream as it could steal // to let the callback know to not read from the serial stream as it could steal
// characters from the F response packet // characters from the F response packet
// //
BOOLEAN gProcessingFPacket = FALSE; BOOLEAN gProcessingFPacket = FALSE;
/** /**
Process a control-C break message. Process a control-C break message.
@ -35,21 +35,19 @@ BOOLEAN gProcessingFPacket = FALSE;
@param ErrNo Error information from the F reply packet or other source @param ErrNo Error information from the F reply packet or other source
**/ **/
VOID VOID
GdbCtrlCBreakMessage ( GdbCtrlCBreakMessage (
IN UINTN ErrNo IN UINTN ErrNo
) )
{ {
// See D.10.5 of gdb.pdf // See D.10.5 of gdb.pdf
// This should look like a break message. Should look like SIGINT // This should look like a break message. Should look like SIGINT
/* TODO: Make sure if we should do anything with ErrNo */ /* TODO: Make sure if we should do anything with ErrNo */
//Turn on the global Ctrl-C flag. // Turn on the global Ctrl-C flag.
gCtrlCBreakFlag = TRUE; gCtrlCBreakFlag = TRUE;
} }
/** /**
Parse the F reply packet and extract the return value and an ErrNo if it exists. Parse the F reply packet and extract the return value and an ErrNo if it exists.
@ -62,11 +60,11 @@ GdbCtrlCBreakMessage (
**/ **/
INTN INTN
GdbParseFReplyPacket ( GdbParseFReplyPacket (
IN CHAR8 *Packet, IN CHAR8 *Packet,
OUT UINTN *ErrNo OUT UINTN *ErrNo
) )
{ {
INTN RetCode; INTN RetCode;
if (Packet[0] != 'F') { if (Packet[0] != 'F') {
// A valid response would be an F packet // A valid response would be an F packet
@ -76,7 +74,9 @@ GdbParseFReplyPacket (
RetCode = AsciiStrHexToUintn (&Packet[1]); RetCode = AsciiStrHexToUintn (&Packet[1]);
// Find 1st comma // Find 1st comma
for (;*Packet != '\0' && *Packet != ','; Packet++); for ( ; *Packet != '\0' && *Packet != ','; Packet++) {
}
if (*Packet == '\0') { if (*Packet == '\0') {
*ErrNo = 0; *ErrNo = 0;
return RetCode; return RetCode;
@ -85,7 +85,9 @@ GdbParseFReplyPacket (
*ErrNo = AsciiStrHexToUintn (++Packet); *ErrNo = AsciiStrHexToUintn (++Packet);
// Find 2nd comma // Find 2nd comma
for (;*Packet != '\0' && *Packet != ','; Packet++); for ( ; *Packet != '\0' && *Packet != ','; Packet++) {
}
if (*Packet == '\0') { if (*Packet == '\0') {
return RetCode; return RetCode;
} }
@ -97,7 +99,6 @@ GdbParseFReplyPacket (
return RetCode; return RetCode;
} }
/** /**
Read data from a FileDescriptor. On success number of bytes read is returned. Zero indicates Read data from a FileDescriptor. On success number of bytes read is returned. Zero indicates
the end of a file. On error -1 is returned. If count is zero, GdbRead returns zero. the end of a file. On error -1 is returned. If count is zero, GdbRead returns zero.
@ -112,16 +113,16 @@ GdbParseFReplyPacket (
**/ **/
INTN INTN
GdbRead ( GdbRead (
IN INTN FileDescriptor, IN INTN FileDescriptor,
OUT VOID *Buffer, OUT VOID *Buffer,
IN UINTN Count IN UINTN Count
) )
{ {
CHAR8 Packet[128]; CHAR8 Packet[128];
UINTN Size; UINTN Size;
INTN RetCode; INTN RetCode;
UINTN ErrNo; UINTN ErrNo;
BOOLEAN ReceiveDone = FALSE; BOOLEAN ReceiveDone = FALSE;
// Send: // Send:
// "Fread,XX,YYYYYYYY,XX // "Fread,XX,YYYYYYYY,XX
@ -146,23 +147,23 @@ GdbRead (
// Process GDB commands // Process GDB commands
switch (Packet[0]) { switch (Packet[0]) {
//Write memory command. // Write memory command.
//M addr,length:XX... // M addr,length:XX...
case 'M': case 'M':
WriteToMemory (Packet); WriteToMemory (Packet);
break; break;
//Fretcode, errno, Ctrl-C flag // Fretcode, errno, Ctrl-C flag
//retcode - Count read // retcode - Count read
case 'F': case 'F':
//Once target receives F reply packet that means the previous // Once target receives F reply packet that means the previous
//transactions are finished. // transactions are finished.
ReceiveDone = TRUE; ReceiveDone = TRUE;
break; break;
//Send empty buffer // Send empty buffer
default : default:
SendNotSupported(); SendNotSupported ();
break; break;
} }
} while (ReceiveDone == FALSE); } while (ReceiveDone == FALSE);
@ -171,7 +172,7 @@ GdbRead (
Print ((CHAR16 *)L"RetCode: %x..ErrNo: %x..\n", RetCode, ErrNo); Print ((CHAR16 *)L"RetCode: %x..ErrNo: %x..\n", RetCode, ErrNo);
if (ErrNo > 0) { if (ErrNo > 0) {
//Send error to the host if there is any. // Send error to the host if there is any.
SendError ((UINT8)ErrNo); SendError ((UINT8)ErrNo);
} }
@ -180,7 +181,6 @@ GdbRead (
return RetCode; return RetCode;
} }
/** /**
Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates
nothing was written. On error -1 is returned. nothing was written. On error -1 is returned.
@ -195,16 +195,16 @@ GdbRead (
**/ **/
INTN INTN
GdbWrite ( GdbWrite (
IN INTN FileDescriptor, IN INTN FileDescriptor,
OUT CONST VOID *Buffer, OUT CONST VOID *Buffer,
IN UINTN Count IN UINTN Count
) )
{ {
CHAR8 Packet[128]; CHAR8 Packet[128];
UINTN Size; UINTN Size;
INTN RetCode; INTN RetCode;
UINTN ErrNo; UINTN ErrNo;
BOOLEAN ReceiveDone = FALSE; BOOLEAN ReceiveDone = FALSE;
// Send: // Send:
// #Fwrite,XX,YYYYYYYY,XX$SS // #Fwrite,XX,YYYYYYYY,XX$SS
@ -228,23 +228,23 @@ GdbWrite (
// Process GDB commands // Process GDB commands
switch (Packet[0]) { switch (Packet[0]) {
//Read memory command. // Read memory command.
//m addr,length. // m addr,length.
case 'm': case 'm':
ReadFromMemory (Packet); ReadFromMemory (Packet);
break; break;
//Fretcode, errno, Ctrl-C flag // Fretcode, errno, Ctrl-C flag
//retcode - Count read // retcode - Count read
case 'F': case 'F':
//Once target receives F reply packet that means the previous // Once target receives F reply packet that means the previous
//transactions are finished. // transactions are finished.
ReceiveDone = TRUE; ReceiveDone = TRUE;
break; break;
//Send empty buffer // Send empty buffer
default : default:
SendNotSupported(); SendNotSupported ();
break; break;
} }
} while (ReceiveDone == FALSE); } while (ReceiveDone == FALSE);
@ -252,15 +252,14 @@ GdbWrite (
RetCode = GdbParseFReplyPacket (Packet, &ErrNo); RetCode = GdbParseFReplyPacket (Packet, &ErrNo);
Print ((CHAR16 *)L"RetCode: %x..ErrNo: %x..\n", RetCode, ErrNo); Print ((CHAR16 *)L"RetCode: %x..ErrNo: %x..\n", RetCode, ErrNo);
//Send error to the host if there is any. // Send error to the host if there is any.
if (ErrNo > 0) { if (ErrNo > 0) {
SendError((UINT8)ErrNo); SendError ((UINT8)ErrNo);
} }
return RetCode; return RetCode;
} }
/** /**
Reset the serial device. Reset the serial device.
@ -279,7 +278,6 @@ GdbSerialReset (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Sets the baud rate, receive FIFO depth, transmit/receive time out, parity, Sets the baud rate, receive FIFO depth, transmit/receive time out, parity,
data buts, and stop bits on a serial device. data buts, and stop bits on a serial device.
@ -321,7 +319,6 @@ GdbSerialSetAttributes (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
/** /**
Set the control bits on a serial device Set the control bits on a serial device
@ -343,7 +340,6 @@ GdbSerialSetControl (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
/** /**
Retrieves the status of the control bits on a serial device Retrieves the status of the control bits on a serial device
@ -364,7 +360,6 @@ GdbSerialGetControl (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
/** /**
Writes data to a serial device. Writes data to a serial device.
@ -387,7 +382,7 @@ GdbSerialWrite (
) )
{ {
GDB_SERIAL_DEV *SerialDev; GDB_SERIAL_DEV *SerialDev;
UINTN Return; UINTN Return;
SerialDev = GDB_SERIAL_DEV_FROM_THIS (This); SerialDev = GDB_SERIAL_DEV_FROM_THIS (This);
@ -416,7 +411,6 @@ GdbSerialWrite (
@retval EFI_TIMEOUT The data write was stopped due to a timeout. @retval EFI_TIMEOUT The data write was stopped due to a timeout.
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GdbSerialRead ( GdbSerialRead (
@ -426,7 +420,7 @@ GdbSerialRead (
) )
{ {
GDB_SERIAL_DEV *SerialDev; GDB_SERIAL_DEV *SerialDev;
UINTN Return; UINTN Return;
SerialDev = GDB_SERIAL_DEV_FROM_THIS (This); SerialDev = GDB_SERIAL_DEV_FROM_THIS (This);
@ -442,11 +436,10 @@ GdbSerialRead (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
// //
// Template used to initialize the GDB Serial IO protocols // Template used to initialize the GDB Serial IO protocols
// //
GDB_SERIAL_DEV gdbSerialDevTemplate = { GDB_SERIAL_DEV gdbSerialDevTemplate = {
GDB_SERIAL_DEV_SIGNATURE, GDB_SERIAL_DEV_SIGNATURE,
NULL, NULL,
@ -460,14 +453,14 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
GdbSerialRead, GdbSerialRead,
NULL NULL
}, },
{ // SerialMode { // SerialMode
0, // ControlMask 0, // ControlMask
0, // Timeout 0, // Timeout
0, // BaudRate 0, // BaudRate
1, // RceiveFifoDepth 1, // RceiveFifoDepth
0, // DataBits 0, // DataBits
0, // Parity 0, // Parity
0 // StopBits 0 // StopBits
}, },
{ {
{ {
@ -475,8 +468,8 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
HARDWARE_DEVICE_PATH, HARDWARE_DEVICE_PATH,
HW_VENDOR_DP, HW_VENDOR_DP,
{ {
(UINT8) (sizeof (VENDOR_DEVICE_PATH) + sizeof (UINT32)), (UINT8)(sizeof (VENDOR_DEVICE_PATH) + sizeof (UINT32)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH) + sizeof (UINT32)) >> 8) (UINT8)((sizeof (VENDOR_DEVICE_PATH) + sizeof (UINT32)) >> 8)
}, },
}, },
EFI_SERIAL_IO_PROTOCOL_GUID EFI_SERIAL_IO_PROTOCOL_GUID
@ -486,8 +479,8 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
END_DEVICE_PATH_TYPE, END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ {
(UINT8) (sizeof (EFI_DEVICE_PATH_PROTOCOL)), (UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL)),
(UINT8) (sizeof (EFI_DEVICE_PATH_PROTOCOL) >> 8) (UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL) >> 8)
} }
}, },
}, },
@ -495,7 +488,6 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
GDB_STDOUT GDB_STDOUT
}; };
/** /**
Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB. Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
@ -512,25 +504,27 @@ GdbInitializeSerialConsole (
GDB_SERIAL_DEV *StdErrSerialDev; GDB_SERIAL_DEV *StdErrSerialDev;
// Use the template to make a copy of the Serial Console private data structure. // Use the template to make a copy of the Serial Console private data structure.
StdOutSerialDev = AllocateCopyPool (sizeof (GDB_SERIAL_DEV), &gdbSerialDevTemplate); StdOutSerialDev = AllocateCopyPool (sizeof (GDB_SERIAL_DEV), &gdbSerialDevTemplate);
ASSERT (StdOutSerialDev != NULL); ASSERT (StdOutSerialDev != NULL);
// Fixup pointer after the copy // Fixup pointer after the copy
StdOutSerialDev->SerialIo.Mode = &StdOutSerialDev->SerialMode; StdOutSerialDev->SerialIo.Mode = &StdOutSerialDev->SerialMode;
StdErrSerialDev = AllocateCopyPool (sizeof (GDB_SERIAL_DEV), &gdbSerialDevTemplate); StdErrSerialDev = AllocateCopyPool (sizeof (GDB_SERIAL_DEV), &gdbSerialDevTemplate);
ASSERT (StdErrSerialDev != NULL); ASSERT (StdErrSerialDev != NULL);
// Fixup pointer and modify stuff that is different for StdError // Fixup pointer and modify stuff that is different for StdError
StdErrSerialDev->SerialIo.Mode = &StdErrSerialDev->SerialMode; StdErrSerialDev->SerialIo.Mode = &StdErrSerialDev->SerialMode;
StdErrSerialDev->DevicePath.Index = 1; StdErrSerialDev->DevicePath.Index = 1;
StdErrSerialDev->OutFileDescriptor = GDB_STDERR; StdErrSerialDev->OutFileDescriptor = GDB_STDERR;
// Make a new handle with Serial IO protocol and its device path on it. // Make a new handle with Serial IO protocol and its device path on it.
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&StdOutSerialDev->Handle, &StdOutSerialDev->Handle,
&gEfiSerialIoProtocolGuid, &StdOutSerialDev->SerialIo, &gEfiSerialIoProtocolGuid,
&gEfiDevicePathProtocolGuid, &StdOutSerialDev->DevicePath, &StdOutSerialDev->SerialIo,
&gEfiDevicePathProtocolGuid,
&StdOutSerialDev->DevicePath,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -538,10 +532,11 @@ GdbInitializeSerialConsole (
// Make a new handle with Serial IO protocol and its device path on it. // Make a new handle with Serial IO protocol and its device path on it.
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&StdErrSerialDev->Handle, &StdErrSerialDev->Handle,
&gEfiSerialIoProtocolGuid, &StdErrSerialDev->SerialIo, &gEfiSerialIoProtocolGuid,
&gEfiDevicePathProtocolGuid, &StdErrSerialDev->DevicePath, &StdErrSerialDev->SerialIo,
&gEfiDevicePathProtocolGuid,
&StdErrSerialDev->DevicePath,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }

View File

@ -12,7 +12,7 @@
// //
// Array of exception types that need to be hooked by the debugger // Array of exception types that need to be hooked by the debugger
// //
EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = { EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
{ EXCEPT_X64_DIVIDE_ERROR, GDB_SIGFPE }, { EXCEPT_X64_DIVIDE_ERROR, GDB_SIGFPE },
{ EXCEPT_X64_DEBUG, GDB_SIGTRAP }, { EXCEPT_X64_DEBUG, GDB_SIGTRAP },
{ EXCEPT_X64_NMI, GDB_SIGEMT }, { EXCEPT_X64_NMI, GDB_SIGEMT },
@ -29,39 +29,37 @@ EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
{ EXCEPT_X64_MACHINE_CHECK, GDB_SIGEMT } { EXCEPT_X64_MACHINE_CHECK, GDB_SIGEMT }
}; };
// The offsets of registers SystemContextX64. // The offsets of registers SystemContextX64.
// The fields in the array are in the gdb ordering. // The fields in the array are in the gdb ordering.
// HAVE TO DOUBLE-CHECK THE ORDER of the 24 regs // HAVE TO DOUBLE-CHECK THE ORDER of the 24 regs
// //
UINTN gRegisterOffsets[] = { UINTN gRegisterOffsets[] = {
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rax), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rax),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rcx), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rcx),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rdx), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rdx),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rbx), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rbx),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rsp), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rsp),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rbp), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rbp),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rsi), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rsi),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rdi), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rdi),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rip), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rip),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rflags), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rflags),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Cs), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Cs),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Ss), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Ss),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Ds), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Ds),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Es), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Es),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Fs), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Fs),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Gs), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Gs),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R8), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R8),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R9), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R9),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R10), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R10),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R11), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R11),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R12), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R12),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R13), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R13),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R14), OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R14),
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R15) OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R15)
}; };
/** /**
Return the number of entries in the gExceptionType[] Return the number of entries in the gExceptionType[]
@ -75,7 +73,6 @@ MaxEfiException (
return sizeof (gExceptionType)/sizeof (EFI_EXCEPTION_TYPE_ENTRY); return sizeof (gExceptionType)/sizeof (EFI_EXCEPTION_TYPE_ENTRY);
} }
/** /**
Return the number of entries in the gRegisters[] Return the number of entries in the gRegisters[]
@ -89,7 +86,6 @@ MaxRegisterCount (
return sizeof (gRegisterOffsets)/sizeof (UINTN); return sizeof (gRegisterOffsets)/sizeof (UINTN);
} }
/** /**
Check to see if the ISA is supported. Check to see if the ISA is supported.
ISA = Instruction Set Architecture ISA = Instruction Set Architecture
@ -104,7 +100,6 @@ CheckIsa (
return (BOOLEAN)(Isa == IsaX64); return (BOOLEAN)(Isa == IsaX64);
} }
/** /**
This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering
It is, by default, set to find the register pointer of the X64 member It is, by default, set to find the register pointer of the X64 member
@ -113,17 +108,17 @@ CheckIsa (
@retval the pointer to the RegNumber-th pointer @retval the pointer to the RegNumber-th pointer
**/ **/
UINTN * UINTN *
FindPointerToRegister( FindPointerToRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN RegNumber IN UINTN RegNumber
) )
{ {
UINT8 *TempPtr; UINT8 *TempPtr;
TempPtr = ((UINT8 *)SystemContext.SystemContextX64) + gRegisterOffsets[RegNumber]; TempPtr = ((UINT8 *)SystemContext.SystemContextX64) + gRegisterOffsets[RegNumber];
return (UINTN *)TempPtr; return (UINTN *)TempPtr;
} }
/** /**
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -133,23 +128,23 @@ FindPointerToRegister(
**/ **/
CHAR8 * CHAR8 *
BasicReadRegister ( BasicReadRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN RegNumber, IN UINTN RegNumber,
IN CHAR8 *OutBufPtr IN CHAR8 *OutBufPtr
) )
{ {
UINTN RegSize; UINTN RegSize;
RegSize = 0; RegSize = 0;
while (RegSize < 64) { while (RegSize < 64) {
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister(SystemContext, RegNumber) >> (RegSize+4)) & 0xf)]; *OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> (RegSize+4)) & 0xf)];
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister(SystemContext, RegNumber) >> RegSize) & 0xf)]; *OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
RegSize = RegSize + 8; RegSize = RegSize + 8;
} }
return OutBufPtr; return OutBufPtr;
} }
/** p n /** p n
Reads the n-th register's value into an output buffer and sends it as a packet Reads the n-th register's value into an output buffer and sends it as a packet
@param SystemContext Register content at time of the exception @param SystemContext Register content at time of the exception
@ -157,29 +152,28 @@ BasicReadRegister (
**/ **/
VOID VOID
ReadNthRegister ( ReadNthRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
) )
{ {
UINTN RegNumber; UINTN RegNumber;
CHAR8 OutBuffer[17]; // 1 reg=16 hex chars, and the end '\0' (escape seq) CHAR8 OutBuffer[17]; // 1 reg=16 hex chars, and the end '\0' (escape seq)
CHAR8 *OutBufPtr; // pointer to the output buffer CHAR8 *OutBufPtr; // pointer to the output buffer
RegNumber = AsciiStrHexToUintn (&InBuffer[1]); RegNumber = AsciiStrHexToUintn (&InBuffer[1]);
if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount())) { if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount ())) {
SendError (GDB_EINVALIDREGNUM); SendError (GDB_EINVALIDREGNUM);
return; return;
} }
OutBufPtr = OutBuffer; OutBufPtr = OutBuffer;
OutBufPtr = BasicReadRegister(SystemContext, RegNumber, OutBufPtr); OutBufPtr = BasicReadRegister (SystemContext, RegNumber, OutBufPtr);
*OutBufPtr = '\0'; // the end of the buffer *OutBufPtr = '\0'; // the end of the buffer
SendPacket (OutBuffer); SendPacket (OutBuffer);
} }
/** g /** g
Reads the general registers into an output buffer and sends it as a packet Reads the general registers into an output buffer and sends it as a packet
@ -188,23 +182,23 @@ ReadNthRegister (
VOID VOID
EFIAPI EFIAPI
ReadGeneralRegisters ( ReadGeneralRegisters (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
UINTN i; UINTN i;
CHAR8 OutBuffer[385]; // 24 regs, 16 hex chars each, and the end '\0' (escape seq) CHAR8 OutBuffer[385]; // 24 regs, 16 hex chars each, and the end '\0' (escape seq)
CHAR8 *OutBufPtr; // pointer to the output buffer CHAR8 *OutBufPtr; // pointer to the output buffer
OutBufPtr = OutBuffer; OutBufPtr = OutBuffer;
for(i = 0 ; i < MaxRegisterCount() ; i++) { // there are only 24 registers to read for (i = 0; i < MaxRegisterCount (); i++) {
OutBufPtr = BasicReadRegister(SystemContext, i, OutBufPtr); // there are only 24 registers to read
OutBufPtr = BasicReadRegister (SystemContext, i, OutBufPtr);
} }
*OutBufPtr = '\0'; // the end of the buffer *OutBufPtr = '\0'; // the end of the buffer
SendPacket (OutBuffer); SendPacket (OutBuffer);
} }
/** /**
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
@ -220,14 +214,14 @@ BasicWriteRegister (
IN CHAR8 *InBufPtr IN CHAR8 *InBufPtr
) )
{ {
UINTN RegSize; UINTN RegSize;
UINTN TempValue; // the value transferred from a hex char UINTN TempValue; // the value transferred from a hex char
UINT64 NewValue; // the new value of the RegNumber-th Register UINT64 NewValue; // the new value of the RegNumber-th Register
NewValue = 0; NewValue = 0;
RegSize = 0; RegSize = 0;
while (RegSize < 64) { while (RegSize < 64) {
TempValue = HexCharToInt(*InBufPtr++); TempValue = HexCharToInt (*InBufPtr++);
if (TempValue < 0) { if (TempValue < 0) {
SendError (GDB_EBADMEMDATA); SendError (GDB_EBADMEMDATA);
@ -235,21 +229,21 @@ BasicWriteRegister (
} }
NewValue += (TempValue << (RegSize+4)); NewValue += (TempValue << (RegSize+4));
TempValue = HexCharToInt(*InBufPtr++); TempValue = HexCharToInt (*InBufPtr++);
if (TempValue < 0) { if (TempValue < 0) {
SendError (GDB_EBADMEMDATA); SendError (GDB_EBADMEMDATA);
return NULL; return NULL;
} }
NewValue += (TempValue << RegSize); NewValue += (TempValue << RegSize);
RegSize = RegSize + 8; RegSize = RegSize + 8;
} }
*(FindPointerToRegister(SystemContext, RegNumber)) = NewValue;
*(FindPointerToRegister (SystemContext, RegNumber)) = NewValue;
return InBufPtr; return InBufPtr;
} }
/** P n...=r... /** P n...=r...
Writes the new value of n-th register received into the input buffer to the n-th register Writes the new value of n-th register received into the input buffer to the n-th register
@ -259,35 +253,36 @@ BasicWriteRegister (
VOID VOID
EFIAPI EFIAPI
WriteNthRegister ( WriteNthRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
) )
{ {
UINTN RegNumber; UINTN RegNumber;
CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array
CHAR8 *RegNumBufPtr; CHAR8 *RegNumBufPtr;
CHAR8 *InBufPtr; // pointer to the input buffer CHAR8 *InBufPtr; // pointer to the input buffer
// find the register number to write // find the register number to write
InBufPtr = &InBuffer[1]; InBufPtr = &InBuffer[1];
RegNumBufPtr = RegNumBuffer; RegNumBufPtr = RegNumBuffer;
while (*InBufPtr != '=') { while (*InBufPtr != '=') {
*RegNumBufPtr++ = *InBufPtr++; *RegNumBufPtr++ = *InBufPtr++;
} }
*RegNumBufPtr = '\0'; *RegNumBufPtr = '\0';
RegNumber = AsciiStrHexToUintn (RegNumBuffer); RegNumber = AsciiStrHexToUintn (RegNumBuffer);
// check if this is a valid Register Number // check if this is a valid Register Number
if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount())) { if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount ())) {
SendError (GDB_EINVALIDREGNUM); SendError (GDB_EINVALIDREGNUM);
return; return;
} }
InBufPtr++; // skips the '=' character InBufPtr++; // skips the '=' character
BasicWriteRegister (SystemContext, RegNumber, InBufPtr); BasicWriteRegister (SystemContext, RegNumber, InBufPtr);
SendSuccess(); SendSuccess ();
} }
/** G XX... /** G XX...
Writes the new values received into the input buffer to the general registers Writes the new values received into the input buffer to the general registers
@ -297,17 +292,18 @@ WriteNthRegister (
VOID VOID
EFIAPI EFIAPI
WriteGeneralRegisters ( WriteGeneralRegisters (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *InBuffer IN CHAR8 *InBuffer
) )
{ {
UINTN i; UINTN i;
CHAR8 *InBufPtr; /// pointer to the input buffer CHAR8 *InBufPtr; /// pointer to the input buffer
// check to see if the buffer is the right size which is // check to see if the buffer is the right size which is
// 1 (for 'G') + 16 (for 16 registers) * 8 ( for 8 hex chars each) = 385 // 1 (for 'G') + 16 (for 16 registers) * 8 ( for 8 hex chars each) = 385
if (AsciiStrLen(InBuffer) != 385) { // 24 regs, 16 hex chars each, and the end '\0' (escape seq) if (AsciiStrLen (InBuffer) != 385) {
//Bad message. Message is not the right length // 24 regs, 16 hex chars each, and the end '\0' (escape seq)
// Bad message. Message is not the right length
SendError (GDB_EBADBUFSIZE); SendError (GDB_EBADBUFSIZE);
return; return;
} }
@ -316,29 +312,27 @@ WriteGeneralRegisters (
// Read the new values for the registers from the input buffer to an array, NewValueArray. // Read the new values for the registers from the input buffer to an array, NewValueArray.
// The values in the array are in the gdb ordering // The values in the array are in the gdb ordering
for(i=0; i < MaxRegisterCount(); i++) { // there are only 16 registers to write for (i = 0; i < MaxRegisterCount (); i++) {
InBufPtr = BasicWriteRegister(SystemContext, i, InBufPtr); // there are only 16 registers to write
InBufPtr = BasicWriteRegister (SystemContext, i, InBufPtr);
} }
SendSuccess(); SendSuccess ();
} }
/**
Insert Single Step in the SystemContext
/** @param SystemContext Register content at time of the exception
Insert Single Step in the SystemContext **/
@param SystemContext Register content at time of the exception
**/
VOID VOID
AddSingleStep ( AddSingleStep (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
SystemContext.SystemContextX64->Rflags |= TF_BIT; //Setting the TF bit. SystemContext.SystemContextX64->Rflags |= TF_BIT; // Setting the TF bit.
} }
/** /**
Remove Single Step in the SystemContext Remove Single Step in the SystemContext
@ -352,8 +346,6 @@ RemoveSingleStep (
SystemContext.SystemContextX64->Rflags &= ~TF_BIT; // clearing the TF bit. SystemContext.SystemContextX64->Rflags &= ~TF_BIT; // clearing the TF bit.
} }
/** c [addr ] /** c [addr ]
Continue. addr is Address to resume. If addr is omitted, resume at current Continue. addr is Address to resume. If addr is omitted, resume at current
Address. Address.
@ -363,16 +355,15 @@ RemoveSingleStep (
VOID VOID
EFIAPI EFIAPI
ContinueAtAddress ( ContinueAtAddress (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
if (PacketData[1] != '\0') { if (PacketData[1] != '\0') {
SystemContext.SystemContextX64->Rip = AsciiStrHexToUintn(&PacketData[1]); SystemContext.SystemContextX64->Rip = AsciiStrHexToUintn (&PacketData[1]);
} }
} }
/** s [addr ] /** s [addr ]
Single step. addr is the Address at which to resume. If addr is omitted, resume Single step. addr is the Address at which to resume. If addr is omitted, resume
at same Address. at same Address.
@ -382,8 +373,8 @@ ContinueAtAddress (
VOID VOID
EFIAPI EFIAPI
SingleStep ( SingleStep (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
if (PacketData[1] != '\0') { if (PacketData[1] != '\0') {
@ -393,7 +384,6 @@ SingleStep (
AddSingleStep (SystemContext); AddSingleStep (SystemContext);
} }
/** /**
Returns breakpoint data address from DR0-DR3 based on the input breakpoint Returns breakpoint data address from DR0-DR3 based on the input breakpoint
number number
@ -411,7 +401,7 @@ GetBreakpointDataAddress (
IN UINTN BreakpointNumber IN UINTN BreakpointNumber
) )
{ {
UINTN Address; UINTN Address;
if (BreakpointNumber == 1) { if (BreakpointNumber == 1) {
Address = SystemContext.SystemContextIa32->Dr0; Address = SystemContext.SystemContextIa32->Dr0;
@ -444,8 +434,8 @@ GetBreakpointDetected (
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
IA32_DR6 Dr6; IA32_DR6 Dr6;
UINTN BreakpointNumber; UINTN BreakpointNumber;
Dr6.UintN = SystemContext.SystemContextIa32->Dr6; Dr6.UintN = SystemContext.SystemContextIa32->Dr6;
@ -458,7 +448,7 @@ GetBreakpointDetected (
} else if (Dr6.Bits.B3 == 1) { } else if (Dr6.Bits.B3 == 1) {
BreakpointNumber = 4; BreakpointNumber = 4;
} else { } else {
BreakpointNumber = 0; //No breakpoint detected BreakpointNumber = 0; // No breakpoint detected
} }
return BreakpointNumber; return BreakpointNumber;
@ -481,25 +471,24 @@ GetBreakpointType (
IN UINTN BreakpointNumber IN UINTN BreakpointNumber
) )
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
BREAK_TYPE Type = NotSupported; //Default is NotSupported type BREAK_TYPE Type = NotSupported; // Default is NotSupported type
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
if (BreakpointNumber == 1) { if (BreakpointNumber == 1) {
Type = (BREAK_TYPE) Dr7.Bits.RW0; Type = (BREAK_TYPE)Dr7.Bits.RW0;
} else if (BreakpointNumber == 2) { } else if (BreakpointNumber == 2) {
Type = (BREAK_TYPE) Dr7.Bits.RW1; Type = (BREAK_TYPE)Dr7.Bits.RW1;
} else if (BreakpointNumber == 3) { } else if (BreakpointNumber == 3) {
Type = (BREAK_TYPE) Dr7.Bits.RW2; Type = (BREAK_TYPE)Dr7.Bits.RW2;
} else if (BreakpointNumber == 4) { } else if (BreakpointNumber == 4) {
Type = (BREAK_TYPE) Dr7.Bits.RW3; Type = (BREAK_TYPE)Dr7.Bits.RW3;
} }
return Type; return Type;
} }
/** /**
Parses Length and returns the length which DR7 LENn field accepts. Parses Length and returns the length which DR7 LENn field accepts.
For example: If we receive 1-Byte length then we should return 0. For example: If we receive 1-Byte length then we should return 0.
@ -512,21 +501,24 @@ GetBreakpointType (
**/ **/
UINTN UINTN
ConvertLengthData ( ConvertLengthData (
IN UINTN Length IN UINTN Length
) )
{ {
if (Length == 1) { //1-Byte length if (Length == 1) {
// 1-Byte length
return 0; return 0;
} else if (Length == 2) { //2-Byte length } else if (Length == 2) {
// 2-Byte length
return 1; return 1;
} else if (Length == 4) { //4-Byte length } else if (Length == 4) {
// 4-Byte length
return 3; return 3;
} else { //Undefined or 8-byte length } else {
// Undefined or 8-byte length
return 2; return 2;
} }
} }
/** /**
Finds the next free debug register. If all the registers are occupied then Finds the next free debug register. If all the registers are occupied then
EFI_OUT_OF_RESOURCES is returned. EFI_OUT_OF_RESOURCES is returned.
@ -543,7 +535,7 @@ FindNextFreeDebugRegister (
OUT UINTN *Register OUT UINTN *Register
) )
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
@ -562,7 +554,6 @@ FindNextFreeDebugRegister (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Enables the debug register. Writes Address value to appropriate DR0-3 register. Enables the debug register. Writes Address value to appropriate DR0-3 register.
Sets LENn, Gn, RWn bits in DR7 register. Sets LENn, Gn, RWn bits in DR7 register.
@ -587,56 +578,56 @@ EnableDebugRegister (
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
//Convert length data // Convert length data
Length = ConvertLengthData (Length); Length = ConvertLengthData (Length);
//For Instruction execution, length should be 0 // For Instruction execution, length should be 0
//(Ref. Intel reference manual 18.2.4) // (Ref. Intel reference manual 18.2.4)
if ((Type == 0) && (Length != 0)) { if ((Type == 0) && (Length != 0)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
//Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle // Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
//software breakpoint. We should send empty packet in both these cases. // software breakpoint. We should send empty packet in both these cases.
if ((Type == (BREAK_TYPE)DataRead) || if ((Type == (BREAK_TYPE)DataRead) ||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) { (Type == (BREAK_TYPE)SoftwareBreakpoint))
{
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
//Read DR7 so appropriate Gn, RWn and LENn bits can be modified. // Read DR7 so appropriate Gn, RWn and LENn bits can be modified.
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
if (Register == 0) { if (Register == 0) {
SystemContext.SystemContextIa32->Dr0 = Address; SystemContext.SystemContextIa32->Dr0 = Address;
Dr7.Bits.G0 = 1; Dr7.Bits.G0 = 1;
Dr7.Bits.RW0 = Type; Dr7.Bits.RW0 = Type;
Dr7.Bits.LEN0 = Length; Dr7.Bits.LEN0 = Length;
} else if (Register == 1) { } else if (Register == 1) {
SystemContext.SystemContextIa32->Dr1 = Address; SystemContext.SystemContextIa32->Dr1 = Address;
Dr7.Bits.G1 = 1; Dr7.Bits.G1 = 1;
Dr7.Bits.RW1 = Type; Dr7.Bits.RW1 = Type;
Dr7.Bits.LEN1 = Length; Dr7.Bits.LEN1 = Length;
} else if (Register == 2) { } else if (Register == 2) {
SystemContext.SystemContextIa32->Dr2 = Address; SystemContext.SystemContextIa32->Dr2 = Address;
Dr7.Bits.G2 = 1; Dr7.Bits.G2 = 1;
Dr7.Bits.RW2 = Type; Dr7.Bits.RW2 = Type;
Dr7.Bits.LEN2 = Length; Dr7.Bits.LEN2 = Length;
} else if (Register == 3) { } else if (Register == 3) {
SystemContext.SystemContextIa32->Dr3 = Address; SystemContext.SystemContextIa32->Dr3 = Address;
Dr7.Bits.G3 = 1; Dr7.Bits.G3 = 1;
Dr7.Bits.RW3 = Type; Dr7.Bits.RW3 = Type;
Dr7.Bits.LEN3 = Length; Dr7.Bits.LEN3 = Length;
} else { } else {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
//Update Dr7 with appropriate Gn, RWn and LENn bits // Update Dr7 with appropriate Gn, RWn and LENn bits
SystemContext.SystemContextIa32->Dr7 = Dr7.UintN; SystemContext.SystemContextIa32->Dr7 = Dr7.UintN;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Returns register number 0 - 3 for the matching debug register. Returns register number 0 - 3 for the matching debug register.
This function compares incoming Address, Type, Length and This function compares incoming Address, Type, Length and
@ -655,46 +646,51 @@ EnableDebugRegister (
**/ **/
EFI_STATUS EFI_STATUS
FindMatchingDebugRegister ( FindMatchingDebugRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN Address, IN UINTN Address,
IN UINTN Length, IN UINTN Length,
IN UINTN Type, IN UINTN Type,
OUT UINTN *Register OUT UINTN *Register
) )
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
//Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle // Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
//software breakpoint. We should send empty packet in both these cases. // software breakpoint. We should send empty packet in both these cases.
if ((Type == (BREAK_TYPE)DataRead) || if ((Type == (BREAK_TYPE)DataRead) ||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) { (Type == (BREAK_TYPE)SoftwareBreakpoint))
{
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
//Convert length data // Convert length data
Length = ConvertLengthData(Length); Length = ConvertLengthData (Length);
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
if ((Dr7.Bits.G0 == 1) && if ((Dr7.Bits.G0 == 1) &&
(Dr7.Bits.LEN0 == Length) && (Dr7.Bits.LEN0 == Length) &&
(Dr7.Bits.RW0 == Type) && (Dr7.Bits.RW0 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr0)) { (Address == SystemContext.SystemContextIa32->Dr0))
{
*Register = 0; *Register = 0;
} else if ((Dr7.Bits.G1 == 1) && } else if ((Dr7.Bits.G1 == 1) &&
(Dr7.Bits.LEN1 == Length) && (Dr7.Bits.LEN1 == Length) &&
(Dr7.Bits.RW1 == Type) && (Dr7.Bits.RW1 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr1)) { (Address == SystemContext.SystemContextIa32->Dr1))
{
*Register = 1; *Register = 1;
} else if ((Dr7.Bits.G2 == 1) && } else if ((Dr7.Bits.G2 == 1) &&
(Dr7.Bits.LEN2 == Length) && (Dr7.Bits.LEN2 == Length) &&
(Dr7.Bits.RW2 == Type) && (Dr7.Bits.RW2 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr2)) { (Address == SystemContext.SystemContextIa32->Dr2))
{
*Register = 2; *Register = 2;
} else if ((Dr7.Bits.G3 == 1) && } else if ((Dr7.Bits.G3 == 1) &&
(Dr7.Bits.LEN3 == Length) && (Dr7.Bits.LEN3 == Length) &&
(Dr7.Bits.RW3 == Type) && (Dr7.Bits.RW3 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr3)) { (Address == SystemContext.SystemContextIa32->Dr3))
{
*Register = 3; *Register = 3;
} else { } else {
Print ((CHAR16 *)L"No match found..\n"); Print ((CHAR16 *)L"No match found..\n");
@ -704,7 +700,6 @@ FindMatchingDebugRegister (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Disables the particular debug register. Disables the particular debug register.
@ -716,41 +711,41 @@ FindMatchingDebugRegister (
**/ **/
EFI_STATUS EFI_STATUS
DisableDebugRegister ( DisableDebugRegister (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN UINTN Register IN UINTN Register
) )
{ {
IA32_DR7 Dr7; IA32_DR7 Dr7;
UINTN Address = 0; UINTN Address = 0;
//Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off. // Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
Dr7.UintN = SystemContext.SystemContextIa32->Dr7; Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
if (Register == 0) { if (Register == 0) {
SystemContext.SystemContextIa32->Dr0 = Address; SystemContext.SystemContextIa32->Dr0 = Address;
Dr7.Bits.G0 = 0; Dr7.Bits.G0 = 0;
Dr7.Bits.RW0 = 0; Dr7.Bits.RW0 = 0;
Dr7.Bits.LEN0 = 0; Dr7.Bits.LEN0 = 0;
} else if (Register == 1) { } else if (Register == 1) {
SystemContext.SystemContextIa32->Dr1 = Address; SystemContext.SystemContextIa32->Dr1 = Address;
Dr7.Bits.G1 = 0; Dr7.Bits.G1 = 0;
Dr7.Bits.RW1 = 0; Dr7.Bits.RW1 = 0;
Dr7.Bits.LEN1 = 0; Dr7.Bits.LEN1 = 0;
} else if (Register == 2) { } else if (Register == 2) {
SystemContext.SystemContextIa32->Dr2 = Address; SystemContext.SystemContextIa32->Dr2 = Address;
Dr7.Bits.G2 = 0; Dr7.Bits.G2 = 0;
Dr7.Bits.RW2 = 0; Dr7.Bits.RW2 = 0;
Dr7.Bits.LEN2 = 0; Dr7.Bits.LEN2 = 0;
} else if (Register == 3) { } else if (Register == 3) {
SystemContext.SystemContextIa32->Dr3 = Address; SystemContext.SystemContextIa32->Dr3 = Address;
Dr7.Bits.G3 = 0; Dr7.Bits.G3 = 0;
Dr7.Bits.RW3 = 0; Dr7.Bits.RW3 = 0;
Dr7.Bits.LEN3 = 0; Dr7.Bits.LEN3 = 0;
} else { } else {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
//Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off. // Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
SystemContext.SystemContextIa32->Dr7 = Dr7.UintN; SystemContext.SystemContextIa32->Dr7 = Dr7.UintN;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -772,16 +767,16 @@ VOID
EFIAPI EFIAPI
InsertBreakPoint ( InsertBreakPoint (
IN EFI_SYSTEM_CONTEXT SystemContext, IN EFI_SYSTEM_CONTEXT SystemContext,
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
UINTN Type; UINTN Type;
UINTN Address; UINTN Address;
UINTN Length; UINTN Length;
UINTN Register; UINTN Register;
EFI_STATUS Status; EFI_STATUS Status;
BREAK_TYPE BreakType = NotSupported; BREAK_TYPE BreakType = NotSupported;
UINTN ErrorCode; UINTN ErrorCode;
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length); ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
if (ErrorCode > 0) { if (ErrorCode > 0) {
@ -790,28 +785,27 @@ InsertBreakPoint (
} }
switch (Type) { switch (Type) {
case 0: // Software breakpoint
case 0: //Software breakpoint
BreakType = SoftwareBreakpoint; BreakType = SoftwareBreakpoint;
break; break;
case 1: //Hardware breakpoint case 1: // Hardware breakpoint
BreakType = InstructionExecution; BreakType = InstructionExecution;
break; break;
case 2: //Write watchpoint case 2: // Write watchpoint
BreakType = DataWrite; BreakType = DataWrite;
break; break;
case 3: //Read watchpoint case 3: // Read watchpoint
BreakType = DataRead; BreakType = DataRead;
break; break;
case 4: //Access watchpoint case 4: // Access watchpoint
BreakType = DataReadWrite; BreakType = DataReadWrite;
break; break;
default : default:
Print ((CHAR16 *)L"Insert breakpoint default: %x\n", Type); Print ((CHAR16 *)L"Insert breakpoint default: %x\n", Type);
SendError (GDB_EINVALIDBRKPOINTTYPE); SendError (GDB_EINVALIDBRKPOINTTYPE);
return; return;
@ -819,7 +813,7 @@ InsertBreakPoint (
// Find next free debug register // Find next free debug register
Status = FindNextFreeDebugRegister (SystemContext, &Register); Status = FindNextFreeDebugRegister (SystemContext, &Register);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print ((CHAR16 *)L"No space left on device\n"); Print ((CHAR16 *)L"No space left on device\n");
SendError (GDB_ENOSPACE); SendError (GDB_ENOSPACE);
return; return;
@ -827,11 +821,10 @@ InsertBreakPoint (
// Write Address, length data at particular DR register // Write Address, length data at particular DR register
Status = EnableDebugRegister (SystemContext, Register, Address, Length, (UINTN)BreakType); Status = EnableDebugRegister (SystemContext, Register, Address, Length, (UINTN)BreakType);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
if (Status == EFI_UNSUPPORTED) { if (Status == EFI_UNSUPPORTED) {
Print ((CHAR16 *)L"Not supported\n"); Print ((CHAR16 *)L"Not supported\n");
SendNotSupported(); SendNotSupported ();
return; return;
} }
@ -843,7 +836,6 @@ InsertBreakPoint (
SendSuccess (); SendSuccess ();
} }
/** /**
z1, [addr], [length] z1, [addr], [length]
z2, [addr], [length] z2, [addr], [length]
@ -862,15 +854,15 @@ RemoveBreakPoint (
IN CHAR8 *PacketData IN CHAR8 *PacketData
) )
{ {
UINTN Type; UINTN Type;
UINTN Address; UINTN Address;
UINTN Length; UINTN Length;
UINTN Register; UINTN Register;
BREAK_TYPE BreakType = NotSupported; BREAK_TYPE BreakType = NotSupported;
EFI_STATUS Status; EFI_STATUS Status;
UINTN ErrorCode; UINTN ErrorCode;
//Parse breakpoint packet data // Parse breakpoint packet data
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length); ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
if (ErrorCode > 0) { if (ErrorCode > 0) {
SendError ((UINT8)ErrorCode); SendError ((UINT8)ErrorCode);
@ -878,39 +870,37 @@ RemoveBreakPoint (
} }
switch (Type) { switch (Type) {
case 0: // Software breakpoint
case 0: //Software breakpoint
BreakType = SoftwareBreakpoint; BreakType = SoftwareBreakpoint;
break; break;
case 1: //Hardware breakpoint case 1: // Hardware breakpoint
BreakType = InstructionExecution; BreakType = InstructionExecution;
break; break;
case 2: //Write watchpoint case 2: // Write watchpoint
BreakType = DataWrite; BreakType = DataWrite;
break; break;
case 3: //Read watchpoint case 3: // Read watchpoint
BreakType = DataRead; BreakType = DataRead;
break; break;
case 4: //Access watchpoint case 4: // Access watchpoint
BreakType = DataReadWrite; BreakType = DataReadWrite;
break; break;
default : default:
SendError (GDB_EINVALIDBRKPOINTTYPE); SendError (GDB_EINVALIDBRKPOINTTYPE);
return; return;
} }
//Find matching debug register // Find matching debug register
Status = FindMatchingDebugRegister (SystemContext, Address, Length, (UINTN)BreakType, &Register); Status = FindMatchingDebugRegister (SystemContext, Address, Length, (UINTN)BreakType, &Register);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
if (Status == EFI_UNSUPPORTED) { if (Status == EFI_UNSUPPORTED) {
Print ((CHAR16 *)L"Not supported.\n"); Print ((CHAR16 *)L"Not supported.\n");
SendNotSupported(); SendNotSupported ();
return; return;
} }
@ -919,9 +909,9 @@ RemoveBreakPoint (
return; return;
} }
//Remove breakpoint // Remove breakpoint
Status = DisableDebugRegister(SystemContext, Register); Status = DisableDebugRegister (SystemContext, Register);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print ((CHAR16 *)L"Invalid argument.\n"); Print ((CHAR16 *)L"Invalid argument.\n");
SendError (GDB_EINVALIDARG); SendError (GDB_EINVALIDARG);
return; return;
@ -930,7 +920,6 @@ RemoveBreakPoint (
SendSuccess (); SendSuccess ();
} }
VOID VOID
InitializeProcessor ( InitializeProcessor (
VOID VOID
@ -948,10 +937,9 @@ ValidateAddress (
BOOLEAN BOOLEAN
ValidateException ( ValidateException (
IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext IN OUT EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
return TRUE; return TRUE;
} }

View File

@ -12,6 +12,6 @@
#define CONSOLE_PREF_FORMSET_GUID \ #define CONSOLE_PREF_FORMSET_GUID \
{ 0x2d2358b4, 0xe96c, 0x484d, { 0xb2, 0xdd, 0x7c, 0x2e, 0xdf, 0xc7, 0xd5, 0x6f } } { 0x2d2358b4, 0xe96c, 0x484d, { 0xb2, 0xdd, 0x7c, 0x2e, 0xdf, 0xc7, 0xd5, 0x6f } }
extern EFI_GUID gConsolePrefFormSetGuid; extern EFI_GUID gConsolePrefFormSetGuid;
#endif #endif

View File

@ -12,6 +12,6 @@
#define DT_PLATFORM_DEFAULT_DTB_FILE_GUID \ #define DT_PLATFORM_DEFAULT_DTB_FILE_GUID \
{ 0x25462cda, 0x221f, 0x47df, { 0xac, 0x1d, 0x25, 0x9c, 0xfa, 0xa4, 0xe3, 0x26 } } { 0x25462cda, 0x221f, 0x47df, { 0xac, 0x1d, 0x25, 0x9c, 0xfa, 0xa4, 0xe3, 0x26 } }
extern EFI_GUID gDtPlatformDefaultDtbFileGuid; extern EFI_GUID gDtPlatformDefaultDtbFileGuid;
#endif #endif

View File

@ -12,6 +12,6 @@
#define DT_PLATFORM_FORMSET_GUID \ #define DT_PLATFORM_FORMSET_GUID \
{ 0x2b7a240d, 0xd5ad, 0x4fd6, { 0xbe, 0x1c, 0xdf, 0xa4, 0x41, 0x5f, 0x55, 0x26 } } { 0x2b7a240d, 0xd5ad, 0x4fd6, { 0xbe, 0x1c, 0xdf, 0xa4, 0x41, 0x5f, 0x55, 0x26 } }
extern EFI_GUID gDtPlatformFormSetGuid; extern EFI_GUID gDtPlatformFormSetGuid;
#endif #endif

View File

@ -11,20 +11,18 @@
#include <Library/ExtractGuidedSectionLib.h> #include <Library/ExtractGuidedSectionLib.h>
// //
// The GUID for this protocol mathes the Decompression scheme being used // The GUID for this protocol mathes the Decompression scheme being used
// So for example LZMA would be gLzmaCustomDecompressGuid // So for example LZMA would be gLzmaCustomDecompressGuid
// //
typedef struct { typedef struct {
EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER SectionGetInfo; EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER SectionGetInfo;
EXTRACT_GUIDED_SECTION_DECODE_HANDLER SectionExtraction; EXTRACT_GUIDED_SECTION_DECODE_HANDLER SectionExtraction;
} EXTRACT_SECTION_DATA; } EXTRACT_SECTION_DATA;
typedef struct { typedef struct {
EFI_HOB_GUID_TYPE Hob; EFI_HOB_GUID_TYPE Hob;
EXTRACT_SECTION_DATA Data; EXTRACT_SECTION_DATA Data;
} EXTRACT_SECTION_HOB; } EXTRACT_SECTION_HOB;
#endif #endif

View File

@ -12,11 +12,11 @@
#define FDT_TABLE_GUID \ #define FDT_TABLE_GUID \
{ 0xb1b621d5, 0xf19c, 0x41a5, { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } } { 0xb1b621d5, 0xf19c, 0x41a5, { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } }
extern EFI_GUID gFdtTableGuid; extern EFI_GUID gFdtTableGuid;
#define FDT_VARIABLE_GUID \ #define FDT_VARIABLE_GUID \
{ 0x25a4fd4a, 0x9703, 0x4ba9, { 0xa1, 0x90, 0xb7, 0xc8, 0x4e, 0xfb, 0x3e, 0x57 } } { 0x25a4fd4a, 0x9703, 0x4ba9, { 0xa1, 0x90, 0xb7, 0xc8, 0x4e, 0xfb, 0x3e, 0x57 } }
extern EFI_GUID gFdtVariableGuid; extern EFI_GUID gFdtVariableGuid;
#endif /* __FDT_H__ */ #endif /* __FDT_H__ */

View File

@ -10,11 +10,11 @@
#ifndef __FDT_HOB_H__ #ifndef __FDT_HOB_H__
#define __FDT_HOB_H__ #define __FDT_HOB_H__
#define FDT_HOB_GUID { \ #define FDT_HOB_GUID {\
0x16958446, 0x19B7, 0x480B, \ 0x16958446, 0x19B7, 0x480B, \
{ 0xB0, 0x47, 0x74, 0x85, 0xAD, 0x3F, 0x71, 0x6D } \ { 0xB0, 0x47, 0x74, 0x85, 0xAD, 0x3F, 0x71, 0x6D } \
} }
extern EFI_GUID gFdtHobGuid; extern EFI_GUID gFdtHobGuid;
#endif #endif

View File

@ -18,7 +18,6 @@
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef __EDKII_NV_VAR_STORE_FORMATTED_H__ #ifndef __EDKII_NV_VAR_STORE_FORMATTED_H__
#define __EDKII_NV_VAR_STORE_FORMATTED_H__ #define __EDKII_NV_VAR_STORE_FORMATTED_H__
@ -28,6 +27,6 @@
{ 0x83, 0xcd, 0xdc, 0x2c, 0x29, 0xc8, 0x91, 0xa3 } \ { 0x83, 0xcd, 0xdc, 0x2c, 0x29, 0xc8, 0x91, 0xa3 } \
} }
extern EFI_GUID gEdkiiNvVarStoreFormattedGuid; extern EFI_GUID gEdkiiNvVarStoreFormattedGuid;
#endif #endif

View File

@ -14,7 +14,6 @@
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef __EDKII_PLATFORM_HAS_DEVICE_TREE_H__ #ifndef __EDKII_PLATFORM_HAS_DEVICE_TREE_H__
#define __EDKII_PLATFORM_HAS_DEVICE_TREE_H__ #define __EDKII_PLATFORM_HAS_DEVICE_TREE_H__
@ -24,6 +23,6 @@
{ 0xb2, 0xaf, 0x54, 0x1e, 0x1d, 0xce, 0x14, 0x8b } \ { 0xb2, 0xaf, 0x54, 0x1e, 0x1d, 0xce, 0x14, 0x8b } \
} }
extern EFI_GUID gEdkiiPlatformHasDeviceTreeGuid; extern EFI_GUID gEdkiiPlatformHasDeviceTreeGuid;
#endif #endif

View File

@ -17,11 +17,11 @@
// //
// Macros for the Generic Address Space // Macros for the Generic Address Space
// //
#define NULL_GAS { EFI_ACPI_5_0_SYSTEM_MEMORY, 0, 0, EFI_ACPI_5_0_UNDEFINED, 0L } #define NULL_GAS { EFI_ACPI_5_0_SYSTEM_MEMORY, 0, 0, EFI_ACPI_5_0_UNDEFINED, 0L }
#define ARM_GAS8(Address) { EFI_ACPI_5_0_SYSTEM_MEMORY, 8, 0, EFI_ACPI_5_0_BYTE, Address } #define ARM_GAS8(Address) { EFI_ACPI_5_0_SYSTEM_MEMORY, 8, 0, EFI_ACPI_5_0_BYTE, Address }
#define ARM_GAS16(Address) { EFI_ACPI_5_0_SYSTEM_MEMORY, 16, 0, EFI_ACPI_5_0_WORD, Address } #define ARM_GAS16(Address) { EFI_ACPI_5_0_SYSTEM_MEMORY, 16, 0, EFI_ACPI_5_0_WORD, Address }
#define ARM_GAS32(Address) { EFI_ACPI_5_0_SYSTEM_MEMORY, 32, 0, EFI_ACPI_5_0_DWORD, Address } #define ARM_GAS32(Address) { EFI_ACPI_5_0_SYSTEM_MEMORY, 32, 0, EFI_ACPI_5_0_DWORD, Address }
#define ARM_GASN(Address) { EFI_ACPI_5_0_SYSTEM_MEMORY, 0, 0, EFI_ACPI_5_0_DWORD, Address } #define ARM_GASN(Address) { EFI_ACPI_5_0_SYSTEM_MEMORY, 0, 0, EFI_ACPI_5_0_DWORD, Address }
// //
// Macros for the Multiple APIC Description Table (MADT) // Macros for the Multiple APIC Description Table (MADT)
@ -48,7 +48,7 @@
// Note the parking protocol is configured by UEFI if required // Note the parking protocol is configured by UEFI if required
#define EFI_ACPI_5_1_GICC_STRUCTURE_INIT(GicId, AcpiCpuUid, Mpidr, Flags, PmuIrq, \ #define EFI_ACPI_5_1_GICC_STRUCTURE_INIT(GicId, AcpiCpuUid, Mpidr, Flags, PmuIrq, \
GicBase, GicVBase, GicHBase, GsivId, GicRBase) \ GicBase, GicVBase, GicHBase, GsivId, GicRBase) \
{ \ { \
EFI_ACPI_5_1_GIC, sizeof (EFI_ACPI_5_1_GIC_STRUCTURE), EFI_ACPI_RESERVED_WORD, \ EFI_ACPI_5_1_GIC, sizeof (EFI_ACPI_5_1_GIC_STRUCTURE), EFI_ACPI_RESERVED_WORD, \
GicId, AcpiCpuUid, Flags, 0, PmuIrq, 0, GicBase, GicVBase, GicHBase, \ GicId, AcpiCpuUid, Flags, 0, PmuIrq, 0, GicBase, GicVBase, GicHBase, \
@ -56,7 +56,7 @@
} }
#define EFI_ACPI_6_0_GICC_STRUCTURE_INIT(GicId, AcpiCpuUid, Mpidr, Flags, PmuIrq, \ #define EFI_ACPI_6_0_GICC_STRUCTURE_INIT(GicId, AcpiCpuUid, Mpidr, Flags, PmuIrq, \
GicBase, GicVBase, GicHBase, GsivId, GicRBase, Efficiency) \ GicBase, GicVBase, GicHBase, GsivId, GicRBase, Efficiency) \
{ \ { \
EFI_ACPI_6_0_GIC, sizeof (EFI_ACPI_6_0_GIC_STRUCTURE), EFI_ACPI_RESERVED_WORD, \ EFI_ACPI_6_0_GIC, sizeof (EFI_ACPI_6_0_GIC_STRUCTURE), EFI_ACPI_RESERVED_WORD, \
GicId, AcpiCpuUid, Flags, 0, PmuIrq, 0, GicBase, GicVBase, GicHBase, \ GicId, AcpiCpuUid, Flags, 0, PmuIrq, 0, GicBase, GicVBase, GicHBase, \
@ -65,7 +65,7 @@
} }
#define EFI_ACPI_6_3_GICC_STRUCTURE_INIT(GicId, AcpiCpuUid, Mpidr, Flags, PmuIrq, \ #define EFI_ACPI_6_3_GICC_STRUCTURE_INIT(GicId, AcpiCpuUid, Mpidr, Flags, PmuIrq, \
GicBase, GicVBase, GicHBase, GsivId, GicRBase, Efficiency, SpeOvflIrq) \ GicBase, GicVBase, GicHBase, GsivId, GicRBase, Efficiency, SpeOvflIrq) \
{ \ { \
EFI_ACPI_6_0_GIC, sizeof (EFI_ACPI_6_3_GIC_STRUCTURE), EFI_ACPI_RESERVED_WORD, \ EFI_ACPI_6_0_GIC, sizeof (EFI_ACPI_6_3_GIC_STRUCTURE), EFI_ACPI_RESERVED_WORD, \
GicId, AcpiCpuUid, Flags, 0, PmuIrq, 0, GicBase, GicVBase, GicHBase, \ GicId, AcpiCpuUid, Flags, 0, PmuIrq, 0, GicBase, GicVBase, GicHBase, \
@ -82,7 +82,7 @@
// SBSA Generic Watchdog // SBSA Generic Watchdog
// //
#define EFI_ACPI_5_1_SBSA_GENERIC_WATCHDOG_STRUCTURE_INIT(RefreshFramePhysicalAddress, \ #define EFI_ACPI_5_1_SBSA_GENERIC_WATCHDOG_STRUCTURE_INIT(RefreshFramePhysicalAddress, \
ControlFramePhysicalAddress, WatchdogTimerGSIV, WatchdogTimerFlags) \ ControlFramePhysicalAddress, WatchdogTimerGSIV, WatchdogTimerFlags) \
{ \ { \
EFI_ACPI_5_1_GTDT_SBSA_GENERIC_WATCHDOG, sizeof(EFI_ACPI_5_1_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE), \ EFI_ACPI_5_1_GTDT_SBSA_GENERIC_WATCHDOG, sizeof(EFI_ACPI_5_1_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE), \
EFI_ACPI_RESERVED_BYTE, RefreshFramePhysicalAddress, ControlFramePhysicalAddress, \ EFI_ACPI_RESERVED_BYTE, RefreshFramePhysicalAddress, ControlFramePhysicalAddress, \
@ -91,7 +91,7 @@
typedef typedef
BOOLEAN BOOLEAN
(EFIAPI *EFI_LOCATE_ACPI_CHECK) ( (EFIAPI *EFI_LOCATE_ACPI_CHECK)(
IN EFI_ACPI_DESCRIPTION_HEADER *AcpiHeader IN EFI_ACPI_DESCRIPTION_HEADER *AcpiHeader
); );
@ -109,7 +109,7 @@ BOOLEAN
**/ **/
EFI_STATUS EFI_STATUS
LocateAndInstallAcpiFromFvConditional ( LocateAndInstallAcpiFromFvConditional (
IN CONST EFI_GUID* AcpiFile, IN CONST EFI_GUID *AcpiFile,
IN EFI_LOCATE_ACPI_CHECK CheckAcpiTableFunction IN EFI_LOCATE_ACPI_CHECK CheckAcpiTableFunction
); );
@ -125,7 +125,7 @@ LocateAndInstallAcpiFromFvConditional (
**/ **/
EFI_STATUS EFI_STATUS
LocateAndInstallAcpiFromFv ( LocateAndInstallAcpiFromFv (
IN CONST EFI_GUID* AcpiFile IN CONST EFI_GUID *AcpiFile
); );
#endif // __ACPI_LIB_H__ #endif // __ACPI_LIB_H__

View File

@ -19,32 +19,33 @@
#define ANDROID_BOOTIMG_KERNEL_ARGS_SIZE 512 #define ANDROID_BOOTIMG_KERNEL_ARGS_SIZE 512
#define ANDROID_BOOT_MAGIC "ANDROID!" #define ANDROID_BOOT_MAGIC "ANDROID!"
#define ANDROID_BOOT_MAGIC_LENGTH (sizeof (ANDROID_BOOT_MAGIC) - 1) #define ANDROID_BOOT_MAGIC_LENGTH (sizeof (ANDROID_BOOT_MAGIC) - 1)
// No documentation for this really - sizes of fields has been determined // No documentation for this really - sizes of fields has been determined
// empirically. // empirically.
#pragma pack(1) #pragma pack(1)
/* https://android.googlesource.com/platform/system/core/+/master/mkbootimg/bootimg.h */ /* https://android.googlesource.com/platform/system/core/+/master/mkbootimg/bootimg.h */
typedef struct { typedef struct {
UINT8 BootMagic[ANDROID_BOOT_MAGIC_LENGTH]; UINT8 BootMagic[ANDROID_BOOT_MAGIC_LENGTH];
UINT32 KernelSize; UINT32 KernelSize;
UINT32 KernelAddress; UINT32 KernelAddress;
UINT32 RamdiskSize; UINT32 RamdiskSize;
UINT32 RamdiskAddress; UINT32 RamdiskAddress;
UINT32 SecondStageBootloaderSize; UINT32 SecondStageBootloaderSize;
UINT32 SecondStageBootloaderAddress; UINT32 SecondStageBootloaderAddress;
UINT32 KernelTaggsAddress; UINT32 KernelTaggsAddress;
UINT32 PageSize; UINT32 PageSize;
UINT32 Reserved[2]; UINT32 Reserved[2];
CHAR8 ProductName[16]; CHAR8 ProductName[16];
CHAR8 KernelArgs[ANDROID_BOOTIMG_KERNEL_ARGS_SIZE]; CHAR8 KernelArgs[ANDROID_BOOTIMG_KERNEL_ARGS_SIZE];
UINT32 Id[32]; UINT32 Id[32];
} ANDROID_BOOTIMG_HEADER; } ANDROID_BOOTIMG_HEADER;
#pragma pack () #pragma pack ()
/* Check Val (unsigned) is a power of 2 (has only one bit set) */ /* Check Val (unsigned) is a power of 2 (has only one bit set) */
#define IS_POWER_OF_2(Val) ((Val) != 0 && (((Val) & ((Val) - 1)) == 0)) #define IS_POWER_OF_2(Val) ((Val) != 0 && (((Val) & ((Val) - 1)) == 0))
/* Android boot image page size is not specified, but it should be power of 2 /* Android boot image page size is not specified, but it should be power of 2
* and larger than boot header */ * and larger than boot header */
#define IS_VALID_ANDROID_PAGE_SIZE(Val) \ #define IS_VALID_ANDROID_PAGE_SIZE(Val) \
@ -52,14 +53,14 @@ typedef struct {
EFI_STATUS EFI_STATUS
AndroidBootImgGetImgSize ( AndroidBootImgGetImgSize (
IN VOID *BootImg, IN VOID *BootImg,
OUT UINTN *ImgSize OUT UINTN *ImgSize
); );
EFI_STATUS EFI_STATUS
AndroidBootImgBoot ( AndroidBootImgBoot (
IN VOID *Buffer, IN VOID *Buffer,
IN UINTN BufferSize IN UINTN BufferSize
); );
#endif /* __ABOOTIMG_H__ */ #endif /* __ABOOTIMG_H__ */

View File

@ -12,8 +12,6 @@
#ifndef __GDB_TIMER_LIB__ #ifndef __GDB_TIMER_LIB__
#define __GDB_TIMER_LIB__ #define __GDB_TIMER_LIB__
/** /**
Setup all the hardware needed for the debug agents timer. Setup all the hardware needed for the debug agents timer.
@ -26,7 +24,6 @@ DebugAgentTimerIntialize (
VOID VOID
); );
/** /**
Set the period for the debug agent timer. Zero means disable the timer. Set the period for the debug agent timer. Zero means disable the timer.
@ -39,7 +36,6 @@ DebugAgentTimerSetPeriod (
IN UINT32 TimerPeriodMilliseconds IN UINT32 TimerPeriodMilliseconds
); );
/** /**
Perform End Of Interrupt for the debug agent timer. This is called in the Perform End Of Interrupt for the debug agent timer. This is called in the
interrupt handler after the interrupt has been processed. interrupt handler after the interrupt has been processed.
@ -52,5 +48,3 @@ DebugAgentTimerEndOfInterrupt (
); );
#endif #endif

View File

@ -51,9 +51,6 @@ typedef enum {
MapOperationMaximum MapOperationMaximum
} DMA_MAP_OPERATION; } DMA_MAP_OPERATION;
/** /**
Provides the DMA controller-specific addresses needed to access system memory. Provides the DMA controller-specific addresses needed to access system memory.
@ -77,16 +74,13 @@ typedef enum {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaMap ( DmaMap (
IN DMA_MAP_OPERATION Operation, IN DMA_MAP_OPERATION Operation,
IN VOID *HostAddress, IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes, IN OUT UINTN *NumberOfBytes,
OUT PHYSICAL_ADDRESS *DeviceAddress, OUT PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping OUT VOID **Mapping
); );
/** /**
Completes the DmaMapBusMasterRead, DmaMapBusMasterWrite, or DmaMapBusMasterCommonBuffer Completes the DmaMapBusMasterRead, DmaMapBusMasterWrite, or DmaMapBusMasterCommonBuffer
operation and releases any corresponding resources. operation and releases any corresponding resources.
@ -100,10 +94,9 @@ DmaMap (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaUnmap ( DmaUnmap (
IN VOID *Mapping IN VOID *Mapping
); );
/** /**
Allocates pages that are suitable for an DmaMap() of type MapOperationBusMasterCommonBuffer. Allocates pages that are suitable for an DmaMap() of type MapOperationBusMasterCommonBuffer.
mapping. mapping.
@ -124,12 +117,11 @@ DmaUnmap (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaAllocateBuffer ( DmaAllocateBuffer (
IN EFI_MEMORY_TYPE MemoryType, IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Pages, IN UINTN Pages,
OUT VOID **HostAddress OUT VOID **HostAddress
); );
/** /**
Frees memory that was allocated with DmaAllocateBuffer(). Frees memory that was allocated with DmaAllocateBuffer().
@ -144,11 +136,10 @@ DmaAllocateBuffer (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaFreeBuffer ( DmaFreeBuffer (
IN UINTN Pages, IN UINTN Pages,
IN VOID *HostAddress IN VOID *HostAddress
); );
/** /**
Allocates pages that are suitable for an DmaMap() of type Allocates pages that are suitable for an DmaMap() of type
MapOperationBusMasterCommonBuffer mapping, at the requested alignment. MapOperationBusMasterCommonBuffer mapping, at the requested alignment.
@ -171,11 +162,10 @@ DmaFreeBuffer (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaAllocateAlignedBuffer ( DmaAllocateAlignedBuffer (
IN EFI_MEMORY_TYPE MemoryType, IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Pages, IN UINTN Pages,
IN UINTN Alignment, IN UINTN Alignment,
OUT VOID **HostAddress OUT VOID **HostAddress
); );
#endif #endif

View File

@ -26,8 +26,8 @@
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DtPlatformLoadDtb ( DtPlatformLoadDtb (
OUT VOID **Dtb, OUT VOID **Dtb,
OUT UINTN *DtbSize OUT UINTN *DtbSize
); );
#endif #endif

View File

@ -42,7 +42,7 @@
#include <Guid/FileInfo.h> #include <Guid/FileInfo.h>
#include <Guid/FileSystemInfo.h> #include <Guid/FileSystemInfo.h>
#define MAX_PATHNAME 0x200 #define MAX_PATHNAME 0x200
/// Type of the file that has been opened /// Type of the file that has been opened
typedef enum { typedef enum {
@ -55,52 +55,49 @@ typedef enum {
EfiOpenMaxValue EfiOpenMaxValue
} EFI_OPEN_FILE_TYPE; } EFI_OPEN_FILE_TYPE;
/// Public information about the open file /// Public information about the open file
typedef struct { typedef struct {
UINTN Version; // Common information UINTN Version; // Common information
EFI_OPEN_FILE_TYPE Type; EFI_OPEN_FILE_TYPE Type;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_STATUS LastError; EFI_STATUS LastError;
EFI_HANDLE EfiHandle; EFI_HANDLE EfiHandle;
CHAR8 *DeviceName; CHAR8 *DeviceName;
CHAR8 *FileName; CHAR8 *FileName;
UINT64 CurrentPosition; // Information for Seek UINT64 CurrentPosition; // Information for Seek
UINT64 MaxPosition; UINT64 MaxPosition;
UINTN BaseOffset; // Base offset for hexdump command UINTN BaseOffset; // Base offset for hexdump command
UINTN Size; // Valid for all types other than l#: UINTN Size; // Valid for all types other than l#:
UINT8 *Buffer; // Information valid for A#: UINT8 *Buffer; // Information valid for A#:
EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; // Information valid for Fv#: EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; // Information valid for Fv#:
EFI_GUID FvNameGuid; EFI_GUID FvNameGuid;
EFI_SECTION_TYPE FvSectionType; EFI_SECTION_TYPE FvSectionType;
EFI_FV_FILETYPE FvType; EFI_FV_FILETYPE FvType;
EFI_FV_FILE_ATTRIBUTES FvAttributes; EFI_FV_FILE_ATTRIBUTES FvAttributes;
EFI_PHYSICAL_ADDRESS FvStart; EFI_PHYSICAL_ADDRESS FvStart;
UINTN FvSize; UINTN FvSize;
UINTN FvHeaderSize; UINTN FvHeaderSize;
EFI_FILE *FsFileHandle; // Information valid for Fs#: EFI_FILE *FsFileHandle; // Information valid for Fs#:
EFI_FILE_SYSTEM_INFO *FsInfo; EFI_FILE_SYSTEM_INFO *FsInfo;
EFI_FILE_INFO *FsFileInfo; EFI_FILE_INFO *FsFileInfo;
EFI_BLOCK_IO_MEDIA *FsBlockIoMedia; // Information valid for Fs#: or B#: EFI_BLOCK_IO_MEDIA *FsBlockIoMedia; // Information valid for Fs#: or B#:
EFI_BLOCK_IO_PROTOCOL *FsBlockIo; // Information valid for Fs#: or B#: EFI_BLOCK_IO_PROTOCOL *FsBlockIo; // Information valid for Fs#: or B#:
UINTN DiskOffset; // Information valid for B#: UINTN DiskOffset; // Information valid for B#:
EFI_LOAD_FILE_PROTOCOL *LoadFile; // Information valid for l#: EFI_LOAD_FILE_PROTOCOL *LoadFile; // Information valid for l#:
EFI_IP_ADDRESS ServerIp; // Information valid for t:
BOOLEAN IsDirty;
BOOLEAN IsBufferValid;
EFI_IP_ADDRESS ServerIp; // Information valid for t:
BOOLEAN IsDirty;
BOOLEAN IsBufferValid;
} EFI_OPEN_FILE; } EFI_OPEN_FILE;
/// Type of Seek to perform /// Type of Seek to perform
typedef enum { typedef enum {
EfiSeekStart, EfiSeekStart,
@ -109,7 +106,6 @@ typedef enum {
EfiSeekMax EfiSeekMax
} EFI_SEEK_TYPE; } EFI_SEEK_TYPE;
/** /**
Open a device named by PathName. The PathName includes a device name and Open a device named by PathName. The PathName includes a device name and
path separated by a :. See file header for more details on the PathName path separated by a :. See file header for more details on the PathName
@ -131,15 +127,15 @@ typedef enum {
**/ **/
EFI_OPEN_FILE * EFI_OPEN_FILE *
EfiOpen ( EfiOpen (
IN CHAR8 *PathName, IN CHAR8 *PathName,
IN CONST UINT64 OpenMode, IN CONST UINT64 OpenMode,
IN CONST EFI_SECTION_TYPE SectionType IN CONST EFI_SECTION_TYPE SectionType
); );
EFI_STATUS EFI_STATUS
EfiCopyFile ( EfiCopyFile (
IN CHAR8 *DestinationFile, IN CHAR8 *DestinationFile,
IN CHAR8 *SourceFile IN CHAR8 *SourceFile
); );
/** /**
@ -154,11 +150,10 @@ EfiCopyFile (
**/ **/
EFI_OPEN_FILE * EFI_OPEN_FILE *
EfiDeviceOpenByType ( EfiDeviceOpenByType (
IN EFI_OPEN_FILE_TYPE DeviceType, IN EFI_OPEN_FILE_TYPE DeviceType,
IN UINTN Index IN UINTN Index
); );
/** /**
Close a file handle opened by EfiOpen() and free all resources allocated by Close a file handle opened by EfiOpen() and free all resources allocated by
EfiOpen(). EfiOpen().
@ -171,10 +166,9 @@ EfiDeviceOpenByType (
**/ **/
EFI_STATUS EFI_STATUS
EfiClose ( EfiClose (
IN EFI_OPEN_FILE *Stream IN EFI_OPEN_FILE *Stream
); );
/** /**
Return the size of the file represented by Stream. Also return the current Return the size of the file represented by Stream. Also return the current
Seek position. Opening a file will enable a valid file size to be returned. Seek position. Opening a file will enable a valid file size to be returned.
@ -187,11 +181,10 @@ EfiClose (
**/ **/
UINTN UINTN
EfiTell ( EfiTell (
IN EFI_OPEN_FILE *Stream, IN EFI_OPEN_FILE *Stream,
OUT UINT64 *CurrentPosition OPTIONAL OUT UINT64 *CurrentPosition OPTIONAL
); );
/** /**
Seek to the Offset location in the file. LoadFile and FV device types do Seek to the Offset location in the file. LoadFile and FV device types do
not support EfiSeek(). It is not possible to grow the file size using not support EfiSeek(). It is not possible to grow the file size using
@ -215,12 +208,11 @@ EfiTell (
**/ **/
EFI_STATUS EFI_STATUS
EfiSeek ( EfiSeek (
IN EFI_OPEN_FILE *Stream, IN EFI_OPEN_FILE *Stream,
IN EFI_LBA Offset, IN EFI_LBA Offset,
IN EFI_SEEK_TYPE SeekType IN EFI_SEEK_TYPE SeekType
); );
/** /**
Read BufferSize bytes from the current location in the file. For load file Read BufferSize bytes from the current location in the file. For load file
and FV case you must read the entire file. and FV case you must read the entire file.
@ -239,12 +231,11 @@ EfiSeek (
**/ **/
EFI_STATUS EFI_STATUS
EfiRead ( EfiRead (
IN EFI_OPEN_FILE *Stream, IN EFI_OPEN_FILE *Stream,
OUT VOID *Buffer, OUT VOID *Buffer,
OUT UINTN *BufferSize OUT UINTN *BufferSize
); );
/** /**
Read the entire file into a buffer. This routine allocates the buffer and Read the entire file into a buffer. This routine allocates the buffer and
returns it to the user full of the read data. returns it to the user full of the read data.
@ -266,12 +257,11 @@ EfiRead (
**/ **/
EFI_STATUS EFI_STATUS
EfiReadAllocatePool ( EfiReadAllocatePool (
IN EFI_OPEN_FILE *Stream, IN EFI_OPEN_FILE *Stream,
OUT VOID **Buffer, OUT VOID **Buffer,
OUT UINTN *BufferSize OUT UINTN *BufferSize
); );
/** /**
Write data back to the file. Write data back to the file.
@ -289,12 +279,11 @@ EfiReadAllocatePool (
**/ **/
EFI_STATUS EFI_STATUS
EfiWrite ( EfiWrite (
IN EFI_OPEN_FILE *Stream, IN EFI_OPEN_FILE *Stream,
OUT VOID *Buffer, OUT VOID *Buffer,
OUT UINTN *BufferSize OUT UINTN *BufferSize
); );
/** /**
Return the number of devices of the current type active in the system Return the number of devices of the current type active in the system
@ -305,10 +294,9 @@ EfiWrite (
**/ **/
UINTN UINTN
EfiGetDeviceCounts ( EfiGetDeviceCounts (
IN EFI_OPEN_FILE_TYPE Type IN EFI_OPEN_FILE_TYPE Type
); );
/** /**
Set the Current Working Directory (CWD). If a call is made to EfiOpen () and Set the Current Working Directory (CWD). If a call is made to EfiOpen () and
the path does not contain a device name, The CWD is prepended to the path. the path does not contain a device name, The CWD is prepended to the path.
@ -322,7 +310,7 @@ EfiGetDeviceCounts (
**/ **/
EFI_STATUS EFI_STATUS
EfiSetCwd ( EfiSetCwd (
IN CHAR8 *Cwd IN CHAR8 *Cwd
); );
/** /**

View File

@ -6,11 +6,9 @@
**/ **/
#ifndef __EFI_RESET_SYSTEM_LIB_H___ #ifndef __EFI_RESET_SYSTEM_LIB_H___
#define __EFI_RESET_SYSTEM_LIB_H___ #define __EFI_RESET_SYSTEM_LIB_H___
/** /**
Resets the entire platform. Resets the entire platform.
@ -25,14 +23,12 @@
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibResetSystem ( LibResetSystem (
IN EFI_RESET_TYPE ResetType, IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus, IN EFI_STATUS ResetStatus,
IN UINTN DataSize, IN UINTN DataSize,
IN CHAR16 *ResetData OPTIONAL IN CHAR16 *ResetData OPTIONAL
); );
/** /**
Initialize any infrastructure required for LibResetSystem () to function. Initialize any infrastructure required for LibResetSystem () to function.

View File

@ -21,7 +21,7 @@
**/ **/
EFI_STATUS EFI_STATUS
InstallFdtFromSemihosting ( InstallFdtFromSemihosting (
IN CONST CHAR16* FileName IN CONST CHAR16 *FileName
); );
/** /**
@ -36,7 +36,7 @@ InstallFdtFromSemihosting (
**/ **/
EFI_STATUS EFI_STATUS
InstallFdtFromFv ( InstallFdtFromFv (
IN CONST EFI_GUID *FileName IN CONST EFI_GUID *FileName
); );
#endif #endif

View File

@ -10,8 +10,6 @@
#ifndef __GDB_SERIAL_LIB_H__ #ifndef __GDB_SERIAL_LIB_H__
#define __GDB_SERIAL_LIB_H__ #define __GDB_SERIAL_LIB_H__
/** /**
Sets the baud rate, receive FIFO depth, transmit/receive time out, parity, Sets the baud rate, receive FIFO depth, transmit/receive time out, parity,
data buts, and stop bits on a serial device. This call is optional as the serial data buts, and stop bits on a serial device. This call is optional as the serial
@ -34,13 +32,12 @@
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
GdbSerialInit ( GdbSerialInit (
IN UINT64 BaudRate, IN UINT64 BaudRate,
IN UINT8 Parity, IN UINT8 Parity,
IN UINT8 DataBits, IN UINT8 DataBits,
IN UINT8 StopBits IN UINT8 StopBits
); );
/** /**
Check to see if a character is available from GDB. Do not read the character as that is Check to see if a character is available from GDB. Do not read the character as that is
done via GdbGetChar(). done via GdbGetChar().
@ -67,7 +64,6 @@ GdbGetChar (
VOID VOID
); );
/** /**
Send a character to GDB. This function must be able to run in interrupt context. Send a character to GDB. This function must be able to run in interrupt context.
@ -79,10 +75,9 @@ GdbGetChar (
VOID VOID
EFIAPI EFIAPI
GdbPutChar ( GdbPutChar (
IN CHAR8 Char IN CHAR8 Char
); );
/** /**
Send an ASCII string to GDB. This function must be able to run in interrupt context. Send an ASCII string to GDB. This function must be able to run in interrupt context.
@ -96,6 +91,4 @@ GdbPutString (
IN CHAR8 *String IN CHAR8 *String
); );
#endif #endif

View File

@ -6,15 +6,18 @@
**/ **/
#ifndef __RUNTIME_SERVICES_LIB_H__ #ifndef __RUNTIME_SERVICES_LIB_H__
#define __RUNTIME_SERVICES_LIB_H__ #define __RUNTIME_SERVICES_LIB_H__
VOID VOID
LibMtcInitialize (VOID); LibMtcInitialize (
VOID
);
VOID VOID
LibMtcVirtualAddressChangeEvent (VOID); LibMtcVirtualAddressChangeEvent (
VOID
);
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -27,21 +30,23 @@ LibMtcGetNextMonotonicCount (
OUT UINT64 *Count OUT UINT64 *Count
); );
VOID
LibVariableInitialize (
VOID
);
VOID VOID
LibVariableInitialize (VOID); LibVariableVirtualAddressChangeEvent (
VOID
VOID );
LibVariableVirtualAddressChangeEvent (VOID);
EFI_STATUS EFI_STATUS
LibGetVariable ( LibGetVariable (
IN CHAR16 *VariableName, IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid, IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes OPTIONAL, OUT UINT32 *Attributes OPTIONAL,
IN OUT UINTN *DataSize, IN OUT UINTN *DataSize,
OUT VOID *Data OUT VOID *Data
); );
EFI_STATUS EFI_STATUS
@ -53,49 +58,54 @@ LibGetNextVariableName (
EFI_STATUS EFI_STATUS
LibSetVariable ( LibSetVariable (
IN CHAR16 *VariableName, IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid, IN EFI_GUID *VendorGuid,
IN UINT32 Attributes, IN UINT32 Attributes,
IN UINTN DataSize, IN UINTN DataSize,
IN VOID *Data IN VOID *Data
); );
EFI_STATUS EFI_STATUS
LibQueryVariableInfo ( LibQueryVariableInfo (
IN UINT32 Attributes, IN UINT32 Attributes,
OUT UINT64 *MaximumVariableStorageSize, OUT UINT64 *MaximumVariableStorageSize,
OUT UINT64 *RemainingVariableStorageSize, OUT UINT64 *RemainingVariableStorageSize,
OUT UINT64 *MaximumVariableSize OUT UINT64 *MaximumVariableSize
); );
VOID
LibResetInitializeReset (
VOID
);
VOID VOID
LibResetInitializeReset (VOID); LibResetVirtualAddressChangeEvent (
VOID
VOID );
LibResetVirtualAddressChangeEvent (VOID);
VOID VOID
LibResetSystem ( LibResetSystem (
IN EFI_RESET_TYPE ResetType, IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus, IN EFI_STATUS ResetStatus,
IN UINTN DataSize, IN UINTN DataSize,
IN CHAR16 *ResetData OPTIONAL IN CHAR16 *ResetData OPTIONAL
); );
VOID
LibCapsuleInitialize (
VOID
);
VOID VOID
LibCapsuleInitialize (VOID); LibCapsuleVirtualAddressChangeEvent (
VOID
VOID );
LibCapsuleVirtualAddressChangeEvent (VOID);
EFI_STATUS EFI_STATUS
LibUpdateCapsule ( LibUpdateCapsule (
IN UEFI_CAPSULE_HEADER **CapsuleHeaderArray, IN UEFI_CAPSULE_HEADER **CapsuleHeaderArray,
IN UINTN CapsuleCount, IN UINTN CapsuleCount,
IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL
); );
EFI_STATUS EFI_STATUS
@ -106,13 +116,15 @@ QueryCapsuleCapabilities (
OUT EFI_RESET_TYPE *ResetType OUT EFI_RESET_TYPE *ResetType
); );
VOID
LibRtcInitialize (
VOID
);
VOID VOID
LibRtcInitialize (VOID); LibRtcVirtualAddressChangeEvent (
VOID
VOID );
LibRtcVirtualAddressChangeEvent (VOID);
EFI_STATUS EFI_STATUS
LibGetTime ( LibGetTime (
@ -122,38 +134,39 @@ LibGetTime (
EFI_STATUS EFI_STATUS
LibSetTime ( LibSetTime (
IN EFI_TIME *Time IN EFI_TIME *Time
); );
EFI_STATUS EFI_STATUS
LibGetWakeupTime ( LibGetWakeupTime (
OUT BOOLEAN *Enabled, OUT BOOLEAN *Enabled,
OUT BOOLEAN *Pending, OUT BOOLEAN *Pending,
OUT EFI_TIME *Time OUT EFI_TIME *Time
); );
EFI_STATUS EFI_STATUS
LibSetWakeupTime ( LibSetWakeupTime (
IN BOOLEAN Enabled, IN BOOLEAN Enabled,
OUT EFI_TIME *Time OUT EFI_TIME *Time
); );
VOID
LibReportStatusCodeInitialize (
VOID
);
VOID VOID
LibReportStatusCodeInitialize (VOID); LibReportStatusCodeVirtualAddressChangeEvent (
VOID
VOID );
LibReportStatusCodeVirtualAddressChangeEvent (VOID);
EFI_STATUS EFI_STATUS
LibReportStatusCode ( LibReportStatusCode (
IN EFI_STATUS_CODE_TYPE CodeType, IN EFI_STATUS_CODE_TYPE CodeType,
IN EFI_STATUS_CODE_VALUE Value, IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance, IN UINT32 Instance,
IN EFI_GUID *CallerId, IN EFI_GUID *CallerId,
IN EFI_STATUS_CODE_DATA *Data OPTIONAL IN EFI_STATUS_CODE_DATA *Data OPTIONAL
); );
#endif #endif

View File

@ -11,45 +11,45 @@
#include <Uefi/UefiBaseType.h> #include <Uefi/UefiBaseType.h>
#define NOR_FLASH_MAX_ID_LEN 6 #define NOR_FLASH_MAX_ID_LEN 6
typedef struct { typedef struct {
/* Device name */ /* Device name */
UINT16 *Name; UINT16 *Name;
/* /*
* JEDEC ID * JEDEC ID
*/ */
UINT8 Id[NOR_FLASH_MAX_ID_LEN]; UINT8 Id[NOR_FLASH_MAX_ID_LEN];
UINT8 IdLen; UINT8 IdLen;
UINT16 PageSize; UINT16 PageSize;
/* /*
* Below parameters can be referred as BlockSize * Below parameters can be referred as BlockSize
* and BlockCount, when treating the NorFlash as * and BlockCount, when treating the NorFlash as
* block device. * block device.
*/ */
UINT32 SectorSize; UINT32 SectorSize;
UINT32 SectorCount; UINT32 SectorCount;
UINT16 Flags; UINT16 Flags;
#define NOR_FLASH_ERASE_4K (1 << 0) /* Use 4 KB erase blocks and CMD_ERASE_4K */ #define NOR_FLASH_ERASE_4K (1 << 0) /* Use 4 KB erase blocks and CMD_ERASE_4K */
#define NOR_FLASH_ERASE_32K (1 << 1) /* Use 32 KB erase blocks and CMD_ERASE_32K */ #define NOR_FLASH_ERASE_32K (1 << 1) /* Use 32 KB erase blocks and CMD_ERASE_32K */
#define NOR_FLASH_WRITE_FSR (1 << 2) /* Use flag status register for write */ #define NOR_FLASH_WRITE_FSR (1 << 2) /* Use flag status register for write */
#define NOR_FLASH_4B_ADDR (1 << 3) /* Use 4B addressing */ #define NOR_FLASH_4B_ADDR (1 << 3) /* Use 4B addressing */
} NOR_FLASH_INFO; } NOR_FLASH_INFO;
/* Vendor IDs */ /* Vendor IDs */
#define NOR_FLASH_ID_ATMEL 0x1f #define NOR_FLASH_ID_ATMEL 0x1f
#define NOR_FLASH_ID_EON 0x1c #define NOR_FLASH_ID_EON 0x1c
#define NOR_FLASH_ID_GIGADEVICE 0xc8 #define NOR_FLASH_ID_GIGADEVICE 0xc8
#define NOR_FLASH_ID_ISSI 0x9d #define NOR_FLASH_ID_ISSI 0x9d
#define NOR_FLASH_ID_MACRONIX 0xc2 #define NOR_FLASH_ID_MACRONIX 0xc2
#define NOR_FLASH_ID_SPANSION 0x01 #define NOR_FLASH_ID_SPANSION 0x01
#define NOR_FLASH_ID_STMICRO 0x20 #define NOR_FLASH_ID_STMICRO 0x20
#define NOR_FLASH_ID_SST 0xbf #define NOR_FLASH_ID_SST 0xbf
#define NOR_FLASH_ID_WINDBOND 0xef #define NOR_FLASH_ID_WINDBOND 0xef
/** /**
Return an allocated copy pool of the NOR flash information structure. Return an allocated copy pool of the NOR flash information structure.
@ -70,9 +70,9 @@ typedef struct {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NorFlashGetInfo ( NorFlashGetInfo (
IN UINT8 *Id, IN UINT8 *Id,
IN OUT NOR_FLASH_INFO **FlashInfo, IN OUT NOR_FLASH_INFO **FlashInfo,
IN BOOLEAN AllocateForRuntime IN BOOLEAN AllocateForRuntime
); );
/** /**
@ -87,4 +87,5 @@ EFIAPI
NorFlashPrintInfo ( NorFlashPrintInfo (
IN NOR_FLASH_INFO *Info IN NOR_FLASH_INFO *Info
); );
#endif #endif

View File

@ -32,7 +32,7 @@ PrePeiGetHobList (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PrePeiSetHobList ( PrePeiSetHobList (
IN VOID *HobList IN VOID *HobList
); );
#endif #endif

View File

@ -27,11 +27,10 @@
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsFindNextVolume ( FfsFindNextVolume (
IN UINTN Instance, IN UINTN Instance,
IN OUT EFI_PEI_FV_HANDLE *VolumeHandle IN OUT EFI_PEI_FV_HANDLE *VolumeHandle
); );
/** /**
This service enables discovery of additional firmware files. This service enables discovery of additional firmware files.
@ -48,12 +47,11 @@ FfsFindNextVolume (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsFindNextFile ( FfsFindNextFile (
IN EFI_FV_FILETYPE SearchType, IN EFI_FV_FILETYPE SearchType,
IN EFI_PEI_FV_HANDLE VolumeHandle, IN EFI_PEI_FV_HANDLE VolumeHandle,
IN OUT EFI_PEI_FILE_HANDLE *FileHandle IN OUT EFI_PEI_FILE_HANDLE *FileHandle
); );
/** /**
This service enables discovery sections of a given type within a valid FFS file. This service enables discovery sections of a given type within a valid FFS file.
@ -69,12 +67,11 @@ FfsFindNextFile (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsFindSectionData ( FfsFindSectionData (
IN EFI_SECTION_TYPE SectionType, IN EFI_SECTION_TYPE SectionType,
IN EFI_PEI_FILE_HANDLE FileHandle, IN EFI_PEI_FILE_HANDLE FileHandle,
OUT VOID **SectionData OUT VOID **SectionData
); );
/** /**
Find a file in the volume by name Find a file in the volume by name
@ -96,12 +93,11 @@ FfsFindSectionData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsFindFileByName ( FfsFindFileByName (
IN CONST EFI_GUID *FileName, IN CONST EFI_GUID *FileName,
IN CONST EFI_PEI_FV_HANDLE VolumeHandle, IN CONST EFI_PEI_FV_HANDLE VolumeHandle,
OUT EFI_PEI_FILE_HANDLE *FileHandle OUT EFI_PEI_FILE_HANDLE *FileHandle
); );
/** /**
Get information about the file by name. Get information about the file by name.
@ -121,11 +117,10 @@ FfsFindFileByName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsGetFileInfo ( FfsGetFileInfo (
IN CONST EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_FILE_HANDLE FileHandle,
OUT EFI_FV_FILE_INFO *FileInfo OUT EFI_FV_FILE_INFO *FileInfo
); );
/** /**
Get Information about the volume by name Get Information about the volume by name
@ -145,12 +140,10 @@ FfsGetFileInfo (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsGetVolumeInfo ( FfsGetVolumeInfo (
IN EFI_PEI_FV_HANDLE VolumeHandle, IN EFI_PEI_FV_HANDLE VolumeHandle,
OUT EFI_FV_INFO *VolumeInfo OUT EFI_FV_INFO *VolumeInfo
); );
/** /**
Get Fv image from the FV type file, then add FV & FV2 Hob. Get Fv image from the FV type file, then add FV & FV2 Hob.
@ -163,10 +156,9 @@ FfsGetVolumeInfo (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsProcessFvFile ( FfsProcessFvFile (
IN EFI_PEI_FILE_HANDLE FvFileHandle IN EFI_PEI_FILE_HANDLE FvFileHandle
); );
/** /**
Search through every FV until you find a file of type FileType Search through every FV until you find a file of type FileType
@ -181,12 +173,11 @@ FfsProcessFvFile (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsAnyFvFindFirstFile ( FfsAnyFvFindFirstFile (
IN EFI_FV_FILETYPE FileType, IN EFI_FV_FILETYPE FileType,
OUT EFI_PEI_FV_HANDLE *VolumeHandle, OUT EFI_PEI_FV_HANDLE *VolumeHandle,
OUT EFI_PEI_FILE_HANDLE *FileHandle OUT EFI_PEI_FILE_HANDLE *FileHandle
); );
/** /**
Get Fv image from the FV type file, then add FV & FV2 Hob. Get Fv image from the FV type file, then add FV & FV2 Hob.
@ -200,10 +191,9 @@ FfsAnyFvFindFirstFile (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsProcessFvFile ( FfsProcessFvFile (
IN EFI_PEI_FILE_HANDLE FvFileHandle IN EFI_PEI_FILE_HANDLE FvFileHandle
); );
/** /**
This service enables PEIMs to ascertain the present value of the boot mode. This service enables PEIMs to ascertain the present value of the boot mode.
@ -217,7 +207,6 @@ GetBootMode (
VOID VOID
); );
/** /**
This service enables PEIMs to update the boot mode variable. This service enables PEIMs to update the boot mode variable.
@ -229,7 +218,7 @@ GetBootMode (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetBootMode ( SetBootMode (
IN EFI_BOOT_MODE BootMode IN EFI_BOOT_MODE BootMode
); );
/** /**
@ -247,7 +236,6 @@ GetHobList (
VOID VOID
); );
/** /**
Updates the pointer to the HOB list. Updates the pointer to the HOB list.
@ -257,10 +245,10 @@ GetHobList (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetHobList ( SetHobList (
IN VOID *HobList IN VOID *HobList
); );
EFI_HOB_HANDOFF_INFO_TABLE* EFI_HOB_HANDOFF_INFO_TABLE *
HobConstructor ( HobConstructor (
IN VOID *EfiMemoryBegin, IN VOID *EfiMemoryBegin,
IN UINTN EfiMemoryLength, IN UINTN EfiMemoryLength,
@ -280,11 +268,10 @@ HobConstructor (
**/ **/
VOID * VOID *
CreateHob ( CreateHob (
IN UINT16 HobType, IN UINT16 HobType,
IN UINT16 HobLenght IN UINT16 HobLenght
); );
/** /**
Returns the next instance of a HOB type from the starting HOB. Returns the next instance of a HOB type from the starting HOB.
@ -304,8 +291,8 @@ CreateHob (
VOID * VOID *
EFIAPI EFIAPI
GetNextHob ( GetNextHob (
IN UINT16 Type, IN UINT16 Type,
IN CONST VOID *HobStart IN CONST VOID *HobStart
); );
/** /**
@ -322,7 +309,7 @@ GetNextHob (
VOID * VOID *
EFIAPI EFIAPI
GetFirstHob ( GetFirstHob (
IN UINT16 Type IN UINT16 Type
); );
/** /**
@ -347,8 +334,8 @@ GetFirstHob (
VOID * VOID *
EFIAPI EFIAPI
GetNextGuidHob ( GetNextGuidHob (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN CONST VOID *HobStart IN CONST VOID *HobStart
); );
/** /**
@ -368,10 +355,9 @@ GetNextGuidHob (
VOID * VOID *
EFIAPI EFIAPI
GetFirstGuidHob ( GetFirstGuidHob (
IN CONST EFI_GUID *Guid IN CONST EFI_GUID *Guid
); );
/** /**
Builds a HOB for a loaded PE32 module. Builds a HOB for a loaded PE32 module.
@ -390,10 +376,10 @@ GetFirstGuidHob (
VOID VOID
EFIAPI EFIAPI
BuildModuleHob ( BuildModuleHob (
IN CONST EFI_GUID *ModuleName, IN CONST EFI_GUID *ModuleName,
IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule, IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
IN UINT64 ModuleLength, IN UINT64 ModuleLength,
IN EFI_PHYSICAL_ADDRESS EntryPoint IN EFI_PHYSICAL_ADDRESS EntryPoint
); );
/** /**
@ -440,8 +426,8 @@ BuildResourceDescriptorHob (
VOID * VOID *
EFIAPI EFIAPI
BuildGuidHob ( BuildGuidHob (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN DataLength IN UINTN DataLength
); );
/** /**
@ -467,9 +453,9 @@ BuildGuidHob (
VOID * VOID *
EFIAPI EFIAPI
BuildGuidDataHob ( BuildGuidDataHob (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN VOID *Data, IN VOID *Data,
IN UINTN DataLength IN UINTN DataLength
); );
/** /**
@ -487,8 +473,8 @@ BuildGuidDataHob (
VOID VOID
EFIAPI EFIAPI
BuildFvHob ( BuildFvHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length IN UINT64 Length
); );
/** /**
@ -511,7 +497,6 @@ BuildFvHobs (
IN EFI_RESOURCE_ATTRIBUTE_TYPE *ResourceAttribute OPTIONAL IN EFI_RESOURCE_ATTRIBUTE_TYPE *ResourceAttribute OPTIONAL
); );
/** /**
Builds a EFI_HOB_TYPE_FV2 HOB. Builds a EFI_HOB_TYPE_FV2 HOB.
@ -529,10 +514,10 @@ BuildFvHobs (
VOID VOID
EFIAPI EFIAPI
BuildFv2Hob ( BuildFv2Hob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length, IN UINT64 Length,
IN CONST EFI_GUID *FvName, IN CONST EFI_GUID *FvName,
IN CONST EFI_GUID *FileName IN CONST EFI_GUID *FileName
); );
/** /**
@ -550,8 +535,8 @@ BuildFv2Hob (
VOID VOID
EFIAPI EFIAPI
BuildCvHob ( BuildCvHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length IN UINT64 Length
); );
/** /**
@ -569,8 +554,8 @@ BuildCvHob (
VOID VOID
EFIAPI EFIAPI
BuildCpuHob ( BuildCpuHob (
IN UINT8 SizeOfMemorySpace, IN UINT8 SizeOfMemorySpace,
IN UINT8 SizeOfIoSpace IN UINT8 SizeOfIoSpace
); );
/** /**
@ -588,8 +573,8 @@ BuildCpuHob (
VOID VOID
EFIAPI EFIAPI
BuildStackHob ( BuildStackHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length IN UINT64 Length
); );
/** /**
@ -601,11 +586,10 @@ BuildStackHob (
**/ **/
VOID VOID
UpdateStackHob ( UpdateStackHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length IN UINT64 Length
); );
/** /**
Builds a HOB for the BSP store. Builds a HOB for the BSP store.
@ -622,9 +606,9 @@ UpdateStackHob (
VOID VOID
EFIAPI EFIAPI
BuildBspStoreHob ( BuildBspStoreHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length, IN UINT64 Length,
IN EFI_MEMORY_TYPE MemoryType IN EFI_MEMORY_TYPE MemoryType
); );
/** /**
@ -643,18 +627,17 @@ BuildBspStoreHob (
VOID VOID
EFIAPI EFIAPI
BuildMemoryAllocationHob ( BuildMemoryAllocationHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length, IN UINT64 Length,
IN EFI_MEMORY_TYPE MemoryType IN EFI_MEMORY_TYPE MemoryType
); );
VOID VOID
EFIAPI EFIAPI
BuildExtractSectionHob ( BuildExtractSectionHob (
IN EFI_GUID *Guid, IN EFI_GUID *Guid,
IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER SectionGetInfo, IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER SectionGetInfo,
IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER SectionExtraction IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER SectionExtraction
); );
VOID VOID
@ -663,7 +646,6 @@ BuildPeCoffLoaderHob (
VOID VOID
); );
/** /**
Allocates one or more 4KB pages of type EfiBootServicesData. Allocates one or more 4KB pages of type EfiBootServicesData.
@ -680,7 +662,7 @@ BuildPeCoffLoaderHob (
VOID * VOID *
EFIAPI EFIAPI
AllocatePages ( AllocatePages (
IN UINTN Pages IN UINTN Pages
); );
/** /**
@ -701,7 +683,6 @@ AllocatePool (
IN UINTN AllocationSize IN UINTN AllocationSize
); );
/** /**
Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment. Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
@ -725,14 +706,13 @@ AllocateAlignedPages (
IN UINTN Alignment IN UINTN Alignment
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LoadPeCoffImage ( LoadPeCoffImage (
IN VOID *PeCoffImage, IN VOID *PeCoffImage,
OUT EFI_PHYSICAL_ADDRESS *ImageAddress, OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
OUT UINT64 *ImageSize, OUT UINT64 *ImageSize,
OUT EFI_PHYSICAL_ADDRESS *EntryPoint OUT EFI_PHYSICAL_ADDRESS *EntryPoint
); );
EFI_STATUS EFI_STATUS

View File

@ -12,7 +12,6 @@
#ifndef __REAL_TIME_CLOCK_LIB__ #ifndef __REAL_TIME_CLOCK_LIB__
#define __REAL_TIME_CLOCK_LIB__ #define __REAL_TIME_CLOCK_LIB__
/** /**
Returns the current time and date information, and the time-keeping capabilities Returns the current time and date information, and the time-keeping capabilities
of the hardware platform. of the hardware platform.
@ -33,7 +32,6 @@ LibGetTime (
OUT EFI_TIME_CAPABILITIES *Capabilities OUT EFI_TIME_CAPABILITIES *Capabilities
); );
/** /**
Sets the current local time and date information. Sets the current local time and date information.
@ -47,10 +45,9 @@ LibGetTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibSetTime ( LibSetTime (
IN EFI_TIME *Time IN EFI_TIME *Time
); );
/** /**
Returns the current wakeup alarm clock setting. Returns the current wakeup alarm clock setting.
@ -66,12 +63,11 @@ LibSetTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibGetWakeupTime ( LibGetWakeupTime (
OUT BOOLEAN *Enabled, OUT BOOLEAN *Enabled,
OUT BOOLEAN *Pending, OUT BOOLEAN *Pending,
OUT EFI_TIME *Time OUT EFI_TIME *Time
); );
/** /**
Sets the system wakeup alarm clock time. Sets the system wakeup alarm clock time.
@ -88,12 +84,10 @@ LibGetWakeupTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibSetWakeupTime ( LibSetWakeupTime (
IN BOOLEAN Enabled, IN BOOLEAN Enabled,
OUT EFI_TIME *Time OUT EFI_TIME *Time
); );
/** /**
This is the declaration of an EFI image entry point. This can be the entry point to an application This is the declaration of an EFI image entry point. This can be the entry point to an application
written to this specification, an EFI boot service driver, or an EFI runtime driver. written to this specification, an EFI boot service driver, or an EFI runtime driver.
@ -107,11 +101,10 @@ LibSetWakeupTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibRtcInitialize ( LibRtcInitialize (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
); );
/** /**
Fixup internal data so that EFI can be call in virtual mode. Fixup internal data so that EFI can be call in virtual mode.
Call the passed in Child Notify event and convert any pointers in Call the passed in Child Notify event and convert any pointers in
@ -123,10 +116,8 @@ LibRtcInitialize (
VOID VOID
EFIAPI EFIAPI
LibRtcVirtualNotifyEvent ( LibRtcVirtualNotifyEvent (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
#endif #endif

View File

@ -20,13 +20,13 @@
// in which case __DATE__ is defined as a "Mmm dd yyyy" 11 chars string, // in which case __DATE__ is defined as a "Mmm dd yyyy" 11 chars string,
// but add an explicit filter for compilers that have been validated. // but add an explicit filter for compilers that have been validated.
// //
#if (defined(__GNUC__) || defined(_MSC_VER) || defined(__clang__)) #if (defined (__GNUC__) || defined (_MSC_VER) || defined (__clang__))
#define TIME_BUILD_YEAR (__DATE__[7] == '?' ? 1900 \ #define TIME_BUILD_YEAR (__DATE__[7] == '?' ? 1900\
: (((__DATE__[7] - '0') * 1000 ) \ : (((__DATE__[7] - '0') * 1000 ) \
+ (__DATE__[8] - '0') * 100 \ + (__DATE__[8] - '0') * 100 \
+ (__DATE__[9] - '0') * 10 \ + (__DATE__[9] - '0') * 10 \
+ __DATE__[10] - '0')) + __DATE__[10] - '0'))
#define TIME_BUILD_MONTH ( __DATE__ [2] == '?' ? 1 \ #define TIME_BUILD_MONTH ( __DATE__ [2] == '?' ? 1 \
: __DATE__ [2] == 'n' ? ( \ : __DATE__ [2] == 'n' ? ( \
__DATE__ [1] == 'a' ? 1 : 6) \ __DATE__ [1] == 'a' ? 1 : 6) \
: __DATE__ [2] == 'b' ? 2 \ : __DATE__ [2] == 'b' ? 2 \
@ -39,19 +39,19 @@
: __DATE__ [2] == 't' ? 10 \ : __DATE__ [2] == 't' ? 10 \
: __DATE__ [2] == 'v' ? 11 \ : __DATE__ [2] == 'v' ? 11 \
: 12) : 12)
#define TIME_BUILD_DAY ( __DATE__[4] == '?' ? 1 \ #define TIME_BUILD_DAY ( __DATE__[4] == '?' ? 1 \
: ((__DATE__[4] == ' ' ? 0 : \ : ((__DATE__[4] == ' ' ? 0 : \
((__DATE__[4] - '0') * 10)) \ ((__DATE__[4] - '0') * 10)) \
+ __DATE__[5] - '0')) + __DATE__[5] - '0'))
#endif #endif
// Define EPOCH (1970-JANUARY-01) in the Julian Date representation // Define EPOCH (1970-JANUARY-01) in the Julian Date representation
#define EPOCH_JULIAN_DATE 2440588 #define EPOCH_JULIAN_DATE 2440588
// Seconds per unit // Seconds per unit
#define SEC_PER_MIN ((UINTN) 60) #define SEC_PER_MIN ((UINTN) 60)
#define SEC_PER_HOUR ((UINTN) 3600) #define SEC_PER_HOUR ((UINTN) 3600)
#define SEC_PER_DAY ((UINTN) 86400) #define SEC_PER_DAY ((UINTN) 86400)
/** /**
Check if it is a leap year. Check if it is a leap year.

View File

@ -13,27 +13,27 @@
// //
// Protocol interface structure // Protocol interface structure
// //
typedef struct _EMBEDDED_GPIO_PPI EMBEDDED_GPIO_PPI; typedef struct _EMBEDDED_GPIO_PPI EMBEDDED_GPIO_PPI;
// //
// Data Types // Data Types
// //
typedef UINTN EMBEDDED_GPIO_PIN; typedef UINTN EMBEDDED_GPIO_PIN;
#define GPIO(Port, Pin) ((EMBEDDED_GPIO_PIN)(((Port) << (16)) | (Pin))) #define GPIO(Port, Pin) ((EMBEDDED_GPIO_PIN)(((Port) << (16)) | (Pin)))
#define GPIO_PIN(x) ((EMBEDDED_GPIO_PIN)(x) & (0xFFFF)) #define GPIO_PIN(x) ((EMBEDDED_GPIO_PIN)(x) & (0xFFFF))
#define GPIO_PORT(x) ((EMBEDDED_GPIO_PIN)(x) >> (16)) #define GPIO_PORT(x) ((EMBEDDED_GPIO_PIN)(x) >> (16))
typedef enum { typedef enum {
GPIO_MODE_INPUT = 0x00, GPIO_MODE_INPUT = 0x00,
GPIO_MODE_OUTPUT_0 = 0x0E, GPIO_MODE_OUTPUT_0 = 0x0E,
GPIO_MODE_OUTPUT_1 = 0x0F, GPIO_MODE_OUTPUT_1 = 0x0F,
GPIO_MODE_SPECIAL_FUNCTION_2 = 0x02, GPIO_MODE_SPECIAL_FUNCTION_2 = 0x02,
GPIO_MODE_SPECIAL_FUNCTION_3 = 0x03, GPIO_MODE_SPECIAL_FUNCTION_3 = 0x03,
GPIO_MODE_SPECIAL_FUNCTION_4 = 0x04, GPIO_MODE_SPECIAL_FUNCTION_4 = 0x04,
GPIO_MODE_SPECIAL_FUNCTION_5 = 0x05, GPIO_MODE_SPECIAL_FUNCTION_5 = 0x05,
GPIO_MODE_SPECIAL_FUNCTION_6 = 0x06, GPIO_MODE_SPECIAL_FUNCTION_6 = 0x06,
GPIO_MODE_SPECIAL_FUNCTION_7 = 0x07 GPIO_MODE_SPECIAL_FUNCTION_7 = 0x07
} EMBEDDED_GPIO_MODE; } EMBEDDED_GPIO_MODE;
typedef enum { typedef enum {
@ -61,7 +61,7 @@ typedef enum {
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_GET) ( (EFIAPI *EMBEDDED_GPIO_GET)(
IN EMBEDDED_GPIO_PPI *This, IN EMBEDDED_GPIO_PPI *This,
IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_PIN Gpio,
OUT UINTN *Value OUT UINTN *Value
@ -82,13 +82,12 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_SET) ( (EFIAPI *EMBEDDED_GPIO_SET)(
IN EMBEDDED_GPIO_PPI *This, IN EMBEDDED_GPIO_PPI *This,
IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_PIN Gpio,
IN EMBEDDED_GPIO_MODE Mode IN EMBEDDED_GPIO_MODE Mode
); );
/** /**
Gets the mode (function) of a GPIO pin Gets the mode (function) of a GPIO pin
@ -104,13 +103,12 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_GET_MODE) ( (EFIAPI *EMBEDDED_GPIO_GET_MODE)(
IN EMBEDDED_GPIO_PPI *This, IN EMBEDDED_GPIO_PPI *This,
IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_PIN Gpio,
OUT EMBEDDED_GPIO_MODE *Mode OUT EMBEDDED_GPIO_MODE *Mode
); );
/** /**
Sets the pull-up / pull-down resistor of a GPIO pin Sets the pull-up / pull-down resistor of a GPIO pin
@ -126,13 +124,12 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_SET_PULL) ( (EFIAPI *EMBEDDED_GPIO_SET_PULL)(
IN EMBEDDED_GPIO_PPI *This, IN EMBEDDED_GPIO_PPI *This,
IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_PIN Gpio,
IN EMBEDDED_GPIO_PULL Direction IN EMBEDDED_GPIO_PULL Direction
); );
struct _EMBEDDED_GPIO_PPI { struct _EMBEDDED_GPIO_PPI {
EMBEDDED_GPIO_GET Get; EMBEDDED_GPIO_GET Get;
EMBEDDED_GPIO_SET Set; EMBEDDED_GPIO_SET Set;
@ -140,6 +137,6 @@ struct _EMBEDDED_GPIO_PPI {
EMBEDDED_GPIO_SET_PULL SetPull; EMBEDDED_GPIO_SET_PULL SetPull;
}; };
extern EFI_GUID gEmbeddedGpioPpiGuid; extern EFI_GUID gEmbeddedGpioPpiGuid;
#endif #endif

View File

@ -12,30 +12,30 @@
// //
// Protocol interface structure // Protocol interface structure
// //
typedef struct _ANDROID_BOOTIMG_PROTOCOL ANDROID_BOOTIMG_PROTOCOL; typedef struct _ANDROID_BOOTIMG_PROTOCOL ANDROID_BOOTIMG_PROTOCOL;
// //
// Function Prototypes // Function Prototypes
// //
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *ANDROID_BOOTIMG_APPEND_KERNEL_ARGS) ( (EFIAPI *ANDROID_BOOTIMG_APPEND_KERNEL_ARGS)(
IN CHAR16 *Args, IN CHAR16 *Args,
IN UINTN Size IN UINTN Size
); );
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *ANDROID_BOOTIMG_UPDATE_DTB) ( (EFIAPI *ANDROID_BOOTIMG_UPDATE_DTB)(
IN EFI_PHYSICAL_ADDRESS OrigDtbBase, IN EFI_PHYSICAL_ADDRESS OrigDtbBase,
OUT EFI_PHYSICAL_ADDRESS *NewDtbBase OUT EFI_PHYSICAL_ADDRESS *NewDtbBase
); );
struct _ANDROID_BOOTIMG_PROTOCOL { struct _ANDROID_BOOTIMG_PROTOCOL {
ANDROID_BOOTIMG_APPEND_KERNEL_ARGS AppendArgs; ANDROID_BOOTIMG_APPEND_KERNEL_ARGS AppendArgs;
ANDROID_BOOTIMG_UPDATE_DTB UpdateDtb; ANDROID_BOOTIMG_UPDATE_DTB UpdateDtb;
}; };
extern EFI_GUID gAndroidBootImgProtocolGuid; extern EFI_GUID gAndroidBootImgProtocolGuid;
#endif /* __ANDROID_BOOTIMG_PROTOCOL_H__ */ #endif /* __ANDROID_BOOTIMG_PROTOCOL_H__ */

View File

@ -9,7 +9,7 @@
#ifndef __ANDROID_FASTBOOT_PLATFORM_H__ #ifndef __ANDROID_FASTBOOT_PLATFORM_H__
#define __ANDROID_FASTBOOT_PLATFORM_H__ #define __ANDROID_FASTBOOT_PLATFORM_H__
extern EFI_GUID gAndroidFastbootPlatformProtocolGuid; extern EFI_GUID gAndroidFastbootPlatformProtocolGuid;
/* /*
Protocol for platform-specific operations initiated by Android Fastboot. Protocol for platform-specific operations initiated by Android Fastboot.
@ -58,9 +58,9 @@ VOID
typedef typedef
EFI_STATUS EFI_STATUS
(*FASTBOOT_PLATFORM_FLASH) ( (*FASTBOOT_PLATFORM_FLASH) (
IN CHAR8 *PartitionName, IN CHAR8 *PartitionName,
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
); );
/* /*
@ -74,7 +74,7 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(*FASTBOOT_PLATFORM_ERASE) ( (*FASTBOOT_PLATFORM_ERASE) (
IN CHAR8 *PartitionName IN CHAR8 *PartitionName
); );
/* /*
@ -98,8 +98,8 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(*FASTBOOT_PLATFORM_GETVAR) ( (*FASTBOOT_PLATFORM_GETVAR) (
IN CHAR8 *Name, IN CHAR8 *Name,
OUT CHAR8 *Value OUT CHAR8 *Value
); );
/* /*
@ -124,16 +124,16 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(*FASTBOOT_PLATFORM_OEM_COMMAND) ( (*FASTBOOT_PLATFORM_OEM_COMMAND) (
IN CHAR8 *Command IN CHAR8 *Command
); );
typedef struct _FASTBOOT_PLATFORM_PROTOCOL { typedef struct _FASTBOOT_PLATFORM_PROTOCOL {
FASTBOOT_PLATFORM_INIT Init; FASTBOOT_PLATFORM_INIT Init;
FASTBOOT_PLATFORM_UN_INIT UnInit; FASTBOOT_PLATFORM_UN_INIT UnInit;
FASTBOOT_PLATFORM_FLASH FlashPartition; FASTBOOT_PLATFORM_FLASH FlashPartition;
FASTBOOT_PLATFORM_ERASE ErasePartition; FASTBOOT_PLATFORM_ERASE ErasePartition;
FASTBOOT_PLATFORM_GETVAR GetVar; FASTBOOT_PLATFORM_GETVAR GetVar;
FASTBOOT_PLATFORM_OEM_COMMAND DoOemCommand; FASTBOOT_PLATFORM_OEM_COMMAND DoOemCommand;
} FASTBOOT_PLATFORM_PROTOCOL; } FASTBOOT_PLATFORM_PROTOCOL;
#endif #endif

View File

@ -15,7 +15,7 @@
#ifndef __ANDROID_FASTBOOT_TRANSPORT_H__ #ifndef __ANDROID_FASTBOOT_TRANSPORT_H__
#define __ANDROID_FASTBOOT_TRANSPORT_H__ #define __ANDROID_FASTBOOT_TRANSPORT_H__
extern EFI_GUID gAndroidFastbootTransportProtocolGuid; extern EFI_GUID gAndroidFastbootTransportProtocolGuid;
/* /*
Set up the transport system for use by Fastboot. Set up the transport system for use by Fastboot.
@ -43,7 +43,7 @@ extern EFI_GUID gAndroidFastbootTransportProtocolGuid;
typedef typedef
EFI_STATUS EFI_STATUS
(*FASTBOOT_TRANSPORT_START) ( (*FASTBOOT_TRANSPORT_START) (
IN EFI_EVENT ReceiveEvent IN EFI_EVENT ReceiveEvent
); );
/* /*
@ -60,7 +60,7 @@ EFI_STATUS
*/ */
typedef typedef
EFI_STATUS EFI_STATUS
(* FASTBOOT_TRANSPORT_STOP) ( (*FASTBOOT_TRANSPORT_STOP) (
VOID VOID
); );
@ -87,8 +87,8 @@ typedef
EFI_STATUS EFI_STATUS
(*FASTBOOT_TRANSPORT_SEND) ( (*FASTBOOT_TRANSPORT_SEND) (
IN UINTN BufferSize, IN UINTN BufferSize,
IN CONST VOID *Buffer, IN CONST VOID *Buffer,
IN EFI_EVENT *FatalErrorEvent IN EFI_EVENT *FatalErrorEvent
); );
/* /*
@ -112,14 +112,14 @@ typedef
EFI_STATUS EFI_STATUS
(*FASTBOOT_TRANSPORT_RECEIVE) ( (*FASTBOOT_TRANSPORT_RECEIVE) (
OUT UINTN *BufferSize, OUT UINTN *BufferSize,
OUT VOID **Buffer OUT VOID **Buffer
); );
typedef struct _FASTBOOT_TRANSPORT_PROTOCOL { typedef struct _FASTBOOT_TRANSPORT_PROTOCOL {
FASTBOOT_TRANSPORT_START Start; FASTBOOT_TRANSPORT_START Start;
FASTBOOT_TRANSPORT_STOP Stop; FASTBOOT_TRANSPORT_STOP Stop;
FASTBOOT_TRANSPORT_SEND Send; FASTBOOT_TRANSPORT_SEND Send;
FASTBOOT_TRANSPORT_RECEIVE Receive; FASTBOOT_TRANSPORT_RECEIVE Receive;
} FASTBOOT_TRANSPORT_PROTOCOL; } FASTBOOT_TRANSPORT_PROTOCOL;
#endif #endif

View File

@ -23,7 +23,6 @@
#ifndef __EMBEDDED_DEVICE_PROTOCOL_H__ #ifndef __EMBEDDED_DEVICE_PROTOCOL_H__
#define __EMBEDDED_DEVICE_PROTOCOL_H__ #define __EMBEDDED_DEVICE_PROTOCOL_H__
// //
// Protocol GUID // Protocol GUID
// //
@ -32,21 +31,17 @@
#define EMBEDDED_DEVICE_PROTOCOL_GUID \ #define EMBEDDED_DEVICE_PROTOCOL_GUID \
{ 0xbf4b9d10, 0x13ec, 0x43dd, { 0x88, 0x80, 0xe9, 0xb, 0x71, 0x8f, 0x27, 0xde } } { 0xbf4b9d10, 0x13ec, 0x43dd, { 0x88, 0x80, 0xe9, 0xb, 0x71, 0x8f, 0x27, 0xde } }
typedef struct { typedef struct {
UINT16 VendorId; UINT16 VendorId;
UINT16 DeviceId; UINT16 DeviceId;
UINT16 RevisionId; UINT16 RevisionId;
UINT16 SubsystemId; UINT16 SubsystemId;
UINT16 SubsystemVendorId; UINT16 SubsystemVendorId;
UINT8 ClassCode[3]; UINT8 ClassCode[3];
UINT8 HeaderSize; UINT8 HeaderSize;
UINTN BaseAddress; UINTN BaseAddress;
} EMBEDDED_DEVICE_PROTOCOL; } EMBEDDED_DEVICE_PROTOCOL;
extern EFI_GUID gEmbeddedDeviceGuid; extern EFI_GUID gEmbeddedDeviceGuid;
#endif #endif

View File

@ -12,7 +12,7 @@
// //
// Protocol GUID // Protocol GUID
// //
#define EMBEDDED_EXTERNAL_DEVICE_PROTOCOL_GUID { 0x735F8C64, 0xD696, 0x44D0, { 0xBD, 0xF2, 0x44, 0x7F, 0xD0, 0x5A, 0x54, 0x06 }} #define EMBEDDED_EXTERNAL_DEVICE_PROTOCOL_GUID { 0x735F8C64, 0xD696, 0x44D0, { 0xBD, 0xF2, 0x44, 0x7F, 0xD0, 0x5A, 0x54, 0x06 }}
// //
// Protocol interface structure // Protocol interface structure
@ -24,12 +24,13 @@ typedef struct _EMBEDDED_EXTERNAL_DEVICE EMBEDDED_EXTERNAL_DEVICE;
// //
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_EXTERNAL_DEVICE_READ) ( (EFIAPI *EMBEDDED_EXTERNAL_DEVICE_READ)(
IN EMBEDDED_EXTERNAL_DEVICE *This, IN EMBEDDED_EXTERNAL_DEVICE *This,
IN UINTN Register, IN UINTN Register,
IN UINTN Length, IN UINTN Length,
OUT VOID *Buffer OUT VOID *Buffer
) )
/*++ /*++
Routine Description: Routine Description:
@ -52,12 +53,13 @@ Returns:
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_EXTERNAL_DEVICE_WRITE) ( (EFIAPI *EMBEDDED_EXTERNAL_DEVICE_WRITE)(
IN EMBEDDED_EXTERNAL_DEVICE *This, IN EMBEDDED_EXTERNAL_DEVICE *This,
IN UINTN Register, IN UINTN Register,
IN UINTN Length, IN UINTN Length,
IN VOID *Buffer IN VOID *Buffer
) )
/*++ /*++
Routine Description: Routine Description:
@ -79,10 +81,10 @@ Returns:
; ;
struct _EMBEDDED_EXTERNAL_DEVICE { struct _EMBEDDED_EXTERNAL_DEVICE {
EMBEDDED_EXTERNAL_DEVICE_READ Read; EMBEDDED_EXTERNAL_DEVICE_READ Read;
EMBEDDED_EXTERNAL_DEVICE_WRITE Write; EMBEDDED_EXTERNAL_DEVICE_WRITE Write;
}; };
extern EFI_GUID gEmbeddedExternalDeviceProtocolGuid; extern EFI_GUID gEmbeddedExternalDeviceProtocolGuid;
#endif // __EMBEDDED_EXTERNAL_DEVICE_H__ #endif // __EMBEDDED_EXTERNAL_DEVICE_H__

View File

@ -12,27 +12,27 @@
// //
// Protocol interface structure // Protocol interface structure
// //
typedef struct _EMBEDDED_GPIO EMBEDDED_GPIO; typedef struct _EMBEDDED_GPIO EMBEDDED_GPIO;
// //
// Data Types // Data Types
// //
typedef UINTN EMBEDDED_GPIO_PIN; typedef UINTN EMBEDDED_GPIO_PIN;
#define GPIO(Port, Pin) ((EMBEDDED_GPIO_PIN)(((Port) << (16)) | (Pin))) #define GPIO(Port, Pin) ((EMBEDDED_GPIO_PIN)(((Port) << (16)) | (Pin)))
#define GPIO_PIN(x) ((EMBEDDED_GPIO_PIN)(x) & (0xFFFF)) #define GPIO_PIN(x) ((EMBEDDED_GPIO_PIN)(x) & (0xFFFF))
#define GPIO_PORT(x) ((EMBEDDED_GPIO_PIN)(x) >> (16)) #define GPIO_PORT(x) ((EMBEDDED_GPIO_PIN)(x) >> (16))
typedef enum { typedef enum {
GPIO_MODE_INPUT = 0x00, GPIO_MODE_INPUT = 0x00,
GPIO_MODE_OUTPUT_0 = 0x0E, GPIO_MODE_OUTPUT_0 = 0x0E,
GPIO_MODE_OUTPUT_1 = 0x0F, GPIO_MODE_OUTPUT_1 = 0x0F,
GPIO_MODE_SPECIAL_FUNCTION_2 = 0x02, GPIO_MODE_SPECIAL_FUNCTION_2 = 0x02,
GPIO_MODE_SPECIAL_FUNCTION_3 = 0x03, GPIO_MODE_SPECIAL_FUNCTION_3 = 0x03,
GPIO_MODE_SPECIAL_FUNCTION_4 = 0x04, GPIO_MODE_SPECIAL_FUNCTION_4 = 0x04,
GPIO_MODE_SPECIAL_FUNCTION_5 = 0x05, GPIO_MODE_SPECIAL_FUNCTION_5 = 0x05,
GPIO_MODE_SPECIAL_FUNCTION_6 = 0x06, GPIO_MODE_SPECIAL_FUNCTION_6 = 0x06,
GPIO_MODE_SPECIAL_FUNCTION_7 = 0x07 GPIO_MODE_SPECIAL_FUNCTION_7 = 0x07
} EMBEDDED_GPIO_MODE; } EMBEDDED_GPIO_MODE;
typedef enum { typedef enum {
@ -46,11 +46,12 @@ typedef enum {
// //
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_GET) ( (EFIAPI *EMBEDDED_GPIO_GET)(
IN EMBEDDED_GPIO *This, IN EMBEDDED_GPIO *This,
IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_PIN Gpio,
OUT UINTN *Value OUT UINTN *Value
); );
/*++ /*++
Routine Description: Routine Description:
@ -69,14 +70,14 @@ Returns:
--*/ --*/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_SET) ( (EFIAPI *EMBEDDED_GPIO_SET)(
IN EMBEDDED_GPIO *This, IN EMBEDDED_GPIO *This,
IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_PIN Gpio,
IN EMBEDDED_GPIO_MODE Mode IN EMBEDDED_GPIO_MODE Mode
); );
/*++ /*++
Routine Description: Routine Description:
@ -95,14 +96,14 @@ Returns:
--*/ --*/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_GET_MODE) ( (EFIAPI *EMBEDDED_GPIO_GET_MODE)(
IN EMBEDDED_GPIO *This, IN EMBEDDED_GPIO *This,
IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_PIN Gpio,
OUT EMBEDDED_GPIO_MODE *Mode OUT EMBEDDED_GPIO_MODE *Mode
); );
/*++ /*++
Routine Description: Routine Description:
@ -121,14 +122,14 @@ Returns:
--*/ --*/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_SET_PULL) ( (EFIAPI *EMBEDDED_GPIO_SET_PULL)(
IN EMBEDDED_GPIO *This, IN EMBEDDED_GPIO *This,
IN EMBEDDED_GPIO_PIN Gpio, IN EMBEDDED_GPIO_PIN Gpio,
IN EMBEDDED_GPIO_PULL Direction IN EMBEDDED_GPIO_PULL Direction
); );
/*++ /*++
Routine Description: Routine Description:
@ -147,32 +148,30 @@ Returns:
--*/ --*/
struct _EMBEDDED_GPIO { struct _EMBEDDED_GPIO {
EMBEDDED_GPIO_GET Get; EMBEDDED_GPIO_GET Get;
EMBEDDED_GPIO_SET Set; EMBEDDED_GPIO_SET Set;
EMBEDDED_GPIO_GET_MODE GetMode; EMBEDDED_GPIO_GET_MODE GetMode;
EMBEDDED_GPIO_SET_PULL SetPull; EMBEDDED_GPIO_SET_PULL SetPull;
}; };
extern EFI_GUID gEmbeddedGpioProtocolGuid; extern EFI_GUID gEmbeddedGpioProtocolGuid;
typedef struct _GPIO_CONTROLLER GPIO_CONTROLLER; typedef struct _GPIO_CONTROLLER GPIO_CONTROLLER;
typedef struct _PLATFORM_GPIO_CONTROLLER PLATFORM_GPIO_CONTROLLER; typedef struct _PLATFORM_GPIO_CONTROLLER PLATFORM_GPIO_CONTROLLER;
struct _GPIO_CONTROLLER { struct _GPIO_CONTROLLER {
UINTN RegisterBase; UINTN RegisterBase;
UINTN GpioIndex; UINTN GpioIndex;
UINTN InternalGpioCount; UINTN InternalGpioCount;
}; };
struct _PLATFORM_GPIO_CONTROLLER { struct _PLATFORM_GPIO_CONTROLLER {
UINTN GpioCount; UINTN GpioCount;
UINTN GpioControllerCount; UINTN GpioControllerCount;
GPIO_CONTROLLER *GpioController; GPIO_CONTROLLER *GpioController;
}; };
extern EFI_GUID gPlatformGpioProtocolGuid; extern EFI_GUID gPlatformGpioProtocolGuid;
#endif #endif

View File

@ -12,7 +12,7 @@
#ifndef __FDT_CLIENT_H__ #ifndef __FDT_CLIENT_H__
#define __FDT_CLIENT_H__ #define __FDT_CLIENT_H__
#define FDT_CLIENT_PROTOCOL_GUID { \ #define FDT_CLIENT_PROTOCOL_GUID {\
0xE11FACA0, 0x4710, 0x4C8E, {0xA7, 0xA2, 0x01, 0xBA, 0xA2, 0x59, 0x1B, 0x4C} \ 0xE11FACA0, 0x4710, 0x4C8E, {0xA7, 0xA2, 0x01, 0xBA, 0xA2, 0x59, 0x1B, 0x4C} \
} }
@ -23,7 +23,7 @@ typedef struct _FDT_CLIENT_PROTOCOL FDT_CLIENT_PROTOCOL;
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_GET_NODE_PROPERTY) ( (EFIAPI *FDT_CLIENT_GET_NODE_PROPERTY)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN INT32 Node, IN INT32 Node,
IN CONST CHAR8 *PropertyName, IN CONST CHAR8 *PropertyName,
@ -33,7 +33,7 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_SET_NODE_PROPERTY) ( (EFIAPI *FDT_CLIENT_SET_NODE_PROPERTY)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN INT32 Node, IN INT32 Node,
IN CONST CHAR8 *PropertyName, IN CONST CHAR8 *PropertyName,
@ -43,7 +43,7 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_FIND_COMPATIBLE_NODE) ( (EFIAPI *FDT_CLIENT_FIND_COMPATIBLE_NODE)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN CONST CHAR8 *CompatibleString, IN CONST CHAR8 *CompatibleString,
OUT INT32 *Node OUT INT32 *Node
@ -51,7 +51,7 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_FIND_NEXT_COMPATIBLE_NODE) ( (EFIAPI *FDT_CLIENT_FIND_NEXT_COMPATIBLE_NODE)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN CONST CHAR8 *CompatibleString, IN CONST CHAR8 *CompatibleString,
IN INT32 PrevNode, IN INT32 PrevNode,
@ -60,7 +60,7 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_FIND_COMPATIBLE_NODE_PROPERTY) ( (EFIAPI *FDT_CLIENT_FIND_COMPATIBLE_NODE_PROPERTY)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN CONST CHAR8 *CompatibleString, IN CONST CHAR8 *CompatibleString,
IN CONST CHAR8 *PropertyName, IN CONST CHAR8 *PropertyName,
@ -70,7 +70,7 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_FIND_COMPATIBLE_NODE_REG) ( (EFIAPI *FDT_CLIENT_FIND_COMPATIBLE_NODE_REG)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN CONST CHAR8 *CompatibleString, IN CONST CHAR8 *CompatibleString,
OUT CONST VOID **Reg, OUT CONST VOID **Reg,
@ -81,7 +81,7 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_FIND_NEXT_MEMORY_NODE_REG) ( (EFIAPI *FDT_CLIENT_FIND_NEXT_MEMORY_NODE_REG)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
IN INT32 PrevNode, IN INT32 PrevNode,
OUT INT32 *Node, OUT INT32 *Node,
@ -93,7 +93,7 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_FIND_MEMORY_NODE_REG) ( (EFIAPI *FDT_CLIENT_FIND_MEMORY_NODE_REG)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
OUT INT32 *Node, OUT INT32 *Node,
OUT CONST VOID **Reg, OUT CONST VOID **Reg,
@ -104,26 +104,26 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *FDT_CLIENT_GET_OR_INSERT_CHOSEN_NODE) ( (EFIAPI *FDT_CLIENT_GET_OR_INSERT_CHOSEN_NODE)(
IN FDT_CLIENT_PROTOCOL *This, IN FDT_CLIENT_PROTOCOL *This,
OUT INT32 *Node OUT INT32 *Node
); );
struct _FDT_CLIENT_PROTOCOL { struct _FDT_CLIENT_PROTOCOL {
FDT_CLIENT_GET_NODE_PROPERTY GetNodeProperty; FDT_CLIENT_GET_NODE_PROPERTY GetNodeProperty;
FDT_CLIENT_SET_NODE_PROPERTY SetNodeProperty; FDT_CLIENT_SET_NODE_PROPERTY SetNodeProperty;
FDT_CLIENT_FIND_COMPATIBLE_NODE FindCompatibleNode; FDT_CLIENT_FIND_COMPATIBLE_NODE FindCompatibleNode;
FDT_CLIENT_FIND_NEXT_COMPATIBLE_NODE FindNextCompatibleNode; FDT_CLIENT_FIND_NEXT_COMPATIBLE_NODE FindNextCompatibleNode;
FDT_CLIENT_FIND_COMPATIBLE_NODE_PROPERTY FindCompatibleNodeProperty; FDT_CLIENT_FIND_COMPATIBLE_NODE_PROPERTY FindCompatibleNodeProperty;
FDT_CLIENT_FIND_COMPATIBLE_NODE_REG FindCompatibleNodeReg; FDT_CLIENT_FIND_COMPATIBLE_NODE_REG FindCompatibleNodeReg;
FDT_CLIENT_FIND_MEMORY_NODE_REG FindMemoryNodeReg; FDT_CLIENT_FIND_MEMORY_NODE_REG FindMemoryNodeReg;
FDT_CLIENT_FIND_NEXT_MEMORY_NODE_REG FindNextMemoryNodeReg; FDT_CLIENT_FIND_NEXT_MEMORY_NODE_REG FindNextMemoryNodeReg;
FDT_CLIENT_GET_OR_INSERT_CHOSEN_NODE GetOrInsertChosenNode; FDT_CLIENT_GET_OR_INSERT_CHOSEN_NODE GetOrInsertChosenNode;
}; };
extern EFI_GUID gFdtClientProtocolGuid; extern EFI_GUID gFdtClientProtocolGuid;
#endif #endif

View File

@ -20,7 +20,6 @@
#include <Protocol/DebugSupport.h> #include <Protocol/DebugSupport.h>
// //
// Protocol GUID // Protocol GUID
// //
@ -29,13 +28,10 @@
#define EFI_HARDWARE_INTERRUPT_PROTOCOL_GGUID \ #define EFI_HARDWARE_INTERRUPT_PROTOCOL_GGUID \
{ 0x2890B3EA, 0x053D, 0x1643, { 0xAD, 0x0C, 0xD6, 0x48, 0x08, 0xDA, 0x3F, 0xF1 } } { 0x2890B3EA, 0x053D, 0x1643, { 0xAD, 0x0C, 0xD6, 0x48, 0x08, 0xDA, 0x3F, 0xF1 } }
typedef struct _EFI_HARDWARE_INTERRUPT_PROTOCOL EFI_HARDWARE_INTERRUPT_PROTOCOL; typedef struct _EFI_HARDWARE_INTERRUPT_PROTOCOL EFI_HARDWARE_INTERRUPT_PROTOCOL;
typedef UINTN HARDWARE_INTERRUPT_SOURCE; typedef UINTN HARDWARE_INTERRUPT_SOURCE;
/** /**
C Interrupt Handler calledin the interrupt context when Source interrupt is active. C Interrupt Handler calledin the interrupt context when Source interrupt is active.
@ -48,12 +44,11 @@ typedef UINTN HARDWARE_INTERRUPT_SOURCE;
**/ **/
typedef typedef
VOID VOID
(EFIAPI *HARDWARE_INTERRUPT_HANDLER) ( (EFIAPI *HARDWARE_INTERRUPT_HANDLER)(
IN HARDWARE_INTERRUPT_SOURCE Source, IN HARDWARE_INTERRUPT_SOURCE Source,
IN EFI_SYSTEM_CONTEXT SystemContext IN EFI_SYSTEM_CONTEXT SystemContext
); );
/** /**
Register Handler for the specified interrupt source. Register Handler for the specified interrupt source.
@ -67,13 +62,12 @@ VOID
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT_REGISTER) ( (EFIAPI *HARDWARE_INTERRUPT_REGISTER)(
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source, IN HARDWARE_INTERRUPT_SOURCE Source,
IN HARDWARE_INTERRUPT_HANDLER Handler IN HARDWARE_INTERRUPT_HANDLER Handler
); );
/** /**
Enable interrupt source Source. Enable interrupt source Source.
@ -86,13 +80,11 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT_ENABLE) ( (EFIAPI *HARDWARE_INTERRUPT_ENABLE)(
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source IN HARDWARE_INTERRUPT_SOURCE Source
); );
/** /**
Disable interrupt source Source. Disable interrupt source Source.
@ -105,12 +97,11 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT_DISABLE) ( (EFIAPI *HARDWARE_INTERRUPT_DISABLE)(
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source IN HARDWARE_INTERRUPT_SOURCE Source
); );
/** /**
Return current state of interrupt source Source. Return current state of interrupt source Source.
@ -124,7 +115,7 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT_INTERRUPT_STATE) ( (EFIAPI *HARDWARE_INTERRUPT_INTERRUPT_STATE)(
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source, IN HARDWARE_INTERRUPT_SOURCE Source,
IN BOOLEAN *InterruptState IN BOOLEAN *InterruptState
@ -143,22 +134,19 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT_END_OF_INTERRUPT) ( (EFIAPI *HARDWARE_INTERRUPT_END_OF_INTERRUPT)(
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source IN HARDWARE_INTERRUPT_SOURCE Source
); );
struct _EFI_HARDWARE_INTERRUPT_PROTOCOL { struct _EFI_HARDWARE_INTERRUPT_PROTOCOL {
HARDWARE_INTERRUPT_REGISTER RegisterInterruptSource; HARDWARE_INTERRUPT_REGISTER RegisterInterruptSource;
HARDWARE_INTERRUPT_ENABLE EnableInterruptSource; HARDWARE_INTERRUPT_ENABLE EnableInterruptSource;
HARDWARE_INTERRUPT_DISABLE DisableInterruptSource; HARDWARE_INTERRUPT_DISABLE DisableInterruptSource;
HARDWARE_INTERRUPT_INTERRUPT_STATE GetInterruptSourceState; HARDWARE_INTERRUPT_INTERRUPT_STATE GetInterruptSourceState;
HARDWARE_INTERRUPT_END_OF_INTERRUPT EndOfInterrupt; HARDWARE_INTERRUPT_END_OF_INTERRUPT EndOfInterrupt;
}; };
extern EFI_GUID gHardwareInterruptProtocolGuid; extern EFI_GUID gHardwareInterruptProtocolGuid;
#endif #endif

View File

@ -25,7 +25,7 @@ typedef enum {
} EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE; } EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE;
typedef struct _EFI_HARDWARE_INTERRUPT2_PROTOCOL \ typedef struct _EFI_HARDWARE_INTERRUPT2_PROTOCOL \
EFI_HARDWARE_INTERRUPT2_PROTOCOL; EFI_HARDWARE_INTERRUPT2_PROTOCOL;
/** /**
Register Handler for the specified interrupt source. Register Handler for the specified interrupt source.
@ -40,13 +40,12 @@ typedef struct _EFI_HARDWARE_INTERRUPT2_PROTOCOL \
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT2_REGISTER) ( (EFIAPI *HARDWARE_INTERRUPT2_REGISTER)(
IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source, IN HARDWARE_INTERRUPT_SOURCE Source,
IN HARDWARE_INTERRUPT_HANDLER Handler IN HARDWARE_INTERRUPT_HANDLER Handler
); );
/** /**
Enable interrupt source Source. Enable interrupt source Source.
@ -59,12 +58,11 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT2_ENABLE) ( (EFIAPI *HARDWARE_INTERRUPT2_ENABLE)(
IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source IN HARDWARE_INTERRUPT_SOURCE Source
); );
/** /**
Disable interrupt source Source. Disable interrupt source Source.
@ -77,12 +75,11 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT2_DISABLE) ( (EFIAPI *HARDWARE_INTERRUPT2_DISABLE)(
IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source IN HARDWARE_INTERRUPT_SOURCE Source
); );
/** /**
Return current state of interrupt source Source. Return current state of interrupt source Source.
@ -96,7 +93,7 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT2_INTERRUPT_STATE) ( (EFIAPI *HARDWARE_INTERRUPT2_INTERRUPT_STATE)(
IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source, IN HARDWARE_INTERRUPT_SOURCE Source,
IN BOOLEAN *InterruptState IN BOOLEAN *InterruptState
@ -115,7 +112,7 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT2_END_OF_INTERRUPT) ( (EFIAPI *HARDWARE_INTERRUPT2_END_OF_INTERRUPT)(
IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source IN HARDWARE_INTERRUPT_SOURCE Source
); );
@ -133,13 +130,12 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT2_GET_TRIGGER_TYPE) ( (EFIAPI *HARDWARE_INTERRUPT2_GET_TRIGGER_TYPE)(
IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source, IN HARDWARE_INTERRUPT_SOURCE Source,
OUT EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE *TriggerType OUT EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE *TriggerType
); );
/** /**
Configure the trigger type for an interrupt source Configure the trigger type for an interrupt source
@ -153,7 +149,7 @@ EFI_STATUS
**/ **/
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *HARDWARE_INTERRUPT2_SET_TRIGGER_TYPE) ( (EFIAPI *HARDWARE_INTERRUPT2_SET_TRIGGER_TYPE)(
IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This,
IN HARDWARE_INTERRUPT_SOURCE Source, IN HARDWARE_INTERRUPT_SOURCE Source,
IN EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE TriggerType IN EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE TriggerType
@ -171,6 +167,6 @@ struct _EFI_HARDWARE_INTERRUPT2_PROTOCOL {
HARDWARE_INTERRUPT2_SET_TRIGGER_TYPE SetTriggerType; HARDWARE_INTERRUPT2_SET_TRIGGER_TYPE SetTriggerType;
}; };
extern EFI_GUID gHardwareInterrupt2ProtocolGuid; extern EFI_GUID gHardwareInterrupt2ProtocolGuid;
#endif #endif

View File

@ -16,169 +16,166 @@
#define EMBEDDED_MMC_HOST_PROTOCOL_GUID \ #define EMBEDDED_MMC_HOST_PROTOCOL_GUID \
{ 0x3e591c00, 0x9e4a, 0x11df, {0x92, 0x44, 0x00, 0x02, 0xA5, 0xD5, 0xC5, 0x1B } } { 0x3e591c00, 0x9e4a, 0x11df, {0x92, 0x44, 0x00, 0x02, 0xA5, 0xD5, 0xC5, 0x1B } }
#define MMC_RESPONSE_TYPE_R1 0 #define MMC_RESPONSE_TYPE_R1 0
#define MMC_RESPONSE_TYPE_R1b 0 #define MMC_RESPONSE_TYPE_R1b 0
#define MMC_RESPONSE_TYPE_R2 1 #define MMC_RESPONSE_TYPE_R2 1
#define MMC_RESPONSE_TYPE_R3 0 #define MMC_RESPONSE_TYPE_R3 0
#define MMC_RESPONSE_TYPE_R6 0 #define MMC_RESPONSE_TYPE_R6 0
#define MMC_RESPONSE_TYPE_R7 0 #define MMC_RESPONSE_TYPE_R7 0
#define MMC_RESPONSE_TYPE_OCR 0 #define MMC_RESPONSE_TYPE_OCR 0
#define MMC_RESPONSE_TYPE_CID 1 #define MMC_RESPONSE_TYPE_CID 1
#define MMC_RESPONSE_TYPE_CSD 1 #define MMC_RESPONSE_TYPE_CSD 1
#define MMC_RESPONSE_TYPE_RCA 0 #define MMC_RESPONSE_TYPE_RCA 0
typedef UINT32 MMC_RESPONSE_TYPE; typedef UINT32 MMC_RESPONSE_TYPE;
typedef UINT32 MMC_CMD; typedef UINT32 MMC_CMD;
#define MMC_CMD_WAIT_RESPONSE (1 << 16) #define MMC_CMD_WAIT_RESPONSE (1 << 16)
#define MMC_CMD_LONG_RESPONSE (1 << 17) #define MMC_CMD_LONG_RESPONSE (1 << 17)
#define MMC_CMD_NO_CRC_RESPONSE (1 << 18) #define MMC_CMD_NO_CRC_RESPONSE (1 << 18)
#define MMC_INDX(Index) ((Index) & 0xFFFF) #define MMC_INDX(Index) ((Index) & 0xFFFF)
#define MMC_GET_INDX(MmcCmd) ((MmcCmd) & 0xFFFF) #define MMC_GET_INDX(MmcCmd) ((MmcCmd) & 0xFFFF)
#define MMC_CMD0 (MMC_INDX(0) | MMC_CMD_NO_CRC_RESPONSE) #define MMC_CMD0 (MMC_INDX(0) | MMC_CMD_NO_CRC_RESPONSE)
#define MMC_CMD1 (MMC_INDX(1) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE) #define MMC_CMD1 (MMC_INDX(1) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE)
#define MMC_CMD2 (MMC_INDX(2) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_LONG_RESPONSE) #define MMC_CMD2 (MMC_INDX(2) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_LONG_RESPONSE)
#define MMC_CMD3 (MMC_INDX(3) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD3 (MMC_INDX(3) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD5 (MMC_INDX(5) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE) #define MMC_CMD5 (MMC_INDX(5) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE)
#define MMC_CMD6 (MMC_INDX(6) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD6 (MMC_INDX(6) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD7 (MMC_INDX(7) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD7 (MMC_INDX(7) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD8 (MMC_INDX(8) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD8 (MMC_INDX(8) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD9 (MMC_INDX(9) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_LONG_RESPONSE) #define MMC_CMD9 (MMC_INDX(9) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_LONG_RESPONSE)
#define MMC_CMD11 (MMC_INDX(11) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD11 (MMC_INDX(11) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD12 (MMC_INDX(12) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD12 (MMC_INDX(12) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD13 (MMC_INDX(13) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD13 (MMC_INDX(13) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD16 (MMC_INDX(16) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD16 (MMC_INDX(16) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD17 (MMC_INDX(17) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD17 (MMC_INDX(17) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD18 (MMC_INDX(18) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD18 (MMC_INDX(18) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD20 (MMC_INDX(20) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD20 (MMC_INDX(20) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD23 (MMC_INDX(23) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD23 (MMC_INDX(23) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD24 (MMC_INDX(24) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD24 (MMC_INDX(24) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD25 (MMC_INDX(25) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD25 (MMC_INDX(25) | MMC_CMD_WAIT_RESPONSE)
#define MMC_CMD55 (MMC_INDX(55) | MMC_CMD_WAIT_RESPONSE) #define MMC_CMD55 (MMC_INDX(55) | MMC_CMD_WAIT_RESPONSE)
#define MMC_ACMD41 (MMC_INDX(41) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE) #define MMC_ACMD41 (MMC_INDX(41) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE)
#define MMC_ACMD51 (MMC_INDX(51) | MMC_CMD_WAIT_RESPONSE) #define MMC_ACMD51 (MMC_INDX(51) | MMC_CMD_WAIT_RESPONSE)
// Valid responses for CMD1 in eMMC // Valid responses for CMD1 in eMMC
#define EMMC_CMD1_CAPACITY_LESS_THAN_2GB 0x00FF8080 // Capacity <= 2GB, byte addressing used #define EMMC_CMD1_CAPACITY_LESS_THAN_2GB 0x00FF8080 // Capacity <= 2GB, byte addressing used
#define EMMC_CMD1_CAPACITY_GREATER_THAN_2GB 0x40FF8080 // Capacity > 2GB, 512-byte sector addressing used #define EMMC_CMD1_CAPACITY_GREATER_THAN_2GB 0x40FF8080 // Capacity > 2GB, 512-byte sector addressing used
#define MMC_STATUS_APP_CMD (1 << 5) #define MMC_STATUS_APP_CMD (1 << 5)
typedef enum _MMC_STATE { typedef enum _MMC_STATE {
MmcInvalidState = 0, MmcInvalidState = 0,
MmcHwInitializationState, MmcHwInitializationState,
MmcIdleState, MmcIdleState,
MmcReadyState, MmcReadyState,
MmcIdentificationState, MmcIdentificationState,
MmcStandByState, MmcStandByState,
MmcTransferState, MmcTransferState,
MmcSendingDataState, MmcSendingDataState,
MmcReceiveDataState, MmcReceiveDataState,
MmcProgrammingState, MmcProgrammingState,
MmcDisconnectState, MmcDisconnectState,
} MMC_STATE; } MMC_STATE;
#define EMMCBACKWARD (0) #define EMMCBACKWARD (0)
#define EMMCHS26 (1 << 0) // High-Speed @26MHz at rated device voltages #define EMMCHS26 (1 << 0) // High-Speed @26MHz at rated device voltages
#define EMMCHS52 (1 << 1) // High-Speed @52MHz at rated device voltages #define EMMCHS52 (1 << 1) // High-Speed @52MHz at rated device voltages
#define EMMCHS52DDR1V8 (1 << 2) // High-Speed Dual Data Rate @52MHz 1.8V or 3V I/O #define EMMCHS52DDR1V8 (1 << 2) // High-Speed Dual Data Rate @52MHz 1.8V or 3V I/O
#define EMMCHS52DDR1V2 (1 << 3) // High-Speed Dual Data Rate @52MHz 1.2V I/O #define EMMCHS52DDR1V2 (1 << 3) // High-Speed Dual Data Rate @52MHz 1.2V I/O
#define EMMCHS200SDR1V8 (1 << 4) // HS200 Single Data Rate @200MHz 1.8V I/O #define EMMCHS200SDR1V8 (1 << 4) // HS200 Single Data Rate @200MHz 1.8V I/O
#define EMMCHS200SDR1V2 (1 << 5) // HS200 Single Data Rate @200MHz 1.2V I/O #define EMMCHS200SDR1V2 (1 << 5) // HS200 Single Data Rate @200MHz 1.2V I/O
#define EMMCHS400DDR1V8 (1 << 6) // HS400 Dual Data Rate @400MHz 1.8V I/O #define EMMCHS400DDR1V8 (1 << 6) // HS400 Dual Data Rate @400MHz 1.8V I/O
#define EMMCHS400DDR1V2 (1 << 7) // HS400 Dual Data Rate @400MHz 1.2V I/O #define EMMCHS400DDR1V2 (1 << 7) // HS400 Dual Data Rate @400MHz 1.2V I/O
/// ///
/// Forward declaration for EFI_MMC_HOST_PROTOCOL /// Forward declaration for EFI_MMC_HOST_PROTOCOL
/// ///
typedef struct _EFI_MMC_HOST_PROTOCOL EFI_MMC_HOST_PROTOCOL; typedef struct _EFI_MMC_HOST_PROTOCOL EFI_MMC_HOST_PROTOCOL;
typedef BOOLEAN (EFIAPI *MMC_ISCARDPRESENT) ( typedef BOOLEAN (EFIAPI *MMC_ISCARDPRESENT)(
IN EFI_MMC_HOST_PROTOCOL *This IN EFI_MMC_HOST_PROTOCOL *This
); );
typedef BOOLEAN (EFIAPI *MMC_ISREADONLY) ( typedef BOOLEAN (EFIAPI *MMC_ISREADONLY)(
IN EFI_MMC_HOST_PROTOCOL *This IN EFI_MMC_HOST_PROTOCOL *This
); );
typedef EFI_STATUS (EFIAPI *MMC_BUILDDEVICEPATH) ( typedef EFI_STATUS (EFIAPI *MMC_BUILDDEVICEPATH)(
IN EFI_MMC_HOST_PROTOCOL *This, IN EFI_MMC_HOST_PROTOCOL *This,
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
); );
typedef EFI_STATUS (EFIAPI *MMC_NOTIFYSTATE) ( typedef EFI_STATUS (EFIAPI *MMC_NOTIFYSTATE)(
IN EFI_MMC_HOST_PROTOCOL *This, IN EFI_MMC_HOST_PROTOCOL *This,
IN MMC_STATE State IN MMC_STATE State
); );
typedef EFI_STATUS (EFIAPI *MMC_SENDCOMMAND) ( typedef EFI_STATUS (EFIAPI *MMC_SENDCOMMAND)(
IN EFI_MMC_HOST_PROTOCOL *This, IN EFI_MMC_HOST_PROTOCOL *This,
IN MMC_CMD Cmd, IN MMC_CMD Cmd,
IN UINT32 Argument IN UINT32 Argument
); );
typedef EFI_STATUS (EFIAPI *MMC_RECEIVERESPONSE) ( typedef EFI_STATUS (EFIAPI *MMC_RECEIVERESPONSE)(
IN EFI_MMC_HOST_PROTOCOL *This, IN EFI_MMC_HOST_PROTOCOL *This,
IN MMC_RESPONSE_TYPE Type, IN MMC_RESPONSE_TYPE Type,
IN UINT32 *Buffer IN UINT32 *Buffer
); );
typedef EFI_STATUS (EFIAPI *MMC_READBLOCKDATA) ( typedef EFI_STATUS (EFIAPI *MMC_READBLOCKDATA)(
IN EFI_MMC_HOST_PROTOCOL *This, IN EFI_MMC_HOST_PROTOCOL *This,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN UINTN Length, IN UINTN Length,
OUT UINT32 *Buffer OUT UINT32 *Buffer
); );
typedef EFI_STATUS (EFIAPI *MMC_WRITEBLOCKDATA) ( typedef EFI_STATUS (EFIAPI *MMC_WRITEBLOCKDATA)(
IN EFI_MMC_HOST_PROTOCOL *This, IN EFI_MMC_HOST_PROTOCOL *This,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN UINTN Length, IN UINTN Length,
IN UINT32 *Buffer IN UINT32 *Buffer
); );
typedef EFI_STATUS (EFIAPI *MMC_SETIOS) ( typedef EFI_STATUS (EFIAPI *MMC_SETIOS)(
IN EFI_MMC_HOST_PROTOCOL *This, IN EFI_MMC_HOST_PROTOCOL *This,
IN UINT32 BusClockFreq, IN UINT32 BusClockFreq,
IN UINT32 BusWidth, IN UINT32 BusWidth,
IN UINT32 TimingMode IN UINT32 TimingMode
); );
typedef BOOLEAN (EFIAPI *MMC_ISMULTIBLOCK) ( typedef BOOLEAN (EFIAPI *MMC_ISMULTIBLOCK)(
IN EFI_MMC_HOST_PROTOCOL *This IN EFI_MMC_HOST_PROTOCOL *This
); );
struct _EFI_MMC_HOST_PROTOCOL { struct _EFI_MMC_HOST_PROTOCOL {
UINT32 Revision;
MMC_ISCARDPRESENT IsCardPresent;
MMC_ISREADONLY IsReadOnly;
MMC_BUILDDEVICEPATH BuildDevicePath;
UINT32 Revision; MMC_NOTIFYSTATE NotifyState;
MMC_ISCARDPRESENT IsCardPresent;
MMC_ISREADONLY IsReadOnly;
MMC_BUILDDEVICEPATH BuildDevicePath;
MMC_NOTIFYSTATE NotifyState; MMC_SENDCOMMAND SendCommand;
MMC_RECEIVERESPONSE ReceiveResponse;
MMC_SENDCOMMAND SendCommand; MMC_READBLOCKDATA ReadBlockData;
MMC_RECEIVERESPONSE ReceiveResponse; MMC_WRITEBLOCKDATA WriteBlockData;
MMC_READBLOCKDATA ReadBlockData;
MMC_WRITEBLOCKDATA WriteBlockData;
MMC_SETIOS SetIos;
MMC_ISMULTIBLOCK IsMultiBlock;
MMC_SETIOS SetIos;
MMC_ISMULTIBLOCK IsMultiBlock;
}; };
#define MMC_HOST_PROTOCOL_REVISION 0x00010002 // 1.2 #define MMC_HOST_PROTOCOL_REVISION 0x00010002 // 1.2
#define MMC_HOST_HAS_SETIOS(Host) (Host->Revision >= MMC_HOST_PROTOCOL_REVISION && \ #define MMC_HOST_HAS_SETIOS(Host) (Host->Revision >= MMC_HOST_PROTOCOL_REVISION &&\
Host->SetIos != NULL) Host->SetIos != NULL)
#define MMC_HOST_HAS_ISMULTIBLOCK(Host) (Host->Revision >= MMC_HOST_PROTOCOL_REVISION && \ #define MMC_HOST_HAS_ISMULTIBLOCK(Host) (Host->Revision >= MMC_HOST_PROTOCOL_REVISION &&\
Host->IsMultiBlock != NULL) Host->IsMultiBlock != NULL)
extern EFI_GUID gEmbeddedMmcHostProtocolGuid; extern EFI_GUID gEmbeddedMmcHostProtocolGuid;
#endif #endif

View File

@ -16,11 +16,8 @@
#define PE_COFF_LOADER_PROTOCOL_GUID \ #define PE_COFF_LOADER_PROTOCOL_GUID \
{ 0xB323179B, 0x97FB, 0x477E, { 0xB0, 0xFE, 0xD8, 0x85, 0x91, 0xFA, 0x11, 0xAB } } { 0xB323179B, 0x97FB, 0x477E, { 0xB0, 0xFE, 0xD8, 0x85, 0x91, 0xFA, 0x11, 0xAB } }
typedef struct _PE_COFF_LOADER_PROTOCOL PE_COFF_LOADER_PROTOCOL; typedef struct _PE_COFF_LOADER_PROTOCOL PE_COFF_LOADER_PROTOCOL;
/** /**
Retrieves information about a PE/COFF image. Retrieves information about a PE/COFF image.
@ -46,11 +43,10 @@ typedef struct _PE_COFF_LOADER_PROTOCOL PE_COFF_LOADER_PROTOCOL;
**/ **/
typedef typedef
RETURN_STATUS RETURN_STATUS
(EFIAPI *PE_COFF_LOADER_GET_IMAGE_INFO) ( (EFIAPI *PE_COFF_LOADER_GET_IMAGE_INFO)(
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
); );
/** /**
Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage(). Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage().
@ -83,11 +79,10 @@ RETURN_STATUS
**/ **/
typedef typedef
RETURN_STATUS RETURN_STATUS
(EFIAPI *PE_COFF_LOADER_RELOCATE_IMAGE) ( (EFIAPI *PE_COFF_LOADER_RELOCATE_IMAGE)(
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
); );
/** /**
Loads a PE/COFF image into memory. Loads a PE/COFF image into memory.
@ -121,12 +116,10 @@ RETURN_STATUS
**/ **/
typedef typedef
RETURN_STATUS RETURN_STATUS
(EFIAPI *PE_COFF_LOADER_LOAD_IMAGE) ( (EFIAPI *PE_COFF_LOADER_LOAD_IMAGE)(
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
); );
/** /**
Reads contents of a PE/COFF image from a buffer in system memory. Reads contents of a PE/COFF image from a buffer in system memory.
@ -152,15 +145,13 @@ RETURN_STATUS
**/ **/
typedef typedef
RETURN_STATUS RETURN_STATUS
(EFIAPI *PE_COFF_LOADER_READ_FROM_MEMORY) ( (EFIAPI *PE_COFF_LOADER_READ_FROM_MEMORY)(
IN VOID *FileHandle, IN VOID *FileHandle,
IN UINTN FileOffset, IN UINTN FileOffset,
IN OUT UINTN *ReadSize, IN OUT UINTN *ReadSize,
OUT VOID *Buffer OUT VOID *Buffer
); );
/** /**
Reapply fixups on a fixed up PE32/PE32+ image to allow virtual calling at EFI Reapply fixups on a fixed up PE32/PE32+ image to allow virtual calling at EFI
runtime. runtime.
@ -186,15 +177,13 @@ RETURN_STATUS
**/ **/
typedef typedef
VOID VOID
(EFIAPI *PE_COFF_LOADER_RELOCATE_IMAGE_FOR_RUNTIME) ( (EFIAPI *PE_COFF_LOADER_RELOCATE_IMAGE_FOR_RUNTIME)(
IN PHYSICAL_ADDRESS ImageBase, IN PHYSICAL_ADDRESS ImageBase,
IN PHYSICAL_ADDRESS VirtImageBase, IN PHYSICAL_ADDRESS VirtImageBase,
IN UINTN ImageSize, IN UINTN ImageSize,
IN VOID *RelocationData IN VOID *RelocationData
); );
/** /**
Unloads a loaded PE/COFF image from memory and releases its taken resource. Unloads a loaded PE/COFF image from memory and releases its taken resource.
Releases any environment specific resources that were allocated when the image Releases any environment specific resources that were allocated when the image
@ -213,23 +202,19 @@ VOID
**/ **/
typedef typedef
RETURN_STATUS RETURN_STATUS
(EFIAPI *PE_COFF_LOADER_UNLOAD_IMAGE) ( (EFIAPI *PE_COFF_LOADER_UNLOAD_IMAGE)(
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
); );
struct _PE_COFF_LOADER_PROTOCOL { struct _PE_COFF_LOADER_PROTOCOL {
PE_COFF_LOADER_GET_IMAGE_INFO GetImageInfo; PE_COFF_LOADER_GET_IMAGE_INFO GetImageInfo;
PE_COFF_LOADER_LOAD_IMAGE LoadImage; PE_COFF_LOADER_LOAD_IMAGE LoadImage;
PE_COFF_LOADER_RELOCATE_IMAGE RelocateImage; PE_COFF_LOADER_RELOCATE_IMAGE RelocateImage;
PE_COFF_LOADER_READ_FROM_MEMORY ReadFromMemory; PE_COFF_LOADER_READ_FROM_MEMORY ReadFromMemory;
PE_COFF_LOADER_RELOCATE_IMAGE_FOR_RUNTIME RelocateImageForRuntime; PE_COFF_LOADER_RELOCATE_IMAGE_FOR_RUNTIME RelocateImageForRuntime;
PE_COFF_LOADER_UNLOAD_IMAGE UnloadImage; PE_COFF_LOADER_UNLOAD_IMAGE UnloadImage;
}; };
extern EFI_GUID gPeCoffLoaderProtocolGuid;
extern EFI_GUID gPeCoffLoaderProtocolGuid;
#endif #endif

View File

@ -12,7 +12,7 @@
// //
// Protocol interface structure // Protocol interface structure
// //
typedef struct _PLATFORM_BOOT_MANAGER_PROTOCOL PLATFORM_BOOT_MANAGER_PROTOCOL; typedef struct _PLATFORM_BOOT_MANAGER_PROTOCOL PLATFORM_BOOT_MANAGER_PROTOCOL;
// //
// Function Prototypes // Function Prototypes
@ -65,16 +65,16 @@ typedef struct _PLATFORM_BOOT_MANAGER_PROTOCOL PLATFORM_BOOT_MANAGER_PROTOCOL
*/ */
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *GET_PLATFORM_BOOT_OPTIONS_AND_KEYS) ( (EFIAPI *GET_PLATFORM_BOOT_OPTIONS_AND_KEYS)(
OUT UINTN *Count, OUT UINTN *Count,
OUT EFI_BOOT_MANAGER_LOAD_OPTION **BootOptions, OUT EFI_BOOT_MANAGER_LOAD_OPTION **BootOptions,
OUT EFI_INPUT_KEY **BootKeys OUT EFI_INPUT_KEY **BootKeys
); );
struct _PLATFORM_BOOT_MANAGER_PROTOCOL { struct _PLATFORM_BOOT_MANAGER_PROTOCOL {
GET_PLATFORM_BOOT_OPTIONS_AND_KEYS GetPlatformBootOptionsAndKeys; GET_PLATFORM_BOOT_OPTIONS_AND_KEYS GetPlatformBootOptionsAndKeys;
}; };
extern EFI_GUID gPlatformBootManagerProtocolGuid; extern EFI_GUID gPlatformBootManagerProtocolGuid;
#endif /* __PLATFORM_BOOT_MANAGER_PROTOCOL_H__ */ #endif /* __PLATFORM_BOOT_MANAGER_PROTOCOL_H__ */

View File

@ -12,48 +12,48 @@
// //
// Protocol interface structure // Protocol interface structure
// //
typedef struct _PLATFORM_VIRTUAL_KBD_PROTOCOL PLATFORM_VIRTUAL_KBD_PROTOCOL; typedef struct _PLATFORM_VIRTUAL_KBD_PROTOCOL PLATFORM_VIRTUAL_KBD_PROTOCOL;
typedef struct _VIRTUAL_KBD_KEY VIRTUAL_KBD_KEY; typedef struct _VIRTUAL_KBD_KEY VIRTUAL_KBD_KEY;
#define VIRTUAL_KEYBOARD_KEY_SIGNATURE SIGNATURE_32 ('v', 'k', 'b', 'd') #define VIRTUAL_KEYBOARD_KEY_SIGNATURE SIGNATURE_32 ('v', 'k', 'b', 'd')
struct _VIRTUAL_KBD_KEY { struct _VIRTUAL_KBD_KEY {
UINTN Signature; UINTN Signature;
EFI_INPUT_KEY Key; EFI_INPUT_KEY Key;
}; };
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *PLATFORM_VIRTUAL_KBD_REGISTER) ( (EFIAPI *PLATFORM_VIRTUAL_KBD_REGISTER)(
IN VOID IN VOID
); );
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *PLATFORM_VIRTUAL_KBD_RESET) ( (EFIAPI *PLATFORM_VIRTUAL_KBD_RESET)(
IN VOID IN VOID
); );
typedef typedef
BOOLEAN BOOLEAN
(EFIAPI *PLATFORM_VIRTUAL_KBD_QUERY) ( (EFIAPI *PLATFORM_VIRTUAL_KBD_QUERY)(
IN VIRTUAL_KBD_KEY *VirtualKey IN VIRTUAL_KBD_KEY *VirtualKey
); );
typedef typedef
EFI_STATUS EFI_STATUS
(EFIAPI *PLATFORM_VIRTUAL_KBD_CLEAR) ( (EFIAPI *PLATFORM_VIRTUAL_KBD_CLEAR)(
IN VIRTUAL_KBD_KEY *VirtualKey IN VIRTUAL_KBD_KEY *VirtualKey
); );
struct _PLATFORM_VIRTUAL_KBD_PROTOCOL { struct _PLATFORM_VIRTUAL_KBD_PROTOCOL {
PLATFORM_VIRTUAL_KBD_REGISTER Register; PLATFORM_VIRTUAL_KBD_REGISTER Register;
PLATFORM_VIRTUAL_KBD_RESET Reset; PLATFORM_VIRTUAL_KBD_RESET Reset;
PLATFORM_VIRTUAL_KBD_QUERY Query; PLATFORM_VIRTUAL_KBD_QUERY Query;
PLATFORM_VIRTUAL_KBD_CLEAR Clear; PLATFORM_VIRTUAL_KBD_CLEAR Clear;
}; };
extern EFI_GUID gPlatformVirtualKeyboardProtocolGuid; extern EFI_GUID gPlatformVirtualKeyboardProtocolGuid;
#endif /* __PLATFORM_VIRTUAL_KEYBOARD_H__ */ #endif /* __PLATFORM_VIRTUAL_KEYBOARD_H__ */

View File

@ -11,7 +11,7 @@
#include <IndustryStandard/Usb.h> #include <IndustryStandard/Usb.h>
extern EFI_GUID gUsbDeviceProtocolGuid; extern EFI_GUID gUsbDeviceProtocolGuid;
/* /*
* Note: This Protocol is just the bare minimum for Android Fastboot. It * Note: This Protocol is just the bare minimum for Android Fastboot. It
@ -30,8 +30,8 @@ extern EFI_GUID gUsbDeviceProtocolGuid;
typedef typedef
VOID VOID
(*USB_DEVICE_RX_CALLBACK) ( (*USB_DEVICE_RX_CALLBACK) (
IN UINTN Size, IN UINTN Size,
IN VOID *Buffer IN VOID *Buffer
); );
/* /*
@ -46,7 +46,7 @@ VOID
typedef typedef
VOID VOID
(*USB_DEVICE_TX_CALLBACK) ( (*USB_DEVICE_TX_CALLBACK) (
IN UINT8 EndpointIndex IN UINT8 EndpointIndex
); );
/* /*
@ -64,9 +64,9 @@ VOID
typedef typedef
EFI_STATUS EFI_STATUS
(*USB_DEVICE_SEND) ( (*USB_DEVICE_SEND) (
IN UINT8 EndpointIndex, IN UINT8 EndpointIndex,
IN UINTN Size, IN UINTN Size,
IN CONST VOID *Buffer IN CONST VOID *Buffer
); );
/* /*
@ -96,15 +96,15 @@ EFI_STATUS
typedef typedef
EFI_STATUS EFI_STATUS
(*USB_DEVICE_START) ( (*USB_DEVICE_START) (
IN USB_DEVICE_DESCRIPTOR *DeviceDescriptor, IN USB_DEVICE_DESCRIPTOR *DeviceDescriptor,
IN VOID **Descriptors, IN VOID **Descriptors,
IN USB_DEVICE_RX_CALLBACK RxCallback, IN USB_DEVICE_RX_CALLBACK RxCallback,
IN USB_DEVICE_TX_CALLBACK TxCallback IN USB_DEVICE_TX_CALLBACK TxCallback
); );
struct _USB_DEVICE_PROTOCOL { struct _USB_DEVICE_PROTOCOL {
USB_DEVICE_START Start; USB_DEVICE_START Start;
USB_DEVICE_SEND Send; USB_DEVICE_SEND Send;
}; };
typedef struct _USB_DEVICE_PROTOCOL USB_DEVICE_PROTOCOL; typedef struct _USB_DEVICE_PROTOCOL USB_DEVICE_PROTOCOL;

View File

@ -1,5 +1,6 @@
#ifndef _FDT_H #ifndef _FDT_H
#define _FDT_H #define _FDT_H
/* /*
* libfdt - Flat Device Tree manipulation * libfdt - Flat Device Tree manipulation
* Copyright (C) 2006 David Gibson, IBM Corporation. * Copyright (C) 2006 David Gibson, IBM Corporation.
@ -55,57 +56,57 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
struct fdt_header { struct fdt_header {
fdt32_t magic; /* magic word FDT_MAGIC */ fdt32_t magic; /* magic word FDT_MAGIC */
fdt32_t totalsize; /* total size of DT block */ fdt32_t totalsize; /* total size of DT block */
fdt32_t off_dt_struct; /* offset to structure */ fdt32_t off_dt_struct; /* offset to structure */
fdt32_t off_dt_strings; /* offset to strings */ fdt32_t off_dt_strings; /* offset to strings */
fdt32_t off_mem_rsvmap; /* offset to memory reserve map */ fdt32_t off_mem_rsvmap; /* offset to memory reserve map */
fdt32_t version; /* format version */ fdt32_t version; /* format version */
fdt32_t last_comp_version; /* last compatible version */ fdt32_t last_comp_version; /* last compatible version */
/* version 2 fields below */ /* version 2 fields below */
fdt32_t boot_cpuid_phys; /* Which physical CPU id we're fdt32_t boot_cpuid_phys; /* Which physical CPU id we're
booting on */ booting on */
/* version 3 fields below */ /* version 3 fields below */
fdt32_t size_dt_strings; /* size of the strings block */ fdt32_t size_dt_strings; /* size of the strings block */
/* version 17 fields below */ /* version 17 fields below */
fdt32_t size_dt_struct; /* size of the structure block */ fdt32_t size_dt_struct; /* size of the structure block */
}; };
struct fdt_reserve_entry { struct fdt_reserve_entry {
fdt64_t address; fdt64_t address;
fdt64_t size; fdt64_t size;
}; };
struct fdt_node_header { struct fdt_node_header {
fdt32_t tag; fdt32_t tag;
char name[0]; char name[0];
}; };
struct fdt_property { struct fdt_property {
fdt32_t tag; fdt32_t tag;
fdt32_t len; fdt32_t len;
fdt32_t nameoff; fdt32_t nameoff;
char data[0]; char data[0];
}; };
#endif /* !__ASSEMBLY */ #endif /* !__ASSEMBLY */
#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ #define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
#define FDT_TAGSIZE sizeof(fdt32_t) #define FDT_TAGSIZE sizeof(fdt32_t)
#define FDT_BEGIN_NODE 0x1 /* Start node: full name */ #define FDT_BEGIN_NODE 0x1 /* Start node: full name */
#define FDT_END_NODE 0x2 /* End node */ #define FDT_END_NODE 0x2 /* End node */
#define FDT_PROP 0x3 /* Property: name off, #define FDT_PROP 0x3 /* Property: name off,
size, content */ size, content */
#define FDT_NOP 0x4 /* nop */ #define FDT_NOP 0x4 /* nop */
#define FDT_END 0x9 #define FDT_END 0x9
#define FDT_V1_SIZE (7*sizeof(fdt32_t)) #define FDT_V1_SIZE (7*sizeof(fdt32_t))
#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(fdt32_t)) #define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(fdt32_t))
#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(fdt32_t)) #define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(fdt32_t))
#define FDT_V16_SIZE FDT_V3_SIZE #define FDT_V16_SIZE FDT_V3_SIZE
#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(fdt32_t)) #define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(fdt32_t))
#endif /* _FDT_H */ #endif /* _FDT_H */

File diff suppressed because it is too large Load Diff

View File

@ -12,79 +12,153 @@
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h> #include <Library/BaseMemoryLib.h>
typedef UINT16 fdt16_t; typedef UINT16 fdt16_t;
typedef UINT32 fdt32_t; typedef UINT32 fdt32_t;
typedef UINT64 fdt64_t; typedef UINT64 fdt64_t;
typedef UINT8 uint8_t; typedef UINT8 uint8_t;
typedef UINT16 uint16_t; typedef UINT16 uint16_t;
typedef UINT32 uint32_t; typedef UINT32 uint32_t;
typedef UINT64 uint64_t; typedef UINT64 uint64_t;
typedef UINTN uintptr_t; typedef UINTN uintptr_t;
typedef UINTN size_t; typedef UINTN size_t;
static inline uint16_t fdt16_to_cpu(fdt16_t x) static inline uint16_t
fdt16_to_cpu (
fdt16_t x
)
{ {
return SwapBytes16 (x); return SwapBytes16 (x);
} }
#define cpu_to_fdt16(x) fdt16_to_cpu(x)
static inline uint32_t fdt32_to_cpu(fdt32_t x) #define cpu_to_fdt16(x) fdt16_to_cpu(x)
static inline uint32_t
fdt32_to_cpu (
fdt32_t x
)
{ {
return SwapBytes32 (x); return SwapBytes32 (x);
} }
#define cpu_to_fdt32(x) fdt32_to_cpu(x)
static inline uint64_t fdt64_to_cpu(fdt64_t x) #define cpu_to_fdt32(x) fdt32_to_cpu(x)
static inline uint64_t
fdt64_to_cpu (
fdt64_t x
)
{ {
return SwapBytes64 (x); return SwapBytes64 (x);
} }
#define cpu_to_fdt64(x) fdt64_to_cpu(x)
static inline void* memcpy(void* dest, const void* src, size_t len) { #define cpu_to_fdt64(x) fdt64_to_cpu(x)
static inline void *
memcpy (
void *dest,
const void *src,
size_t len
)
{
return CopyMem (dest, src, len); return CopyMem (dest, src, len);
} }
static inline void *memmove(void *dest, const void *src, size_t n) { static inline void *
memmove (
void *dest,
const void *src,
size_t n
)
{
return CopyMem (dest, src, n); return CopyMem (dest, src, n);
} }
static inline void *memset(void *s, int c, size_t n) { static inline void *
memset (
void *s,
int c,
size_t n
)
{
return SetMem (s, n, c); return SetMem (s, n, c);
} }
static inline int memcmp(const void* dest, const void* src, int len) { static inline int
memcmp (
const void *dest,
const void *src,
int len
)
{
return CompareMem (dest, src, len); return CompareMem (dest, src, len);
} }
static inline void *memchr(const void *s, int c, size_t n) { static inline void *
memchr (
const void *s,
int c,
size_t n
)
{
return ScanMem8 (s, n, c); return ScanMem8 (s, n, c);
} }
static inline size_t strlen (const char* str) { static inline size_t
strlen (
const char *str
)
{
return AsciiStrLen (str); return AsciiStrLen (str);
} }
static inline char *strchr(const char *s, int c) { static inline char *
char pattern[2]; strchr (
const char *s,
int c
)
{
char pattern[2];
pattern[0] = c; pattern[0] = c;
pattern[1] = 0; pattern[1] = 0;
return AsciiStrStr (s, pattern); return AsciiStrStr (s, pattern);
} }
static inline size_t strnlen (const char* str, size_t strsz ) { static inline size_t
strnlen (
const char *str,
size_t strsz
)
{
return AsciiStrnLenS (str, strsz); return AsciiStrnLenS (str, strsz);
} }
static inline size_t strcmp (const char* str1, const char* str2) { static inline size_t
strcmp (
const char *str1,
const char *str2
)
{
return AsciiStrCmp (str1, str2); return AsciiStrCmp (str1, str2);
} }
static inline size_t strncmp (const char* str1, const char* str2, size_t strsz ) { static inline size_t
strncmp (
const char *str1,
const char *str2,
size_t strsz
)
{
return AsciiStrnCmp (str1, str2, strsz); return AsciiStrnCmp (str1, str2, strsz);
} }
static inline size_t strncpy (char* dest, const char* source, size_t dest_max) { static inline size_t
strncpy (
char *dest,
const char *source,
size_t dest_max
)
{
return AsciiStrCpyS (dest, dest_max, source); return AsciiStrCpyS (dest, dest_max, source);
} }

View File

@ -31,29 +31,29 @@
**/ **/
EFI_STATUS EFI_STATUS
LocateAndInstallAcpiFromFvConditional ( LocateAndInstallAcpiFromFvConditional (
IN CONST EFI_GUID* AcpiFile, IN CONST EFI_GUID *AcpiFile,
IN EFI_LOCATE_ACPI_CHECK CheckAcpiTableFunction IN EFI_LOCATE_ACPI_CHECK CheckAcpiTableFunction
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol; EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol;
EFI_HANDLE *HandleBuffer; EFI_HANDLE *HandleBuffer;
UINTN NumberOfHandles; UINTN NumberOfHandles;
UINT32 FvStatus; UINT32 FvStatus;
UINTN Index; UINTN Index;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FvInstance; EFI_FIRMWARE_VOLUME2_PROTOCOL *FvInstance;
INTN SectionInstance; INTN SectionInstance;
UINTN SectionSize; UINTN SectionSize;
EFI_ACPI_COMMON_HEADER *AcpiTable; EFI_ACPI_COMMON_HEADER *AcpiTable;
UINTN AcpiTableSize; UINTN AcpiTableSize;
UINTN AcpiTableKey; UINTN AcpiTableKey;
BOOLEAN Valid; BOOLEAN Valid;
// Ensure the ACPI Table is present // Ensure the ACPI Table is present
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiAcpiTableProtocolGuid, &gEfiAcpiTableProtocolGuid,
NULL, NULL,
(VOID**)&AcpiProtocol (VOID **)&AcpiProtocol
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
@ -64,12 +64,12 @@ LocateAndInstallAcpiFromFvConditional (
// Locate all the Firmware Volume protocols. // Locate all the Firmware Volume protocols.
Status = gBS->LocateHandleBuffer ( Status = gBS->LocateHandleBuffer (
ByProtocol, ByProtocol,
&gEfiFirmwareVolume2ProtocolGuid, &gEfiFirmwareVolume2ProtocolGuid,
NULL, NULL,
&NumberOfHandles, &NumberOfHandles,
&HandleBuffer &HandleBuffer
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -81,10 +81,10 @@ LocateAndInstallAcpiFromFvConditional (
// This should not fail because of LocateHandleBuffer // This should not fail because of LocateHandleBuffer
// //
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiFirmwareVolume2ProtocolGuid, &gEfiFirmwareVolume2ProtocolGuid,
(VOID**) &FvInstance (VOID **)&FvInstance
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FREE_HANDLE_BUFFER; goto FREE_HANDLE_BUFFER;
} }
@ -95,24 +95,27 @@ LocateAndInstallAcpiFromFvConditional (
// See if it has the ACPI storage file // See if it has the ACPI storage file
Status = FvInstance->ReadSection ( Status = FvInstance->ReadSection (
FvInstance, FvInstance,
AcpiFile, AcpiFile,
EFI_SECTION_RAW, EFI_SECTION_RAW,
SectionInstance, SectionInstance,
(VOID**) &AcpiTable, (VOID **)&AcpiTable,
&SectionSize, &SectionSize,
&FvStatus &FvStatus
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
AcpiTableKey = 0; AcpiTableKey = 0;
AcpiTableSize = ((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Length; AcpiTableSize = ((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable)->Length;
ASSERT (SectionSize >= AcpiTableSize); ASSERT (SectionSize >= AcpiTableSize);
DEBUG ((DEBUG_ERROR, "- Found '%c%c%c%c' ACPI Table\n", DEBUG ((
(((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature & 0xFF), DEBUG_ERROR,
((((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature >> 8) & 0xFF), "- Found '%c%c%c%c' ACPI Table\n",
((((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature >> 16) & 0xFF), (((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable)->Signature & 0xFF),
((((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature >> 24) & 0xFF))); ((((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable)->Signature >> 8) & 0xFF),
((((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable)->Signature >> 16) & 0xFF),
((((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable)->Signature >> 24) & 0xFF)
));
// Is the ACPI table valid? // Is the ACPI table valid?
if (CheckAcpiTableFunction) { if (CheckAcpiTableFunction) {
@ -124,11 +127,11 @@ LocateAndInstallAcpiFromFvConditional (
// Install the ACPI Table // Install the ACPI Table
if (Valid) { if (Valid) {
Status = AcpiProtocol->InstallAcpiTable ( Status = AcpiProtocol->InstallAcpiTable (
AcpiProtocol, AcpiProtocol,
AcpiTable, AcpiTable,
AcpiTableSize, AcpiTableSize,
&AcpiTableKey &AcpiTableKey
); );
} }
// Free memory allocated by ReadSection // Free memory allocated by ReadSection
@ -165,7 +168,7 @@ FREE_HANDLE_BUFFER:
**/ **/
EFI_STATUS EFI_STATUS
LocateAndInstallAcpiFromFv ( LocateAndInstallAcpiFromFv (
IN CONST EFI_GUID* AcpiFile IN CONST EFI_GUID *AcpiFile
) )
{ {
return LocateAndInstallAcpiFromFvConditional (AcpiFile, NULL); return LocateAndInstallAcpiFromFvConditional (AcpiFile, NULL);

View File

@ -20,24 +20,24 @@
#include <Guid/LinuxEfiInitrdMedia.h> #include <Guid/LinuxEfiInitrdMedia.h>
#define FDT_ADDITIONAL_ENTRIES_SIZE 0x400 #define FDT_ADDITIONAL_ENTRIES_SIZE 0x400
typedef struct { typedef struct {
MEMMAP_DEVICE_PATH Node1; MEMMAP_DEVICE_PATH Node1;
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
} MEMORY_DEVICE_PATH; } MEMORY_DEVICE_PATH;
typedef struct { typedef struct {
VENDOR_DEVICE_PATH VendorMediaNode; VENDOR_DEVICE_PATH VendorMediaNode;
EFI_DEVICE_PATH_PROTOCOL EndNode; EFI_DEVICE_PATH_PROTOCOL EndNode;
} RAMDISK_DEVICE_PATH; } RAMDISK_DEVICE_PATH;
STATIC ANDROID_BOOTIMG_PROTOCOL *mAndroidBootImg; STATIC ANDROID_BOOTIMG_PROTOCOL *mAndroidBootImg;
STATIC VOID *mRamdiskData = NULL; STATIC VOID *mRamdiskData = NULL;
STATIC UINTN mRamdiskSize = 0; STATIC UINTN mRamdiskSize = 0;
STATIC EFI_HANDLE mRamDiskLoadFileHandle = NULL; STATIC EFI_HANDLE mRamDiskLoadFileHandle = NULL;
STATIC CONST MEMORY_DEVICE_PATH mMemoryDevicePathTemplate = STATIC CONST MEMORY_DEVICE_PATH mMemoryDevicePathTemplate =
{ {
{ {
{ {
@ -58,13 +58,13 @@ STATIC CONST MEMORY_DEVICE_PATH mMemoryDevicePathTemplate =
} // End } // End
}; };
STATIC CONST RAMDISK_DEVICE_PATH mRamdiskDevicePath = STATIC CONST RAMDISK_DEVICE_PATH mRamdiskDevicePath =
{ {
{ {
{ {
MEDIA_DEVICE_PATH, MEDIA_DEVICE_PATH,
MEDIA_VENDOR_DP, MEDIA_VENDOR_DP,
{ sizeof (VENDOR_DEVICE_PATH), 0 } { sizeof (VENDOR_DEVICE_PATH), 0 }
}, },
LINUX_EFI_INITRD_MEDIA_GUID LINUX_EFI_INITRD_MEDIA_GUID
}, },
@ -107,19 +107,20 @@ STATIC CONST RAMDISK_DEVICE_PATH mRamdiskDevicePath =
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AndroidBootImgLoadFile2 ( AndroidBootImgLoadFile2 (
IN EFI_LOAD_FILE2_PROTOCOL *This, IN EFI_LOAD_FILE2_PROTOCOL *This,
IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
IN BOOLEAN BootPolicy, IN BOOLEAN BootPolicy,
IN OUT UINTN *BufferSize, IN OUT UINTN *BufferSize,
IN VOID *Buffer OPTIONAL IN VOID *Buffer OPTIONAL
) )
{ {
// Verify if the valid parameters // Verify if the valid parameters
if (This == NULL || if ((This == NULL) ||
BufferSize == NULL || (BufferSize == NULL) ||
FilePath == NULL || (FilePath == NULL) ||
!IsDevicePathValid (FilePath, 0)) { !IsDevicePathValid (FilePath, 0))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -132,7 +133,8 @@ AndroidBootImgLoadFile2 (
if (mRamdiskSize == 0) { if (mRamdiskSize == 0) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
if (Buffer == NULL || *BufferSize < mRamdiskSize) {
if ((Buffer == NULL) || (*BufferSize < mRamdiskSize)) {
*BufferSize = mRamdiskSize; *BufferSize = mRamdiskSize;
return EFI_BUFFER_TOO_SMALL; return EFI_BUFFER_TOO_SMALL;
} }
@ -153,16 +155,20 @@ STATIC EFI_LOAD_FILE2_PROTOCOL mAndroidBootImgLoadFile2 = {
EFI_STATUS EFI_STATUS
AndroidBootImgGetImgSize ( AndroidBootImgGetImgSize (
IN VOID *BootImg, IN VOID *BootImg,
OUT UINTN *ImgSize OUT UINTN *ImgSize
) )
{ {
ANDROID_BOOTIMG_HEADER *Header; ANDROID_BOOTIMG_HEADER *Header;
Header = (ANDROID_BOOTIMG_HEADER *) BootImg; Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC, if (AsciiStrnCmp (
ANDROID_BOOT_MAGIC_LENGTH) != 0) { (CONST CHAR8 *)Header->BootMagic,
ANDROID_BOOT_MAGIC,
ANDROID_BOOT_MAGIC_LENGTH
) != 0)
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -179,17 +185,21 @@ AndroidBootImgGetImgSize (
EFI_STATUS EFI_STATUS
AndroidBootImgGetKernelInfo ( AndroidBootImgGetKernelInfo (
IN VOID *BootImg, IN VOID *BootImg,
OUT VOID **Kernel, OUT VOID **Kernel,
OUT UINTN *KernelSize OUT UINTN *KernelSize
) )
{ {
ANDROID_BOOTIMG_HEADER *Header; ANDROID_BOOTIMG_HEADER *Header;
Header = (ANDROID_BOOTIMG_HEADER *) BootImg; Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC, if (AsciiStrnCmp (
ANDROID_BOOT_MAGIC_LENGTH) != 0) { (CONST CHAR8 *)Header->BootMagic,
ANDROID_BOOT_MAGIC,
ANDROID_BOOT_MAGIC_LENGTH
) != 0)
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -200,23 +210,27 @@ AndroidBootImgGetKernelInfo (
ASSERT (IS_VALID_ANDROID_PAGE_SIZE (Header->PageSize)); ASSERT (IS_VALID_ANDROID_PAGE_SIZE (Header->PageSize));
*KernelSize = Header->KernelSize; *KernelSize = Header->KernelSize;
*Kernel = (VOID *)((UINTN)BootImg + Header->PageSize); *Kernel = (VOID *)((UINTN)BootImg + Header->PageSize);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
AndroidBootImgGetRamdiskInfo ( AndroidBootImgGetRamdiskInfo (
IN VOID *BootImg, IN VOID *BootImg,
OUT VOID **Ramdisk, OUT VOID **Ramdisk,
OUT UINTN *RamdiskSize OUT UINTN *RamdiskSize
) )
{ {
ANDROID_BOOTIMG_HEADER *Header; ANDROID_BOOTIMG_HEADER *Header;
Header = (ANDROID_BOOTIMG_HEADER *)BootImg; Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC, if (AsciiStrnCmp (
ANDROID_BOOT_MAGIC_LENGTH) != 0) { (CONST CHAR8 *)Header->BootMagic,
ANDROID_BOOT_MAGIC,
ANDROID_BOOT_MAGIC_LENGTH
) != 0)
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -229,22 +243,27 @@ AndroidBootImgGetRamdiskInfo (
+ Header->PageSize + Header->PageSize
+ ALIGN_VALUE (Header->KernelSize, Header->PageSize)); + ALIGN_VALUE (Header->KernelSize, Header->PageSize));
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
AndroidBootImgGetSecondBootLoaderInfo ( AndroidBootImgGetSecondBootLoaderInfo (
IN VOID *BootImg, IN VOID *BootImg,
OUT VOID **Second, OUT VOID **Second,
OUT UINTN *SecondSize OUT UINTN *SecondSize
) )
{ {
ANDROID_BOOTIMG_HEADER *Header; ANDROID_BOOTIMG_HEADER *Header;
Header = (ANDROID_BOOTIMG_HEADER *)BootImg; Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC, if (AsciiStrnCmp (
ANDROID_BOOT_MAGIC_LENGTH) != 0) { (CONST CHAR8 *)Header->BootMagic,
ANDROID_BOOT_MAGIC,
ANDROID_BOOT_MAGIC_LENGTH
) != 0)
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -258,32 +277,37 @@ AndroidBootImgGetSecondBootLoaderInfo (
+ ALIGN_VALUE (Header->KernelSize, Header->PageSize) + ALIGN_VALUE (Header->KernelSize, Header->PageSize)
+ ALIGN_VALUE (Header->RamdiskSize, Header->PageSize)); + ALIGN_VALUE (Header->RamdiskSize, Header->PageSize));
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
AndroidBootImgGetKernelArgs ( AndroidBootImgGetKernelArgs (
IN VOID *BootImg, IN VOID *BootImg,
OUT CHAR8 *KernelArgs OUT CHAR8 *KernelArgs
) )
{ {
ANDROID_BOOTIMG_HEADER *Header; ANDROID_BOOTIMG_HEADER *Header;
Header = (ANDROID_BOOTIMG_HEADER *) BootImg; Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
AsciiStrnCpyS (KernelArgs, ANDROID_BOOTIMG_KERNEL_ARGS_SIZE, Header->KernelArgs, AsciiStrnCpyS (
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE); KernelArgs,
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE,
Header->KernelArgs,
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE
);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
AndroidBootImgGetFdt ( AndroidBootImgGetFdt (
IN VOID *BootImg, IN VOID *BootImg,
IN VOID **FdtBase IN VOID **FdtBase
) )
{ {
UINTN SecondLoaderSize; UINTN SecondLoaderSize;
EFI_STATUS Status; EFI_STATUS Status;
/* Check whether FDT is located in second boot region as some vendor do so, /* Check whether FDT is located in second boot region as some vendor do so,
* because second loader is never used as far as I know. */ * because second loader is never used as far as I know. */
@ -291,43 +315,50 @@ AndroidBootImgGetFdt (
BootImg, BootImg,
FdtBase, FdtBase,
&SecondLoaderSize &SecondLoaderSize
); );
return Status; return Status;
} }
EFI_STATUS EFI_STATUS
AndroidBootImgUpdateArgs ( AndroidBootImgUpdateArgs (
IN VOID *BootImg, IN VOID *BootImg,
OUT VOID *KernelArgs OUT VOID *KernelArgs
) )
{ {
CHAR8 ImageKernelArgs[ANDROID_BOOTIMG_KERNEL_ARGS_SIZE]; CHAR8 ImageKernelArgs[ANDROID_BOOTIMG_KERNEL_ARGS_SIZE];
EFI_STATUS Status; EFI_STATUS Status;
// Get kernel arguments from Android boot image // Get kernel arguments from Android boot image
Status = AndroidBootImgGetKernelArgs (BootImg, ImageKernelArgs); Status = AndroidBootImgGetKernelArgs (BootImg, ImageKernelArgs);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
AsciiStrToUnicodeStrS (ImageKernelArgs, KernelArgs,
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE >> 1); AsciiStrToUnicodeStrS (
ImageKernelArgs,
KernelArgs,
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE >> 1
);
// Append platform kernel arguments // Append platform kernel arguments
if(mAndroidBootImg->AppendArgs) { if (mAndroidBootImg->AppendArgs) {
Status = mAndroidBootImg->AppendArgs (KernelArgs, Status = mAndroidBootImg->AppendArgs (
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE); KernelArgs,
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE
);
} }
return Status; return Status;
} }
EFI_STATUS EFI_STATUS
AndroidBootImgInstallLoadFile2 ( AndroidBootImgInstallLoadFile2 (
IN VOID *RamdiskData, IN VOID *RamdiskData,
IN UINTN RamdiskSize IN UINTN RamdiskSize
) )
{ {
mRamDiskLoadFileHandle = NULL; mRamDiskLoadFileHandle = NULL;
mRamdiskData = RamdiskData; mRamdiskData = RamdiskData;
mRamdiskSize = RamdiskSize; mRamdiskSize = RamdiskSize;
return gBS->InstallMultipleProtocolInterfaces ( return gBS->InstallMultipleProtocolInterfaces (
&mRamDiskLoadFileHandle, &mRamDiskLoadFileHandle,
&gEfiLoadFile2ProtocolGuid, &gEfiLoadFile2ProtocolGuid,
@ -343,9 +374,9 @@ AndroidBootImgUninstallLoadFile2 (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
mRamdiskData = NULL; mRamdiskData = NULL;
mRamdiskSize = 0; mRamdiskSize = 0;
if (mRamDiskLoadFileHandle != NULL) { if (mRamDiskLoadFileHandle != NULL) {
@ -359,15 +390,17 @@ AndroidBootImgUninstallLoadFile2 (
); );
mRamDiskLoadFileHandle = NULL; mRamDiskLoadFileHandle = NULL;
} }
return Status; return Status;
} }
BOOLEAN AndroidBootImgAcpiSupported ( BOOLEAN
AndroidBootImgAcpiSupported (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VOID *AcpiTable; VOID *AcpiTable;
Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, &AcpiTable); Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, &AcpiTable);
return !EFI_ERROR (Status); return !EFI_ERROR (Status);
@ -375,12 +408,12 @@ BOOLEAN AndroidBootImgAcpiSupported (
EFI_STATUS EFI_STATUS
AndroidBootImgLocateFdt ( AndroidBootImgLocateFdt (
IN VOID *BootImg, IN VOID *BootImg,
IN VOID **FdtBase IN VOID **FdtBase
) )
{ {
INTN Err; INTN Err;
EFI_STATUS Status; EFI_STATUS Status;
Status = EfiGetSystemConfigurationTable (&gFdtTableGuid, FdtBase); Status = EfiGetSystemConfigurationTable (&gFdtTableGuid, FdtBase);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
@ -391,58 +424,77 @@ AndroidBootImgLocateFdt (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Err = fdt_check_header (*FdtBase); Err = fdt_check_header (*FdtBase);
if (Err != 0) { if (Err != 0) {
DEBUG ((DEBUG_ERROR, "ERROR: Device Tree header not valid (Err:%d)\n", DEBUG ((
Err)); DEBUG_ERROR,
"ERROR: Device Tree header not valid (Err:%d)\n",
Err
));
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
INTN INTN
AndroidBootImgGetChosenNode ( AndroidBootImgGetChosenNode (
IN INTN UpdatedFdtBase IN INTN UpdatedFdtBase
) )
{ {
INTN ChosenNode; INTN ChosenNode;
ChosenNode = fdt_subnode_offset ((CONST VOID *)UpdatedFdtBase, 0, "chosen"); ChosenNode = fdt_subnode_offset ((CONST VOID *)UpdatedFdtBase, 0, "chosen");
if (ChosenNode < 0) { if (ChosenNode < 0) {
ChosenNode = fdt_add_subnode((VOID *)UpdatedFdtBase, 0, "chosen"); ChosenNode = fdt_add_subnode ((VOID *)UpdatedFdtBase, 0, "chosen");
if (ChosenNode < 0) { if (ChosenNode < 0) {
DEBUG ((DEBUG_ERROR, "Fail to find fdt node chosen!\n")); DEBUG ((DEBUG_ERROR, "Fail to find fdt node chosen!\n"));
return 0; return 0;
} }
} }
return ChosenNode; return ChosenNode;
} }
EFI_STATUS EFI_STATUS
AndroidBootImgSetProperty64 ( AndroidBootImgSetProperty64 (
IN INTN UpdatedFdtBase, IN INTN UpdatedFdtBase,
IN INTN ChosenNode, IN INTN ChosenNode,
IN CHAR8 *PropertyName, IN CHAR8 *PropertyName,
IN UINT64 Val IN UINT64 Val
) )
{ {
INTN Err; INTN Err;
struct fdt_property *Property; struct fdt_property *Property;
int Len; int Len;
Property = fdt_get_property_w((VOID *)UpdatedFdtBase, ChosenNode, Property = fdt_get_property_w (
PropertyName, &Len); (VOID *)UpdatedFdtBase,
if (NULL == Property && Len == -FDT_ERR_NOTFOUND) { ChosenNode,
Val = cpu_to_fdt64(Val); PropertyName,
Err = fdt_appendprop ((VOID *)UpdatedFdtBase, ChosenNode, &Len
PropertyName, &Val, sizeof (UINT64)); );
if ((NULL == Property) && (Len == -FDT_ERR_NOTFOUND)) {
Val = cpu_to_fdt64 (Val);
Err = fdt_appendprop (
(VOID *)UpdatedFdtBase,
ChosenNode,
PropertyName,
&Val,
sizeof (UINT64)
);
if (Err) { if (Err) {
DEBUG ((DEBUG_ERROR, "fdt_appendprop() fail: %a\n", fdt_strerror (Err))); DEBUG ((DEBUG_ERROR, "fdt_appendprop() fail: %a\n", fdt_strerror (Err)));
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
} else if (Property != NULL) { } else if (Property != NULL) {
Err = fdt_setprop_u64((VOID *)UpdatedFdtBase, ChosenNode, Err = fdt_setprop_u64 (
PropertyName, Val); (VOID *)UpdatedFdtBase,
ChosenNode,
PropertyName,
Val
);
if (Err) { if (Err) {
DEBUG ((DEBUG_ERROR, "fdt_setprop_u64() fail: %a\n", fdt_strerror (Err))); DEBUG ((DEBUG_ERROR, "fdt_setprop_u64() fail: %a\n", fdt_strerror (Err)));
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -451,33 +503,41 @@ AndroidBootImgSetProperty64 (
DEBUG ((DEBUG_ERROR, "Failed to set fdt Property %a\n", PropertyName)); DEBUG ((DEBUG_ERROR, "Failed to set fdt Property %a\n", PropertyName));
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
AndroidBootImgUpdateFdt ( AndroidBootImgUpdateFdt (
IN VOID *BootImg, IN VOID *BootImg,
IN VOID *FdtBase, IN VOID *FdtBase,
IN VOID *RamdiskData, IN VOID *RamdiskData,
IN UINTN RamdiskSize IN UINTN RamdiskSize
) )
{ {
INTN ChosenNode, Err, NewFdtSize; INTN ChosenNode, Err, NewFdtSize;
EFI_STATUS Status; EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS UpdatedFdtBase, NewFdtBase; EFI_PHYSICAL_ADDRESS UpdatedFdtBase, NewFdtBase;
NewFdtSize = (UINTN)fdt_totalsize (FdtBase) NewFdtSize = (UINTN)fdt_totalsize (FdtBase)
+ FDT_ADDITIONAL_ENTRIES_SIZE; + FDT_ADDITIONAL_ENTRIES_SIZE;
Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesData, Status = gBS->AllocatePages (
EFI_SIZE_TO_PAGES (NewFdtSize), &UpdatedFdtBase); AllocateAnyPages,
EfiBootServicesData,
EFI_SIZE_TO_PAGES (NewFdtSize),
&UpdatedFdtBase
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "Warning: Failed to reallocate FDT, err %d.\n", DEBUG ((
Status)); DEBUG_WARN,
"Warning: Failed to reallocate FDT, err %d.\n",
Status
));
return Status; return Status;
} }
// Load the Original FDT tree into the new region // Load the Original FDT tree into the new region
Err = fdt_open_into(FdtBase, (VOID*)(INTN)UpdatedFdtBase, NewFdtSize); Err = fdt_open_into (FdtBase, (VOID *)(INTN)UpdatedFdtBase, NewFdtSize);
if (Err) { if (Err) {
DEBUG ((DEBUG_ERROR, "fdt_open_into(): %a\n", fdt_strerror (Err))); DEBUG ((DEBUG_ERROR, "fdt_open_into(): %a\n", fdt_strerror (Err)));
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
@ -490,21 +550,27 @@ AndroidBootImgUpdateFdt (
goto Fdt_Exit; goto Fdt_Exit;
} }
} else { } else {
ChosenNode = AndroidBootImgGetChosenNode(UpdatedFdtBase); ChosenNode = AndroidBootImgGetChosenNode (UpdatedFdtBase);
if (!ChosenNode) { if (!ChosenNode) {
goto Fdt_Exit; goto Fdt_Exit;
} }
Status = AndroidBootImgSetProperty64 (UpdatedFdtBase, ChosenNode, Status = AndroidBootImgSetProperty64 (
"linux,initrd-start", UpdatedFdtBase,
(UINTN)RamdiskData); ChosenNode,
"linux,initrd-start",
(UINTN)RamdiskData
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Fdt_Exit; goto Fdt_Exit;
} }
Status = AndroidBootImgSetProperty64 (UpdatedFdtBase, ChosenNode, Status = AndroidBootImgSetProperty64 (
"linux,initrd-end", UpdatedFdtBase,
(UINTN)RamdiskData + RamdiskSize); ChosenNode,
"linux,initrd-end",
(UINTN)RamdiskData + RamdiskSize
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Fdt_Exit; goto Fdt_Exit;
} }
@ -518,6 +584,7 @@ AndroidBootImgUpdateFdt (
} else { } else {
NewFdtBase = UpdatedFdtBase; NewFdtBase = UpdatedFdtBase;
} }
Status = gBS->InstallConfigurationTable ( Status = gBS->InstallConfigurationTable (
&gFdtTableGuid, &gFdtTableGuid,
(VOID *)(UINTN)NewFdtBase (VOID *)(UINTN)NewFdtBase
@ -534,35 +601,38 @@ Fdt_Exit:
EFI_STATUS EFI_STATUS
AndroidBootImgBoot ( AndroidBootImgBoot (
IN VOID *Buffer, IN VOID *Buffer,
IN UINTN BufferSize IN UINTN BufferSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VOID *Kernel; VOID *Kernel;
UINTN KernelSize; UINTN KernelSize;
MEMORY_DEVICE_PATH KernelDevicePath; MEMORY_DEVICE_PATH KernelDevicePath;
EFI_HANDLE ImageHandle; EFI_HANDLE ImageHandle;
VOID *NewKernelArg; VOID *NewKernelArg;
EFI_LOADED_IMAGE_PROTOCOL *ImageInfo; EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
VOID *RamdiskData; VOID *RamdiskData;
UINTN RamdiskSize; UINTN RamdiskSize;
IN VOID *FdtBase; IN VOID *FdtBase;
NewKernelArg = NULL; NewKernelArg = NULL;
ImageHandle = NULL; ImageHandle = NULL;
Status = gBS->LocateProtocol (&gAndroidBootImgProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **) &mAndroidBootImg); &gAndroidBootImgProtocolGuid,
NULL,
(VOID **)&mAndroidBootImg
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
Status = AndroidBootImgGetKernelInfo ( Status = AndroidBootImgGetKernelInfo (
Buffer, Buffer,
&Kernel, &Kernel,
&KernelSize &KernelSize
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
@ -580,10 +650,10 @@ AndroidBootImgBoot (
} }
Status = AndroidBootImgGetRamdiskInfo ( Status = AndroidBootImgGetRamdiskInfo (
Buffer, Buffer,
&RamdiskData, &RamdiskData,
&RamdiskSize &RamdiskSize
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
@ -607,24 +677,33 @@ AndroidBootImgBoot (
KernelDevicePath = mMemoryDevicePathTemplate; KernelDevicePath = mMemoryDevicePathTemplate;
KernelDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel; KernelDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Kernel;
KernelDevicePath.Node1.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel KernelDevicePath.Node1.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Kernel
+ KernelSize; + KernelSize;
Status = gBS->LoadImage (TRUE, gImageHandle, Status = gBS->LoadImage (
(EFI_DEVICE_PATH *)&KernelDevicePath, TRUE,
(VOID*)(UINTN)Kernel, KernelSize, &ImageHandle); gImageHandle,
(EFI_DEVICE_PATH *)&KernelDevicePath,
(VOID *)(UINTN)Kernel,
KernelSize,
&ImageHandle
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
// Set kernel arguments // Set kernel arguments
Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, Status = gBS->HandleProtocol (
(VOID **) &ImageInfo); ImageHandle,
&gEfiLoadedImageProtocolGuid,
(VOID **)&ImageInfo
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
ImageInfo->LoadOptions = NewKernelArg;
ImageInfo->LoadOptions = NewKernelArg;
ImageInfo->LoadOptionsSize = StrLen (NewKernelArg) * sizeof (CHAR16); ImageInfo->LoadOptionsSize = StrLen (NewKernelArg) * sizeof (CHAR16);
// Before calling the image, enable the Watchdog Timer for the 5 Minute period // Before calling the image, enable the Watchdog Timer for the 5 Minute period
@ -635,17 +714,19 @@ AndroidBootImgBoot (
gBS->SetWatchdogTimer (0, 0x10000, 0, NULL); gBS->SetWatchdogTimer (0, 0x10000, 0, NULL);
Exit: Exit:
//Unload image as it will not be used anymore // Unload image as it will not be used anymore
if (ImageHandle != NULL) { if (ImageHandle != NULL) {
gBS->UnloadImage (ImageHandle); gBS->UnloadImage (ImageHandle);
ImageHandle = NULL; ImageHandle = NULL;
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
if (NewKernelArg != NULL) { if (NewKernelArg != NULL) {
FreePool (NewKernelArg); FreePool (NewKernelArg);
NewKernelArg = NULL; NewKernelArg = NULL;
} }
} }
AndroidBootImgUninstallLoadFile2 (); AndroidBootImgUninstallLoadFile2 ();
return Status; return Status;
} }

View File

@ -12,11 +12,10 @@
#include <Library/DmaLib.h> #include <Library/DmaLib.h>
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
STATIC STATIC
PHYSICAL_ADDRESS PHYSICAL_ADDRESS
HostToDeviceAddress ( HostToDeviceAddress (
IN VOID *Address IN VOID *Address
) )
{ {
return (PHYSICAL_ADDRESS)(UINTN)Address + PcdGet64 (PcdDmaDeviceOffset); return (PHYSICAL_ADDRESS)(UINTN)Address + PcdGet64 (PcdDmaDeviceOffset);
@ -45,25 +44,26 @@ HostToDeviceAddress (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaMap ( DmaMap (
IN DMA_MAP_OPERATION Operation, IN DMA_MAP_OPERATION Operation,
IN VOID *HostAddress, IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes, IN OUT UINTN *NumberOfBytes,
OUT PHYSICAL_ADDRESS *DeviceAddress, OUT PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping OUT VOID **Mapping
) )
{ {
if (HostAddress == NULL || if ((HostAddress == NULL) ||
NumberOfBytes == NULL || (NumberOfBytes == NULL) ||
DeviceAddress == NULL || (DeviceAddress == NULL) ||
Mapping == NULL ) { (Mapping == NULL))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
*DeviceAddress = HostToDeviceAddress (HostAddress); *DeviceAddress = HostToDeviceAddress (HostAddress);
*Mapping = NULL; *Mapping = NULL;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or DmaMapBusMasterCommonBuffer() Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or DmaMapBusMasterCommonBuffer()
operation and releases any corresponding resources. operation and releases any corresponding resources.
@ -77,7 +77,7 @@ DmaMap (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaUnmap ( DmaUnmap (
IN VOID *Mapping IN VOID *Mapping
) )
{ {
return EFI_SUCCESS; return EFI_SUCCESS;
@ -103,15 +103,14 @@ DmaUnmap (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaAllocateBuffer ( DmaAllocateBuffer (
IN EFI_MEMORY_TYPE MemoryType, IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Pages, IN UINTN Pages,
OUT VOID **HostAddress OUT VOID **HostAddress
) )
{ {
return DmaAllocateAlignedBuffer (MemoryType, Pages, 0, HostAddress); return DmaAllocateAlignedBuffer (MemoryType, Pages, 0, HostAddress);
} }
/** /**
Allocates pages that are suitable for an DmaMap() of type Allocates pages that are suitable for an DmaMap() of type
MapOperationBusMasterCommonBuffer mapping, at the requested alignment. MapOperationBusMasterCommonBuffer mapping, at the requested alignment.
@ -134,18 +133,19 @@ DmaAllocateBuffer (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaAllocateAlignedBuffer ( DmaAllocateAlignedBuffer (
IN EFI_MEMORY_TYPE MemoryType, IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Pages, IN UINTN Pages,
IN UINTN Alignment, IN UINTN Alignment,
OUT VOID **HostAddress OUT VOID **HostAddress
) )
{ {
if (Alignment == 0) { if (Alignment == 0) {
Alignment = EFI_PAGE_SIZE; Alignment = EFI_PAGE_SIZE;
} }
if (HostAddress == NULL || if ((HostAddress == NULL) ||
(Alignment & (Alignment - 1)) != 0) { ((Alignment & (Alignment - 1)) != 0))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -163,10 +163,10 @@ DmaAllocateAlignedBuffer (
if (*HostAddress == NULL) { if (*HostAddress == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Frees memory that was allocated with DmaAllocateBuffer(). Frees memory that was allocated with DmaAllocateBuffer().
@ -181,15 +181,14 @@ DmaAllocateAlignedBuffer (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaFreeBuffer ( DmaFreeBuffer (
IN UINTN Pages, IN UINTN Pages,
IN VOID *HostAddress IN VOID *HostAddress
) )
{ {
if (HostAddress == NULL) { if (HostAddress == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
FreePages (HostAddress, Pages); FreePages (HostAddress, Pages);
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -11,7 +11,6 @@
**/ **/
/** /**
Setup all the hardware needed for the debug agents timer. Setup all the hardware needed for the debug agents timer.
@ -26,7 +25,6 @@ DebugAgentTimerIntialize (
{ {
} }
/** /**
Set the period for the debug agent timer. Zero means disable the timer. Set the period for the debug agent timer. Zero means disable the timer.
@ -41,7 +39,6 @@ DebugAgentTimerSetPeriod (
{ {
} }
/** /**
Perform End Of Interrupt for the debug agent timer. This is called in the Perform End Of Interrupt for the debug agent timer. This is called in the
interrupt handler after the interrupt has been processed. interrupt handler after the interrupt has been processed.
@ -54,4 +51,3 @@ DebugAgentTimerEndOfInterrupt (
) )
{ {
} }

View File

@ -27,17 +27,22 @@
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DtPlatformLoadDtb ( DtPlatformLoadDtb (
OUT VOID **Dtb, OUT VOID **Dtb,
OUT UINTN *DtbSize OUT UINTN *DtbSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VOID *OrigDtb; VOID *OrigDtb;
VOID *CopyDtb; VOID *CopyDtb;
UINTN OrigDtbSize; UINTN OrigDtbSize;
Status = GetSectionFromAnyFv (&gDtPlatformDefaultDtbFileGuid, Status = GetSectionFromAnyFv (
EFI_SECTION_RAW, 0, &OrigDtb, &OrigDtbSize); &gDtPlatformDefaultDtbFileGuid,
EFI_SECTION_RAW,
0,
&OrigDtb,
&OrigDtbSize
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -47,7 +52,7 @@ DtPlatformLoadDtb (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
*Dtb = CopyDtb; *Dtb = CopyDtb;
*DtbSize = OrigDtbSize; *DtbSize = OrigDtbSize;
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -55,197 +55,276 @@
#include "libfdt_internal.h" #include "libfdt_internal.h"
int fdt_check_header(const void *fdt) int
fdt_check_header (
const void *fdt
)
{ {
if (fdt_magic(fdt) == FDT_MAGIC) { if (fdt_magic (fdt) == FDT_MAGIC) {
/* Complete tree */ /* Complete tree */
if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) if (fdt_version (fdt) < FDT_FIRST_SUPPORTED_VERSION) {
return -FDT_ERR_BADVERSION; return -FDT_ERR_BADVERSION;
if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) }
return -FDT_ERR_BADVERSION;
} else if (fdt_magic(fdt) == FDT_SW_MAGIC) {
/* Unfinished sequential-write blob */
if (fdt_size_dt_struct(fdt) == 0)
return -FDT_ERR_BADSTATE;
} else {
return -FDT_ERR_BADMAGIC;
}
return 0; if (fdt_last_comp_version (fdt) > FDT_LAST_SUPPORTED_VERSION) {
return -FDT_ERR_BADVERSION;
}
} else if (fdt_magic (fdt) == FDT_SW_MAGIC) {
/* Unfinished sequential-write blob */
if (fdt_size_dt_struct (fdt) == 0) {
return -FDT_ERR_BADSTATE;
}
} else {
return -FDT_ERR_BADMAGIC;
}
return 0;
} }
const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) const void *
fdt_offset_ptr (
const void *fdt,
int offset,
unsigned int len
)
{ {
unsigned absoffset = offset + fdt_off_dt_struct(fdt); unsigned absoffset = offset + fdt_off_dt_struct (fdt);
if ((absoffset < offset) if ( (absoffset < offset)
|| ((absoffset + len) < absoffset) || ((absoffset + len) < absoffset)
|| (absoffset + len) > fdt_totalsize(fdt)) || ((absoffset + len) > fdt_totalsize (fdt)))
return NULL; {
return NULL;
}
if (fdt_version(fdt) >= 0x11) if (fdt_version (fdt) >= 0x11) {
if (((offset + len) < offset) if ( ((offset + len) < offset)
|| ((offset + len) > fdt_size_dt_struct(fdt))) || ((offset + len) > fdt_size_dt_struct (fdt)))
return NULL; {
return NULL;
}
}
return _fdt_offset_ptr(fdt, offset); return _fdt_offset_ptr (fdt, offset);
} }
uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) uint32_t
fdt_next_tag (
const void *fdt,
int startoffset,
int *nextoffset
)
{ {
const fdt32_t *tagp, *lenp; const fdt32_t *tagp, *lenp;
uint32_t tag; uint32_t tag;
int offset = startoffset; int offset = startoffset;
const char *p; const char *p;
*nextoffset = -FDT_ERR_TRUNCATED; *nextoffset = -FDT_ERR_TRUNCATED;
tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE); tagp = fdt_offset_ptr (fdt, offset, FDT_TAGSIZE);
if (!tagp) if (!tagp) {
return FDT_END; /* premature end */ return FDT_END; /* premature end */
tag = fdt32_to_cpu(*tagp); }
offset += FDT_TAGSIZE;
*nextoffset = -FDT_ERR_BADSTRUCTURE; tag = fdt32_to_cpu (*tagp);
switch (tag) { offset += FDT_TAGSIZE;
case FDT_BEGIN_NODE:
/* skip name */
do {
p = fdt_offset_ptr(fdt, offset++, 1);
} while (p && (*p != '\0'));
if (!p)
return FDT_END; /* premature end */
break;
case FDT_PROP: *nextoffset = -FDT_ERR_BADSTRUCTURE;
lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp)); switch (tag) {
if (!lenp) case FDT_BEGIN_NODE:
return FDT_END; /* premature end */ /* skip name */
/* skip-name offset, length and value */ do {
offset += sizeof(struct fdt_property) - FDT_TAGSIZE p = fdt_offset_ptr (fdt, offset++, 1);
+ fdt32_to_cpu(*lenp); } while (p && (*p != '\0'));
break;
case FDT_END: if (!p) {
case FDT_END_NODE: return FDT_END; /* premature end */
case FDT_NOP: }
break;
default: break;
return FDT_END;
}
if (!fdt_offset_ptr(fdt, startoffset, offset - startoffset)) case FDT_PROP:
return FDT_END; /* premature end */ lenp = fdt_offset_ptr (fdt, offset, sizeof (*lenp));
if (!lenp) {
return FDT_END; /* premature end */
}
*nextoffset = FDT_TAGALIGN(offset); /* skip-name offset, length and value */
return tag; offset += sizeof (struct fdt_property) - FDT_TAGSIZE
+ fdt32_to_cpu (*lenp);
break;
case FDT_END:
case FDT_END_NODE:
case FDT_NOP:
break;
default:
return FDT_END;
}
if (!fdt_offset_ptr (fdt, startoffset, offset - startoffset)) {
return FDT_END; /* premature end */
}
*nextoffset = FDT_TAGALIGN (offset);
return tag;
} }
int _fdt_check_node_offset(const void *fdt, int offset) int
_fdt_check_node_offset (
const void *fdt,
int offset
)
{ {
if ((offset < 0) || (offset % FDT_TAGSIZE) if ( (offset < 0) || (offset % FDT_TAGSIZE)
|| (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE)) || (fdt_next_tag (fdt, offset, &offset) != FDT_BEGIN_NODE))
return -FDT_ERR_BADOFFSET; {
return -FDT_ERR_BADOFFSET;
}
return offset; return offset;
} }
int _fdt_check_prop_offset(const void *fdt, int offset) int
_fdt_check_prop_offset (
const void *fdt,
int offset
)
{ {
if ((offset < 0) || (offset % FDT_TAGSIZE) if ( (offset < 0) || (offset % FDT_TAGSIZE)
|| (fdt_next_tag(fdt, offset, &offset) != FDT_PROP)) || (fdt_next_tag (fdt, offset, &offset) != FDT_PROP))
return -FDT_ERR_BADOFFSET; {
return -FDT_ERR_BADOFFSET;
}
return offset; return offset;
} }
int fdt_next_node(const void *fdt, int offset, int *depth) int
fdt_next_node (
const void *fdt,
int offset,
int *depth
)
{ {
int nextoffset = 0; int nextoffset = 0;
uint32_t tag; uint32_t tag;
if (offset >= 0) if (offset >= 0) {
if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0) if ((nextoffset = _fdt_check_node_offset (fdt, offset)) < 0) {
return nextoffset; return nextoffset;
}
}
do { do {
offset = nextoffset; offset = nextoffset;
tag = fdt_next_tag(fdt, offset, &nextoffset); tag = fdt_next_tag (fdt, offset, &nextoffset);
switch (tag) { switch (tag) {
case FDT_PROP: case FDT_PROP:
case FDT_NOP: case FDT_NOP:
break; break;
case FDT_BEGIN_NODE: case FDT_BEGIN_NODE:
if (depth) if (depth) {
(*depth)++; (*depth)++;
break; }
case FDT_END_NODE: break;
if (depth && ((--(*depth)) < 0))
return nextoffset;
break;
case FDT_END: case FDT_END_NODE:
if ((nextoffset >= 0) if (depth && ((--(*depth)) < 0)) {
|| ((nextoffset == -FDT_ERR_TRUNCATED) && !depth)) return nextoffset;
return -FDT_ERR_NOTFOUND; }
else
return nextoffset;
}
} while (tag != FDT_BEGIN_NODE);
return offset; break;
case FDT_END:
if ( (nextoffset >= 0)
|| ((nextoffset == -FDT_ERR_TRUNCATED) && !depth))
{
return -FDT_ERR_NOTFOUND;
} else {
return nextoffset;
}
}
} while (tag != FDT_BEGIN_NODE);
return offset;
} }
int fdt_first_subnode(const void *fdt, int offset) int
fdt_first_subnode (
const void *fdt,
int offset
)
{ {
int depth = 0; int depth = 0;
offset = fdt_next_node(fdt, offset, &depth); offset = fdt_next_node (fdt, offset, &depth);
if (offset < 0 || depth != 1) if ((offset < 0) || (depth != 1)) {
return -FDT_ERR_NOTFOUND; return -FDT_ERR_NOTFOUND;
}
return offset; return offset;
} }
int fdt_next_subnode(const void *fdt, int offset) int
fdt_next_subnode (
const void *fdt,
int offset
)
{ {
int depth = 1; int depth = 1;
/* /*
* With respect to the parent, the depth of the next subnode will be * With respect to the parent, the depth of the next subnode will be
* the same as the last. * the same as the last.
*/ */
do { do {
offset = fdt_next_node(fdt, offset, &depth); offset = fdt_next_node (fdt, offset, &depth);
if (offset < 0 || depth < 1) if ((offset < 0) || (depth < 1)) {
return -FDT_ERR_NOTFOUND; return -FDT_ERR_NOTFOUND;
} while (depth > 1); }
} while (depth > 1);
return offset; return offset;
} }
const char *_fdt_find_string(const char *strtab, int tabsize, const char *s) const char *
_fdt_find_string (
const char *strtab,
int tabsize,
const char *s
)
{ {
int len = strlen(s) + 1; int len = strlen (s) + 1;
const char *last = strtab + tabsize - len; const char *last = strtab + tabsize - len;
const char *p; const char *p;
for (p = strtab; p <= last; p++) for (p = strtab; p <= last; p++) {
if (memcmp(p, s, len) == 0) if (memcmp (p, s, len) == 0) {
return p; return p;
return NULL; }
}
return NULL;
} }
int fdt_move(const void *fdt, void *buf, int bufsize) int
fdt_move (
const void *fdt,
void *buf,
int bufsize
)
{ {
FDT_CHECK_HEADER(fdt); FDT_CHECK_HEADER (fdt);
if (fdt_totalsize(fdt) > bufsize) if (fdt_totalsize (fdt) > bufsize) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
memmove(buf, fdt, fdt_totalsize(fdt)); memmove (buf, fdt, fdt_totalsize (fdt));
return 0; return 0;
} }

View File

@ -55,42 +55,56 @@
#include "libfdt_internal.h" #include "libfdt_internal.h"
int fdt_address_cells(const void *fdt, int nodeoffset) int
fdt_address_cells (
const void *fdt,
int nodeoffset
)
{ {
const fdt32_t *ac; const fdt32_t *ac;
int val; int val;
int len; int len;
ac = fdt_getprop(fdt, nodeoffset, "#address-cells", &len); ac = fdt_getprop (fdt, nodeoffset, "#address-cells", &len);
if (!ac) if (!ac) {
return 2; return 2;
}
if (len != sizeof(*ac)) if (len != sizeof (*ac)) {
return -FDT_ERR_BADNCELLS; return -FDT_ERR_BADNCELLS;
}
val = fdt32_to_cpu(*ac); val = fdt32_to_cpu (*ac);
if ((val <= 0) || (val > FDT_MAX_NCELLS)) if ((val <= 0) || (val > FDT_MAX_NCELLS)) {
return -FDT_ERR_BADNCELLS; return -FDT_ERR_BADNCELLS;
}
return val; return val;
} }
int fdt_size_cells(const void *fdt, int nodeoffset) int
fdt_size_cells (
const void *fdt,
int nodeoffset
)
{ {
const fdt32_t *sc; const fdt32_t *sc;
int val; int val;
int len; int len;
sc = fdt_getprop(fdt, nodeoffset, "#size-cells", &len); sc = fdt_getprop (fdt, nodeoffset, "#size-cells", &len);
if (!sc) if (!sc) {
return 2; return 2;
}
if (len != sizeof(*sc)) if (len != sizeof (*sc)) {
return -FDT_ERR_BADNCELLS; return -FDT_ERR_BADNCELLS;
}
val = fdt32_to_cpu(*sc); val = fdt32_to_cpu (*sc);
if ((val < 0) || (val > FDT_MAX_NCELLS)) if ((val < 0) || (val > FDT_MAX_NCELLS)) {
return -FDT_ERR_BADNCELLS; return -FDT_ERR_BADNCELLS;
}
return val; return val;
} }

View File

@ -55,29 +55,38 @@
#include "libfdt_internal.h" #include "libfdt_internal.h"
int fdt_create_empty_tree(void *buf, int bufsize) int
fdt_create_empty_tree (
void *buf,
int bufsize
)
{ {
int err; int err;
err = fdt_create(buf, bufsize); err = fdt_create (buf, bufsize);
if (err) if (err) {
return err; return err;
}
err = fdt_finish_reservemap(buf); err = fdt_finish_reservemap (buf);
if (err) if (err) {
return err; return err;
}
err = fdt_begin_node(buf, ""); err = fdt_begin_node (buf, "");
if (err) if (err) {
return err; return err;
}
err = fdt_end_node(buf); err = fdt_end_node (buf);
if (err) if (err) {
return err; return err;
}
err = fdt_finish(buf); err = fdt_finish (buf);
if (err) if (err) {
return err; return err;
}
return fdt_open_into(buf, buf, bufsize); return fdt_open_into (buf, buf, bufsize);
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -55,451 +55,632 @@
#include "libfdt_internal.h" #include "libfdt_internal.h"
static int _fdt_blocks_misordered(const void *fdt, static int
int mem_rsv_size, int struct_size) _fdt_blocks_misordered (
const void *fdt,
int mem_rsv_size,
int struct_size
)
{ {
return (fdt_off_mem_rsvmap(fdt) < FDT_ALIGN(sizeof(struct fdt_header), 8)) return (fdt_off_mem_rsvmap (fdt) < FDT_ALIGN (sizeof (struct fdt_header), 8))
|| (fdt_off_dt_struct(fdt) < || (fdt_off_dt_struct (fdt) <
(fdt_off_mem_rsvmap(fdt) + mem_rsv_size)) (fdt_off_mem_rsvmap (fdt) + mem_rsv_size))
|| (fdt_off_dt_strings(fdt) < || (fdt_off_dt_strings (fdt) <
(fdt_off_dt_struct(fdt) + struct_size)) (fdt_off_dt_struct (fdt) + struct_size))
|| (fdt_totalsize(fdt) < || (fdt_totalsize (fdt) <
(fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt))); (fdt_off_dt_strings (fdt) + fdt_size_dt_strings (fdt)));
} }
static int _fdt_rw_check_header(void *fdt) static int
_fdt_rw_check_header (
void *fdt
)
{ {
FDT_CHECK_HEADER(fdt); FDT_CHECK_HEADER (fdt);
if (fdt_version(fdt) < 17) if (fdt_version (fdt) < 17) {
return -FDT_ERR_BADVERSION; return -FDT_ERR_BADVERSION;
if (_fdt_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry), }
fdt_size_dt_struct(fdt)))
return -FDT_ERR_BADLAYOUT;
if (fdt_version(fdt) > 17)
fdt_set_version(fdt, 17);
return 0; if (_fdt_blocks_misordered (
fdt,
sizeof (struct fdt_reserve_entry),
fdt_size_dt_struct (fdt)
))
{
return -FDT_ERR_BADLAYOUT;
}
if (fdt_version (fdt) > 17) {
fdt_set_version (fdt, 17);
}
return 0;
} }
#define FDT_RW_CHECK_HEADER(fdt) \ #define FDT_RW_CHECK_HEADER(fdt) \
{ \ { \
int __err; \ int __err; \
if ((__err = _fdt_rw_check_header(fdt)) != 0) \ if ((__err = _fdt_rw_check_header(fdt)) != 0) \
return __err; \ return __err; \
} }
static inline int _fdt_data_size(void *fdt) static inline int
_fdt_data_size (
void *fdt
)
{ {
return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); return fdt_off_dt_strings (fdt) + fdt_size_dt_strings (fdt);
} }
static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen) static int
_fdt_splice (
void *fdt,
void *splicepoint,
int oldlen,
int newlen
)
{ {
char *p = splicepoint; char *p = splicepoint;
char *end = (char *)fdt + _fdt_data_size(fdt); char *end = (char *)fdt + _fdt_data_size (fdt);
if (((p + oldlen) < p) || ((p + oldlen) > end)) if (((p + oldlen) < p) || ((p + oldlen) > end)) {
return -FDT_ERR_BADOFFSET; return -FDT_ERR_BADOFFSET;
if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt)) }
return -FDT_ERR_BADOFFSET;
if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt))) if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt)) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_BADOFFSET;
memmove(p + newlen, p + oldlen, end - p - oldlen); }
return 0;
if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize (fdt))) {
return -FDT_ERR_NOSPACE;
}
memmove (p + newlen, p + oldlen, end - p - oldlen);
return 0;
} }
static int _fdt_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p, static int
int oldn, int newn) _fdt_splice_mem_rsv (
void *fdt,
struct fdt_reserve_entry *p,
int oldn,
int newn
)
{ {
int delta = (newn - oldn) * sizeof(*p); int delta = (newn - oldn) * sizeof (*p);
int err; int err;
err = _fdt_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p));
if (err) err = _fdt_splice (fdt, p, oldn * sizeof (*p), newn * sizeof (*p));
return err; if (err) {
fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta); return err;
fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); }
return 0;
fdt_set_off_dt_struct (fdt, fdt_off_dt_struct (fdt) + delta);
fdt_set_off_dt_strings (fdt, fdt_off_dt_strings (fdt) + delta);
return 0;
} }
static int _fdt_splice_struct(void *fdt, void *p, static int
int oldlen, int newlen) _fdt_splice_struct (
void *fdt,
void *p,
int oldlen,
int newlen
)
{ {
int delta = newlen - oldlen; int delta = newlen - oldlen;
int err; int err;
if ((err = _fdt_splice(fdt, p, oldlen, newlen))) if ((err = _fdt_splice (fdt, p, oldlen, newlen))) {
return err; return err;
}
fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta); fdt_set_size_dt_struct (fdt, fdt_size_dt_struct (fdt) + delta);
fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); fdt_set_off_dt_strings (fdt, fdt_off_dt_strings (fdt) + delta);
return 0; return 0;
} }
static int _fdt_splice_string(void *fdt, int newlen) static int
_fdt_splice_string (
void *fdt,
int newlen
)
{ {
void *p = (char *)fdt void *p = (char *)fdt
+ fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); + fdt_off_dt_strings (fdt) + fdt_size_dt_strings (fdt);
int err; int err;
if ((err = _fdt_splice(fdt, p, 0, newlen))) if ((err = _fdt_splice (fdt, p, 0, newlen))) {
return err; return err;
}
fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen); fdt_set_size_dt_strings (fdt, fdt_size_dt_strings (fdt) + newlen);
return 0; return 0;
} }
static int _fdt_find_add_string(void *fdt, const char *s) static int
_fdt_find_add_string (
void *fdt,
const char *s
)
{ {
char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); char *strtab = (char *)fdt + fdt_off_dt_strings (fdt);
const char *p; const char *p;
char *new; char *new;
int len = strlen(s) + 1; int len = strlen (s) + 1;
int err; int err;
p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s); p = _fdt_find_string (strtab, fdt_size_dt_strings (fdt), s);
if (p) if (p) {
/* found it */ /* found it */
return (p - strtab); return (p - strtab);
}
new = strtab + fdt_size_dt_strings(fdt); new = strtab + fdt_size_dt_strings (fdt);
err = _fdt_splice_string(fdt, len); err = _fdt_splice_string (fdt, len);
if (err) if (err) {
return err; return err;
}
memcpy(new, s, len); memcpy (new, s, len);
return (new - strtab); return (new - strtab);
} }
int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size) int
fdt_add_mem_rsv (
void *fdt,
uint64_t address,
uint64_t size
)
{ {
struct fdt_reserve_entry *re; struct fdt_reserve_entry *re;
int err; int err;
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt)); re = _fdt_mem_rsv_w (fdt, fdt_num_mem_rsv (fdt));
err = _fdt_splice_mem_rsv(fdt, re, 0, 1); err = _fdt_splice_mem_rsv (fdt, re, 0, 1);
if (err) if (err) {
return err; return err;
}
re->address = cpu_to_fdt64(address); re->address = cpu_to_fdt64 (address);
re->size = cpu_to_fdt64(size); re->size = cpu_to_fdt64 (size);
return 0; return 0;
} }
int fdt_del_mem_rsv(void *fdt, int n) int
fdt_del_mem_rsv (
void *fdt,
int n
)
{ {
struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n); struct fdt_reserve_entry *re = _fdt_mem_rsv_w (fdt, n);
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
if (n >= fdt_num_mem_rsv(fdt)) if (n >= fdt_num_mem_rsv (fdt)) {
return -FDT_ERR_NOTFOUND; return -FDT_ERR_NOTFOUND;
}
return _fdt_splice_mem_rsv(fdt, re, 1, 0); return _fdt_splice_mem_rsv (fdt, re, 1, 0);
} }
static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name, static int
int len, struct fdt_property **prop) _fdt_resize_property (
void *fdt,
int nodeoffset,
const char *name,
int len,
struct fdt_property **prop
)
{ {
int oldlen; int oldlen;
int err; int err;
*prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); *prop = fdt_get_property_w (fdt, nodeoffset, name, &oldlen);
if (!*prop) if (!*prop) {
return oldlen; return oldlen;
}
if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen), if ((err = _fdt_splice_struct (
FDT_TAGALIGN(len)))) fdt,
return err; (*prop)->data,
FDT_TAGALIGN (oldlen),
FDT_TAGALIGN (len)
)))
{
return err;
}
(*prop)->len = cpu_to_fdt32(len); (*prop)->len = cpu_to_fdt32 (len);
return 0; return 0;
} }
static int _fdt_add_property(void *fdt, int nodeoffset, const char *name, static int
int len, struct fdt_property **prop) _fdt_add_property (
void *fdt,
int nodeoffset,
const char *name,
int len,
struct fdt_property **prop
)
{ {
int proplen; int proplen;
int nextoffset; int nextoffset;
int namestroff; int namestroff;
int err; int err;
if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0) if ((nextoffset = _fdt_check_node_offset (fdt, nodeoffset)) < 0) {
return nextoffset; return nextoffset;
}
namestroff = _fdt_find_add_string(fdt, name); namestroff = _fdt_find_add_string (fdt, name);
if (namestroff < 0) if (namestroff < 0) {
return namestroff; return namestroff;
}
*prop = _fdt_offset_ptr_w(fdt, nextoffset); *prop = _fdt_offset_ptr_w (fdt, nextoffset);
proplen = sizeof(**prop) + FDT_TAGALIGN(len); proplen = sizeof (**prop) + FDT_TAGALIGN (len);
err = _fdt_splice_struct(fdt, *prop, 0, proplen); err = _fdt_splice_struct (fdt, *prop, 0, proplen);
if (err) if (err) {
return err; return err;
}
(*prop)->tag = cpu_to_fdt32(FDT_PROP); (*prop)->tag = cpu_to_fdt32 (FDT_PROP);
(*prop)->nameoff = cpu_to_fdt32(namestroff); (*prop)->nameoff = cpu_to_fdt32 (namestroff);
(*prop)->len = cpu_to_fdt32(len); (*prop)->len = cpu_to_fdt32 (len);
return 0; return 0;
} }
int fdt_set_name(void *fdt, int nodeoffset, const char *name) int
fdt_set_name (
void *fdt,
int nodeoffset,
const char *name
)
{ {
char *namep; char *namep;
int oldlen, newlen; int oldlen, newlen;
int err; int err;
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen); namep = (char *)(uintptr_t)fdt_get_name (fdt, nodeoffset, &oldlen);
if (!namep) if (!namep) {
return oldlen; return oldlen;
}
newlen = strlen(name); newlen = strlen (name);
err = _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1), err = _fdt_splice_struct (
FDT_TAGALIGN(newlen+1)); fdt,
if (err) namep,
return err; FDT_TAGALIGN (oldlen+1),
FDT_TAGALIGN (newlen+1)
);
if (err) {
return err;
}
memcpy(namep, name, newlen+1); memcpy (namep, name, newlen+1);
return 0; return 0;
} }
int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, int
int len, void **prop_data) fdt_setprop_placeholder (
void *fdt,
int nodeoffset,
const char *name,
int len,
void **prop_data
)
{ {
struct fdt_property *prop; struct fdt_property *prop;
int err; int err;
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
err = _fdt_resize_property(fdt, nodeoffset, name, len, &prop); err = _fdt_resize_property (fdt, nodeoffset, name, len, &prop);
if (err == -FDT_ERR_NOTFOUND) if (err == -FDT_ERR_NOTFOUND) {
err = _fdt_add_property(fdt, nodeoffset, name, len, &prop); err = _fdt_add_property (fdt, nodeoffset, name, len, &prop);
if (err) }
return err;
*prop_data = prop->data; if (err) {
return 0; return err;
}
*prop_data = prop->data;
return 0;
} }
int fdt_setprop(void *fdt, int nodeoffset, const char *name, int
const void *val, int len) fdt_setprop (
void *fdt,
int nodeoffset,
const char *name,
const void *val,
int len
)
{ {
void *prop_data; void *prop_data;
int err; int err;
err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data); err = fdt_setprop_placeholder (fdt, nodeoffset, name, len, &prop_data);
if (err) if (err) {
return err; return err;
}
if (len) if (len) {
memcpy(prop_data, val, len); memcpy (prop_data, val, len);
return 0; }
return 0;
} }
int fdt_appendprop(void *fdt, int nodeoffset, const char *name, int
const void *val, int len) fdt_appendprop (
void *fdt,
int nodeoffset,
const char *name,
const void *val,
int len
)
{ {
struct fdt_property *prop; struct fdt_property *prop;
int err, oldlen, newlen; int err, oldlen, newlen;
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); prop = fdt_get_property_w (fdt, nodeoffset, name, &oldlen);
if (prop) { if (prop) {
newlen = len + oldlen; newlen = len + oldlen;
err = _fdt_splice_struct(fdt, prop->data, err = _fdt_splice_struct (
FDT_TAGALIGN(oldlen), fdt,
FDT_TAGALIGN(newlen)); prop->data,
if (err) FDT_TAGALIGN (oldlen),
return err; FDT_TAGALIGN (newlen)
prop->len = cpu_to_fdt32(newlen); );
memcpy(prop->data + oldlen, val, len); if (err) {
} else { return err;
err = _fdt_add_property(fdt, nodeoffset, name, len, &prop); }
if (err)
return err; prop->len = cpu_to_fdt32 (newlen);
memcpy(prop->data, val, len); memcpy (prop->data + oldlen, val, len);
} } else {
return 0; err = _fdt_add_property (fdt, nodeoffset, name, len, &prop);
if (err) {
return err;
}
memcpy (prop->data, val, len);
}
return 0;
} }
int fdt_delprop(void *fdt, int nodeoffset, const char *name) int
fdt_delprop (
void *fdt,
int nodeoffset,
const char *name
)
{ {
struct fdt_property *prop; struct fdt_property *prop;
int len, proplen; int len, proplen;
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
prop = fdt_get_property_w(fdt, nodeoffset, name, &len); prop = fdt_get_property_w (fdt, nodeoffset, name, &len);
if (!prop) if (!prop) {
return len; return len;
}
proplen = sizeof(*prop) + FDT_TAGALIGN(len); proplen = sizeof (*prop) + FDT_TAGALIGN (len);
return _fdt_splice_struct(fdt, prop, proplen, 0); return _fdt_splice_struct (fdt, prop, proplen, 0);
} }
int fdt_add_subnode_namelen(void *fdt, int parentoffset, int
const char *name, int namelen) fdt_add_subnode_namelen (
void *fdt,
int parentoffset,
const char *name,
int namelen
)
{ {
struct fdt_node_header *nh; struct fdt_node_header *nh;
int offset, nextoffset; int offset, nextoffset;
int nodelen; int nodelen;
int err; int err;
uint32_t tag; uint32_t tag;
fdt32_t *endtag; fdt32_t *endtag;
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen); offset = fdt_subnode_offset_namelen (fdt, parentoffset, name, namelen);
if (offset >= 0) if (offset >= 0) {
return -FDT_ERR_EXISTS; return -FDT_ERR_EXISTS;
else if (offset != -FDT_ERR_NOTFOUND) } else if (offset != -FDT_ERR_NOTFOUND) {
return offset; return offset;
}
/* Try to place the new node after the parent's properties */ /* Try to place the new node after the parent's properties */
fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */ fdt_next_tag (fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */
do { do {
offset = nextoffset; offset = nextoffset;
tag = fdt_next_tag(fdt, offset, &nextoffset); tag = fdt_next_tag (fdt, offset, &nextoffset);
} while ((tag == FDT_PROP) || (tag == FDT_NOP)); } while ((tag == FDT_PROP) || (tag == FDT_NOP));
nh = _fdt_offset_ptr_w(fdt, offset); nh = _fdt_offset_ptr_w (fdt, offset);
nodelen = sizeof(*nh) + FDT_TAGALIGN(namelen+1) + FDT_TAGSIZE; nodelen = sizeof (*nh) + FDT_TAGALIGN (namelen+1) + FDT_TAGSIZE;
err = _fdt_splice_struct(fdt, nh, 0, nodelen); err = _fdt_splice_struct (fdt, nh, 0, nodelen);
if (err) if (err) {
return err; return err;
}
nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE); nh->tag = cpu_to_fdt32 (FDT_BEGIN_NODE);
memset(nh->name, 0, FDT_TAGALIGN(namelen+1)); memset (nh->name, 0, FDT_TAGALIGN (namelen+1));
memcpy(nh->name, name, namelen); memcpy (nh->name, name, namelen);
endtag = (fdt32_t *)((char *)nh + nodelen - FDT_TAGSIZE); endtag = (fdt32_t *)((char *)nh + nodelen - FDT_TAGSIZE);
*endtag = cpu_to_fdt32(FDT_END_NODE); *endtag = cpu_to_fdt32 (FDT_END_NODE);
return offset; return offset;
} }
int fdt_add_subnode(void *fdt, int parentoffset, const char *name) int
fdt_add_subnode (
void *fdt,
int parentoffset,
const char *name
)
{ {
return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name)); return fdt_add_subnode_namelen (fdt, parentoffset, name, strlen (name));
} }
int fdt_del_node(void *fdt, int nodeoffset) int
fdt_del_node (
void *fdt,
int nodeoffset
)
{ {
int endoffset; int endoffset;
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
endoffset = _fdt_node_end_offset(fdt, nodeoffset); endoffset = _fdt_node_end_offset (fdt, nodeoffset);
if (endoffset < 0) if (endoffset < 0) {
return endoffset; return endoffset;
}
return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset), return _fdt_splice_struct (
endoffset - nodeoffset, 0); fdt,
_fdt_offset_ptr_w (fdt, nodeoffset),
endoffset - nodeoffset,
0
);
} }
static void _fdt_packblocks(const char *old, char *new, static void
int mem_rsv_size, int struct_size) _fdt_packblocks (
const char *old,
char *new,
int mem_rsv_size,
int struct_size
)
{ {
int mem_rsv_off, struct_off, strings_off; int mem_rsv_off, struct_off, strings_off;
mem_rsv_off = FDT_ALIGN(sizeof(struct fdt_header), 8); mem_rsv_off = FDT_ALIGN (sizeof (struct fdt_header), 8);
struct_off = mem_rsv_off + mem_rsv_size; struct_off = mem_rsv_off + mem_rsv_size;
strings_off = struct_off + struct_size; strings_off = struct_off + struct_size;
memmove(new + mem_rsv_off, old + fdt_off_mem_rsvmap(old), mem_rsv_size); memmove (new + mem_rsv_off, old + fdt_off_mem_rsvmap (old), mem_rsv_size);
fdt_set_off_mem_rsvmap(new, mem_rsv_off); fdt_set_off_mem_rsvmap (new, mem_rsv_off);
memmove(new + struct_off, old + fdt_off_dt_struct(old), struct_size); memmove (new + struct_off, old + fdt_off_dt_struct (old), struct_size);
fdt_set_off_dt_struct(new, struct_off); fdt_set_off_dt_struct (new, struct_off);
fdt_set_size_dt_struct(new, struct_size); fdt_set_size_dt_struct (new, struct_size);
memmove(new + strings_off, old + fdt_off_dt_strings(old), memmove (
fdt_size_dt_strings(old)); new + strings_off,
fdt_set_off_dt_strings(new, strings_off); old + fdt_off_dt_strings (old),
fdt_set_size_dt_strings(new, fdt_size_dt_strings(old)); fdt_size_dt_strings (old)
);
fdt_set_off_dt_strings (new, strings_off);
fdt_set_size_dt_strings (new, fdt_size_dt_strings (old));
} }
int fdt_open_into(const void *fdt, void *buf, int bufsize) int
fdt_open_into (
const void *fdt,
void *buf,
int bufsize
)
{ {
int err; int err;
int mem_rsv_size, struct_size; int mem_rsv_size, struct_size;
int newsize; int newsize;
const char *fdtstart = fdt; const char *fdtstart = fdt;
const char *fdtend = fdtstart + fdt_totalsize(fdt); const char *fdtend = fdtstart + fdt_totalsize (fdt);
char *tmp; char *tmp;
FDT_CHECK_HEADER(fdt); FDT_CHECK_HEADER (fdt);
mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) mem_rsv_size = (fdt_num_mem_rsv (fdt)+1)
* sizeof(struct fdt_reserve_entry); * sizeof (struct fdt_reserve_entry);
if (fdt_version(fdt) >= 17) { if (fdt_version (fdt) >= 17) {
struct_size = fdt_size_dt_struct(fdt); struct_size = fdt_size_dt_struct (fdt);
} else { } else {
struct_size = 0; struct_size = 0;
while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END) while (fdt_next_tag (fdt, struct_size, &struct_size) != FDT_END) {
; }
if (struct_size < 0)
return struct_size;
}
if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) { if (struct_size < 0) {
/* no further work necessary */ return struct_size;
err = fdt_move(fdt, buf, bufsize); }
if (err) }
return err;
fdt_set_version(buf, 17);
fdt_set_size_dt_struct(buf, struct_size);
fdt_set_totalsize(buf, bufsize);
return 0;
}
/* Need to reorder */ if (!_fdt_blocks_misordered (fdt, mem_rsv_size, struct_size)) {
newsize = FDT_ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size /* no further work necessary */
+ struct_size + fdt_size_dt_strings(fdt); err = fdt_move (fdt, buf, bufsize);
if (err) {
return err;
}
if (bufsize < newsize) fdt_set_version (buf, 17);
return -FDT_ERR_NOSPACE; fdt_set_size_dt_struct (buf, struct_size);
fdt_set_totalsize (buf, bufsize);
return 0;
}
/* First attempt to build converted tree at beginning of buffer */ /* Need to reorder */
tmp = buf; newsize = FDT_ALIGN (sizeof (struct fdt_header), 8) + mem_rsv_size
/* But if that overlaps with the old tree... */ + struct_size + fdt_size_dt_strings (fdt);
if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) {
/* Try right after the old tree instead */
tmp = (char *)(uintptr_t)fdtend;
if ((tmp + newsize) > ((char *)buf + bufsize))
return -FDT_ERR_NOSPACE;
}
_fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size); if (bufsize < newsize) {
memmove(buf, tmp, newsize); return -FDT_ERR_NOSPACE;
}
fdt_set_magic(buf, FDT_MAGIC); /* First attempt to build converted tree at beginning of buffer */
fdt_set_totalsize(buf, bufsize); tmp = buf;
fdt_set_version(buf, 17); /* But if that overlaps with the old tree... */
fdt_set_last_comp_version(buf, 16); if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) {
fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt)); /* Try right after the old tree instead */
tmp = (char *)(uintptr_t)fdtend;
if ((tmp + newsize) > ((char *)buf + bufsize)) {
return -FDT_ERR_NOSPACE;
}
}
return 0; _fdt_packblocks (fdt, tmp, mem_rsv_size, struct_size);
memmove (buf, tmp, newsize);
fdt_set_magic (buf, FDT_MAGIC);
fdt_set_totalsize (buf, bufsize);
fdt_set_version (buf, 17);
fdt_set_last_comp_version (buf, 16);
fdt_set_boot_cpuid_phys (buf, fdt_boot_cpuid_phys (fdt));
return 0;
} }
int fdt_pack(void *fdt) int
fdt_pack (
void *fdt
)
{ {
int mem_rsv_size; int mem_rsv_size;
FDT_RW_CHECK_HEADER(fdt); FDT_RW_CHECK_HEADER (fdt);
mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) mem_rsv_size = (fdt_num_mem_rsv (fdt)+1)
* sizeof(struct fdt_reserve_entry); * sizeof (struct fdt_reserve_entry);
_fdt_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt)); _fdt_packblocks (fdt, fdt, mem_rsv_size, fdt_size_dt_struct (fdt));
fdt_set_totalsize(fdt, _fdt_data_size(fdt)); fdt_set_totalsize (fdt, _fdt_data_size (fdt));
return 0; return 0;
} }

View File

@ -56,47 +56,51 @@
#include "libfdt_internal.h" #include "libfdt_internal.h"
struct fdt_errtabent { struct fdt_errtabent {
const char *str; const char *str;
}; };
#define FDT_ERRTABENT(val) \ #define FDT_ERRTABENT(val) \
[(val)] = { .str = #val, } [(val)] = { .str = #val, }
static struct fdt_errtabent fdt_errtable[] = { static struct fdt_errtabent fdt_errtable[] = {
FDT_ERRTABENT(FDT_ERR_NOTFOUND), FDT_ERRTABENT (FDT_ERR_NOTFOUND),
FDT_ERRTABENT(FDT_ERR_EXISTS), FDT_ERRTABENT (FDT_ERR_EXISTS),
FDT_ERRTABENT(FDT_ERR_NOSPACE), FDT_ERRTABENT (FDT_ERR_NOSPACE),
FDT_ERRTABENT(FDT_ERR_BADOFFSET), FDT_ERRTABENT (FDT_ERR_BADOFFSET),
FDT_ERRTABENT(FDT_ERR_BADPATH), FDT_ERRTABENT (FDT_ERR_BADPATH),
FDT_ERRTABENT(FDT_ERR_BADPHANDLE), FDT_ERRTABENT (FDT_ERR_BADPHANDLE),
FDT_ERRTABENT(FDT_ERR_BADSTATE), FDT_ERRTABENT (FDT_ERR_BADSTATE),
FDT_ERRTABENT(FDT_ERR_TRUNCATED), FDT_ERRTABENT (FDT_ERR_TRUNCATED),
FDT_ERRTABENT(FDT_ERR_BADMAGIC), FDT_ERRTABENT (FDT_ERR_BADMAGIC),
FDT_ERRTABENT(FDT_ERR_BADVERSION), FDT_ERRTABENT (FDT_ERR_BADVERSION),
FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE), FDT_ERRTABENT (FDT_ERR_BADSTRUCTURE),
FDT_ERRTABENT(FDT_ERR_BADLAYOUT), FDT_ERRTABENT (FDT_ERR_BADLAYOUT),
FDT_ERRTABENT(FDT_ERR_INTERNAL), FDT_ERRTABENT (FDT_ERR_INTERNAL),
FDT_ERRTABENT(FDT_ERR_BADNCELLS), FDT_ERRTABENT (FDT_ERR_BADNCELLS),
FDT_ERRTABENT(FDT_ERR_BADVALUE), FDT_ERRTABENT (FDT_ERR_BADVALUE),
FDT_ERRTABENT(FDT_ERR_BADOVERLAY), FDT_ERRTABENT (FDT_ERR_BADOVERLAY),
FDT_ERRTABENT(FDT_ERR_NOPHANDLES), FDT_ERRTABENT (FDT_ERR_NOPHANDLES),
}; };
#define FDT_ERRTABSIZE (sizeof(fdt_errtable) / sizeof(fdt_errtable[0])) #define FDT_ERRTABSIZE (sizeof(fdt_errtable) / sizeof(fdt_errtable[0]))
const char *fdt_strerror(int errval) const char *
fdt_strerror (
int errval
)
{ {
if (errval > 0) if (errval > 0) {
return "<valid offset/length>"; return "<valid offset/length>";
else if (errval == 0) } else if (errval == 0) {
return "<no error>"; return "<no error>";
else if (errval > -FDT_ERRTABSIZE) { } else if (errval > -FDT_ERRTABSIZE) {
const char *s = fdt_errtable[-errval].str; const char *s = fdt_errtable[-errval].str;
if (s) if (s) {
return s; return s;
} }
}
return "<unknown error>"; return "<unknown error>";
} }

View File

@ -9,24 +9,29 @@
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
unsigned long strtoul(const char *nptr, char **endptr, int base) unsigned long
strtoul (
const char *nptr,
char **endptr,
int base
)
{ {
RETURN_STATUS Status; RETURN_STATUS Status;
UINTN ReturnValue; UINTN ReturnValue;
ASSERT (base == 10 || base == 16); ASSERT (base == 10 || base == 16);
if (base == 10) { if (base == 10) {
Status = AsciiStrDecimalToUintnS (nptr, endptr, &ReturnValue); Status = AsciiStrDecimalToUintnS (nptr, endptr, &ReturnValue);
} else if (base == 16) { } else if (base == 16) {
Status = AsciiStrHexToUintnS (nptr, endptr, &ReturnValue); Status = AsciiStrHexToUintnS (nptr, endptr, &ReturnValue);
} else { } else {
Status = RETURN_INVALID_PARAMETER; Status = RETURN_INVALID_PARAMETER;
} }
if (RETURN_ERROR (Status)) { if (RETURN_ERROR (Status)) {
return MAX_UINTN; return MAX_UINTN;
} }
return ReturnValue; return ReturnValue;
} }

View File

@ -55,246 +55,321 @@
#include "libfdt_internal.h" #include "libfdt_internal.h"
static int _fdt_sw_check_header(void *fdt) static int
_fdt_sw_check_header (
void *fdt
)
{ {
if (fdt_magic(fdt) != FDT_SW_MAGIC) if (fdt_magic (fdt) != FDT_SW_MAGIC) {
return -FDT_ERR_BADMAGIC; return -FDT_ERR_BADMAGIC;
/* FIXME: should check more details about the header state */ }
return 0;
/* FIXME: should check more details about the header state */
return 0;
} }
#define FDT_SW_CHECK_HEADER(fdt) \ #define FDT_SW_CHECK_HEADER(fdt) \
{ \ { \
int err; \ int err; \
if ((err = _fdt_sw_check_header(fdt)) != 0) \ if ((err = _fdt_sw_check_header(fdt)) != 0) \
return err; \ return err; \
} }
static void *_fdt_grab_space(void *fdt, size_t len) static void *
_fdt_grab_space (
void *fdt,
size_t len
)
{ {
int offset = fdt_size_dt_struct(fdt); int offset = fdt_size_dt_struct (fdt);
int spaceleft; int spaceleft;
spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt) spaceleft = fdt_totalsize (fdt) - fdt_off_dt_struct (fdt)
- fdt_size_dt_strings(fdt); - fdt_size_dt_strings (fdt);
if ((offset + len < offset) || (offset + len > spaceleft)) if ((offset + len < offset) || (offset + len > spaceleft)) {
return NULL; return NULL;
}
fdt_set_size_dt_struct(fdt, offset + len); fdt_set_size_dt_struct (fdt, offset + len);
return _fdt_offset_ptr_w(fdt, offset); return _fdt_offset_ptr_w (fdt, offset);
} }
int fdt_create(void *buf, int bufsize) int
fdt_create (
void *buf,
int bufsize
)
{ {
void *fdt = buf; void *fdt = buf;
if (bufsize < sizeof(struct fdt_header)) if (bufsize < sizeof (struct fdt_header)) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
memset(buf, 0, bufsize); memset (buf, 0, bufsize);
fdt_set_magic(fdt, FDT_SW_MAGIC); fdt_set_magic (fdt, FDT_SW_MAGIC);
fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION); fdt_set_version (fdt, FDT_LAST_SUPPORTED_VERSION);
fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION); fdt_set_last_comp_version (fdt, FDT_FIRST_SUPPORTED_VERSION);
fdt_set_totalsize(fdt, bufsize); fdt_set_totalsize (fdt, bufsize);
fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header), fdt_set_off_mem_rsvmap (
sizeof(struct fdt_reserve_entry))); fdt,
fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt)); FDT_ALIGN (
fdt_set_off_dt_strings(fdt, bufsize); sizeof (struct fdt_header),
sizeof (struct fdt_reserve_entry)
)
);
fdt_set_off_dt_struct (fdt, fdt_off_mem_rsvmap (fdt));
fdt_set_off_dt_strings (fdt, bufsize);
return 0; return 0;
} }
int fdt_resize(void *fdt, void *buf, int bufsize) int
fdt_resize (
void *fdt,
void *buf,
int bufsize
)
{ {
size_t headsize, tailsize; size_t headsize, tailsize;
char *oldtail, *newtail; char *oldtail, *newtail;
FDT_SW_CHECK_HEADER(fdt); FDT_SW_CHECK_HEADER (fdt);
headsize = fdt_off_dt_struct(fdt); headsize = fdt_off_dt_struct (fdt);
tailsize = fdt_size_dt_strings(fdt); tailsize = fdt_size_dt_strings (fdt);
if ((headsize + tailsize) > bufsize) if ((headsize + tailsize) > bufsize) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize; oldtail = (char *)fdt + fdt_totalsize (fdt) - tailsize;
newtail = (char *)buf + bufsize - tailsize; newtail = (char *)buf + bufsize - tailsize;
/* Two cases to avoid clobbering data if the old and new /* Two cases to avoid clobbering data if the old and new
* buffers partially overlap */ * buffers partially overlap */
if (buf <= fdt) { if (buf <= fdt) {
memmove(buf, fdt, headsize); memmove (buf, fdt, headsize);
memmove(newtail, oldtail, tailsize); memmove (newtail, oldtail, tailsize);
} else { } else {
memmove(newtail, oldtail, tailsize); memmove (newtail, oldtail, tailsize);
memmove(buf, fdt, headsize); memmove (buf, fdt, headsize);
} }
fdt_set_off_dt_strings(buf, bufsize); fdt_set_off_dt_strings (buf, bufsize);
fdt_set_totalsize(buf, bufsize); fdt_set_totalsize (buf, bufsize);
return 0; return 0;
} }
int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size) int
fdt_add_reservemap_entry (
void *fdt,
uint64_t addr,
uint64_t size
)
{ {
struct fdt_reserve_entry *re; struct fdt_reserve_entry *re;
int offset; int offset;
FDT_SW_CHECK_HEADER(fdt); FDT_SW_CHECK_HEADER (fdt);
if (fdt_size_dt_struct(fdt)) if (fdt_size_dt_struct (fdt)) {
return -FDT_ERR_BADSTATE; return -FDT_ERR_BADSTATE;
}
offset = fdt_off_dt_struct(fdt); offset = fdt_off_dt_struct (fdt);
if ((offset + sizeof(*re)) > fdt_totalsize(fdt)) if ((offset + sizeof (*re)) > fdt_totalsize (fdt)) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
re = (struct fdt_reserve_entry *)((char *)fdt + offset); re = (struct fdt_reserve_entry *)((char *)fdt + offset);
re->address = cpu_to_fdt64(addr); re->address = cpu_to_fdt64 (addr);
re->size = cpu_to_fdt64(size); re->size = cpu_to_fdt64 (size);
fdt_set_off_dt_struct(fdt, offset + sizeof(*re)); fdt_set_off_dt_struct (fdt, offset + sizeof (*re));
return 0; return 0;
} }
int fdt_finish_reservemap(void *fdt) int
fdt_finish_reservemap (
void *fdt
)
{ {
return fdt_add_reservemap_entry(fdt, 0, 0); return fdt_add_reservemap_entry (fdt, 0, 0);
} }
int fdt_begin_node(void *fdt, const char *name) int
fdt_begin_node (
void *fdt,
const char *name
)
{ {
struct fdt_node_header *nh; struct fdt_node_header *nh;
int namelen = strlen(name) + 1; int namelen = strlen (name) + 1;
FDT_SW_CHECK_HEADER(fdt); FDT_SW_CHECK_HEADER (fdt);
nh = _fdt_grab_space(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen)); nh = _fdt_grab_space (fdt, sizeof (*nh) + FDT_TAGALIGN (namelen));
if (! nh) if (!nh) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE); nh->tag = cpu_to_fdt32 (FDT_BEGIN_NODE);
memcpy(nh->name, name, namelen); memcpy (nh->name, name, namelen);
return 0; return 0;
} }
int fdt_end_node(void *fdt) int
fdt_end_node (
void *fdt
)
{ {
fdt32_t *en; fdt32_t *en;
FDT_SW_CHECK_HEADER(fdt); FDT_SW_CHECK_HEADER (fdt);
en = _fdt_grab_space(fdt, FDT_TAGSIZE); en = _fdt_grab_space (fdt, FDT_TAGSIZE);
if (! en) if (!en) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
*en = cpu_to_fdt32(FDT_END_NODE); *en = cpu_to_fdt32 (FDT_END_NODE);
return 0; return 0;
} }
static int _fdt_find_add_string(void *fdt, const char *s) static int
_fdt_find_add_string (
void *fdt,
const char *s
)
{ {
char *strtab = (char *)fdt + fdt_totalsize(fdt); char *strtab = (char *)fdt + fdt_totalsize (fdt);
const char *p; const char *p;
int strtabsize = fdt_size_dt_strings(fdt); int strtabsize = fdt_size_dt_strings (fdt);
int len = strlen(s) + 1; int len = strlen (s) + 1;
int struct_top, offset; int struct_top, offset;
p = _fdt_find_string(strtab - strtabsize, strtabsize, s); p = _fdt_find_string (strtab - strtabsize, strtabsize, s);
if (p) if (p) {
return p - strtab; return p - strtab;
}
/* Add it */ /* Add it */
offset = -strtabsize - len; offset = -strtabsize - len;
struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); struct_top = fdt_off_dt_struct (fdt) + fdt_size_dt_struct (fdt);
if (fdt_totalsize(fdt) + offset < struct_top) if (fdt_totalsize (fdt) + offset < struct_top) {
return 0; /* no more room :( */ return 0; /* no more room :( */
}
memcpy(strtab + offset, s, len); memcpy (strtab + offset, s, len);
fdt_set_size_dt_strings(fdt, strtabsize + len); fdt_set_size_dt_strings (fdt, strtabsize + len);
return offset; return offset;
} }
int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp) int
fdt_property_placeholder (
void *fdt,
const char *name,
int len,
void **valp
)
{ {
struct fdt_property *prop; struct fdt_property *prop;
int nameoff; int nameoff;
FDT_SW_CHECK_HEADER(fdt); FDT_SW_CHECK_HEADER (fdt);
nameoff = _fdt_find_add_string(fdt, name); nameoff = _fdt_find_add_string (fdt, name);
if (nameoff == 0) if (nameoff == 0) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
prop = _fdt_grab_space(fdt, sizeof(*prop) + FDT_TAGALIGN(len)); prop = _fdt_grab_space (fdt, sizeof (*prop) + FDT_TAGALIGN (len));
if (! prop) if (!prop) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
prop->tag = cpu_to_fdt32(FDT_PROP); prop->tag = cpu_to_fdt32 (FDT_PROP);
prop->nameoff = cpu_to_fdt32(nameoff); prop->nameoff = cpu_to_fdt32 (nameoff);
prop->len = cpu_to_fdt32(len); prop->len = cpu_to_fdt32 (len);
*valp = prop->data; *valp = prop->data;
return 0; return 0;
} }
int fdt_property(void *fdt, const char *name, const void *val, int len) int
fdt_property (
void *fdt,
const char *name,
const void *val,
int len
)
{ {
void *ptr; void *ptr;
int ret; int ret;
ret = fdt_property_placeholder(fdt, name, len, &ptr); ret = fdt_property_placeholder (fdt, name, len, &ptr);
if (ret) if (ret) {
return ret; return ret;
memcpy(ptr, val, len); }
return 0;
memcpy (ptr, val, len);
return 0;
} }
int fdt_finish(void *fdt) int
fdt_finish (
void *fdt
)
{ {
char *p = (char *)fdt; char *p = (char *)fdt;
fdt32_t *end; fdt32_t *end;
int oldstroffset, newstroffset; int oldstroffset, newstroffset;
uint32_t tag; uint32_t tag;
int offset, nextoffset; int offset, nextoffset;
FDT_SW_CHECK_HEADER(fdt); FDT_SW_CHECK_HEADER (fdt);
/* Add terminator */ /* Add terminator */
end = _fdt_grab_space(fdt, sizeof(*end)); end = _fdt_grab_space (fdt, sizeof (*end));
if (! end) if (!end) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
*end = cpu_to_fdt32(FDT_END); }
/* Relocate the string table */ *end = cpu_to_fdt32 (FDT_END);
oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
fdt_set_off_dt_strings(fdt, newstroffset);
/* Walk the structure, correcting string offsets */ /* Relocate the string table */
offset = 0; oldstroffset = fdt_totalsize (fdt) - fdt_size_dt_strings (fdt);
while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) { newstroffset = fdt_off_dt_struct (fdt) + fdt_size_dt_struct (fdt);
if (tag == FDT_PROP) { memmove (p + newstroffset, p + oldstroffset, fdt_size_dt_strings (fdt));
struct fdt_property *prop = fdt_set_off_dt_strings (fdt, newstroffset);
_fdt_offset_ptr_w(fdt, offset);
int nameoff;
nameoff = fdt32_to_cpu(prop->nameoff); /* Walk the structure, correcting string offsets */
nameoff += fdt_size_dt_strings(fdt); offset = 0;
prop->nameoff = cpu_to_fdt32(nameoff); while ((tag = fdt_next_tag (fdt, offset, &nextoffset)) != FDT_END) {
} if (tag == FDT_PROP) {
offset = nextoffset; struct fdt_property *prop =
} _fdt_offset_ptr_w (fdt, offset);
if (nextoffset < 0) int nameoff;
return nextoffset;
/* Finally, adjust the header */ nameoff = fdt32_to_cpu (prop->nameoff);
fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt)); nameoff += fdt_size_dt_strings (fdt);
fdt_set_magic(fdt, FDT_MAGIC); prop->nameoff = cpu_to_fdt32 (nameoff);
return 0; }
offset = nextoffset;
}
if (nextoffset < 0) {
return nextoffset;
}
/* Finally, adjust the header */
fdt_set_totalsize (fdt, newstroffset + fdt_size_dt_strings (fdt));
fdt_set_magic (fdt, FDT_MAGIC);
return 0;
} }

View File

@ -55,85 +55,135 @@
#include "libfdt_internal.h" #include "libfdt_internal.h"
int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, int
const char *name, int namelen, fdt_setprop_inplace_namelen_partial (
uint32_t idx, const void *val, void *fdt,
int len) int nodeoffset,
const char *name,
int namelen,
uint32_t idx,
const void *val,
int len
)
{ {
void *propval; void *propval;
int proplen; int proplen;
propval = fdt_getprop_namelen_w(fdt, nodeoffset, name, namelen, propval = fdt_getprop_namelen_w (
&proplen); fdt,
if (!propval) nodeoffset,
return proplen; name,
namelen,
&proplen
);
if (!propval) {
return proplen;
}
if (proplen < (len + idx)) if (proplen < (len + idx)) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
memcpy((char *)propval + idx, val, len); memcpy ((char *)propval + idx, val, len);
return 0; return 0;
} }
int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, int
const void *val, int len) fdt_setprop_inplace (
void *fdt,
int nodeoffset,
const char *name,
const void *val,
int len
)
{ {
const void *propval; const void *propval;
int proplen; int proplen;
propval = fdt_getprop(fdt, nodeoffset, name, &proplen); propval = fdt_getprop (fdt, nodeoffset, name, &proplen);
if (!propval) if (!propval) {
return proplen; return proplen;
}
if (proplen != len) if (proplen != len) {
return -FDT_ERR_NOSPACE; return -FDT_ERR_NOSPACE;
}
return fdt_setprop_inplace_namelen_partial(fdt, nodeoffset, name, return fdt_setprop_inplace_namelen_partial (
strlen(name), 0, fdt,
val, len); nodeoffset,
name,
strlen (name),
0,
val,
len
);
} }
static void _fdt_nop_region(void *start, int len) static void
_fdt_nop_region (
void *start,
int len
)
{ {
fdt32_t *p; fdt32_t *p;
for (p = start; (char *)p < ((char *)start + len); p++) for (p = start; (char *)p < ((char *)start + len); p++) {
*p = cpu_to_fdt32(FDT_NOP); *p = cpu_to_fdt32 (FDT_NOP);
}
} }
int fdt_nop_property(void *fdt, int nodeoffset, const char *name) int
fdt_nop_property (
void *fdt,
int nodeoffset,
const char *name
)
{ {
struct fdt_property *prop; struct fdt_property *prop;
int len; int len;
prop = fdt_get_property_w(fdt, nodeoffset, name, &len); prop = fdt_get_property_w (fdt, nodeoffset, name, &len);
if (!prop) if (!prop) {
return len; return len;
}
_fdt_nop_region(prop, len + sizeof(*prop)); _fdt_nop_region (prop, len + sizeof (*prop));
return 0; return 0;
} }
int _fdt_node_end_offset(void *fdt, int offset) int
_fdt_node_end_offset (
void *fdt,
int offset
)
{ {
int depth = 0; int depth = 0;
while ((offset >= 0) && (depth >= 0)) while ((offset >= 0) && (depth >= 0)) {
offset = fdt_next_node(fdt, offset, &depth); offset = fdt_next_node (fdt, offset, &depth);
}
return offset; return offset;
} }
int fdt_nop_node(void *fdt, int nodeoffset) int
fdt_nop_node (
void *fdt,
int nodeoffset
)
{ {
int endoffset; int endoffset;
endoffset = _fdt_node_end_offset(fdt, nodeoffset); endoffset = _fdt_node_end_offset (fdt, nodeoffset);
if (endoffset < 0) if (endoffset < 0) {
return endoffset; return endoffset;
}
_fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0), _fdt_nop_region (
endoffset - nodeoffset); fdt_offset_ptr_w (fdt, nodeoffset, 0),
return 0; endoffset - nodeoffset
);
return 0;
} }

View File

@ -1,5 +1,6 @@
#ifndef _LIBFDT_INTERNAL_H #ifndef _LIBFDT_INTERNAL_H
#define _LIBFDT_INTERNAL_H #define _LIBFDT_INTERNAL_H
/* /*
* libfdt - Flat Device Tree manipulation * libfdt - Flat Device Tree manipulation
* Copyright (C) 2006 David Gibson, IBM Corporation. * Copyright (C) 2006 David Gibson, IBM Corporation.
@ -52,44 +53,81 @@
*/ */
#include <fdt.h> #include <fdt.h>
#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) #define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) #define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE))
#define FDT_CHECK_HEADER(fdt) \ #define FDT_CHECK_HEADER(fdt) \
{ \ { \
int __err; \ int __err; \
if ((__err = fdt_check_header(fdt)) != 0) \ if ((__err = fdt_check_header(fdt)) != 0) \
return __err; \ return __err; \
} }
int _fdt_check_node_offset(const void *fdt, int offset); int
int _fdt_check_prop_offset(const void *fdt, int offset); _fdt_check_node_offset (
const char *_fdt_find_string(const char *strtab, int tabsize, const char *s); const void *fdt,
int _fdt_node_end_offset(void *fdt, int nodeoffset); int offset
);
static inline const void *_fdt_offset_ptr(const void *fdt, int offset) int
_fdt_check_prop_offset (
const void *fdt,
int offset
);
const char *
_fdt_find_string (
const char *strtab,
int tabsize,
const char *s
);
int
_fdt_node_end_offset (
void *fdt,
int nodeoffset
);
static inline const void *
_fdt_offset_ptr (
const void *fdt,
int offset
)
{ {
return (const char *)fdt + fdt_off_dt_struct(fdt) + offset; return (const char *)fdt + fdt_off_dt_struct (fdt) + offset;
} }
static inline void *_fdt_offset_ptr_w(void *fdt, int offset) static inline void *
_fdt_offset_ptr_w (
void *fdt,
int offset
)
{ {
return (void *)(uintptr_t)_fdt_offset_ptr(fdt, offset); return (void *)(uintptr_t)_fdt_offset_ptr (fdt, offset);
} }
static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int n) static inline const struct fdt_reserve_entry *
_fdt_mem_rsv (
const void *fdt,
int n
)
{ {
const struct fdt_reserve_entry *rsv_table = const struct fdt_reserve_entry *rsv_table =
(const struct fdt_reserve_entry *) (const struct fdt_reserve_entry *)
((const char *)fdt + fdt_off_mem_rsvmap(fdt)); ((const char *)fdt + fdt_off_mem_rsvmap (fdt));
return rsv_table + n; return rsv_table + n;
}
static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n)
{
return (void *)(uintptr_t)_fdt_mem_rsv(fdt, n);
} }
#define FDT_SW_MAGIC (~FDT_MAGIC) static inline struct fdt_reserve_entry *
_fdt_mem_rsv_w (
void *fdt,
int n
)
{
return (void *)(uintptr_t)_fdt_mem_rsv (fdt, n);
}
#define FDT_SW_MAGIC (~FDT_MAGIC)
#endif /* _LIBFDT_INTERNAL_H */ #endif /* _LIBFDT_INTERNAL_H */

View File

@ -16,9 +16,8 @@
#include <Protocol/DebugPort.h> #include <Protocol/DebugPort.h>
EFI_DEBUGPORT_PROTOCOL *gDebugPort = NULL; EFI_DEBUGPORT_PROTOCOL *gDebugPort = NULL;
UINTN gTimeOut = 0; UINTN gTimeOut = 0;
/** /**
The constructor function initializes the UART. The constructor function initializes the UART.
@ -36,7 +35,7 @@ GdbSerialLibDebugPortConstructor (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = gBS->LocateProtocol (&gEfiDebugPortProtocolGuid, NULL, (VOID **)&gDebugPort); Status = gBS->LocateProtocol (&gEfiDebugPortProtocolGuid, NULL, (VOID **)&gDebugPort);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
@ -47,8 +46,6 @@ GdbSerialLibDebugPortConstructor (
return Status; return Status;
} }
/** /**
Sets the baud rate, receive FIFO depth, transmit/receive time out, parity, Sets the baud rate, receive FIFO depth, transmit/receive time out, parity,
data buts, and stop bits on a serial device. This call is optional as the serial data buts, and stop bits on a serial device. This call is optional as the serial
@ -71,10 +68,10 @@ GdbSerialLibDebugPortConstructor (
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
GdbSerialInit ( GdbSerialInit (
IN UINT64 BaudRate, IN UINT64 BaudRate,
IN UINT8 Parity, IN UINT8 Parity,
IN UINT8 DataBits, IN UINT8 DataBits,
IN UINT8 StopBits IN UINT8 StopBits
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -83,7 +80,6 @@ GdbSerialInit (
return Status; return Status;
} }
/** /**
Check to see if a character is available from GDB. Do not read the character as that is Check to see if a character is available from GDB. Do not read the character as that is
done via GdbGetChar(). done via GdbGetChar().
@ -105,7 +101,6 @@ GdbIsCharAvailable (
return (Status == EFI_SUCCESS ? TRUE : FALSE); return (Status == EFI_SUCCESS ? TRUE : FALSE);
} }
/** /**
Get a character from GDB. This function must be able to run in interrupt context. Get a character from GDB. This function must be able to run in interrupt context.
@ -124,13 +119,12 @@ GdbGetChar (
do { do {
BufferSize = sizeof (Char); BufferSize = sizeof (Char);
Status = gDebugPort->Read (gDebugPort, gTimeOut, &BufferSize, &Char); Status = gDebugPort->Read (gDebugPort, gTimeOut, &BufferSize, &Char);
} while (EFI_ERROR (Status) || BufferSize != sizeof (Char)); } while (EFI_ERROR (Status) || BufferSize != sizeof (Char));
return Char; return Char;
} }
/** /**
Send a character to GDB. This function must be able to run in interrupt context. Send a character to GDB. This function must be able to run in interrupt context.
@ -138,11 +132,10 @@ GdbGetChar (
@param Char Send a character to GDB @param Char Send a character to GDB
**/ **/
VOID VOID
EFIAPI EFIAPI
GdbPutChar ( GdbPutChar (
IN CHAR8 Char IN CHAR8 Char
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -150,7 +143,7 @@ GdbPutChar (
do { do {
BufferSize = sizeof (Char); BufferSize = sizeof (Char);
Status = gDebugPort->Write (gDebugPort, gTimeOut, &BufferSize, &Char); Status = gDebugPort->Write (gDebugPort, gTimeOut, &BufferSize, &Char);
} while (EFI_ERROR (Status) || BufferSize != sizeof (Char)); } while (EFI_ERROR (Status) || BufferSize != sizeof (Char));
return; return;
@ -163,19 +156,14 @@ GdbPutChar (
@param String Send a string to GDB @param String Send a string to GDB
**/ **/
VOID VOID
GdbPutString ( GdbPutString (
IN CHAR8 *String IN CHAR8 *String
) )
{ {
// We could performance enhance this function by calling gDebugPort->Write () // We could performance enhance this function by calling gDebugPort->Write ()
while (*String != '\0') { while (*String != '\0') {
GdbPutChar (*String); GdbPutChar (*String);
String++; String++;
} }
} }

View File

@ -13,38 +13,34 @@
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
// ---------------------------------------------
//---------------------------------------------
// UART Register Offsets // UART Register Offsets
//--------------------------------------------- // ---------------------------------------------
#define BAUD_LOW_OFFSET 0x00 #define BAUD_LOW_OFFSET 0x00
#define BAUD_HIGH_OFFSET 0x01 #define BAUD_HIGH_OFFSET 0x01
#define IER_OFFSET 0x01 #define IER_OFFSET 0x01
#define LCR_SHADOW_OFFSET 0x01 #define LCR_SHADOW_OFFSET 0x01
#define FCR_SHADOW_OFFSET 0x02 #define FCR_SHADOW_OFFSET 0x02
#define IR_CONTROL_OFFSET 0x02 #define IR_CONTROL_OFFSET 0x02
#define FCR_OFFSET 0x02 #define FCR_OFFSET 0x02
#define EIR_OFFSET 0x02 #define EIR_OFFSET 0x02
#define BSR_OFFSET 0x03 #define BSR_OFFSET 0x03
#define LCR_OFFSET 0x03 #define LCR_OFFSET 0x03
#define MCR_OFFSET 0x04 #define MCR_OFFSET 0x04
#define LSR_OFFSET 0x05 #define LSR_OFFSET 0x05
#define MSR_OFFSET 0x06 #define MSR_OFFSET 0x06
//--------------------------------------------- // ---------------------------------------------
// UART Register Bit Defines // UART Register Bit Defines
//--------------------------------------------- // ---------------------------------------------
#define LSR_TXRDY 0x20U #define LSR_TXRDY 0x20U
#define LSR_RXDA 0x01U #define LSR_RXDA 0x01U
#define DLAB 0x01U #define DLAB 0x01U
#define ENABLE_FIFO 0x01U #define ENABLE_FIFO 0x01U
#define CLEAR_FIFOS 0x06U #define CLEAR_FIFOS 0x06U
// IO Port Base for the UART // IO Port Base for the UART
UINTN gPort; UINTN gPort;
/** /**
The constructor function initializes the UART. The constructor function initializes the UART.
@ -62,10 +58,10 @@ GdbSerialLibConstructor (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
UINT64 BaudRate; UINT64 BaudRate;
UINT8 DataBits; UINT8 DataBits;
UINT8 Parity; UINT8 Parity;
UINT8 StopBits; UINT8 StopBits;
gPort = (UINTN)PcdGet32 (PcdGdbUartPort); gPort = (UINTN)PcdGet32 (PcdGdbUartPort);
@ -77,8 +73,6 @@ GdbSerialLibConstructor (
return GdbSerialInit (BaudRate, Parity, DataBits, StopBits); return GdbSerialInit (BaudRate, Parity, DataBits, StopBits);
} }
/** /**
Sets the baud rate, receive FIFO depth, transmit/receive time out, parity, Sets the baud rate, receive FIFO depth, transmit/receive time out, parity,
data buts, and stop bits on a serial device. This call is optional as the serial data buts, and stop bits on a serial device. This call is optional as the serial
@ -101,16 +95,16 @@ GdbSerialLibConstructor (
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
GdbSerialInit ( GdbSerialInit (
IN UINT64 BaudRate, IN UINT64 BaudRate,
IN UINT8 Parity, IN UINT8 Parity,
IN UINT8 DataBits, IN UINT8 DataBits,
IN UINT8 StopBits IN UINT8 StopBits
) )
{ {
UINTN Divisor; UINTN Divisor;
UINT8 OutputData; UINT8 OutputData;
UINT8 Data; UINT8 Data;
UINT8 BreakSet = 0; UINT8 BreakSet = 0;
// //
// We assume the UART has been turned on to decode gPort address range // We assume the UART has been turned on to decode gPort address range
@ -119,7 +113,7 @@ GdbSerialInit (
// //
// Map 5..8 to 0..3 // Map 5..8 to 0..3
// //
Data = (UINT8) (DataBits - (UINT8)5); Data = (UINT8)(DataBits - (UINT8)5);
// //
// Calculate divisor for baud generator // Calculate divisor for baud generator
@ -138,7 +132,6 @@ GdbSerialInit (
IoWrite8 (gPort + BAUD_HIGH_OFFSET, (UINT8)(Divisor >> 8)); IoWrite8 (gPort + BAUD_HIGH_OFFSET, (UINT8)(Divisor >> 8));
IoWrite8 (gPort + BAUD_LOW_OFFSET, (UINT8)(Divisor & 0xff)); IoWrite8 (gPort + BAUD_LOW_OFFSET, (UINT8)(Divisor & 0xff));
// //
// Switch back to bank 0 // Switch back to bank 0
// //
@ -149,12 +142,10 @@ GdbSerialInit (
// We probably need the FIFO enabled to not drop input // We probably need the FIFO enabled to not drop input
IoWrite8 (gPort + FCR_SHADOW_OFFSET, ENABLE_FIFO); IoWrite8 (gPort + FCR_SHADOW_OFFSET, ENABLE_FIFO);
// Configure the UART hardware here // Configure the UART hardware here
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
/** /**
Check to see if a character is available from GDB. Do not read the character as that is Check to see if a character is available from GDB. Do not read the character as that is
done via GdbGetChar(). done via GdbGetChar().
@ -169,14 +160,13 @@ GdbIsCharAvailable (
VOID VOID
) )
{ {
UINT8 Data; UINT8 Data;
Data = IoRead8 (gPort + LSR_OFFSET); Data = IoRead8 (gPort + LSR_OFFSET);
return ((Data & LSR_RXDA) == LSR_RXDA); return ((Data & LSR_RXDA) == LSR_RXDA);
} }
/** /**
Get a character from GDB. This function must be able to run in interrupt context. Get a character from GDB. This function must be able to run in interrupt context.
@ -189,8 +179,8 @@ GdbGetChar (
VOID VOID
) )
{ {
UINT8 Data; UINT8 Data;
CHAR8 Char; CHAR8 Char;
// Wait for the serial port to be ready // Wait for the serial port to be ready
do { do {
@ -204,7 +194,6 @@ GdbGetChar (
return Char; return Char;
} }
/** /**
Send a character to GDB. This function must be able to run in interrupt context. Send a character to GDB. This function must be able to run in interrupt context.
@ -212,14 +201,13 @@ GdbGetChar (
@param Char Send a character to GDB @param Char Send a character to GDB
**/ **/
VOID VOID
EFIAPI EFIAPI
GdbPutChar ( GdbPutChar (
IN CHAR8 Char IN CHAR8 Char
) )
{ {
UINT8 Data; UINT8 Data;
// Make this an DEBUG_INFO after we get everything debugged. // Make this an DEBUG_INFO after we get everything debugged.
DEBUG ((DEBUG_ERROR, ">%c>", Char)); DEBUG ((DEBUG_ERROR, ">%c>", Char));
@ -239,7 +227,6 @@ GdbPutChar (
@param String Send a string to GDB @param String Send a string to GDB
**/ **/
VOID VOID
GdbPutString ( GdbPutString (
IN CHAR8 *String IN CHAR8 *String

View File

@ -22,30 +22,29 @@
#include <Protocol/Cpu.h> #include <Protocol/Cpu.h>
typedef struct { typedef struct {
EFI_PHYSICAL_ADDRESS HostAddress; EFI_PHYSICAL_ADDRESS HostAddress;
VOID *BufferAddress; VOID *BufferAddress;
UINTN NumberOfBytes; UINTN NumberOfBytes;
DMA_MAP_OPERATION Operation; DMA_MAP_OPERATION Operation;
BOOLEAN DoubleBuffer; BOOLEAN DoubleBuffer;
} MAP_INFO_INSTANCE; } MAP_INFO_INSTANCE;
typedef struct { typedef struct {
LIST_ENTRY Link; LIST_ENTRY Link;
VOID *HostAddress; VOID *HostAddress;
UINTN NumPages; UINTN NumPages;
UINT64 Attributes; UINT64 Attributes;
} UNCACHED_ALLOCATION; } UNCACHED_ALLOCATION;
STATIC EFI_CPU_ARCH_PROTOCOL *mCpu; STATIC EFI_CPU_ARCH_PROTOCOL *mCpu;
STATIC LIST_ENTRY UncachedAllocationList; STATIC LIST_ENTRY UncachedAllocationList;
STATIC PHYSICAL_ADDRESS mDmaHostAddressLimit; STATIC PHYSICAL_ADDRESS mDmaHostAddressLimit;
STATIC STATIC
PHYSICAL_ADDRESS PHYSICAL_ADDRESS
HostToDeviceAddress ( HostToDeviceAddress (
IN VOID *Address IN VOID *Address
) )
{ {
return (PHYSICAL_ADDRESS)(UINTN)Address + PcdGet64 (PcdDmaDeviceOffset); return (PHYSICAL_ADDRESS)(UINTN)Address + PcdGet64 (PcdDmaDeviceOffset);
@ -95,13 +94,14 @@ InternalAllocateAlignedPages (
if (Pages == 0) { if (Pages == 0) {
return NULL; return NULL;
} }
if (Alignment > EFI_PAGE_SIZE) { if (Alignment > EFI_PAGE_SIZE) {
// //
// Calculate the total number of pages since alignment is larger than page // Calculate the total number of pages since alignment is larger than page
// size. // size.
// //
AlignmentMask = Alignment - 1; AlignmentMask = Alignment - 1;
RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment); RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment);
// //
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not
// overflow. // overflow.
@ -109,11 +109,16 @@ InternalAllocateAlignedPages (
ASSERT (RealPages > Pages); ASSERT (RealPages > Pages);
Memory = mDmaHostAddressLimit; Memory = mDmaHostAddressLimit;
Status = gBS->AllocatePages (AllocateMaxAddress, MemoryType, RealPages, Status = gBS->AllocatePages (
&Memory); AllocateMaxAddress,
MemoryType,
RealPages,
&Memory
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return NULL; return NULL;
} }
AlignedMemory = ((UINTN)Memory + AlignmentMask) & ~AlignmentMask; AlignedMemory = ((UINTN)Memory + AlignmentMask) & ~AlignmentMask;
UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN)Memory); UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN)Memory);
if (UnalignedPages > 0) { if (UnalignedPages > 0) {
@ -123,6 +128,7 @@ InternalAllocateAlignedPages (
Status = gBS->FreePages (Memory, UnalignedPages); Status = gBS->FreePages (Memory, UnalignedPages);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
Memory = AlignedMemory + EFI_PAGES_TO_SIZE (Pages); Memory = AlignedMemory + EFI_PAGES_TO_SIZE (Pages);
UnalignedPages = RealPages - Pages - UnalignedPages; UnalignedPages = RealPages - Pages - UnalignedPages;
if (UnalignedPages > 0) { if (UnalignedPages > 0) {
@ -137,13 +143,19 @@ InternalAllocateAlignedPages (
// Do not over-allocate pages in this case. // Do not over-allocate pages in this case.
// //
Memory = mDmaHostAddressLimit; Memory = mDmaHostAddressLimit;
Status = gBS->AllocatePages (AllocateMaxAddress, MemoryType, Pages, Status = gBS->AllocatePages (
&Memory); AllocateMaxAddress,
MemoryType,
Pages,
&Memory
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return NULL; return NULL;
} }
AlignedMemory = (UINTN)Memory; AlignedMemory = (UINTN)Memory;
} }
return (VOID *)AlignedMemory; return (VOID *)AlignedMemory;
} }
@ -177,23 +189,24 @@ InternalAllocateAlignedPages (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaMap ( DmaMap (
IN DMA_MAP_OPERATION Operation, IN DMA_MAP_OPERATION Operation,
IN VOID *HostAddress, IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes, IN OUT UINTN *NumberOfBytes,
OUT PHYSICAL_ADDRESS *DeviceAddress, OUT PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping OUT VOID **Mapping
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
MAP_INFO_INSTANCE *Map; MAP_INFO_INSTANCE *Map;
VOID *Buffer; VOID *Buffer;
EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor; EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;
UINTN AllocSize; UINTN AllocSize;
if (HostAddress == NULL || if ((HostAddress == NULL) ||
NumberOfBytes == NULL || (NumberOfBytes == NULL) ||
DeviceAddress == NULL || (DeviceAddress == NULL) ||
Mapping == NULL ) { (Mapping == NULL))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -206,19 +219,20 @@ DmaMap (
// Remember range so we can flush on the other side // Remember range so we can flush on the other side
Map = AllocatePool (sizeof (MAP_INFO_INSTANCE)); Map = AllocatePool (sizeof (MAP_INFO_INSTANCE));
if (Map == NULL) { if (Map == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
if (((UINTN)HostAddress + *NumberOfBytes) > mDmaHostAddressLimit) { if (((UINTN)HostAddress + *NumberOfBytes) > mDmaHostAddressLimit) {
if (Operation == MapOperationBusMasterCommonBuffer) { if (Operation == MapOperationBusMasterCommonBuffer) {
goto CommonBufferError; goto CommonBufferError;
} }
AllocSize = ALIGN_VALUE (*NumberOfBytes, mCpu->DmaBufferAlignment); AllocSize = ALIGN_VALUE (*NumberOfBytes, mCpu->DmaBufferAlignment);
Map->BufferAddress = InternalAllocateAlignedPages (EfiBootServicesData, Map->BufferAddress = InternalAllocateAlignedPages (
EfiBootServicesData,
EFI_SIZE_TO_PAGES (AllocSize), EFI_SIZE_TO_PAGES (AllocSize),
mCpu->DmaBufferAlignment); mCpu->DmaBufferAlignment
);
if (Map->BufferAddress == NULL) { if (Map->BufferAddress == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto FreeMapInfo; goto FreeMapInfo;
@ -227,17 +241,22 @@ DmaMap (
if (Operation == MapOperationBusMasterRead) { if (Operation == MapOperationBusMasterRead) {
CopyMem (Map->BufferAddress, (VOID *)(UINTN)HostAddress, *NumberOfBytes); CopyMem (Map->BufferAddress, (VOID *)(UINTN)HostAddress, *NumberOfBytes);
} }
mCpu->FlushDataCache (mCpu, (UINTN)Map->BufferAddress, AllocSize,
EfiCpuFlushTypeWriteBack); mCpu->FlushDataCache (
mCpu,
(UINTN)Map->BufferAddress,
AllocSize,
EfiCpuFlushTypeWriteBack
);
*DeviceAddress = HostToDeviceAddress (Map->BufferAddress); *DeviceAddress = HostToDeviceAddress (Map->BufferAddress);
} else if (Operation != MapOperationBusMasterRead && } else if ((Operation != MapOperationBusMasterRead) &&
((((UINTN)HostAddress & (mCpu->DmaBufferAlignment - 1)) != 0) || ((((UINTN)HostAddress & (mCpu->DmaBufferAlignment - 1)) != 0) ||
((*NumberOfBytes & (mCpu->DmaBufferAlignment - 1)) != 0))) { ((*NumberOfBytes & (mCpu->DmaBufferAlignment - 1)) != 0)))
{
// Get the cacheability of the region // Get the cacheability of the region
Status = gDS->GetMemorySpaceDescriptor ((UINTN)HostAddress, &GcdDescriptor); Status = gDS->GetMemorySpaceDescriptor ((UINTN)HostAddress, &GcdDescriptor);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
goto FreeMapInfo; goto FreeMapInfo;
} }
@ -259,15 +278,15 @@ DmaMap (
// we only have to add (alignment - 8) worth of padding. // we only have to add (alignment - 8) worth of padding.
// //
Map->DoubleBuffer = TRUE; Map->DoubleBuffer = TRUE;
AllocSize = ALIGN_VALUE (*NumberOfBytes, mCpu->DmaBufferAlignment) + AllocSize = ALIGN_VALUE (*NumberOfBytes, mCpu->DmaBufferAlignment) +
(mCpu->DmaBufferAlignment - 8); (mCpu->DmaBufferAlignment - 8);
Map->BufferAddress = AllocatePool (AllocSize); Map->BufferAddress = AllocatePool (AllocSize);
if (Map->BufferAddress == NULL) { if (Map->BufferAddress == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto FreeMapInfo; goto FreeMapInfo;
} }
Buffer = ALIGN_POINTER (Map->BufferAddress, mCpu->DmaBufferAlignment); Buffer = ALIGN_POINTER (Map->BufferAddress, mCpu->DmaBufferAlignment);
*DeviceAddress = HostToDeviceAddress (Buffer); *DeviceAddress = HostToDeviceAddress (Buffer);
// //
@ -275,13 +294,17 @@ DmaMap (
// prevents them from being written back unexpectedly, potentially // prevents them from being written back unexpectedly, potentially
// overwriting the data we receive from the device. // overwriting the data we receive from the device.
// //
mCpu->FlushDataCache (mCpu, (UINTN)Buffer, *NumberOfBytes, mCpu->FlushDataCache (
EfiCpuFlushTypeWriteBack); mCpu,
(UINTN)Buffer,
*NumberOfBytes,
EfiCpuFlushTypeWriteBack
);
} else { } else {
Map->DoubleBuffer = FALSE; Map->DoubleBuffer = FALSE;
} }
} else { } else {
Map->DoubleBuffer = FALSE; Map->DoubleBuffer = FALSE;
DEBUG_CODE_BEGIN (); DEBUG_CODE_BEGIN ();
@ -293,17 +316,23 @@ DmaMap (
// that we are not trying to create a consistent mapping for cached memory. // that we are not trying to create a consistent mapping for cached memory.
// //
Status = gDS->GetMemorySpaceDescriptor ((UINTN)HostAddress, &GcdDescriptor); Status = gDS->GetMemorySpaceDescriptor ((UINTN)HostAddress, &GcdDescriptor);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR (Status);
ASSERT (Operation != MapOperationBusMasterCommonBuffer || ASSERT (
(GcdDescriptor.Attributes & (EFI_MEMORY_WB | EFI_MEMORY_WT)) == 0); Operation != MapOperationBusMasterCommonBuffer ||
(GcdDescriptor.Attributes & (EFI_MEMORY_WB | EFI_MEMORY_WT)) == 0
);
DEBUG_CODE_END (); DEBUG_CODE_END ();
// Flush the Data Cache (should not have any effect if the memory region is // Flush the Data Cache (should not have any effect if the memory region is
// uncached) // uncached)
mCpu->FlushDataCache (mCpu, (UINTN)HostAddress, *NumberOfBytes, mCpu->FlushDataCache (
EfiCpuFlushTypeWriteBackInvalidate); mCpu,
(UINTN)HostAddress,
*NumberOfBytes,
EfiCpuFlushTypeWriteBackInvalidate
);
} }
Map->HostAddress = (UINTN)HostAddress; Map->HostAddress = (UINTN)HostAddress;
@ -315,10 +344,13 @@ DmaMap (
return EFI_SUCCESS; return EFI_SUCCESS;
CommonBufferError: CommonBufferError:
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: Operation type 'MapOperationBusMasterCommonBuffer' is only " "%a: Operation type 'MapOperationBusMasterCommonBuffer' is only "
"supported\non memory regions that were allocated using " "supported\non memory regions that were allocated using "
"DmaAllocateBuffer ()\n", __FUNCTION__)); "DmaAllocateBuffer ()\n",
__FUNCTION__
));
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
FreeMapInfo: FreeMapInfo:
FreePool (Map); FreePool (Map);
@ -326,7 +358,6 @@ FreeMapInfo:
return Status; return Status;
} }
/** /**
Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or
DmaMapBusMasterCommonBuffer() operation and releases any corresponding DmaMapBusMasterCommonBuffer() operation and releases any corresponding
@ -344,13 +375,13 @@ FreeMapInfo:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaUnmap ( DmaUnmap (
IN VOID *Mapping IN VOID *Mapping
) )
{ {
MAP_INFO_INSTANCE *Map; MAP_INFO_INSTANCE *Map;
EFI_STATUS Status; EFI_STATUS Status;
VOID *Buffer; VOID *Buffer;
UINTN AllocSize; UINTN AllocSize;
if (Mapping == NULL) { if (Mapping == NULL) {
ASSERT (FALSE); ASSERT (FALSE);
@ -363,14 +394,21 @@ DmaUnmap (
if (((UINTN)Map->HostAddress + Map->NumberOfBytes) > mDmaHostAddressLimit) { if (((UINTN)Map->HostAddress + Map->NumberOfBytes) > mDmaHostAddressLimit) {
AllocSize = ALIGN_VALUE (Map->NumberOfBytes, mCpu->DmaBufferAlignment); AllocSize = ALIGN_VALUE (Map->NumberOfBytes, mCpu->DmaBufferAlignment);
if (Map->Operation == MapOperationBusMasterWrite) { if (Map->Operation == MapOperationBusMasterWrite) {
mCpu->FlushDataCache (mCpu, (UINTN)Map->BufferAddress, AllocSize, mCpu->FlushDataCache (
EfiCpuFlushTypeInvalidate); mCpu,
CopyMem ((VOID *)(UINTN)Map->HostAddress, Map->BufferAddress, (UINTN)Map->BufferAddress,
Map->NumberOfBytes); AllocSize,
EfiCpuFlushTypeInvalidate
);
CopyMem (
(VOID *)(UINTN)Map->HostAddress,
Map->BufferAddress,
Map->NumberOfBytes
);
} }
FreePages (Map->BufferAddress, EFI_SIZE_TO_PAGES (AllocSize)); FreePages (Map->BufferAddress, EFI_SIZE_TO_PAGES (AllocSize));
} else if (Map->DoubleBuffer) { } else if (Map->DoubleBuffer) {
ASSERT (Map->Operation == MapOperationBusMasterWrite); ASSERT (Map->Operation == MapOperationBusMasterWrite);
if (Map->Operation != MapOperationBusMasterWrite) { if (Map->Operation != MapOperationBusMasterWrite) {
@ -378,8 +416,12 @@ DmaUnmap (
} else { } else {
Buffer = ALIGN_POINTER (Map->BufferAddress, mCpu->DmaBufferAlignment); Buffer = ALIGN_POINTER (Map->BufferAddress, mCpu->DmaBufferAlignment);
mCpu->FlushDataCache (mCpu, (UINTN)Buffer, Map->NumberOfBytes, mCpu->FlushDataCache (
EfiCpuFlushTypeInvalidate); mCpu,
(UINTN)Buffer,
Map->NumberOfBytes,
EfiCpuFlushTypeInvalidate
);
CopyMem ((VOID *)(UINTN)Map->HostAddress, Buffer, Map->NumberOfBytes); CopyMem ((VOID *)(UINTN)Map->HostAddress, Buffer, Map->NumberOfBytes);
@ -390,8 +432,12 @@ DmaUnmap (
// //
// Make sure we read buffer from uncached memory and not the cache // Make sure we read buffer from uncached memory and not the cache
// //
mCpu->FlushDataCache (mCpu, Map->HostAddress, Map->NumberOfBytes, mCpu->FlushDataCache (
EfiCpuFlushTypeInvalidate); mCpu,
Map->HostAddress,
Map->NumberOfBytes,
EfiCpuFlushTypeInvalidate
);
} }
} }
@ -418,9 +464,9 @@ DmaUnmap (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaAllocateBuffer ( DmaAllocateBuffer (
IN EFI_MEMORY_TYPE MemoryType, IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Pages, IN UINTN Pages,
OUT VOID **HostAddress OUT VOID **HostAddress
) )
{ {
return DmaAllocateAlignedBuffer (MemoryType, Pages, 0, HostAddress); return DmaAllocateAlignedBuffer (MemoryType, Pages, 0, HostAddress);
@ -446,29 +492,31 @@ DmaAllocateBuffer (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaAllocateAlignedBuffer ( DmaAllocateAlignedBuffer (
IN EFI_MEMORY_TYPE MemoryType, IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Pages, IN UINTN Pages,
IN UINTN Alignment, IN UINTN Alignment,
OUT VOID **HostAddress OUT VOID **HostAddress
) )
{ {
EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor; EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;
VOID *Allocation; VOID *Allocation;
UINT64 MemType; UINT64 MemType;
UNCACHED_ALLOCATION *Alloc; UNCACHED_ALLOCATION *Alloc;
EFI_STATUS Status; EFI_STATUS Status;
if (Alignment == 0) { if (Alignment == 0) {
Alignment = EFI_PAGE_SIZE; Alignment = EFI_PAGE_SIZE;
} }
if (HostAddress == NULL || if ((HostAddress == NULL) ||
(Alignment & (Alignment - 1)) != 0) { ((Alignment & (Alignment - 1)) != 0))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (MemoryType == EfiBootServicesData || if ((MemoryType == EfiBootServicesData) ||
MemoryType == EfiRuntimeServicesData) { (MemoryType == EfiRuntimeServicesData))
{
Allocation = InternalAllocateAlignedPages (MemoryType, Pages, Alignment); Allocation = InternalAllocateAlignedPages (MemoryType, Pages, Alignment);
} else { } else {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -480,7 +528,7 @@ DmaAllocateAlignedBuffer (
// Get the cacheability of the region // Get the cacheability of the region
Status = gDS->GetMemorySpaceDescriptor ((UINTN)Allocation, &GcdDescriptor); Status = gDS->GetMemorySpaceDescriptor ((UINTN)Allocation, &GcdDescriptor);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
goto FreeBuffer; goto FreeBuffer;
} }
@ -500,23 +548,27 @@ DmaAllocateAlignedBuffer (
} }
Alloc->HostAddress = Allocation; Alloc->HostAddress = Allocation;
Alloc->NumPages = Pages; Alloc->NumPages = Pages;
Alloc->Attributes = GcdDescriptor.Attributes; Alloc->Attributes = GcdDescriptor.Attributes;
InsertHeadList (&UncachedAllocationList, &Alloc->Link); InsertHeadList (&UncachedAllocationList, &Alloc->Link);
// Remap the region with the new attributes // Remap the region with the new attributes
Status = gDS->SetMemorySpaceAttributes ((PHYSICAL_ADDRESS)(UINTN)Allocation, Status = gDS->SetMemorySpaceAttributes (
EFI_PAGES_TO_SIZE (Pages), (PHYSICAL_ADDRESS)(UINTN)Allocation,
MemType); EFI_PAGES_TO_SIZE (Pages),
MemType
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreeAlloc; goto FreeAlloc;
} }
Status = mCpu->FlushDataCache (mCpu, Status = mCpu->FlushDataCache (
(PHYSICAL_ADDRESS)(UINTN)Allocation, mCpu,
EFI_PAGES_TO_SIZE (Pages), (PHYSICAL_ADDRESS)(UINTN)Allocation,
EfiCpuFlushTypeInvalidate); EFI_PAGES_TO_SIZE (Pages),
EfiCpuFlushTypeInvalidate
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreeAlloc; goto FreeAlloc;
} }
@ -534,7 +586,6 @@ FreeBuffer:
return Status; return Status;
} }
/** /**
Frees memory that was allocated with DmaAllocateBuffer(). Frees memory that was allocated with DmaAllocateBuffer().
@ -551,25 +602,25 @@ FreeBuffer:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DmaFreeBuffer ( DmaFreeBuffer (
IN UINTN Pages, IN UINTN Pages,
IN VOID *HostAddress IN VOID *HostAddress
) )
{ {
LIST_ENTRY *Link; LIST_ENTRY *Link;
UNCACHED_ALLOCATION *Alloc; UNCACHED_ALLOCATION *Alloc;
BOOLEAN Found; BOOLEAN Found;
EFI_STATUS Status; EFI_STATUS Status;
if (HostAddress == NULL) { if (HostAddress == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
for (Link = GetFirstNode (&UncachedAllocationList), Found = FALSE; for (Link = GetFirstNode (&UncachedAllocationList), Found = FALSE;
!IsNull (&UncachedAllocationList, Link); !IsNull (&UncachedAllocationList, Link);
Link = GetNextNode (&UncachedAllocationList, Link)) { Link = GetNextNode (&UncachedAllocationList, Link))
{
Alloc = BASE_CR (Link, UNCACHED_ALLOCATION, Link); Alloc = BASE_CR (Link, UNCACHED_ALLOCATION, Link);
if (Alloc->HostAddress == HostAddress && Alloc->NumPages == Pages) { if ((Alloc->HostAddress == HostAddress) && (Alloc->NumPages == Pages)) {
Found = TRUE; Found = TRUE;
break; break;
} }
@ -582,9 +633,11 @@ DmaFreeBuffer (
RemoveEntryList (&Alloc->Link); RemoveEntryList (&Alloc->Link);
Status = gDS->SetMemorySpaceAttributes ((PHYSICAL_ADDRESS)(UINTN)HostAddress, Status = gDS->SetMemorySpaceAttributes (
EFI_PAGES_TO_SIZE (Pages), (PHYSICAL_ADDRESS)(UINTN)HostAddress,
Alloc->Attributes); EFI_PAGES_TO_SIZE (Pages),
Alloc->Attributes
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreeAlloc; goto FreeAlloc;
} }
@ -600,12 +653,11 @@ FreeAlloc:
return Status; return Status;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonCoherentDmaLibConstructor ( NonCoherentDmaLibConstructor (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
InitializeListHead (&UncachedAllocationList); InitializeListHead (&UncachedAllocationList);

View File

@ -15,121 +15,121 @@
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/NorFlashInfoLib.h> #include <Library/NorFlashInfoLib.h>
STATIC CONST NOR_FLASH_INFO NorFlashIds[] = { STATIC CONST NOR_FLASH_INFO NorFlashIds[] = {
/* ATMEL */ /* ATMEL */
{L"at45db011d", {0x1f, 0x22, 0x00}, 3, 256, 64 * 1024, 4, NOR_FLASH_ERASE_4K}, { L"at45db011d", { 0x1f, 0x22, 0x00 }, 3, 256, 64 * 1024, 4, NOR_FLASH_ERASE_4K },
{L"at45db021d", {0x1f, 0x23, 0x00}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K}, { L"at45db021d", { 0x1f, 0x23, 0x00 }, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K },
{L"at45db041d", {0x1f, 0x24, 0x00}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K}, { L"at45db041d", { 0x1f, 0x24, 0x00 }, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K },
{L"at45db081d", {0x1f, 0x25, 0x00}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K}, { L"at45db081d", { 0x1f, 0x25, 0x00 }, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K },
{L"at45db161d", {0x1f, 0x26, 0x00}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K}, { L"at45db161d", { 0x1f, 0x26, 0x00 }, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K },
{L"at45db321d", {0x1f, 0x27, 0x00}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"at45db321d", { 0x1f, 0x27, 0x00 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"at45db641d", {0x1f, 0x28, 0x00}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"at45db641d", { 0x1f, 0x28, 0x00 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"at25df321a", {0x1f, 0x47, 0x01}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"at25df321a", { 0x1f, 0x47, 0x01 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"at25df321", {0x1f, 0x47, 0x00}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"at25df321", { 0x1f, 0x47, 0x00 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"at26df081a", {0x1f, 0x45, 0x01}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K}, { L"at26df081a", { 0x1f, 0x45, 0x01 }, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K },
/* EON */ /* EON */
{L"en25q32b", {0x1c, 0x30, 0x16}, 3, 256, 64 * 1024, 64, 0}, { L"en25q32b", { 0x1c, 0x30, 0x16 }, 3, 256, 64 * 1024, 64, 0 },
{L"en25q64", {0x1c, 0x30, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"en25q64", { 0x1c, 0x30, 0x17 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"en25q128b", {0x1c, 0x30, 0x18}, 3, 256, 64 * 1024, 256, 0}, { L"en25q128b", { 0x1c, 0x30, 0x18 }, 3, 256, 64 * 1024, 256, 0 },
{L"en25s64", {0x1c, 0x38, 0x17}, 3, 256, 64 * 1024, 128, 0}, { L"en25s64", { 0x1c, 0x38, 0x17 }, 3, 256, 64 * 1024, 128, 0 },
/* GIGADEVICE */ /* GIGADEVICE */
{L"gd25q64b", {0xc8, 0x40, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"gd25q64b", { 0xc8, 0x40, 0x17 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"gd25lq32", {0xc8, 0x60, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"gd25lq32", { 0xc8, 0x60, 0x16 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
/* ISSI */ /* ISSI */
{L"is25lp032", {0x9d, 0x60, 0x16}, 3, 256, 64 * 1024, 64, 0}, { L"is25lp032", { 0x9d, 0x60, 0x16 }, 3, 256, 64 * 1024, 64, 0 },
{L"is25lp064", {0x9d, 0x60, 0x17}, 3, 256, 64 * 1024, 128, 0}, { L"is25lp064", { 0x9d, 0x60, 0x17 }, 3, 256, 64 * 1024, 128, 0 },
{L"is25lp128", {0x9d, 0x60, 0x18}, 3, 256, 64 * 1024, 256, 0}, { L"is25lp128", { 0x9d, 0x60, 0x18 }, 3, 256, 64 * 1024, 256, 0 },
/* MACRONIX */ /* MACRONIX */
{L"mx25l2006e", {0xc2, 0x20, 0x12}, 3, 256, 64 * 1024, 4, 0}, { L"mx25l2006e", { 0xc2, 0x20, 0x12 }, 3, 256, 64 * 1024, 4, 0 },
{L"mx25l4005", {0xc2, 0x20, 0x13}, 3, 256, 64 * 1024, 8, 0}, { L"mx25l4005", { 0xc2, 0x20, 0x13 }, 3, 256, 64 * 1024, 8, 0 },
{L"mx25l8005", {0xc2, 0x20, 0x14}, 3, 256, 64 * 1024, 16, 0}, { L"mx25l8005", { 0xc2, 0x20, 0x14 }, 3, 256, 64 * 1024, 16, 0 },
{L"mx25l1605d", {0xc2, 0x20, 0x15}, 3, 256, 64 * 1024, 32, 0}, { L"mx25l1605d", { 0xc2, 0x20, 0x15 }, 3, 256, 64 * 1024, 32, 0 },
{L"mx25l3205d", {0xc2, 0x20, 0x16}, 3, 256, 64 * 1024, 64, 0}, { L"mx25l3205d", { 0xc2, 0x20, 0x16 }, 3, 256, 64 * 1024, 64, 0 },
{L"mx25l6405d", {0xc2, 0x20, 0x17}, 3, 256, 64 * 1024, 128, 0}, { L"mx25l6405d", { 0xc2, 0x20, 0x17 }, 3, 256, 64 * 1024, 128, 0 },
{L"mx25l12805", {0xc2, 0x20, 0x18}, 3, 256, 64 * 1024, 256, 0}, { L"mx25l12805", { 0xc2, 0x20, 0x18 }, 3, 256, 64 * 1024, 256, 0 },
{L"mx25l25635f", {0xc2, 0x20, 0x19}, 3, 256, 64 * 1024, 512, 0}, { L"mx25l25635f", { 0xc2, 0x20, 0x19 }, 3, 256, 64 * 1024, 512, 0 },
{L"mx25l51235f", {0xc2, 0x20, 0x1a}, 3, 256, 64 * 1024, 1024, 0}, { L"mx25l51235f", { 0xc2, 0x20, 0x1a }, 3, 256, 64 * 1024, 1024, 0 },
{L"mx25l12855e", {0xc2, 0x26, 0x18}, 3, 256, 64 * 1024, 256, 0}, { L"mx25l12855e", { 0xc2, 0x26, 0x18 }, 3, 256, 64 * 1024, 256, 0 },
{L"mx66u51235f", {0xc2, 0x25, 0x3a}, 3, 256, 64 * 1024, 1024, 0}, { L"mx66u51235f", { 0xc2, 0x25, 0x3a }, 3, 256, 64 * 1024, 1024, 0 },
{L"mx66u1g45g", {0xc2, 0x25, 0x3b}, 3, 256, 64 * 1024, 2048, 0}, { L"mx66u1g45g", { 0xc2, 0x25, 0x3b }, 3, 256, 64 * 1024, 2048, 0 },
{L"mx66l1g45g", {0xc2, 0x20, 0x1b}, 3, 256, 64 * 1024, 2048, 0}, { L"mx66l1g45g", { 0xc2, 0x20, 0x1b }, 3, 256, 64 * 1024, 2048, 0 },
/* SPANSION */ /* SPANSION */
{L"s25fl008a", {0x01, 0x02, 0x13}, 3, 256, 64 * 1024, 16, 0}, { L"s25fl008a", { 0x01, 0x02, 0x13 }, 3, 256, 64 * 1024, 16, 0 },
{L"s25fl016a", {0x01, 0x02, 0x14}, 3, 256, 64 * 1024, 32, 0}, { L"s25fl016a", { 0x01, 0x02, 0x14 }, 3, 256, 64 * 1024, 32, 0 },
{L"s25fl032a", {0x01, 0x02, 0x15}, 3, 256, 64 * 1024, 64, 0}, { L"s25fl032a", { 0x01, 0x02, 0x15 }, 3, 256, 64 * 1024, 64, 0 },
{L"s25fl064a", {0x01, 0x02, 0x16}, 3, 256, 64 * 1024, 128, 0}, { L"s25fl064a", { 0x01, 0x02, 0x16 }, 3, 256, 64 * 1024, 128, 0 },
{L"s25fl116k", {0x01, 0x40, 0x15}, 3, 256, 64 * 1024, 128, 0}, { L"s25fl116k", { 0x01, 0x40, 0x15 }, 3, 256, 64 * 1024, 128, 0 },
{L"s25fl164k", {0x01, 0x40, 0x17, 0x01, 0x40}, 5, 256, 64 * 1024, 128, 0}, { L"s25fl164k", { 0x01, 0x40, 0x17, 0x01, 0x40}, 5, 256, 64 * 1024, 128, 0 },
{L"s25fl128p_256k", {0x01, 0x20, 0x18, 0x03, 0x00}, 5, 256, 256 * 1024, 64, 0}, { L"s25fl128p_256k", { 0x01, 0x20, 0x18, 0x03, 0x00}, 5, 256, 256 * 1024, 64, 0 },
{L"s25fl128p_64k", {0x01, 0x20, 0x18, 0x03, 0x01}, 5, 256, 64 * 1024, 256, 0}, { L"s25fl128p_64k", { 0x01, 0x20, 0x18, 0x03, 0x01}, 5, 256, 64 * 1024, 256, 0 },
{L"s25fl032p", {0x01, 0x02, 0x15, 0x4d, 0x00}, 5, 256, 64 * 1024, 64, 0}, { L"s25fl032p", { 0x01, 0x02, 0x15, 0x4d, 0x00}, 5, 256, 64 * 1024, 64, 0 },
{L"s25fl064p", {0x01, 0x02, 0x16, 0x4d, 0x00}, 5, 256, 64 * 1024, 128, 0}, { L"s25fl064p", { 0x01, 0x02, 0x16, 0x4d, 0x00}, 5, 256, 64 * 1024, 128, 0 },
{L"s25fl128s_256k", {0x01, 0x20, 0x18, 0x4d, 0x00}, 5, 256, 256 * 1024, 64, 0}, { L"s25fl128s_256k", { 0x01, 0x20, 0x18, 0x4d, 0x00}, 5, 256, 256 * 1024, 64, 0 },
{L"s25fl128s_64k", {0x01, 0x20, 0x18, 0x4d, 0x01}, 5, 256, 64 * 1024, 256, 0}, { L"s25fl128s_64k", { 0x01, 0x20, 0x18, 0x4d, 0x01}, 5, 256, 64 * 1024, 256, 0 },
{L"s25fl256s_256k", {0x01, 0x02, 0x19, 0x4d, 0x00}, 5, 256, 256 * 1024, 128, 0}, { L"s25fl256s_256k", { 0x01, 0x02, 0x19, 0x4d, 0x00}, 5, 256, 256 * 1024, 128, 0 },
{L"s25fl256s_64k", {0x01, 0x02, 0x19, 0x4d, 0x01}, 5, 256, 64 * 1024, 512, 0}, { L"s25fl256s_64k", { 0x01, 0x02, 0x19, 0x4d, 0x01}, 5, 256, 64 * 1024, 512, 0 },
{L"s25fl512s_256k", {0x01, 0x02, 0x20, 0x4d, 0x00}, 5, 256, 256 * 1024, 256, 0}, { L"s25fl512s_256k", { 0x01, 0x02, 0x20, 0x4d, 0x00}, 5, 256, 256 * 1024, 256, 0 },
{L"s25fl512s_64k", {0x01, 0x02, 0x20, 0x4d, 0x01}, 5, 256, 64 * 1024, 1024, 0}, { L"s25fl512s_64k", { 0x01, 0x02, 0x20, 0x4d, 0x01}, 5, 256, 64 * 1024, 1024, 0 },
{L"s25fl512s_512k", {0x01, 0x02, 0x20, 0x4f, 0x00}, 5, 256, 256 * 1024, 256, 0}, { L"s25fl512s_512k", { 0x01, 0x02, 0x20, 0x4f, 0x00}, 5, 256, 256 * 1024, 256, 0 },
/* STMICRO */ /* STMICRO */
{L"m25p10", {0x20, 0x20, 0x11}, 3, 256, 32 * 1024, 4, 0}, { L"m25p10", { 0x20, 0x20, 0x11 }, 3, 256, 32 * 1024, 4, 0 },
{L"m25p20", {0x20, 0x20, 0x12}, 3, 256, 64 * 1024, 4, 0}, { L"m25p20", { 0x20, 0x20, 0x12 }, 3, 256, 64 * 1024, 4, 0 },
{L"m25p40", {0x20, 0x20, 0x13}, 3, 256, 64 * 1024, 8, 0}, { L"m25p40", { 0x20, 0x20, 0x13 }, 3, 256, 64 * 1024, 8, 0 },
{L"m25p80", {0x20, 0x20, 0x14}, 3, 256, 64 * 1024, 16, 0}, { L"m25p80", { 0x20, 0x20, 0x14 }, 3, 256, 64 * 1024, 16, 0 },
{L"m25p16", {0x20, 0x20, 0x15}, 3, 256, 64 * 1024, 32, 0}, { L"m25p16", { 0x20, 0x20, 0x15 }, 3, 256, 64 * 1024, 32, 0 },
{L"m25pE16", {0x20, 0x80, 0x15, 0x10, 0x00}, 5, 256, 64 * 1024, 32, 0}, { L"m25pE16", { 0x20, 0x80, 0x15, 0x10, 0x00}, 5, 256, 64 * 1024, 32, 0 },
{L"m25pX16", {0x20, 0x71, 0x15, 0x10, 0x00}, 5, 256, 64 * 1024, 32, 0}, { L"m25pX16", { 0x20, 0x71, 0x15, 0x10, 0x00}, 5, 256, 64 * 1024, 32, 0 },
{L"m25p32", {0x20, 0x20, 0x16}, 3, 256, 64 * 1024, 64, 0}, { L"m25p32", { 0x20, 0x20, 0x16 }, 3, 256, 64 * 1024, 64, 0 },
{L"m25p64", {0x20, 0x20, 0x17}, 3, 256, 64 * 1024, 128, 0}, { L"m25p64", { 0x20, 0x20, 0x17 }, 3, 256, 64 * 1024, 128, 0 },
{L"m25p128", {0x20, 0x20, 0x18}, 3, 256, 256 * 1024, 64, 0}, { L"m25p128", { 0x20, 0x20, 0x18 }, 3, 256, 256 * 1024, 64, 0 },
{L"m25pX64", {0x20, 0x71, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"m25pX64", { 0x20, 0x71, 0x17 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"n25q016a", {0x20, 0xbb, 0x15}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K}, { L"n25q016a", { 0x20, 0xbb, 0x15 }, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K },
{L"n25q32", {0x20, 0xba, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"n25q32", { 0x20, 0xba, 0x16 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"n25q32a", {0x20, 0xbb, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"n25q32a", { 0x20, 0xbb, 0x16 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"n25q64", {0x20, 0xba, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"n25q64", { 0x20, 0xba, 0x17 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"n25q64a", {0x20, 0xbb, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"n25q64a", { 0x20, 0xbb, 0x17 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"n25q128", {0x20, 0xba, 0x18}, 3, 256, 64 * 1024, 256, 0}, { L"n25q128", { 0x20, 0xba, 0x18 }, 3, 256, 64 * 1024, 256, 0 },
{L"n25q128a", {0x20, 0xbb, 0x18}, 3, 256, 64 * 1024, 256, 0}, { L"n25q128a", { 0x20, 0xbb, 0x18 }, 3, 256, 64 * 1024, 256, 0 },
{L"n25q256", {0x20, 0xba, 0x19}, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K}, { L"n25q256", { 0x20, 0xba, 0x19 }, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K },
{L"n25q256a", {0x20, 0xbb, 0x19}, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K}, { L"n25q256a", { 0x20, 0xbb, 0x19 }, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K },
{L"n25q512", {0x20, 0xba, 0x20}, 3, 256, 64 * 1024, 1024, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K}, { L"n25q512", { 0x20, 0xba, 0x20 }, 3, 256, 64 * 1024, 1024, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K },
{L"n25q512a", {0x20, 0xbb, 0x20}, 3, 256, 64 * 1024, 1024, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K}, { L"n25q512a", { 0x20, 0xbb, 0x20 }, 3, 256, 64 * 1024, 1024, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K },
{L"n25q1024", {0x20, 0xba, 0x21}, 3, 256, 64 * 1024, 2048, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K}, { L"n25q1024", { 0x20, 0xba, 0x21 }, 3, 256, 64 * 1024, 2048, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K },
{L"n25q1024a", {0x20, 0xbb, 0x21}, 3, 256, 64 * 1024, 2048, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K}, { L"n25q1024a", { 0x20, 0xbb, 0x21 }, 3, 256, 64 * 1024, 2048, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K },
{L"mt25qu02g", {0x20, 0xbb, 0x22}, 3, 256, 64 * 1024, 4096, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K}, { L"mt25qu02g", { 0x20, 0xbb, 0x22 }, 3, 256, 64 * 1024, 4096, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K },
{L"mt25ql02g", {0x20, 0xba, 0x22}, 3, 256, 64 * 1024, 4096, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K}, { L"mt25ql02g", { 0x20, 0xba, 0x22 }, 3, 256, 64 * 1024, 4096, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K },
/* SST */ /* SST */
{L"sst25vf040b", {0xbf, 0x25, 0x8d}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K}, { L"sst25vf040b", { 0xbf, 0x25, 0x8d }, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K },
{L"sst25vf080b", {0xbf, 0x25, 0x8e}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K}, { L"sst25vf080b", { 0xbf, 0x25, 0x8e }, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K },
{L"sst25vf016b", {0xbf, 0x25, 0x41}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K}, { L"sst25vf016b", { 0xbf, 0x25, 0x41 }, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K },
{L"sst25vf032b", {0xbf, 0x25, 0x4a}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"sst25vf032b", { 0xbf, 0x25, 0x4a }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"sst25vf064c", {0xbf, 0x25, 0x4b}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"sst25vf064c", { 0xbf, 0x25, 0x4b }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"sst25wf512", {0xbf, 0x25, 0x01}, 3, 256, 64 * 1024, 1, NOR_FLASH_ERASE_4K}, { L"sst25wf512", { 0xbf, 0x25, 0x01 }, 3, 256, 64 * 1024, 1, NOR_FLASH_ERASE_4K },
{L"sst25wf010", {0xbf, 0x25, 0x02}, 3, 256, 64 * 1024, 2, NOR_FLASH_ERASE_4K}, { L"sst25wf010", { 0xbf, 0x25, 0x02 }, 3, 256, 64 * 1024, 2, NOR_FLASH_ERASE_4K },
{L"sst25wf020", {0xbf, 0x25, 0x03}, 3, 256, 64 * 1024, 4, NOR_FLASH_ERASE_4K}, { L"sst25wf020", { 0xbf, 0x25, 0x03 }, 3, 256, 64 * 1024, 4, NOR_FLASH_ERASE_4K },
{L"sst25wf040", {0xbf, 0x25, 0x04}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K}, { L"sst25wf040", { 0xbf, 0x25, 0x04 }, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K },
{L"sst25wf040b", {0x62, 0x16, 0x13}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K}, { L"sst25wf040b", { 0x62, 0x16, 0x13 }, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K },
{L"sst25wf080", {0xbf, 0x25, 0x05}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K}, { L"sst25wf080", { 0xbf, 0x25, 0x05 }, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K },
/* WINBOND */ /* WINBOND */
{L"w25p80", {0xef, 0x20, 0x14}, 3, 256, 64 * 1024, 16, 0}, { L"w25p80", { 0xef, 0x20, 0x14 }, 3, 256, 64 * 1024, 16, 0 },
{L"w25p16", {0xef, 0x20, 0x15}, 3, 256, 64 * 1024, 32, 0}, { L"w25p16", { 0xef, 0x20, 0x15 }, 3, 256, 64 * 1024, 32, 0 },
{L"w25p32", {0xef, 0x20, 0x16}, 3, 256, 64 * 1024, 64, 0}, { L"w25p32", { 0xef, 0x20, 0x16 }, 3, 256, 64 * 1024, 64, 0 },
{L"w25x40", {0xef, 0x30, 0x13}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K}, { L"w25x40", { 0xef, 0x30, 0x13 }, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K },
{L"w25x16", {0xef, 0x30, 0x15}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K}, { L"w25x16", { 0xef, 0x30, 0x15 }, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K },
{L"w25x32", {0xef, 0x30, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"w25x32", { 0xef, 0x30, 0x16 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"w25x64", {0xef, 0x30, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"w25x64", { 0xef, 0x30, 0x17 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"w25q80bl", {0xef, 0x40, 0x14}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K}, { L"w25q80bl", { 0xef, 0x40, 0x14 }, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K },
{L"w25q16cl", {0xef, 0x40, 0x15}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K}, { L"w25q16cl", { 0xef, 0x40, 0x15 }, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K },
{L"w25q32bv", {0xef, 0x40, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"w25q32bv", { 0xef, 0x40, 0x16 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"w25q64cv", {0xef, 0x40, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"w25q64cv", { 0xef, 0x40, 0x17 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"w25q128bv", {0xef, 0x40, 0x18}, 3, 256, 64 * 1024, 256, NOR_FLASH_ERASE_4K}, { L"w25q128bv", { 0xef, 0x40, 0x18 }, 3, 256, 64 * 1024, 256, NOR_FLASH_ERASE_4K },
{L"w25q256", {0xef, 0x40, 0x19}, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K}, { L"w25q256", { 0xef, 0x40, 0x19 }, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K },
{L"w25q80bw", {0xef, 0x50, 0x14}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K}, { L"w25q80bw", { 0xef, 0x50, 0x14 }, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K },
{L"w25q16dw", {0xef, 0x60, 0x15}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K}, { L"w25q16dw", { 0xef, 0x60, 0x15 }, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K },
{L"w25q32dw", {0xef, 0x60, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K}, { L"w25q32dw", { 0xef, 0x60, 0x16 }, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K },
{L"w25q64dw", {0xef, 0x60, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K}, { L"w25q64dw", { 0xef, 0x60, 0x17 }, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K },
{L"w25q128fw", {0xef, 0x60, 0x18}, 3, 256, 64 * 1024, 256, NOR_FLASH_ERASE_4K}, { L"w25q128fw", { 0xef, 0x60, 0x18 }, 3, 256, 64 * 1024, 256, NOR_FLASH_ERASE_4K },
{}, /* Empty entry to terminate the list */ { }, /* Empty entry to terminate the list */
}; };
/** /**
@ -151,18 +151,18 @@ STATIC CONST NOR_FLASH_INFO NorFlashIds[] = {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NorFlashGetInfo ( NorFlashGetInfo (
IN UINT8 *Id, IN UINT8 *Id,
IN OUT NOR_FLASH_INFO **FlashInfo, IN OUT NOR_FLASH_INFO **FlashInfo,
IN BOOLEAN AllocateForRuntime IN BOOLEAN AllocateForRuntime
) )
{ {
CONST NOR_FLASH_INFO *TmpInfo; CONST NOR_FLASH_INFO *TmpInfo;
/* /*
* Iterate over NorFlashIds table, in order to find matching entry. * Iterate over NorFlashIds table, in order to find matching entry.
*/ */
TmpInfo = NorFlashIds; TmpInfo = NorFlashIds;
for (; TmpInfo->Name != NULL; TmpInfo++) { for ( ; TmpInfo->Name != NULL; TmpInfo++) {
if (CompareMem (TmpInfo->Id, Id, TmpInfo->IdLen) == 0) { if (CompareMem (TmpInfo->Id, Id, TmpInfo->IdLen) == 0) {
break; break;
} }
@ -183,6 +183,7 @@ NorFlashGetInfo (
} else { } else {
*FlashInfo = AllocateCopyPool (sizeof (NOR_FLASH_INFO), TmpInfo); *FlashInfo = AllocateCopyPool (sizeof (NOR_FLASH_INFO), TmpInfo);
} }
if (FlashInfo == NULL) { if (FlashInfo == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -203,7 +204,7 @@ NorFlashPrintInfo (
IN NOR_FLASH_INFO *Info IN NOR_FLASH_INFO *Info
) )
{ {
UINTN EraseSize; UINTN EraseSize;
if (Info->Flags & NOR_FLASH_ERASE_4K) { if (Info->Flags & NOR_FLASH_ERASE_4K) {
EraseSize = SIZE_4KB; EraseSize = SIZE_4KB;
@ -211,10 +212,12 @@ NorFlashPrintInfo (
EraseSize = Info->SectorSize; EraseSize = Info->SectorSize;
} }
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"Detected %s SPI NOR flash with page size %d B, erase size %d KB, total %d MB\n", "Detected %s SPI NOR flash with page size %d B, erase size %d KB, total %d MB\n",
Info->Name, Info->Name,
Info->PageSize, Info->PageSize,
EraseSize / 1024, EraseSize / 1024,
(Info->SectorSize * Info->SectorCount) / 1024 / 1024)); (Info->SectorSize * Info->SectorCount) / 1024 / 1024
));
} }

View File

@ -13,13 +13,13 @@
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <Library/PrePiLib.h> #include <Library/PrePiLib.h>
#define PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID { 0x385A982C, 0x2F49, 0x4043, { 0xA5, 0x1E, 0x49, 0x01, 0x02, 0x5C, 0x8B, 0x6B }} #define PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID { 0x385A982C, 0x2F49, 0x4043, { 0xA5, 0x1E, 0x49, 0x01, 0x02, 0x5C, 0x8B, 0x6B }}
typedef struct { typedef struct {
UINT32 NumberOfExtractHandler; UINT32 NumberOfExtractHandler;
GUID *ExtractHandlerGuidTable; GUID *ExtractHandlerGuidTable;
EXTRACT_GUIDED_SECTION_DECODE_HANDLER *ExtractDecodeHandlerTable; EXTRACT_GUIDED_SECTION_DECODE_HANDLER *ExtractDecodeHandlerTable;
EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *ExtractGetInfoHandlerTable; EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *ExtractGetInfoHandlerTable;
} PRE_PI_EXTRACT_GUIDED_SECTION_DATA; } PRE_PI_EXTRACT_GUIDED_SECTION_DATA;
PRE_PI_EXTRACT_GUIDED_SECTION_DATA * PRE_PI_EXTRACT_GUIDED_SECTION_DATA *
@ -27,10 +27,10 @@ GetSavedData (
VOID VOID
) )
{ {
EFI_HOB_GUID_TYPE *GuidHob; EFI_HOB_GUID_TYPE *GuidHob;
GUID SavedDataGuid = PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID; GUID SavedDataGuid = PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID;
GuidHob = GetFirstGuidHob(&SavedDataGuid); GuidHob = GetFirstGuidHob (&SavedDataGuid);
GuidHob++; GuidHob++;
return (PRE_PI_EXTRACT_GUIDED_SECTION_DATA *)GuidHob; return (PRE_PI_EXTRACT_GUIDED_SECTION_DATA *)GuidHob;
@ -46,6 +46,7 @@ ExtractGuidedSectionRegisterHandlers (
{ {
PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData; PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;
UINT32 Index; UINT32 Index;
// //
// Check input parameter. // Check input parameter.
// //
@ -53,12 +54,12 @@ ExtractGuidedSectionRegisterHandlers (
return RETURN_INVALID_PARAMETER; return RETURN_INVALID_PARAMETER;
} }
SavedData = GetSavedData(); SavedData = GetSavedData ();
// //
// Search the match registered GetInfo handler for the input guided section. // Search the match registered GetInfo handler for the input guided section.
// //
for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) { for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index++) {
if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionGuid)) { if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionGuid)) {
break; break;
} }
@ -68,8 +69,8 @@ ExtractGuidedSectionRegisterHandlers (
// If the guided handler has been registered before, only update its handler. // If the guided handler has been registered before, only update its handler.
// //
if (Index < SavedData->NumberOfExtractHandler) { if (Index < SavedData->NumberOfExtractHandler) {
SavedData->ExtractDecodeHandlerTable [Index] = DecodeHandler; SavedData->ExtractDecodeHandlerTable[Index] = DecodeHandler;
SavedData->ExtractGetInfoHandlerTable [Index] = GetInfoHandler; SavedData->ExtractGetInfoHandlerTable[Index] = GetInfoHandler;
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
@ -83,9 +84,9 @@ ExtractGuidedSectionRegisterHandlers (
// //
// Register new Handler and guid value. // Register new Handler and guid value.
// //
CopyGuid (&SavedData->ExtractHandlerGuidTable [SavedData->NumberOfExtractHandler], SectionGuid); CopyGuid (&SavedData->ExtractHandlerGuidTable[SavedData->NumberOfExtractHandler], SectionGuid);
SavedData->ExtractDecodeHandlerTable [SavedData->NumberOfExtractHandler] = DecodeHandler; SavedData->ExtractDecodeHandlerTable[SavedData->NumberOfExtractHandler] = DecodeHandler;
SavedData->ExtractGetInfoHandlerTable [SavedData->NumberOfExtractHandler++] = GetInfoHandler; SavedData->ExtractGetInfoHandlerTable[SavedData->NumberOfExtractHandler++] = GetInfoHandler;
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
@ -98,9 +99,9 @@ ExtractGuidedSectionGetGuidList (
{ {
PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData; PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;
ASSERT(ExtractHandlerGuidTable != NULL); ASSERT (ExtractHandlerGuidTable != NULL);
SavedData = GetSavedData(); SavedData = GetSavedData ();
*ExtractHandlerGuidTable = SavedData->ExtractHandlerGuidTable; *ExtractHandlerGuidTable = SavedData->ExtractHandlerGuidTable;
return SavedData->NumberOfExtractHandler; return SavedData->NumberOfExtractHandler;
@ -127,18 +128,18 @@ ExtractGuidedSectionGetInfo (
ASSERT (ScratchBufferSize != NULL); ASSERT (ScratchBufferSize != NULL);
ASSERT (SectionAttribute != NULL); ASSERT (SectionAttribute != NULL);
SavedData = GetSavedData(); SavedData = GetSavedData ();
if (IS_SECTION2 (InputSection)) { if (IS_SECTION2 (InputSection)) {
SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid); SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid);
} else { } else {
SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid); SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid);
} }
// //
// Search the match registered GetInfo handler for the input guided section. // Search the match registered GetInfo handler for the input guided section.
// //
for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) { for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index++) {
if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) { if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) {
break; break;
} }
@ -154,12 +155,12 @@ ExtractGuidedSectionGetInfo (
// //
// Call the match handler to getinfo for the input section data. // Call the match handler to getinfo for the input section data.
// //
return SavedData->ExtractGetInfoHandlerTable [Index] ( return SavedData->ExtractGetInfoHandlerTable[Index](
InputSection, InputSection,
OutputBufferSize, OutputBufferSize,
ScratchBufferSize, ScratchBufferSize,
SectionAttribute SectionAttribute
); );
} }
RETURN_STATUS RETURN_STATUS
@ -182,18 +183,18 @@ ExtractGuidedSectionDecode (
ASSERT (OutputBuffer != NULL); ASSERT (OutputBuffer != NULL);
ASSERT (AuthenticationStatus != NULL); ASSERT (AuthenticationStatus != NULL);
SavedData = GetSavedData(); SavedData = GetSavedData ();
if (IS_SECTION2 (InputSection)) { if (IS_SECTION2 (InputSection)) {
SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid); SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid);
} else { } else {
SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid); SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid);
} }
// //
// Search the match registered GetInfo handler for the input guided section. // Search the match registered GetInfo handler for the input guided section.
// //
for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) { for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index++) {
if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) { if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) {
break; break;
} }
@ -209,12 +210,12 @@ ExtractGuidedSectionDecode (
// //
// Call the match handler to getinfo for the input section data. // Call the match handler to getinfo for the input section data.
// //
return SavedData->ExtractDecodeHandlerTable [Index] ( return SavedData->ExtractDecodeHandlerTable[Index](
InputSection, InputSection,
OutputBuffer, OutputBuffer,
ScratchBuffer, ScratchBuffer,
AuthenticationStatus AuthenticationStatus
); );
} }
RETURN_STATUS RETURN_STATUS
@ -229,17 +230,17 @@ ExtractGuidedSectionLibConstructor (
// //
// Allocate global pool space to store the registered handler and its guid value. // Allocate global pool space to store the registered handler and its guid value.
// //
SavedData.ExtractHandlerGuidTable = (GUID *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(GUID)); SavedData.ExtractHandlerGuidTable = (GUID *)AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID));
if (SavedData.ExtractHandlerGuidTable == NULL) { if (SavedData.ExtractHandlerGuidTable == NULL) {
return RETURN_OUT_OF_RESOURCES; return RETURN_OUT_OF_RESOURCES;
} }
SavedData.ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(EXTRACT_GUIDED_SECTION_DECODE_HANDLER)); SavedData.ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *)AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER));
if (SavedData.ExtractDecodeHandlerTable == NULL) { if (SavedData.ExtractDecodeHandlerTable == NULL) {
return RETURN_OUT_OF_RESOURCES; return RETURN_OUT_OF_RESOURCES;
} }
SavedData.ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER)); SavedData.ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *)AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER));
if (SavedData.ExtractGetInfoHandlerTable == NULL) { if (SavedData.ExtractGetInfoHandlerTable == NULL) {
return RETURN_OUT_OF_RESOURCES; return RETURN_OUT_OF_RESOURCES;
} }
@ -249,7 +250,7 @@ ExtractGuidedSectionLibConstructor (
// //
SavedData.NumberOfExtractHandler = 0; SavedData.NumberOfExtractHandler = 0;
BuildGuidDataHob(&HobGuid, &SavedData, sizeof(SavedData)); BuildGuidDataHob (&HobGuid, &SavedData, sizeof (SavedData));
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -44,8 +44,6 @@ GetHobList (
return PrePeiGetHobList (); return PrePeiGetHobList ();
} }
/** /**
Updates the pointer to the HOB list. Updates the pointer to the HOB list.
@ -55,7 +53,7 @@ GetHobList (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetHobList ( SetHobList (
IN VOID *HobList IN VOID *HobList
) )
{ {
return PrePeiSetHobList (HobList); return PrePeiSetHobList (HobList);
@ -65,7 +63,7 @@ SetHobList (
**/ **/
EFI_HOB_HANDOFF_INFO_TABLE* EFI_HOB_HANDOFF_INFO_TABLE *
HobConstructor ( HobConstructor (
IN VOID *EfiMemoryBegin, IN VOID *EfiMemoryBegin,
IN UINTN EfiMemoryLength, IN UINTN EfiMemoryLength,
@ -79,16 +77,16 @@ HobConstructor (
Hob = EfiFreeMemoryBottom; Hob = EfiFreeMemoryBottom;
HobEnd = (EFI_HOB_GENERIC_HEADER *)(Hob+1); HobEnd = (EFI_HOB_GENERIC_HEADER *)(Hob+1);
Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF; Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF;
Hob->Header.HobLength = sizeof(EFI_HOB_HANDOFF_INFO_TABLE); Hob->Header.HobLength = sizeof (EFI_HOB_HANDOFF_INFO_TABLE);
Hob->Header.Reserved = 0; Hob->Header.Reserved = 0;
HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST; HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER); HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER);
HobEnd->Reserved = 0; HobEnd->Reserved = 0;
Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION; Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION;
Hob->BootMode = BOOT_WITH_FULL_CONFIGURATION; Hob->BootMode = BOOT_WITH_FULL_CONFIGURATION;
Hob->EfiMemoryTop = (UINTN)EfiMemoryBegin + EfiMemoryLength; Hob->EfiMemoryTop = (UINTN)EfiMemoryBegin + EfiMemoryLength;
Hob->EfiMemoryBottom = (UINTN)EfiMemoryBegin; Hob->EfiMemoryBottom = (UINTN)EfiMemoryBegin;
@ -101,8 +99,8 @@ HobConstructor (
VOID * VOID *
CreateHob ( CreateHob (
IN UINT16 HobType, IN UINT16 HobType,
IN UINT16 HobLength IN UINT16 HobLength
) )
{ {
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob; EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
@ -117,22 +115,22 @@ CreateHob (
FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom; FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom;
if (FreeMemory < HobLength) { if (FreeMemory < HobLength) {
return NULL; return NULL;
} }
Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList; Hob = (VOID *)(UINTN)HandOffHob->EfiEndOfHobList;
((EFI_HOB_GENERIC_HEADER*) Hob)->HobType = HobType; ((EFI_HOB_GENERIC_HEADER *)Hob)->HobType = HobType;
((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength = HobLength; ((EFI_HOB_GENERIC_HEADER *)Hob)->HobLength = HobLength;
((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved = 0; ((EFI_HOB_GENERIC_HEADER *)Hob)->Reserved = 0;
HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength); HobEnd = (EFI_HOB_GENERIC_HEADER *)((UINTN)Hob + HobLength);
HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd; HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;
HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST; HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER); HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER);
HobEnd->Reserved = 0; HobEnd->Reserved = 0;
HobEnd++; HobEnd++;
HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd; HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;
return Hob; return Hob;
} }
@ -161,7 +159,7 @@ BuildResourceDescriptorHob (
EFI_HOB_RESOURCE_DESCRIPTOR *Hob; EFI_HOB_RESOURCE_DESCRIPTOR *Hob;
Hob = CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR)); Hob = CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));
ASSERT(Hob != NULL); ASSERT (Hob != NULL);
Hob->ResourceType = ResourceType; Hob->ResourceType = ResourceType;
Hob->ResourceAttribute = ResourceAttribute; Hob->ResourceAttribute = ResourceAttribute;
@ -177,8 +175,7 @@ BuildFvHobs (
IN EFI_RESOURCE_ATTRIBUTE_TYPE *ResourceAttribute IN EFI_RESOURCE_ATTRIBUTE_TYPE *ResourceAttribute
) )
{ {
EFI_RESOURCE_ATTRIBUTE_TYPE Resource;
EFI_RESOURCE_ATTRIBUTE_TYPE Resource;
BuildFvHob (PhysicalStart, NumberOfBytes); BuildFvHob (PhysicalStart, NumberOfBytes);
@ -213,15 +210,15 @@ BuildFvHobs (
VOID * VOID *
EFIAPI EFIAPI
GetNextHob ( GetNextHob (
IN UINT16 Type, IN UINT16 Type,
IN CONST VOID *HobStart IN CONST VOID *HobStart
) )
{ {
EFI_PEI_HOB_POINTERS Hob; EFI_PEI_HOB_POINTERS Hob;
ASSERT (HobStart != NULL); ASSERT (HobStart != NULL);
Hob.Raw = (UINT8 *) HobStart; Hob.Raw = (UINT8 *)HobStart;
// //
// Parse the HOB list until end of list or matching type is found. // Parse the HOB list until end of list or matching type is found.
// //
@ -229,13 +226,13 @@ GetNextHob (
if (Hob.Header->HobType == Type) { if (Hob.Header->HobType == Type) {
return Hob.Raw; return Hob.Raw;
} }
Hob.Raw = GET_NEXT_HOB (Hob); Hob.Raw = GET_NEXT_HOB (Hob);
} }
return NULL; return NULL;
} }
/** /**
Returns the first instance of a HOB type among the whole HOB list. Returns the first instance of a HOB type among the whole HOB list.
@ -250,16 +247,15 @@ GetNextHob (
VOID * VOID *
EFIAPI EFIAPI
GetFirstHob ( GetFirstHob (
IN UINT16 Type IN UINT16 Type
) )
{ {
VOID *HobList; VOID *HobList;
HobList = GetHobList (); HobList = GetHobList ();
return GetNextHob (Type, HobList); return GetNextHob (Type, HobList);
} }
/** /**
This function searches the first instance of a HOB from the starting HOB pointer. This function searches the first instance of a HOB from the starting HOB pointer.
Such HOB should satisfy two conditions: Such HOB should satisfy two conditions:
@ -282,22 +278,24 @@ GetFirstHob (
VOID * VOID *
EFIAPI EFIAPI
GetNextGuidHob ( GetNextGuidHob (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN CONST VOID *HobStart IN CONST VOID *HobStart
){ )
{
EFI_PEI_HOB_POINTERS GuidHob; EFI_PEI_HOB_POINTERS GuidHob;
GuidHob.Raw = (UINT8 *) HobStart; GuidHob.Raw = (UINT8 *)HobStart;
while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) { while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {
if (CompareGuid (Guid, &GuidHob.Guid->Name)) { if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
break; break;
} }
GuidHob.Raw = GET_NEXT_HOB (GuidHob); GuidHob.Raw = GET_NEXT_HOB (GuidHob);
} }
return GuidHob.Raw; return GuidHob.Raw;
} }
/** /**
This function searches the first instance of a HOB among the whole HOB list. This function searches the first instance of a HOB among the whole HOB list.
Such HOB should satisfy two conditions: Such HOB should satisfy two conditions:
@ -315,16 +313,15 @@ GetNextGuidHob (
VOID * VOID *
EFIAPI EFIAPI
GetFirstGuidHob ( GetFirstGuidHob (
IN CONST EFI_GUID *Guid IN CONST EFI_GUID *Guid
) )
{ {
VOID *HobList; VOID *HobList;
HobList = GetHobList (); HobList = GetHobList ();
return GetNextGuidHob (Guid, HobList); return GetNextGuidHob (Guid, HobList);
} }
/** /**
Get the Boot Mode from the HOB list. Get the Boot Mode from the HOB list.
@ -348,7 +345,6 @@ GetBootMode (
return Hob.HandoffInformationTable->BootMode; return Hob.HandoffInformationTable->BootMode;
} }
/** /**
Get the Boot Mode from the HOB list. Get the Boot Mode from the HOB list.
@ -363,12 +359,12 @@ GetBootMode (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetBootMode ( SetBootMode (
IN EFI_BOOT_MODE BootMode IN EFI_BOOT_MODE BootMode
) )
{ {
EFI_PEI_HOB_POINTERS Hob; EFI_PEI_HOB_POINTERS Hob;
Hob.Raw = GetHobList (); Hob.Raw = GetHobList ();
Hob.HandoffInformationTable->BootMode = BootMode; Hob.HandoffInformationTable->BootMode = BootMode;
return BootMode; return BootMode;
} }
@ -391,16 +387,18 @@ SetBootMode (
VOID VOID
EFIAPI EFIAPI
BuildModuleHob ( BuildModuleHob (
IN CONST EFI_GUID *ModuleName, IN CONST EFI_GUID *ModuleName,
IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule, IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
IN UINT64 ModuleLength, IN UINT64 ModuleLength,
IN EFI_PHYSICAL_ADDRESS EntryPoint IN EFI_PHYSICAL_ADDRESS EntryPoint
) )
{ {
EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob; EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob;
ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) && ASSERT (
((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0)); ((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&
((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0)
);
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE)); Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));
@ -439,23 +437,22 @@ BuildModuleHob (
VOID * VOID *
EFIAPI EFIAPI
BuildGuidHob ( BuildGuidHob (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN DataLength IN UINTN DataLength
) )
{ {
EFI_HOB_GUID_TYPE *Hob; EFI_HOB_GUID_TYPE *Hob;
// //
// Make sure that data length is not too long. // Make sure that data length is not too long.
// //
ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE))); ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));
Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataLength)); Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16)(sizeof (EFI_HOB_GUID_TYPE) + DataLength));
CopyGuid (&Hob->Name, Guid); CopyGuid (&Hob->Name, Guid);
return Hob + 1; return Hob + 1;
} }
/** /**
Copies a data buffer to a newly-built HOB. Copies a data buffer to a newly-built HOB.
@ -479,9 +476,9 @@ BuildGuidHob (
VOID * VOID *
EFIAPI EFIAPI
BuildGuidDataHob ( BuildGuidDataHob (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN VOID *Data, IN VOID *Data,
IN UINTN DataLength IN UINTN DataLength
) )
{ {
VOID *HobData; VOID *HobData;
@ -493,7 +490,6 @@ BuildGuidDataHob (
return CopyMem (HobData, Data, DataLength); return CopyMem (HobData, Data, DataLength);
} }
/** /**
Builds a Firmware Volume HOB. Builds a Firmware Volume HOB.
@ -509,8 +505,8 @@ BuildGuidDataHob (
VOID VOID
EFIAPI EFIAPI
BuildFvHob ( BuildFvHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length IN UINT64 Length
) )
{ {
EFI_HOB_FIRMWARE_VOLUME *Hob; EFI_HOB_FIRMWARE_VOLUME *Hob;
@ -521,7 +517,6 @@ BuildFvHob (
Hob->Length = Length; Hob->Length = Length;
} }
/** /**
Builds a EFI_HOB_TYPE_FV2 HOB. Builds a EFI_HOB_TYPE_FV2 HOB.
@ -539,10 +534,10 @@ BuildFvHob (
VOID VOID
EFIAPI EFIAPI
BuildFv2Hob ( BuildFv2Hob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length, IN UINT64 Length,
IN CONST EFI_GUID *FvName, IN CONST EFI_GUID *FvName,
IN CONST EFI_GUID *FileName IN CONST EFI_GUID *FileName
) )
{ {
EFI_HOB_FIRMWARE_VOLUME2 *Hob; EFI_HOB_FIRMWARE_VOLUME2 *Hob;
@ -578,12 +573,12 @@ BuildFv2Hob (
VOID VOID
EFIAPI EFIAPI
BuildFv3Hob ( BuildFv3Hob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length, IN UINT64 Length,
IN UINT32 AuthenticationStatus, IN UINT32 AuthenticationStatus,
IN BOOLEAN ExtractedFv, IN BOOLEAN ExtractedFv,
IN CONST EFI_GUID *FvName OPTIONAL, IN CONST EFI_GUID *FvName OPTIONAL,
IN CONST EFI_GUID *FileName OPTIONAL IN CONST EFI_GUID *FileName OPTIONAL
) )
{ {
EFI_HOB_FIRMWARE_VOLUME3 *Hob; EFI_HOB_FIRMWARE_VOLUME3 *Hob;
@ -615,14 +610,13 @@ BuildFv3Hob (
VOID VOID
EFIAPI EFIAPI
BuildCvHob ( BuildCvHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length IN UINT64 Length
) )
{ {
ASSERT (FALSE); ASSERT (FALSE);
} }
/** /**
Builds a HOB for the CPU. Builds a HOB for the CPU.
@ -638,8 +632,8 @@ BuildCvHob (
VOID VOID
EFIAPI EFIAPI
BuildCpuHob ( BuildCpuHob (
IN UINT8 SizeOfMemorySpace, IN UINT8 SizeOfMemorySpace,
IN UINT8 SizeOfIoSpace IN UINT8 SizeOfIoSpace
) )
{ {
EFI_HOB_CPU *Hob; EFI_HOB_CPU *Hob;
@ -655,7 +649,6 @@ BuildCpuHob (
ZeroMem (Hob->Reserved, sizeof (Hob->Reserved)); ZeroMem (Hob->Reserved, sizeof (Hob->Reserved));
} }
/** /**
Builds a HOB for the Stack. Builds a HOB for the Stack.
@ -671,14 +664,16 @@ BuildCpuHob (
VOID VOID
EFIAPI EFIAPI
BuildStackHob ( BuildStackHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length IN UINT64 Length
) )
{ {
EFI_HOB_MEMORY_ALLOCATION_STACK *Hob; EFI_HOB_MEMORY_ALLOCATION_STACK *Hob;
ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) && ASSERT (
((Length & (EFI_PAGE_SIZE - 1)) == 0)); ((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
((Length & (EFI_PAGE_SIZE - 1)) == 0)
);
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK)); Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK));
@ -693,7 +688,6 @@ BuildStackHob (
ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved)); ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
} }
/** /**
Update the Stack Hob if the stack has been moved Update the Stack Hob if the stack has been moved
@ -703,11 +697,11 @@ BuildStackHob (
**/ **/
VOID VOID
UpdateStackHob ( UpdateStackHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length IN UINT64 Length
) )
{ {
EFI_PEI_HOB_POINTERS Hob; EFI_PEI_HOB_POINTERS Hob;
Hob.Raw = GetHobList (); Hob.Raw = GetHobList ();
while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw)) != NULL) { while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw)) != NULL) {
@ -725,15 +719,14 @@ UpdateStackHob (
// Update the BSP Stack Hob to reflect the new stack info. // Update the BSP Stack Hob to reflect the new stack info.
// //
Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress = BaseAddress; Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress = BaseAddress;
Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength = Length; Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength = Length;
break; break;
} }
Hob.Raw = GET_NEXT_HOB (Hob); Hob.Raw = GET_NEXT_HOB (Hob);
} }
} }
/** /**
Builds a HOB for the memory allocation. Builds a HOB for the memory allocation.
@ -750,15 +743,17 @@ UpdateStackHob (
VOID VOID
EFIAPI EFIAPI
BuildMemoryAllocationHob ( BuildMemoryAllocationHob (
IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length, IN UINT64 Length,
IN EFI_MEMORY_TYPE MemoryType IN EFI_MEMORY_TYPE MemoryType
) )
{ {
EFI_HOB_MEMORY_ALLOCATION *Hob; EFI_HOB_MEMORY_ALLOCATION *Hob;
ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) && ASSERT (
((Length & (EFI_PAGE_SIZE - 1)) == 0)); ((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
((Length & (EFI_PAGE_SIZE - 1)) == 0)
);
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION)); Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));
@ -772,24 +767,22 @@ BuildMemoryAllocationHob (
ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved)); ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
} }
VOID VOID
EFIAPI EFIAPI
BuildExtractSectionHob ( BuildExtractSectionHob (
IN EFI_GUID *Guid, IN EFI_GUID *Guid,
IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER SectionGetInfo, IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER SectionGetInfo,
IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER SectionExtraction IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER SectionExtraction
) )
{ {
EXTRACT_SECTION_DATA Data; EXTRACT_SECTION_DATA Data;
Data.SectionGetInfo = SectionGetInfo; Data.SectionGetInfo = SectionGetInfo;
Data.SectionExtraction = SectionExtraction; Data.SectionExtraction = SectionExtraction;
BuildGuidDataHob (Guid, &Data, sizeof (Data)); BuildGuidDataHob (Guid, &Data, sizeof (Data));
} }
PE_COFF_LOADER_PROTOCOL gPeCoffProtocol = { PE_COFF_LOADER_PROTOCOL gPeCoffProtocol = {
PeCoffLoaderGetImageInfo, PeCoffLoaderGetImageInfo,
PeCoffLoaderLoadImage, PeCoffLoaderLoadImage,
PeCoffLoaderRelocateImage, PeCoffLoaderRelocateImage,
@ -798,8 +791,6 @@ PE_COFF_LOADER_PROTOCOL gPeCoffProtocol = {
PeCoffLoaderUnloadImage PeCoffLoaderUnloadImage
}; };
VOID VOID
EFIAPI EFIAPI
BuildPeCoffLoaderHob ( BuildPeCoffLoaderHob (
@ -818,7 +809,7 @@ BuildMemoryTypeInformationHob (
VOID VOID
) )
{ {
EFI_MEMORY_TYPE_INFORMATION Info[10]; EFI_MEMORY_TYPE_INFORMATION Info[10];
Info[0].Type = EfiACPIReclaimMemory; Info[0].Type = EfiACPIReclaimMemory;
Info[0].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory); Info[0].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory);
@ -843,6 +834,5 @@ BuildMemoryTypeInformationHob (
Info[9].Type = EfiMaxMemoryType; Info[9].Type = EfiMaxMemoryType;
Info[9].NumberOfPages = 0; Info[9].NumberOfPages = 0;
BuildGuidDataHob (&gEfiMemoryTypeInformationGuid, &Info, sizeof (Info)); BuildGuidDataHob (&gEfiMemoryTypeInformationGuid, &Info, sizeof (Info));
} }

View File

@ -12,11 +12,9 @@
#include <PrePi.h> #include <PrePi.h>
#include <Library/ExtractGuidedSectionLib.h> #include <Library/ExtractGuidedSectionLib.h>
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \ #define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
(ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1)) (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
/** /**
Returns the highest bit set of the State field Returns the highest bit set of the State field
@ -30,7 +28,7 @@
**/ **/
STATIC STATIC
EFI_FFS_FILE_STATE EFI_FFS_FILE_STATE
GetFileState( GetFileState (
IN UINT8 ErasePolarity, IN UINT8 ErasePolarity,
IN EFI_FFS_FILE_HEADER *FfsHeader IN EFI_FFS_FILE_HEADER *FfsHeader
) )
@ -41,7 +39,7 @@ GetFileState(
FileState = FfsHeader->State; FileState = FfsHeader->State;
if (ErasePolarity != 0) { if (ErasePolarity != 0) {
FileState = (EFI_FFS_FILE_STATE)~FileState; FileState = (EFI_FFS_FILE_STATE) ~FileState;
} }
HighestBit = 0x80; HighestBit = 0x80;
@ -52,7 +50,6 @@ GetFileState(
return HighestBit; return HighestBit;
} }
/** /**
Calculates the checksum of the header of a file. Calculates the checksum of the header of a file.
The header is a zero byte checksum, so zero means header is good The header is a zero byte checksum, so zero means header is good
@ -68,21 +65,21 @@ CalculateHeaderChecksum (
IN EFI_FFS_FILE_HEADER *FileHeader IN EFI_FFS_FILE_HEADER *FileHeader
) )
{ {
UINT8 *Ptr; UINT8 *Ptr;
UINTN Index; UINTN Index;
UINT8 Sum; UINT8 Sum;
Sum = 0; Sum = 0;
Ptr = (UINT8 *)FileHeader; Ptr = (UINT8 *)FileHeader;
for (Index = 0; Index < sizeof(EFI_FFS_FILE_HEADER) - 3; Index += 4) { for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
Sum = (UINT8)(Sum + Ptr[Index]); Sum = (UINT8)(Sum + Ptr[Index]);
Sum = (UINT8)(Sum + Ptr[Index+1]); Sum = (UINT8)(Sum + Ptr[Index+1]);
Sum = (UINT8)(Sum + Ptr[Index+2]); Sum = (UINT8)(Sum + Ptr[Index+2]);
Sum = (UINT8)(Sum + Ptr[Index+3]); Sum = (UINT8)(Sum + Ptr[Index+3]);
} }
for (; Index < sizeof(EFI_FFS_FILE_HEADER); Index++) { for ( ; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
Sum = (UINT8)(Sum + Ptr[Index]); Sum = (UINT8)(Sum + Ptr[Index]);
} }
@ -98,7 +95,6 @@ CalculateHeaderChecksum (
return Sum; return Sum;
} }
/** /**
Given a FileHandle return the VolumeHandle Given a FileHandle return the VolumeHandle
@ -112,8 +108,8 @@ STATIC
BOOLEAN BOOLEAN
EFIAPI EFIAPI
FileHandleToVolume ( FileHandleToVolume (
IN EFI_PEI_FILE_HANDLE FileHandle, IN EFI_PEI_FILE_HANDLE FileHandle,
OUT EFI_PEI_FV_HANDLE *VolumeHandle OUT EFI_PEI_FV_HANDLE *VolumeHandle
) )
{ {
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
@ -128,8 +124,9 @@ FileHandleToVolume (
Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw); Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw);
if (Hob.Raw != NULL) { if (Hob.Raw != NULL) {
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)(Hob.FirmwareVolume->BaseAddress); FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)(Hob.FirmwareVolume->BaseAddress);
if (((UINT64) (UINTN) FileHandle > (UINT64) (UINTN) FwVolHeader ) && \ if (((UINT64)(UINTN)FileHandle > (UINT64)(UINTN)FwVolHeader) && \
((UINT64) (UINTN) FileHandle <= ((UINT64) (UINTN) FwVolHeader + FwVolHeader->FvLength - 1))) { ((UINT64)(UINTN)FileHandle <= ((UINT64)(UINTN)FwVolHeader + FwVolHeader->FvLength - 1)))
{
*VolumeHandle = (EFI_PEI_FV_HANDLE)FwVolHeader; *VolumeHandle = (EFI_PEI_FV_HANDLE)FwVolHeader;
return TRUE; return TRUE;
} }
@ -141,8 +138,6 @@ FileHandleToVolume (
return FALSE; return FALSE;
} }
/** /**
Given the input file pointer, search for the next matching file in the 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 FFS volume as defined by SearchType. The search starts from FileHeader inside
@ -155,22 +150,22 @@ FileHandleToVolume (
**/ **/
EFI_STATUS EFI_STATUS
FindFileEx ( FindFileEx (
IN CONST EFI_PEI_FV_HANDLE FvHandle, IN CONST EFI_PEI_FV_HANDLE FvHandle,
IN CONST EFI_GUID *FileName OPTIONAL, IN CONST EFI_GUID *FileName OPTIONAL,
IN EFI_FV_FILETYPE SearchType, IN EFI_FV_FILETYPE SearchType,
IN OUT EFI_PEI_FILE_HANDLE *FileHandle IN OUT EFI_PEI_FILE_HANDLE *FileHandle
) )
{ {
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
EFI_FFS_FILE_HEADER **FileHeader; EFI_FFS_FILE_HEADER **FileHeader;
EFI_FFS_FILE_HEADER *FfsFileHeader; EFI_FFS_FILE_HEADER *FfsFileHeader;
EFI_FIRMWARE_VOLUME_EXT_HEADER *FwVolExHeaderInfo; EFI_FIRMWARE_VOLUME_EXT_HEADER *FwVolExHeaderInfo;
UINT32 FileLength; UINT32 FileLength;
UINT32 FileOccupiedSize; UINT32 FileOccupiedSize;
UINT32 FileOffset; UINT32 FileOffset;
UINT64 FvLength; UINT64 FvLength;
UINT8 ErasePolarity; UINT8 ErasePolarity;
UINT8 FileState; UINT8 FileState;
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)FvHandle; FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)FvHandle;
FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle; FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
@ -191,22 +186,22 @@ FindFileEx (
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolHeader + FwVolHeader->HeaderLength); FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolHeader + FwVolHeader->HeaderLength);
if (FwVolHeader->ExtHeaderOffset != 0) { if (FwVolHeader->ExtHeaderOffset != 0) {
FwVolExHeaderInfo = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(((UINT8 *)FwVolHeader) + FwVolHeader->ExtHeaderOffset); FwVolExHeaderInfo = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(((UINT8 *)FwVolHeader) + FwVolHeader->ExtHeaderOffset);
FfsFileHeader = (EFI_FFS_FILE_HEADER *)(((UINT8 *)FwVolExHeaderInfo) + FwVolExHeaderInfo->ExtHeaderSize); FfsFileHeader = (EFI_FFS_FILE_HEADER *)(((UINT8 *)FwVolExHeaderInfo) + FwVolExHeaderInfo->ExtHeaderSize);
} }
} else { } else {
// //
// Length is 24 bits wide so mask upper 8 bits // Length is 24 bits wide so mask upper 8 bits
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned. // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
// //
FileLength = *(UINT32 *)(*FileHeader)->Size & 0x00FFFFFF; FileLength = *(UINT32 *)(*FileHeader)->Size & 0x00FFFFFF;
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)*FileHeader + FileOccupiedSize); FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)*FileHeader + FileOccupiedSize);
} }
// FFS files begin with a header that is aligned on an 8-byte boundary // FFS files begin with a header that is aligned on an 8-byte boundary
FfsFileHeader = ALIGN_POINTER (FfsFileHeader, 8); FfsFileHeader = ALIGN_POINTER (FfsFileHeader, 8);
FileOffset = (UINT32) ((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader); FileOffset = (UINT32)((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader);
ASSERT (FileOffset <= 0xFFFFFFFF); ASSERT (FileOffset <= 0xFFFFFFFF);
while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) { while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
@ -216,57 +211,55 @@ FindFileEx (
FileState = GetFileState (ErasePolarity, FfsFileHeader); FileState = GetFileState (ErasePolarity, FfsFileHeader);
switch (FileState) { switch (FileState) {
case EFI_FILE_HEADER_INVALID:
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
break;
case EFI_FILE_HEADER_INVALID: case EFI_FILE_DATA_VALID:
FileOffset += sizeof(EFI_FFS_FILE_HEADER); case EFI_FILE_MARKED_FOR_UPDATE:
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof(EFI_FFS_FILE_HEADER)); if (CalculateHeaderChecksum (FfsFileHeader) != 0) {
break; ASSERT (FALSE);
*FileHeader = NULL;
return EFI_NOT_FOUND;
}
case EFI_FILE_DATA_VALID: FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;
case EFI_FILE_MARKED_FOR_UPDATE: FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
if (CalculateHeaderChecksum (FfsFileHeader) != 0) {
ASSERT (FALSE);
*FileHeader = NULL;
return EFI_NOT_FOUND;
}
FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF; if (FileName != NULL) {
FileOccupiedSize = GET_OCCUPIED_SIZE(FileLength, 8); if (CompareGuid (&FfsFileHeader->Name, (EFI_GUID *)FileName)) {
*FileHeader = FfsFileHeader;
if (FileName != NULL) { return EFI_SUCCESS;
if (CompareGuid (&FfsFileHeader->Name, (EFI_GUID*)FileName)) { }
} else if (((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) &&
(FfsFileHeader->Type != EFI_FV_FILETYPE_FFS_PAD))
{
*FileHeader = FfsFileHeader; *FileHeader = FfsFileHeader;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} else if (((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) &&
(FfsFileHeader->Type != EFI_FV_FILETYPE_FFS_PAD)) {
*FileHeader = FfsFileHeader;
return EFI_SUCCESS;
}
FileOffset += FileOccupiedSize; FileOffset += FileOccupiedSize;
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize); FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);
break; break;
case EFI_FILE_DELETED: case EFI_FILE_DELETED:
FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF; FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;
FileOccupiedSize = GET_OCCUPIED_SIZE(FileLength, 8); FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
FileOffset += FileOccupiedSize; FileOffset += FileOccupiedSize;
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize); FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);
break; break;
default: default:
*FileHeader = NULL; *FileHeader = NULL;
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
} }
*FileHeader = NULL; *FileHeader = NULL;
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
Go through the file to search SectionType section, Go through the file to search SectionType section,
when meeting an encapsuled section. when meeting an encapsuled section.
@ -286,20 +279,19 @@ FfsProcessSection (
OUT VOID **OutputBuffer OUT VOID **OutputBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT32 SectionLength; UINT32 SectionLength;
UINT32 ParsedLength; UINT32 ParsedLength;
EFI_COMPRESSION_SECTION *CompressionSection; EFI_COMPRESSION_SECTION *CompressionSection;
EFI_COMPRESSION_SECTION2 *CompressionSection2; EFI_COMPRESSION_SECTION2 *CompressionSection2;
UINT32 DstBufferSize; UINT32 DstBufferSize;
VOID *ScratchBuffer; VOID *ScratchBuffer;
UINT32 ScratchBufferSize; UINT32 ScratchBufferSize;
VOID *DstBuffer; VOID *DstBuffer;
UINT16 SectionAttribute; UINT16 SectionAttribute;
UINT32 AuthenticationStatus; UINT32 AuthenticationStatus;
CHAR8 *CompressedData; CHAR8 *CompressedData;
UINTN CompressedDataLength; UINTN CompressedDataLength;
*OutputBuffer = NULL; *OutputBuffer = NULL;
ParsedLength = 0; ParsedLength = 0;
@ -311,35 +303,34 @@ FfsProcessSection (
if (Section->Type == SectionType) { if (Section->Type == SectionType) {
if (IS_SECTION2 (Section)) { if (IS_SECTION2 (Section)) {
*OutputBuffer = (VOID *)((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2)); *OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2));
} else { } else {
*OutputBuffer = (VOID *)((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER)); *OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER));
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) { } else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) {
if (Section->Type == EFI_SECTION_COMPRESSION) { if (Section->Type == EFI_SECTION_COMPRESSION) {
if (IS_SECTION2 (Section)) { if (IS_SECTION2 (Section)) {
CompressionSection2 = (EFI_COMPRESSION_SECTION2 *) Section; CompressionSection2 = (EFI_COMPRESSION_SECTION2 *)Section;
SectionLength = SECTION2_SIZE (Section); SectionLength = SECTION2_SIZE (Section);
if (CompressionSection2->CompressionType != EFI_STANDARD_COMPRESSION) { if (CompressionSection2->CompressionType != EFI_STANDARD_COMPRESSION) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION2 *) Section + 1); CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION2 *)Section + 1);
CompressedDataLength = (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION2); CompressedDataLength = (UINT32)SectionLength - sizeof (EFI_COMPRESSION_SECTION2);
} else { } else {
CompressionSection = (EFI_COMPRESSION_SECTION *) Section; CompressionSection = (EFI_COMPRESSION_SECTION *)Section;
SectionLength = SECTION_SIZE (Section); SectionLength = SECTION_SIZE (Section);
if (CompressionSection->CompressionType != EFI_STANDARD_COMPRESSION) { if (CompressionSection->CompressionType != EFI_STANDARD_COMPRESSION) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1); CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION *)Section + 1);
CompressedDataLength = (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION); CompressedDataLength = (UINT32)SectionLength - sizeof (EFI_COMPRESSION_SECTION);
} }
Status = UefiDecompressGetInfo ( Status = UefiDecompressGetInfo (
@ -364,6 +355,7 @@ FfsProcessSection (
DEBUG ((DEBUG_ERROR, "Decompress GetInfo Failed - %r\n", Status)); DEBUG ((DEBUG_ERROR, "Decompress GetInfo Failed - %r\n", Status));
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
// //
// Allocate scratch buffer // Allocate scratch buffer
// //
@ -371,6 +363,7 @@ FfsProcessSection (
if (ScratchBuffer == NULL) { if (ScratchBuffer == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
// //
// Allocate destination buffer, extra one page for adjustment // Allocate destination buffer, extra one page for adjustment
// //
@ -378,37 +371,39 @@ FfsProcessSection (
if (DstBuffer == NULL) { if (DstBuffer == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
// //
// DstBuffer still is one section. Adjust DstBuffer offset, skip EFI section header // DstBuffer still is one section. Adjust DstBuffer offset, skip EFI section header
// to make section data at page alignment. // to make section data at page alignment.
// //
if (IS_SECTION2 (Section)) if (IS_SECTION2 (Section)) {
DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER2); DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER2);
else } else {
DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER); DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER);
}
// //
// Call decompress function // Call decompress function
// //
if (Section->Type == EFI_SECTION_COMPRESSION) { if (Section->Type == EFI_SECTION_COMPRESSION) {
if (IS_SECTION2 (Section)) { if (IS_SECTION2 (Section)) {
CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION2 *) Section + 1); CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION2 *)Section + 1);
} } else {
else { CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION *)Section + 1);
CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1);
} }
Status = UefiDecompress ( Status = UefiDecompress (
CompressedData, CompressedData,
DstBuffer, DstBuffer,
ScratchBuffer ScratchBuffer
); );
} else if (Section->Type == EFI_SECTION_GUID_DEFINED) { } else if (Section->Type == EFI_SECTION_GUID_DEFINED) {
Status = ExtractGuidedSectionDecode ( Status = ExtractGuidedSectionDecode (
Section, Section,
&DstBuffer, &DstBuffer,
ScratchBuffer, ScratchBuffer,
&AuthenticationStatus &AuthenticationStatus
); );
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -419,12 +414,12 @@ FfsProcessSection (
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} else { } else {
return FfsProcessSection ( return FfsProcessSection (
SectionType, SectionType,
DstBuffer, DstBuffer,
DstBufferSize, DstBufferSize,
OutputBuffer OutputBuffer
); );
} }
} }
if (IS_SECTION2 (Section)) { if (IS_SECTION2 (Section)) {
@ -432,6 +427,7 @@ FfsProcessSection (
} else { } else {
SectionLength = SECTION_SIZE (Section); SectionLength = SECTION_SIZE (Section);
} }
// //
// SectionLength is adjusted it is 4 byte aligned. // SectionLength is adjusted it is 4 byte aligned.
// Go to the next section // Go to the next section
@ -439,14 +435,12 @@ FfsProcessSection (
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4); SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
ASSERT (SectionLength != 0); ASSERT (SectionLength != 0);
ParsedLength += SectionLength; ParsedLength += SectionLength;
Section = (EFI_COMMON_SECTION_HEADER *)((UINT8 *)Section + SectionLength); Section = (EFI_COMMON_SECTION_HEADER *)((UINT8 *)Section + SectionLength);
} }
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
This service enables discovery sections of a given type within a valid FFS file. This service enables discovery sections of a given type within a valid FFS file.
@ -462,14 +456,14 @@ FfsProcessSection (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsFindSectionData ( FfsFindSectionData (
IN EFI_SECTION_TYPE SectionType, IN EFI_SECTION_TYPE SectionType,
IN EFI_PEI_FILE_HANDLE FileHandle, IN EFI_PEI_FILE_HANDLE FileHandle,
OUT VOID **SectionData OUT VOID **SectionData
) )
{ {
EFI_FFS_FILE_HEADER *FfsFileHeader; EFI_FFS_FILE_HEADER *FfsFileHeader;
UINT32 FileSize; UINT32 FileSize;
EFI_COMMON_SECTION_HEADER *Section; EFI_COMMON_SECTION_HEADER *Section;
FfsFileHeader = (EFI_FFS_FILE_HEADER *)(FileHandle); FfsFileHeader = (EFI_FFS_FILE_HEADER *)(FileHandle);
@ -478,23 +472,18 @@ FfsFindSectionData (
// Does not include FfsFileHeader header size // Does not include FfsFileHeader header size
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned. // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
// //
Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1); Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1);
FileSize = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF; FileSize = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;
FileSize -= sizeof (EFI_FFS_FILE_HEADER); FileSize -= sizeof (EFI_FFS_FILE_HEADER);
return FfsProcessSection ( return FfsProcessSection (
SectionType, SectionType,
Section, Section,
FileSize, FileSize,
SectionData SectionData
); );
} }
/** /**
This service enables discovery of additional firmware files. This service enables discovery of additional firmware files.
@ -511,15 +500,14 @@ FfsFindSectionData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsFindNextFile ( FfsFindNextFile (
IN UINT8 SearchType, IN UINT8 SearchType,
IN EFI_PEI_FV_HANDLE VolumeHandle, IN EFI_PEI_FV_HANDLE VolumeHandle,
IN OUT EFI_PEI_FILE_HANDLE *FileHandle IN OUT EFI_PEI_FILE_HANDLE *FileHandle
) )
{ {
return FindFileEx (VolumeHandle, NULL, SearchType, FileHandle); return FindFileEx (VolumeHandle, NULL, SearchType, FileHandle);
} }
/** /**
This service enables discovery of additional firmware volumes. This service enables discovery of additional firmware volumes.
@ -534,12 +522,11 @@ FfsFindNextFile (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsFindNextVolume ( FfsFindNextVolume (
IN UINTN Instance, IN UINTN Instance,
IN OUT EFI_PEI_FV_HANDLE *VolumeHandle IN OUT EFI_PEI_FV_HANDLE *VolumeHandle
) )
{ {
EFI_PEI_HOB_POINTERS Hob; EFI_PEI_HOB_POINTERS Hob;
Hob.Raw = GetHobList (); Hob.Raw = GetHobList ();
if (Hob.Raw == NULL) { if (Hob.Raw == NULL) {
@ -559,10 +546,8 @@ FfsFindNextVolume (
} while (Hob.Raw != NULL); } while (Hob.Raw != NULL);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
Find a file in the volume by name Find a file in the volume by name
@ -584,25 +569,25 @@ FfsFindNextVolume (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsFindFileByName ( FfsFindFileByName (
IN CONST EFI_GUID *FileName, IN CONST EFI_GUID *FileName,
IN EFI_PEI_FV_HANDLE VolumeHandle, IN EFI_PEI_FV_HANDLE VolumeHandle,
OUT EFI_PEI_FILE_HANDLE *FileHandle OUT EFI_PEI_FILE_HANDLE *FileHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
if ((VolumeHandle == NULL) || (FileName == NULL) || (FileHandle == NULL)) { if ((VolumeHandle == NULL) || (FileName == NULL) || (FileHandle == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Status = FindFileEx (VolumeHandle, FileName, 0, FileHandle); Status = FindFileEx (VolumeHandle, FileName, 0, FileHandle);
if (Status == EFI_NOT_FOUND) { if (Status == EFI_NOT_FOUND) {
*FileHandle = NULL; *FileHandle = NULL;
} }
return Status; return Status;
} }
/** /**
Get information about the file by name. Get information about the file by name.
@ -626,10 +611,10 @@ FfsGetFileInfo (
OUT EFI_FV_FILE_INFO *FileInfo OUT EFI_FV_FILE_INFO *FileInfo
) )
{ {
UINT8 FileState; UINT8 FileState;
UINT8 ErasePolarity; UINT8 ErasePolarity;
EFI_FFS_FILE_HEADER *FileHeader; EFI_FFS_FILE_HEADER *FileHeader;
EFI_PEI_FV_HANDLE VolumeHandle; EFI_PEI_FV_HANDLE VolumeHandle;
if ((FileHandle == NULL) || (FileInfo == NULL)) { if ((FileHandle == NULL) || (FileInfo == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -639,11 +624,11 @@ FfsGetFileInfo (
// //
// Retrieve the FirmwareVolume which the file resides in. // Retrieve the FirmwareVolume which the file resides in.
// //
if (!FileHandleToVolume(FileHandle, &VolumeHandle)) { if (!FileHandleToVolume (FileHandle, &VolumeHandle)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (((EFI_FIRMWARE_VOLUME_HEADER*)VolumeHandle)->Attributes & EFI_FVB2_ERASE_POLARITY) { if (((EFI_FIRMWARE_VOLUME_HEADER *)VolumeHandle)->Attributes & EFI_FVB2_ERASE_POLARITY) {
ErasePolarity = 1; ErasePolarity = 1;
} else { } else {
ErasePolarity = 0; ErasePolarity = 0;
@ -652,7 +637,7 @@ FfsGetFileInfo (
// //
// Get FileState which is the highest bit of the State // Get FileState which is the highest bit of the State
// //
FileState = GetFileState (ErasePolarity, (EFI_FFS_FILE_HEADER*)FileHandle); FileState = GetFileState (ErasePolarity, (EFI_FFS_FILE_HEADER *)FileHandle);
switch (FileState) { switch (FileState) {
case EFI_FILE_DATA_VALID: case EFI_FILE_DATA_VALID:
@ -660,18 +645,17 @@ FfsGetFileInfo (
break; break;
default: default:
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
FileHeader = (EFI_FFS_FILE_HEADER *)FileHandle; FileHeader = (EFI_FFS_FILE_HEADER *)FileHandle;
CopyMem (&FileInfo->FileName, &FileHeader->Name, sizeof(EFI_GUID)); CopyMem (&FileInfo->FileName, &FileHeader->Name, sizeof (EFI_GUID));
FileInfo->FileType = FileHeader->Type; FileInfo->FileType = FileHeader->Type;
FileInfo->FileAttributes = FileHeader->Attributes; FileInfo->FileAttributes = FileHeader->Attributes;
FileInfo->BufferSize = ((*(UINT32 *)FileHeader->Size) & 0x00FFFFFF) - sizeof (EFI_FFS_FILE_HEADER); FileInfo->BufferSize = ((*(UINT32 *)FileHeader->Size) & 0x00FFFFFF) - sizeof (EFI_FFS_FILE_HEADER);
FileInfo->Buffer = (FileHeader + 1); FileInfo->Buffer = (FileHeader + 1);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Get Information about the volume by name Get Information about the volume by name
@ -695,8 +679,8 @@ FfsGetVolumeInfo (
OUT EFI_FV_INFO *VolumeInfo OUT EFI_FV_INFO *VolumeInfo
) )
{ {
EFI_FIRMWARE_VOLUME_HEADER FwVolHeader; EFI_FIRMWARE_VOLUME_HEADER FwVolHeader;
EFI_FIRMWARE_VOLUME_EXT_HEADER *FwVolExHeaderInfo; EFI_FIRMWARE_VOLUME_EXT_HEADER *FwVolExHeaderInfo;
if (VolumeInfo == NULL) { if (VolumeInfo == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -714,20 +698,20 @@ FfsGetVolumeInfo (
if (FwVolHeader.Signature != EFI_FVH_SIGNATURE) { if (FwVolHeader.Signature != EFI_FVH_SIGNATURE) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
VolumeInfo->FvAttributes = FwVolHeader.Attributes; VolumeInfo->FvAttributes = FwVolHeader.Attributes;
VolumeInfo->FvStart = (VOID *) VolumeHandle; VolumeInfo->FvStart = (VOID *)VolumeHandle;
VolumeInfo->FvSize = FwVolHeader.FvLength; VolumeInfo->FvSize = FwVolHeader.FvLength;
CopyMem (&VolumeInfo->FvFormat, &FwVolHeader.FileSystemGuid, sizeof(EFI_GUID)); CopyMem (&VolumeInfo->FvFormat, &FwVolHeader.FileSystemGuid, sizeof (EFI_GUID));
if (FwVolHeader.ExtHeaderOffset != 0) { if (FwVolHeader.ExtHeaderOffset != 0) {
FwVolExHeaderInfo = (EFI_FIRMWARE_VOLUME_EXT_HEADER*)(((UINT8 *)VolumeHandle) + FwVolHeader.ExtHeaderOffset); FwVolExHeaderInfo = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(((UINT8 *)VolumeHandle) + FwVolHeader.ExtHeaderOffset);
CopyMem (&VolumeInfo->FvName, &FwVolExHeaderInfo->FvName, sizeof(EFI_GUID)); CopyMem (&VolumeInfo->FvName, &FwVolExHeaderInfo->FvName, sizeof (EFI_GUID));
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Search through every FV until you find a file of type FileType Search through every FV until you find a file of type FileType
@ -742,13 +726,13 @@ FfsGetVolumeInfo (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsAnyFvFindFirstFile ( FfsAnyFvFindFirstFile (
IN EFI_FV_FILETYPE FileType, IN EFI_FV_FILETYPE FileType,
OUT EFI_PEI_FV_HANDLE *VolumeHandle, OUT EFI_PEI_FV_HANDLE *VolumeHandle,
OUT EFI_PEI_FILE_HANDLE *FileHandle OUT EFI_PEI_FILE_HANDLE *FileHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN Instance; UINTN Instance;
// //
// Search every FV for the DXE Core // Search every FV for the DXE Core
@ -756,17 +740,14 @@ FfsAnyFvFindFirstFile (
Instance = 0; Instance = 0;
*FileHandle = NULL; *FileHandle = NULL;
while (1) while (1) {
{
Status = FfsFindNextVolume (Instance++, VolumeHandle); Status = FfsFindNextVolume (Instance++, VolumeHandle);
if (EFI_ERROR (Status)) if (EFI_ERROR (Status)) {
{
break; break;
} }
Status = FfsFindNextFile (FileType, *VolumeHandle, FileHandle); Status = FfsFindNextFile (FileType, *VolumeHandle, FileHandle);
if (!EFI_ERROR (Status)) if (!EFI_ERROR (Status)) {
{
break; break;
} }
} }
@ -774,8 +755,6 @@ FfsAnyFvFindFirstFile (
return Status; return Status;
} }
/** /**
Get Fv image from the FV type file, then add FV & FV2 Hob. Get Fv image from the FV type file, then add FV & FV2 Hob.
@ -789,7 +768,7 @@ FfsAnyFvFindFirstFile (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FfsProcessFvFile ( FfsProcessFvFile (
IN EFI_PEI_FILE_HANDLE FvFileHandle IN EFI_PEI_FILE_HANDLE FvFileHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -799,8 +778,7 @@ FfsProcessFvFile (
VOID *FvBuffer; VOID *FvBuffer;
EFI_PEI_HOB_POINTERS HobFv2; EFI_PEI_HOB_POINTERS HobFv2;
FvBuffer = NULL; FvBuffer = NULL;
// //
// Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already
@ -814,6 +792,7 @@ FfsProcessFvFile (
// //
return EFI_SUCCESS; return EFI_SUCCESS;
} }
HobFv2.Raw = GET_NEXT_HOB (HobFv2); HobFv2.Raw = GET_NEXT_HOB (HobFv2);
} }
@ -843,30 +822,30 @@ FfsProcessFvFile (
// //
// Check FvImage // Check FvImage
// //
if ((UINTN) FvImageInfo.FvStart % FvAlignment != 0) { if ((UINTN)FvImageInfo.FvStart % FvAlignment != 0) {
FvBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINT32) FvImageInfo.FvSize), FvAlignment); FvBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINT32)FvImageInfo.FvSize), FvAlignment);
if (FvBuffer == NULL) { if (FvBuffer == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
CopyMem (FvBuffer, FvImageInfo.FvStart, (UINTN) FvImageInfo.FvSize);
CopyMem (FvBuffer, FvImageInfo.FvStart, (UINTN)FvImageInfo.FvSize);
// //
// Update FvImageInfo after reload FvImage to new aligned memory // Update FvImageInfo after reload FvImage to new aligned memory
// //
FfsGetVolumeInfo ((EFI_PEI_FV_HANDLE) FvBuffer, &FvImageInfo); FfsGetVolumeInfo ((EFI_PEI_FV_HANDLE)FvBuffer, &FvImageInfo);
} }
// //
// Inform HOB consumer phase, i.e. DXE core, the existence of this FV // Inform HOB consumer phase, i.e. DXE core, the existence of this FV
// //
BuildFvHob ((EFI_PHYSICAL_ADDRESS) (UINTN) FvImageInfo.FvStart, FvImageInfo.FvSize); BuildFvHob ((EFI_PHYSICAL_ADDRESS)(UINTN)FvImageInfo.FvStart, FvImageInfo.FvSize);
// //
// Makes the encapsulated volume show up in DXE phase to skip processing of // Makes the encapsulated volume show up in DXE phase to skip processing of
// encapsulated file again. // encapsulated file again.
// //
BuildFv2Hob ( BuildFv2Hob (
(EFI_PHYSICAL_ADDRESS) (UINTN) FvImageInfo.FvStart, (EFI_PHYSICAL_ADDRESS)(UINTN)FvImageInfo.FvStart,
FvImageInfo.FvSize, FvImageInfo.FvSize,
&FvImageInfo.FvName, &FvImageInfo.FvName,
&(((EFI_FFS_FILE_HEADER *)FvFileHandle)->Name) &(((EFI_FFS_FILE_HEADER *)FvFileHandle)->Name)

View File

@ -26,7 +26,6 @@
#include <Guid/MemoryAllocationHob.h> #include <Guid/MemoryAllocationHob.h>
#define GET_HOB_TYPE(Hob) ((Hob).Header->HobType) #define GET_HOB_TYPE(Hob) ((Hob).Header->HobType)
#define GET_HOB_LENGTH(Hob) ((Hob).Header->HobLength) #define GET_HOB_LENGTH(Hob) ((Hob).Header->HobLength)
#define GET_NEXT_HOB(Hob) ((Hob).Raw + GET_HOB_LENGTH (Hob)) #define GET_NEXT_HOB(Hob) ((Hob).Raw + GET_HOB_LENGTH (Hob))
@ -35,7 +34,7 @@
// //
// Get the data and data size field of GUID // Get the data and data size field of GUID
// //
#define GET_GUID_HOB_DATA(GuidHob) ((VOID *) (((UINT8 *) &((GuidHob)->Name)) + sizeof (EFI_GUID))) #define GET_GUID_HOB_DATA(GuidHob) ((VOID *) (((UINT8 *) &((GuidHob)->Name)) + sizeof (EFI_GUID)))
#define GET_GUID_HOB_DATA_SIZE(GuidHob) (((GuidHob)->Header).HobLength - sizeof (EFI_HOB_GUID_TYPE)) #define GET_GUID_HOB_DATA_SIZE(GuidHob) (((GuidHob)->Header).HobLength - sizeof (EFI_HOB_GUID_TYPE))
#endif #endif

View File

@ -16,21 +16,21 @@ EFI_STATUS
EFIAPI EFIAPI
SecWinNtPeiLoadFile ( SecWinNtPeiLoadFile (
IN VOID *Pe32Data, IN VOID *Pe32Data,
IN EFI_PHYSICAL_ADDRESS *ImageAddress, IN EFI_PHYSICAL_ADDRESS *ImageAddress,
IN UINT64 *ImageSize, IN UINT64 *ImageSize,
IN EFI_PHYSICAL_ADDRESS *EntryPoint IN EFI_PHYSICAL_ADDRESS *EntryPoint
); );
STATIC STATIC
VOID* VOID *
EFIAPI EFIAPI
AllocateCodePages ( AllocateCodePages (
IN UINTN Pages IN UINTN Pages
) )
{ {
VOID *Alloc; VOID *Alloc;
EFI_PEI_HOB_POINTERS Hob; EFI_PEI_HOB_POINTERS Hob;
Alloc = AllocatePages (Pages); Alloc = AllocatePages (Pages);
if (Alloc == NULL) { if (Alloc == NULL) {
@ -44,6 +44,7 @@ AllocateCodePages (
Hob.MemoryAllocation->AllocDescriptor.MemoryType = EfiBootServicesCode; Hob.MemoryAllocation->AllocDescriptor.MemoryType = EfiBootServicesCode;
return Alloc; return Alloc;
} }
Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, GET_NEXT_HOB (Hob)); Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, GET_NEXT_HOB (Hob));
} }
@ -53,19 +54,18 @@ AllocateCodePages (
return NULL; return NULL;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LoadPeCoffImage ( LoadPeCoffImage (
IN VOID *PeCoffImage, IN VOID *PeCoffImage,
OUT EFI_PHYSICAL_ADDRESS *ImageAddress, OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
OUT UINT64 *ImageSize, OUT UINT64 *ImageSize,
OUT EFI_PHYSICAL_ADDRESS *EntryPoint OUT EFI_PHYSICAL_ADDRESS *EntryPoint
) )
{ {
RETURN_STATUS Status; RETURN_STATUS Status;
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
VOID *Buffer; VOID *Buffer;
ZeroMem (&ImageContext, sizeof (ImageContext)); ZeroMem (&ImageContext, sizeof (ImageContext));
@ -75,14 +75,12 @@ LoadPeCoffImage (
Status = PeCoffLoaderGetImageInfo (&ImageContext); Status = PeCoffLoaderGetImageInfo (&ImageContext);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
// Allocate Memory for the image // Allocate Memory for the image
// //
Buffer = AllocateCodePages (EFI_SIZE_TO_PAGES((UINT32)ImageContext.ImageSize)); Buffer = AllocateCodePages (EFI_SIZE_TO_PAGES ((UINT32)ImageContext.ImageSize));
ASSERT (Buffer != 0); ASSERT (Buffer != 0);
ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer; ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;
// //
@ -97,7 +95,6 @@ LoadPeCoffImage (
Status = PeCoffLoaderRelocateImage (&ImageContext); Status = PeCoffLoaderRelocateImage (&ImageContext);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
*ImageAddress = ImageContext.ImageAddress; *ImageAddress = ImageContext.ImageAddress;
*ImageSize = ImageContext.ImageSize; *ImageSize = ImageContext.ImageSize;
*EntryPoint = ImageContext.EntryPoint; *EntryPoint = ImageContext.EntryPoint;
@ -111,11 +108,9 @@ LoadPeCoffImage (
return Status; return Status;
} }
typedef typedef
VOID VOID
(EFIAPI *DXE_CORE_ENTRY_POINT) ( (EFIAPI *DXE_CORE_ENTRY_POINT)(
IN VOID *HobStart IN VOID *HobStart
); );
@ -126,24 +121,23 @@ LoadDxeCoreFromFfsFile (
IN UINTN StackSize IN UINTN StackSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VOID *PeCoffImage; VOID *PeCoffImage;
EFI_PHYSICAL_ADDRESS ImageAddress; EFI_PHYSICAL_ADDRESS ImageAddress;
UINT64 ImageSize; UINT64 ImageSize;
EFI_PHYSICAL_ADDRESS EntryPoint; EFI_PHYSICAL_ADDRESS EntryPoint;
VOID *BaseOfStack; VOID *BaseOfStack;
VOID *TopOfStack; VOID *TopOfStack;
VOID *Hob; VOID *Hob;
EFI_FV_FILE_INFO FvFileInfo; EFI_FV_FILE_INFO FvFileInfo;
Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage); Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = LoadPeCoffImage (PeCoffImage, &ImageAddress, &ImageSize, &EntryPoint); Status = LoadPeCoffImage (PeCoffImage, &ImageAddress, &ImageSize, &EntryPoint);
// For NT32 Debug Status = SecWinNtPeiLoadFile (PeCoffImage, &ImageAddress, &ImageSize, &EntryPoint); // For NT32 Debug Status = SecWinNtPeiLoadFile (PeCoffImage, &ImageAddress, &ImageSize, &EntryPoint);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
@ -152,7 +146,7 @@ LoadDxeCoreFromFfsFile (
Status = FfsGetFileInfo (FileHandle, &FvFileInfo); Status = FfsGetFileInfo (FileHandle, &FvFileInfo);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
BuildModuleHob (&FvFileInfo.FileName, (EFI_PHYSICAL_ADDRESS)(UINTN)ImageAddress, EFI_SIZE_TO_PAGES ((UINT32) ImageSize) * EFI_PAGE_SIZE, EntryPoint); BuildModuleHob (&FvFileInfo.FileName, (EFI_PHYSICAL_ADDRESS)(UINTN)ImageAddress, EFI_SIZE_TO_PAGES ((UINT32)ImageSize) * EFI_PAGE_SIZE, EntryPoint);
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Loading DxeCore at 0x%10p EntryPoint=0x%10p\n", (VOID *)(UINTN)ImageAddress, (VOID *)(UINTN)EntryPoint)); DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Loading DxeCore at 0x%10p EntryPoint=0x%10p\n", (VOID *)(UINTN)ImageAddress, (VOID *)(UINTN)EntryPoint));
@ -160,9 +154,8 @@ LoadDxeCoreFromFfsFile (
if (StackSize == 0) { if (StackSize == 0) {
// User the current stack // User the current stack
((DXE_CORE_ENTRY_POINT)(UINTN)EntryPoint) (Hob); ((DXE_CORE_ENTRY_POINT)(UINTN)EntryPoint)(Hob);
} else { } else {
// //
// Allocate 128KB for the Stack // Allocate 128KB for the Stack
// //
@ -173,13 +166,13 @@ LoadDxeCoreFromFfsFile (
// Compute the top of the stack we were allocated. Pre-allocate a UINTN // Compute the top of the stack we were allocated. Pre-allocate a UINTN
// for safety. // for safety.
// //
TopOfStack = (VOID *) ((UINTN) BaseOfStack + EFI_SIZE_TO_PAGES (StackSize) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT); TopOfStack = (VOID *)((UINTN)BaseOfStack + EFI_SIZE_TO_PAGES (StackSize) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT);
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT); TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
// //
// Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore. // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore.
// //
UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN) BaseOfStack, StackSize); UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN)BaseOfStack, StackSize);
SwitchStack ( SwitchStack (
(SWITCH_STACK_ENTRY_POINT)(UINTN)EntryPoint, (SWITCH_STACK_ENTRY_POINT)(UINTN)EntryPoint,
@ -187,7 +180,6 @@ LoadDxeCoreFromFfsFile (
NULL, NULL,
TopOfStack TopOfStack
); );
} }
// Should never get here as DXE Core does not return // Should never get here as DXE Core does not return
@ -197,8 +189,6 @@ LoadDxeCoreFromFfsFile (
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LoadDxeCoreFromFv ( LoadDxeCoreFromFv (
@ -206,9 +196,9 @@ LoadDxeCoreFromFv (
IN UINTN StackSize IN UINTN StackSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PEI_FV_HANDLE VolumeHandle; EFI_PEI_FV_HANDLE VolumeHandle;
EFI_PEI_FILE_HANDLE FileHandle = NULL; EFI_PEI_FILE_HANDLE FileHandle = NULL;
if (FvInstance != NULL) { if (FvInstance != NULL) {
// //
@ -229,16 +219,15 @@ LoadDxeCoreFromFv (
return Status; return Status;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DecompressFirstFv ( DecompressFirstFv (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PEI_FV_HANDLE VolumeHandle; EFI_PEI_FV_HANDLE VolumeHandle;
EFI_PEI_FILE_HANDLE FileHandle; EFI_PEI_FILE_HANDLE FileHandle;
Status = FfsAnyFvFindFirstFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, &VolumeHandle, &FileHandle); Status = FfsAnyFvFindFirstFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, &VolumeHandle, &FileHandle);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {

View File

@ -14,8 +14,6 @@
#include <Library/PrePiLib.h> #include <Library/PrePiLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
/** /**
Allocates one or more 4KB pages of type EfiBootServicesData. Allocates one or more 4KB pages of type EfiBootServicesData.
@ -32,11 +30,11 @@
VOID * VOID *
EFIAPI EFIAPI
AllocatePages ( AllocatePages (
IN UINTN Pages IN UINTN Pages
) )
{ {
EFI_PEI_HOB_POINTERS Hob; EFI_PEI_HOB_POINTERS Hob;
EFI_PHYSICAL_ADDRESS Offset; EFI_PHYSICAL_ADDRESS Offset;
Hob.Raw = GetHobList (); Hob.Raw = GetHobList ();
@ -65,15 +63,14 @@ AllocatePages (
// Create a memory allocation HOB. // Create a memory allocation HOB.
// //
BuildMemoryAllocationHob ( BuildMemoryAllocationHob (
Hob.HandoffInformationTable->EfiFreeMemoryTop, Hob.HandoffInformationTable->EfiFreeMemoryTop,
Pages * EFI_PAGE_SIZE, Pages * EFI_PAGE_SIZE,
EfiBootServicesData EfiBootServicesData
); );
return (VOID *)(UINTN)Hob.HandoffInformationTable->EfiFreeMemoryTop; return (VOID *)(UINTN)Hob.HandoffInformationTable->EfiFreeMemoryTop;
} }
} }
/** /**
Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment. Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
@ -97,8 +94,8 @@ AllocateAlignedPages (
IN UINTN Alignment IN UINTN Alignment
) )
{ {
VOID *Memory; VOID *Memory;
UINTN AlignmentMask; UINTN AlignmentMask;
// //
// Alignment must be a power of two or zero. // Alignment must be a power of two or zero.
@ -108,6 +105,7 @@ AllocateAlignedPages (
if (Pages == 0) { if (Pages == 0) {
return NULL; return NULL;
} }
// //
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow. // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
// //
@ -121,9 +119,9 @@ AllocateAlignedPages (
} else { } else {
AlignmentMask = Alignment - 1; AlignmentMask = Alignment - 1;
} }
return (VOID *) (UINTN) (((UINTN) Memory + AlignmentMask) & ~AlignmentMask);
}
return (VOID *)(UINTN)(((UINTN)Memory + AlignmentMask) & ~AlignmentMask);
}
/** /**
Frees one or more 4KB pages that were previously allocated with one of the page allocation Frees one or more 4KB pages that were previously allocated with one of the page allocation
@ -171,11 +169,10 @@ AllocatePool (
IN UINTN AllocationSize IN UINTN AllocationSize
) )
{ {
EFI_HOB_MEMORY_POOL *Hob; EFI_HOB_MEMORY_POOL *Hob;
Hob = GetHobList (); Hob = GetHobList ();
// //
// Verify that there is sufficient memory to satisfy the allocation // Verify that there is sufficient memory to satisfy the allocation
// //
@ -183,10 +180,11 @@ AllocatePool (
// Please call AllocatePages for big allocations // Please call AllocatePages for big allocations
return 0; return 0;
} else { } else {
Hob = (EFI_HOB_MEMORY_POOL *)CreateHob (
Hob = (EFI_HOB_MEMORY_POOL *)CreateHob (EFI_HOB_TYPE_MEMORY_POOL, EFI_HOB_TYPE_MEMORY_POOL,
(UINT16)(sizeof (EFI_HOB_MEMORY_POOL) + (UINT16)(sizeof (EFI_HOB_MEMORY_POOL) +
AllocationSize)); AllocationSize)
);
return (VOID *)(Hob + 1); return (VOID *)(Hob + 1);
} }
} }
@ -210,7 +208,7 @@ AllocateZeroPool (
IN UINTN AllocationSize IN UINTN AllocationSize
) )
{ {
VOID *Buffer; VOID *Buffer;
Buffer = AllocatePool (AllocationSize); Buffer = AllocatePool (AllocationSize);
if (Buffer == NULL) { if (Buffer == NULL) {
@ -239,7 +237,7 @@ AllocateZeroPool (
VOID VOID
EFIAPI EFIAPI
FreePool ( FreePool (
IN VOID *Buffer IN VOID *Buffer
) )
{ {
// Not implemented yet // Not implemented yet

View File

@ -15,7 +15,6 @@
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/RealTimeClockLib.h> #include <Library/RealTimeClockLib.h>
/** /**
Returns the current time and date information, and the time-keeping capabilities Returns the current time and date information, and the time-keeping capabilities
of the hardware platform. of the hardware platform.
@ -42,7 +41,6 @@ LibGetTime (
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
/** /**
Sets the current local time and date information. Sets the current local time and date information.
@ -56,7 +54,7 @@ LibGetTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibSetTime ( LibSetTime (
IN EFI_TIME *Time IN EFI_TIME *Time
) )
{ {
// //
@ -65,7 +63,6 @@ LibSetTime (
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
/** /**
Returns the current wakeup alarm clock setting. Returns the current wakeup alarm clock setting.
@ -81,16 +78,15 @@ LibSetTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibGetWakeupTime ( LibGetWakeupTime (
OUT BOOLEAN *Enabled, OUT BOOLEAN *Enabled,
OUT BOOLEAN *Pending, OUT BOOLEAN *Pending,
OUT EFI_TIME *Time OUT EFI_TIME *Time
) )
{ {
// Not a required feature // Not a required feature
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
/** /**
Sets the system wakeup alarm clock time. Sets the system wakeup alarm clock time.
@ -107,16 +103,14 @@ LibGetWakeupTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibSetWakeupTime ( LibSetWakeupTime (
IN BOOLEAN Enabled, IN BOOLEAN Enabled,
OUT EFI_TIME *Time OUT EFI_TIME *Time
) )
{ {
// Not a required feature // Not a required feature
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
/** /**
This is the declaration of an EFI image entry point. This can be the entry point to an application This is the declaration of an EFI image entry point. This can be the entry point to an application
written to this specification, an EFI boot service driver, or an EFI runtime driver. written to this specification, an EFI boot service driver, or an EFI runtime driver.
@ -130,8 +124,8 @@ LibSetWakeupTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibRtcInitialize ( LibRtcInitialize (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
// //
@ -140,7 +134,6 @@ LibRtcInitialize (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Fixup internal data so that EFI can be call in virtual mode. Fixup internal data so that EFI can be call in virtual mode.
Call the passed in Child Notify event and convert any pointers in Call the passed in Child Notify event and convert any pointers in
@ -152,8 +145,8 @@ LibRtcInitialize (
VOID VOID
EFIAPI EFIAPI
LibRtcVirtualNotifyEvent ( LibRtcVirtualNotifyEvent (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
// //
@ -164,6 +157,3 @@ LibRtcVirtualNotifyEvent (
// //
return; return;
} }

View File

@ -10,14 +10,12 @@
**/ **/
#include <PiDxe.h> #include <PiDxe.h>
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/EfiResetSystemLib.h> #include <Library/EfiResetSystemLib.h>
/** /**
Resets the entire platform. Resets the entire platform.
@ -32,40 +30,39 @@
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LibResetSystem ( LibResetSystem (
IN EFI_RESET_TYPE ResetType, IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus, IN EFI_STATUS ResetStatus,
IN UINTN DataSize, IN UINTN DataSize,
IN CHAR16 *ResetData OPTIONAL IN CHAR16 *ResetData OPTIONAL
) )
{ {
UINTN Address; UINTN Address;
UINT8 Data; UINT8 Data;
switch (ResetType) { switch (ResetType) {
case EfiResetCold: case EfiResetCold:
// system power cycle // system power cycle
// Example using IoLib functions to do IO. // Example using IoLib functions to do IO.
Address = 0x12345678; Address = 0x12345678;
Data = MmioRead8 (Address); Data = MmioRead8 (Address);
MmioWrite8 (Address, Data | 0x01); MmioWrite8 (Address, Data | 0x01);
// Note this is a bad example asa MmioOr8 (Address, 0x01) does the same thing // Note this is a bad example asa MmioOr8 (Address, 0x01) does the same thing
break; break;
case EfiResetWarm: case EfiResetWarm:
// not a full power cycle, maybe memory stays around. // not a full power cycle, maybe memory stays around.
// if not support do the same thing as EfiResetCold. // if not support do the same thing as EfiResetCold.
break; break;
case EfiResetShutdown: case EfiResetShutdown:
// turn off the system. // turn off the system.
// if not support do the same thing as EfiResetCold. // if not support do the same thing as EfiResetCold.
break; break;
default: default:
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
// //
@ -74,8 +71,6 @@ LibResetSystem (
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
/** /**
Initialize any infrastructure required for LibResetSystem () to function. Initialize any infrastructure required for LibResetSystem () to function.
@ -94,4 +89,3 @@ LibInitializeResetSystem (
{ {
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -27,22 +27,22 @@ EpochToEfiTime (
OUT EFI_TIME *Time OUT EFI_TIME *Time
) )
{ {
UINTN a; UINTN a;
UINTN b; UINTN b;
UINTN c; UINTN c;
UINTN d; UINTN d;
UINTN g; UINTN g;
UINTN j; UINTN j;
UINTN m; UINTN m;
UINTN y; UINTN y;
UINTN da; UINTN da;
UINTN db; UINTN db;
UINTN dc; UINTN dc;
UINTN dg; UINTN dg;
UINTN hh; UINTN hh;
UINTN mm; UINTN mm;
UINTN ss; UINTN ss;
UINTN J; UINTN J;
J = (EpochSeconds / 86400) + 2440588; J = (EpochSeconds / 86400) + 2440588;
j = J + 32044; j = J + 32044;
@ -65,14 +65,13 @@ EpochToEfiTime (
ss = EpochSeconds % 60; ss = EpochSeconds % 60;
a = (EpochSeconds - ss) / 60; a = (EpochSeconds - ss) / 60;
mm = a % 60; mm = a % 60;
b = (a - mm) / 60; b = (a - mm) / 60;
hh = b % 24; hh = b % 24;
Time->Hour = (UINT8)hh; Time->Hour = (UINT8)hh;
Time->Minute = (UINT8)mm; Time->Minute = (UINT8)mm;
Time->Second = (UINT8)ss; Time->Second = (UINT8)ss;
Time->Nanosecond = 0; Time->Nanosecond = 0;
} }
/** /**
@ -89,13 +88,13 @@ EfiGetEpochDays (
IN EFI_TIME *Time IN EFI_TIME *Time
) )
{ {
UINTN a; UINTN a;
UINTN y; UINTN y;
UINTN m; UINTN m;
UINTN JulianDate; // Absolute Julian Date representation of the supplied Time UINTN JulianDate; // Absolute Julian Date representation of the supplied Time
UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY
a = (14 - Time->Month) / 12 ; a = (14 - Time->Month) / 12;
y = Time->Year + 4800 - a; y = Time->Year + 4800 - a;
m = Time->Month + (12*a) - 3; m = Time->Month + (12*a) - 3;
@ -121,8 +120,8 @@ EfiTimeToEpoch (
IN EFI_TIME *Time IN EFI_TIME *Time
) )
{ {
UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY
UINTN EpochSeconds; UINTN EpochSeconds;
EpochDays = EfiGetEpochDays (Time); EpochDays = EfiGetEpochDays (Time);
@ -144,7 +143,7 @@ EfiTimeToWday (
IN EFI_TIME *Time IN EFI_TIME *Time
) )
{ {
UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY
EpochDays = EfiGetEpochDays (Time); EpochDays = EfiGetEpochDays (Time);
@ -165,7 +164,7 @@ EfiTimeToWday (
BOOLEAN BOOLEAN
EFIAPI EFIAPI
IsLeapYear ( IsLeapYear (
IN EFI_TIME *Time IN EFI_TIME *Time
) )
{ {
if (Time->Year % 4 == 0) { if (Time->Year % 4 == 0) {
@ -198,12 +197,13 @@ IsDayValid (
IN EFI_TIME *Time IN EFI_TIME *Time
) )
{ {
STATIC CONST INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; STATIC CONST INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (Time->Day < 1 || if ((Time->Day < 1) ||
Time->Day > DayOfMonth[Time->Month - 1] || (Time->Day > DayOfMonth[Time->Month - 1]) ||
(Time->Month == 2 && (!IsLeapYear (Time) && Time->Day > 28)) ((Time->Month == 2) && (!IsLeapYear (Time) && (Time->Day > 28)))
) { )
{
return FALSE; return FALSE;
} }
@ -267,21 +267,22 @@ IsValidDaylight (
BOOLEAN BOOLEAN
EFIAPI EFIAPI
IsTimeValid ( IsTimeValid (
IN EFI_TIME *Time IN EFI_TIME *Time
) )
{ {
// Check the input parameters are within the range specified by UEFI // Check the input parameters are within the range specified by UEFI
if ((Time->Year < 2000) || if ((Time->Year < 2000) ||
(Time->Year > 2099) || (Time->Year > 2099) ||
(Time->Month < 1 ) || (Time->Month < 1) ||
(Time->Month > 12 ) || (Time->Month > 12) ||
(!IsDayValid (Time) ) || (!IsDayValid (Time)) ||
(Time->Hour > 23 ) || (Time->Hour > 23) ||
(Time->Minute > 59 ) || (Time->Minute > 59) ||
(Time->Second > 59 ) || (Time->Second > 59) ||
(Time->Nanosecond > 999999999) || (Time->Nanosecond > 999999999) ||
(!IsValidTimeZone(Time->TimeZone)) || (!IsValidTimeZone (Time->TimeZone)) ||
(!IsValidDaylight(Time->Daylight))) { (!IsValidDaylight (Time->Daylight)))
{
return FALSE; return FALSE;
} }

View File

@ -23,9 +23,9 @@
#include <Library/TimeBaseLib.h> #include <Library/TimeBaseLib.h>
#include <Library/UefiRuntimeLib.h> #include <Library/UefiRuntimeLib.h>
STATIC CONST CHAR16 mEpochVariableName[] = L"RtcEpochSeconds"; STATIC CONST CHAR16 mEpochVariableName[] = L"RtcEpochSeconds";
STATIC CONST CHAR16 mTimeZoneVariableName[] = L"RtcTimeZone"; STATIC CONST CHAR16 mTimeZoneVariableName[] = L"RtcTimeZone";
STATIC CONST CHAR16 mDaylightVariableName[] = L"RtcDaylight"; STATIC CONST CHAR16 mDaylightVariableName[] = L"RtcDaylight";
/** /**
Returns the current time and date information, and the time-keeping capabilities Returns the current time and date information, and the time-keeping capabilities
@ -67,19 +67,19 @@ LibGetTime (
} }
// Get the epoch time from non-volatile storage // Get the epoch time from non-volatile storage
Size = sizeof (UINTN); Size = sizeof (UINTN);
EpochSeconds = 0; EpochSeconds = 0;
Status = EfiGetVariable ( Status = EfiGetVariable (
(CHAR16 *)mEpochVariableName, (CHAR16 *)mEpochVariableName,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
NULL, NULL,
&Size, &Size,
(VOID *)&EpochSeconds (VOID *)&EpochSeconds
); );
// Fall back to compilation-time epoch if not set // Fall back to compilation-time epoch if not set
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
ASSERT(Status != EFI_INVALID_PARAMETER); ASSERT (Status != EFI_INVALID_PARAMETER);
ASSERT(Status != EFI_BUFFER_TOO_SMALL); ASSERT (Status != EFI_BUFFER_TOO_SMALL);
// //
// The following is intended to produce a compilation error on build // The following is intended to produce a compilation error on build
// environments where BUILD_EPOCH can not be set from inline shell. // environments where BUILD_EPOCH can not be set from inline shell.
@ -101,11 +101,12 @@ LibGetTime (
&EpochSeconds &EpochSeconds
); );
} }
Counter = GetPerformanceCounter ();
Counter = GetPerformanceCounter ();
EpochSeconds += DivU64x64Remainder (Counter, Freq, &Remainder); EpochSeconds += DivU64x64Remainder (Counter, Freq, &Remainder);
// Get the current time zone information from non-volatile storage // Get the current time zone information from non-volatile storage
Size = sizeof (TimeZone); Size = sizeof (TimeZone);
Status = EfiGetVariable ( Status = EfiGetVariable (
(CHAR16 *)mTimeZoneVariableName, (CHAR16 *)mTimeZoneVariableName,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
@ -115,8 +116,8 @@ LibGetTime (
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
ASSERT(Status != EFI_INVALID_PARAMETER); ASSERT (Status != EFI_INVALID_PARAMETER);
ASSERT(Status != EFI_BUFFER_TOO_SMALL); ASSERT (Status != EFI_BUFFER_TOO_SMALL);
if (Status != EFI_NOT_FOUND) { if (Status != EFI_NOT_FOUND) {
return Status; return Status;
@ -146,8 +147,9 @@ LibGetTime (
Time->TimeZone = TimeZone; Time->TimeZone = TimeZone;
// Check TimeZone bounds: -1440 to 1440 or 2047 // Check TimeZone bounds: -1440 to 1440 or 2047
if (((Time->TimeZone < -1440) || (Time->TimeZone > 1440)) if ( ((Time->TimeZone < -1440) || (Time->TimeZone > 1440))
&& (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE)) { && (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE))
{
Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE; Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE;
} }
@ -158,18 +160,18 @@ LibGetTime (
} }
// Get the current daylight information from non-volatile storage // Get the current daylight information from non-volatile storage
Size = sizeof (Daylight); Size = sizeof (Daylight);
Status = EfiGetVariable ( Status = EfiGetVariable (
(CHAR16 *)mDaylightVariableName, (CHAR16 *)mDaylightVariableName,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
NULL, NULL,
&Size, &Size,
(VOID *)&Daylight (VOID *)&Daylight
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
ASSERT(Status != EFI_INVALID_PARAMETER); ASSERT (Status != EFI_INVALID_PARAMETER);
ASSERT(Status != EFI_BUFFER_TOO_SMALL); ASSERT (Status != EFI_BUFFER_TOO_SMALL);
if (Status != EFI_NOT_FOUND) { if (Status != EFI_NOT_FOUND) {
return Status; return Status;
@ -253,14 +255,16 @@ LibSetTime (
EpochSeconds = EfiTimeToEpoch (Time); EpochSeconds = EfiTimeToEpoch (Time);
// Adjust for the correct time zone, i.e. convert to UTC time zone // Adjust for the correct time zone, i.e. convert to UTC time zone
if ((Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE) if ( (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE)
&& (EpochSeconds > Time->TimeZone * SEC_PER_MIN)) { && (EpochSeconds > Time->TimeZone * SEC_PER_MIN))
{
EpochSeconds -= Time->TimeZone * SEC_PER_MIN; EpochSeconds -= Time->TimeZone * SEC_PER_MIN;
} }
// Adjust for the correct period // Adjust for the correct period
if (((Time->Daylight & EFI_TIME_IN_DAYLIGHT) == EFI_TIME_IN_DAYLIGHT) if ( ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) == EFI_TIME_IN_DAYLIGHT)
&& (EpochSeconds > SEC_PER_HOUR)) { && (EpochSeconds > SEC_PER_HOUR))
{
// Convert to un-adjusted time, i.e. fall back one hour // Convert to un-adjusted time, i.e. fall back one hour
EpochSeconds -= SEC_PER_HOUR; EpochSeconds -= SEC_PER_HOUR;
} }
@ -300,9 +304,9 @@ LibSetTime (
(CHAR16 *)mDaylightVariableName, (CHAR16 *)mDaylightVariableName,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof(Time->Daylight), sizeof (Time->Daylight),
(VOID *)&(Time->Daylight) (VOID *)&(Time->Daylight)
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((
DEBUG_ERROR, DEBUG_ERROR,

View File

@ -49,12 +49,11 @@ WaitForTick (
installed. All consumers must treat this as a read-only field. installed. All consumers must treat this as a read-only field.
**/ **/
EFI_METRONOME_ARCH_PROTOCOL gMetronome = { EFI_METRONOME_ARCH_PROTOCOL gMetronome = {
WaitForTick, WaitForTick,
FixedPcdGet32 (PcdMetronomeTickPeriod) FixedPcdGet32 (PcdMetronomeTickPeriod)
}; };
/** /**
The WaitForTick() function waits for the number of ticks specified by The WaitForTick() function waits for the number of ticks specified by
TickNumber from a known time source in the platform. If TickNumber of TickNumber from a known time source in the platform. If TickNumber of
@ -93,11 +92,8 @@ WaitForTick (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_HANDLE gMetronomeHandle = NULL; EFI_HANDLE gMetronomeHandle = NULL;
/** /**
Initialize the state information for the CPU Architectural Protocol Initialize the state information for the CPU Architectural Protocol
@ -112,8 +108,8 @@ EFI_HANDLE gMetronomeHandle = NULL;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
MetronomeInitialize ( MetronomeInitialize (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -124,11 +120,11 @@ MetronomeInitialize (
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&gMetronomeHandle, &gMetronomeHandle,
&gEfiMetronomeArchProtocolGuid, &gMetronome, &gEfiMetronomeArchProtocolGuid,
&gMetronome,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }

View File

@ -26,12 +26,12 @@ EFI_HANDLE mHandle = NULL;
// variable instead. // variable instead.
// //
typedef struct { typedef struct {
INT16 TimeZone; INT16 TimeZone;
UINT8 Daylight; UINT8 Daylight;
} NON_VOLATILE_TIME_SETTINGS; } NON_VOLATILE_TIME_SETTINGS;
STATIC CONST CHAR16 mTimeSettingsVariableName[] = L"RtcTimeSettings"; STATIC CONST CHAR16 mTimeSettingsVariableName[] = L"RtcTimeSettings";
STATIC NON_VOLATILE_TIME_SETTINGS mTimeSettings; STATIC NON_VOLATILE_TIME_SETTINGS mTimeSettings;
/** /**
Returns the current time and date information, and the time-keeping capabilities Returns the current time and date information, and the time-keeping capabilities
@ -49,8 +49,8 @@ STATIC NON_VOLATILE_TIME_SETTINGS mTimeSettings;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GetTime ( GetTime (
OUT EFI_TIME *Time, OUT EFI_TIME *Time,
OUT EFI_TIME_CAPABILITIES *Capabilities OUT EFI_TIME_CAPABILITIES *Capabilities
) )
{ {
if (Time == NULL) { if (Time == NULL) {
@ -67,8 +67,6 @@ GetTime (
return LibGetTime (Time, Capabilities); return LibGetTime (Time, Capabilities);
} }
/** /**
Sets the current local time and date information. Sets the current local time and date information.
@ -82,23 +80,23 @@ GetTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetTime ( SetTime (
IN EFI_TIME *Time IN EFI_TIME *Time
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
BOOLEAN TimeSettingsChanged; BOOLEAN TimeSettingsChanged;
if (Time == NULL || !IsTimeValid (Time)) { if ((Time == NULL) || !IsTimeValid (Time)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
TimeSettingsChanged = FALSE; TimeSettingsChanged = FALSE;
if (mTimeSettings.TimeZone != Time->TimeZone || if ((mTimeSettings.TimeZone != Time->TimeZone) ||
mTimeSettings.Daylight != Time->Daylight) { (mTimeSettings.Daylight != Time->Daylight))
{
mTimeSettings.TimeZone = Time->TimeZone; mTimeSettings.TimeZone = Time->TimeZone;
mTimeSettings.Daylight = Time->Daylight; mTimeSettings.Daylight = Time->Daylight;
TimeSettingsChanged = TRUE; TimeSettingsChanged = TRUE;
} }
Status = LibSetTime (Time); Status = LibSetTime (Time);
@ -114,15 +112,16 @@ SetTime (
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS, EFI_VARIABLE_RUNTIME_ACCESS,
sizeof (mTimeSettings), sizeof (mTimeSettings),
(VOID *)&mTimeSettings); (VOID *)&mTimeSettings
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Returns the current wakeup alarm clock setting. Returns the current wakeup alarm clock setting.
@ -138,12 +137,12 @@ SetTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GetWakeupTime ( GetWakeupTime (
OUT BOOLEAN *Enabled, OUT BOOLEAN *Enabled,
OUT BOOLEAN *Pending, OUT BOOLEAN *Pending,
OUT EFI_TIME *Time OUT EFI_TIME *Time
) )
{ {
if (Time == NULL || Enabled == NULL || Pending == NULL) { if ((Time == NULL) || (Enabled == NULL) || (Pending == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -157,7 +156,6 @@ GetWakeupTime (
return LibGetWakeupTime (Enabled, Pending, Time); return LibGetWakeupTime (Enabled, Pending, Time);
} }
/** /**
Sets the system wakeup alarm clock time. Sets the system wakeup alarm clock time.
@ -174,15 +172,13 @@ GetWakeupTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetWakeupTime ( SetWakeupTime (
IN BOOLEAN Enabled, IN BOOLEAN Enabled,
OUT EFI_TIME *Time OUT EFI_TIME *Time
) )
{ {
return LibSetWakeupTime (Enabled, Time); return LibSetWakeupTime (Enabled, Time);
} }
/** /**
This is the declaration of an EFI image entry point. This can be the entry point to an application This is the declaration of an EFI image entry point. This can be the entry point to an application
written to this specification, an EFI boot service driver, or an EFI runtime driver. written to this specification, an EFI boot service driver, or an EFI runtime driver.
@ -196,8 +192,8 @@ SetWakeupTime (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeRealTimeClock ( InitializeRealTimeClock (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -208,14 +204,23 @@ InitializeRealTimeClock (
return Status; return Status;
} }
Size = sizeof (mTimeSettings); Size = sizeof (mTimeSettings);
Status = EfiGetVariable ((CHAR16 *)mTimeSettingsVariableName, Status = EfiGetVariable (
&gEfiCallerIdGuid, NULL, &Size, (VOID *)&mTimeSettings); (CHAR16 *)mTimeSettingsVariableName,
&gEfiCallerIdGuid,
NULL,
&Size,
(VOID *)&mTimeSettings
);
if (EFI_ERROR (Status) || if (EFI_ERROR (Status) ||
!IsValidTimeZone (mTimeSettings.TimeZone) || !IsValidTimeZone (mTimeSettings.TimeZone) ||
!IsValidDaylight (mTimeSettings.Daylight)) { !IsValidDaylight (mTimeSettings.Daylight))
DEBUG ((DEBUG_WARN, "%a: using default timezone/daylight settings\n", {
__FUNCTION__)); DEBUG ((
DEBUG_WARN,
"%a: using default timezone/daylight settings\n",
__FUNCTION__
));
mTimeSettings.TimeZone = EFI_UNSPECIFIED_TIMEZONE; mTimeSettings.TimeZone = EFI_UNSPECIFIED_TIMEZONE;
mTimeSettings.Daylight = 0; mTimeSettings.Daylight = 0;
@ -235,4 +240,3 @@ InitializeRealTimeClock (
return Status; return Status;
} }

View File

@ -13,7 +13,6 @@
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
#include <Library/EfiResetSystemLib.h> #include <Library/EfiResetSystemLib.h>
/** /**
Resets the entire platform. Resets the entire platform.
@ -28,18 +27,16 @@
VOID VOID
EFIAPI EFIAPI
ResetSystemViaLib ( ResetSystemViaLib (
IN EFI_RESET_TYPE ResetType, IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus, IN EFI_STATUS ResetStatus,
IN UINTN DataSize, IN UINTN DataSize,
IN VOID *ResetData OPTIONAL IN VOID *ResetData OPTIONAL
) )
{ {
LibResetSystem (ResetType, ResetStatus, DataSize, ResetData); LibResetSystem (ResetType, ResetStatus, DataSize, ResetData);
return; return;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeReset ( InitializeReset (
@ -65,4 +62,3 @@ InitializeReset (
return Status; return Status;
} }

View File

@ -65,30 +65,26 @@
#include <Protocol/SimpleTextOut.h> #include <Protocol/SimpleTextOut.h>
#include <Protocol/DevicePath.h> #include <Protocol/DevicePath.h>
#define MODE0_COLUMN_COUNT 80
#define MODE0_COLUMN_COUNT 80 #define MODE0_ROW_COUNT 25
#define MODE0_ROW_COUNT 25
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TextInReset( TextInReset (
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ReadKeyStroke( ReadKeyStroke (
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
OUT EFI_INPUT_KEY *Key OUT EFI_INPUT_KEY *Key
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TextOutReset( TextOutReset (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
); );
@ -96,8 +92,8 @@ TextOutReset(
CHAR8 * CHAR8 *
EFIAPI EFIAPI
SafeUnicodeStrToAsciiStr ( SafeUnicodeStrToAsciiStr (
IN CONST CHAR16 *Source, IN CONST CHAR16 *Source,
OUT CHAR8 *Destination OUT CHAR8 *Destination
); );
EFI_STATUS EFI_STATUS
@ -107,7 +103,6 @@ OutputString (
IN CHAR16 *String IN CHAR16 *String
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TestString ( TestString (
@ -115,7 +110,6 @@ TestString (
IN CHAR16 *String IN CHAR16 *String
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
QueryMode ( QueryMode (
@ -125,30 +119,26 @@ QueryMode (
OUT UINTN *Rows OUT UINTN *Rows
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetMode( SetMode (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
IN UINTN ModeNumber IN UINTN ModeNumber
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetAttribute( SetAttribute (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
IN UINTN Attribute IN UINTN Attribute
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ClearScreen ( ClearScreen (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetCursorPosition ( SetCursorPosition (
@ -157,7 +147,6 @@ SetCursorPosition (
IN UINTN Row IN UINTN Row
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EnableCursor ( EnableCursor (
@ -165,23 +154,22 @@ EnableCursor (
IN BOOLEAN Enable IN BOOLEAN Enable
); );
EFI_SIMPLE_TEXT_INPUT_PROTOCOL mSimpleTextIn = {
EFI_SIMPLE_TEXT_INPUT_PROTOCOL mSimpleTextIn = {
TextInReset, TextInReset,
ReadKeyStroke, ReadKeyStroke,
NULL NULL
}; };
EFI_SIMPLE_TEXT_OUTPUT_MODE mSimpleTextOutMode = { EFI_SIMPLE_TEXT_OUTPUT_MODE mSimpleTextOutMode = {
1, 1,
0, 0,
EFI_TEXT_ATTR( EFI_LIGHTGRAY, EFI_BLACK ), EFI_TEXT_ATTR (EFI_LIGHTGRAY,EFI_BLACK),
0, 0,
0, 0,
TRUE TRUE
}; };
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL mSimpleTextOut = { EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL mSimpleTextOut = {
TextOutReset, TextOutReset,
OutputString, OutputString,
TestString, TestString,
@ -194,36 +182,36 @@ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL mSimpleTextOut = {
&mSimpleTextOutMode &mSimpleTextOutMode
}; };
EFI_HANDLE mInstallHandle = NULL; EFI_HANDLE mInstallHandle = NULL;
typedef struct { typedef struct {
VENDOR_DEVICE_PATH Guid; VENDOR_DEVICE_PATH Guid;
UART_DEVICE_PATH Uart; UART_DEVICE_PATH Uart;
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
} SIMPLE_TEXT_OUT_DEVICE_PATH; } SIMPLE_TEXT_OUT_DEVICE_PATH;
SIMPLE_TEXT_OUT_DEVICE_PATH mDevicePath = { SIMPLE_TEXT_OUT_DEVICE_PATH mDevicePath = {
{ {
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0} }, { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 }
},
EFI_CALLER_ID_GUID EFI_CALLER_ID_GUID
}, },
{ {
{ MESSAGING_DEVICE_PATH, MSG_UART_DP, { sizeof (UART_DEVICE_PATH), 0} }, { MESSAGING_DEVICE_PATH, MSG_UART_DP, { sizeof (UART_DEVICE_PATH), 0 }
0, // Reserved },
FixedPcdGet64 (PcdUartDefaultBaudRate), // BaudRate 0, // Reserved
FixedPcdGet8 (PcdUartDefaultDataBits), // DataBits FixedPcdGet64 (PcdUartDefaultBaudRate), // BaudRate
FixedPcdGet8 (PcdUartDefaultParity), // Parity (N) FixedPcdGet8 (PcdUartDefaultDataBits), // DataBits
FixedPcdGet8 (PcdUartDefaultStopBits) // StopBits FixedPcdGet8 (PcdUartDefaultParity), // Parity (N)
FixedPcdGet8 (PcdUartDefaultStopBits) // StopBits
}, },
{ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0} } { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
}
}; };
BOOLEAN BOOLEAN
TextOutIsValidAscii ( TextOutIsValidAscii (
IN CHAR16 Ascii IN CHAR16 Ascii
) )
{ {
// //
@ -236,59 +224,56 @@ TextOutIsValidAscii (
return FALSE; return FALSE;
} }
BOOLEAN BOOLEAN
TextOutIsValidEfiCntlChar ( TextOutIsValidEfiCntlChar (
IN CHAR16 Char IN CHAR16 Char
) )
{ {
// //
// only support four control characters. // only support four control characters.
// //
if (Char == CHAR_NULL || if ((Char == CHAR_NULL) ||
Char == CHAR_BACKSPACE || (Char == CHAR_BACKSPACE) ||
Char == CHAR_LINEFEED || (Char == CHAR_LINEFEED) ||
Char == CHAR_CARRIAGE_RETURN || (Char == CHAR_CARRIAGE_RETURN) ||
Char == CHAR_TAB ) { (Char == CHAR_TAB))
{
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
VOID VOID
EFIAPI EFIAPI
WaitForKeyEvent ( WaitForKeyEvent (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
if (SerialPortPoll ()) { if (SerialPortPoll ()) {
gBS->SignalEvent (Event); gBS->SignalEvent (Event);
} }
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TextInReset ( TextInReset (
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
) )
{ {
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ReadKeyStroke ( ReadKeyStroke (
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
OUT EFI_INPUT_KEY *Key OUT EFI_INPUT_KEY *Key
) )
{ {
CHAR8 Char; CHAR8 Char;
if (!SerialPortPoll ()) { if (!SerialPortPoll ()) {
return EFI_NOT_READY; return EFI_NOT_READY;
@ -310,113 +295,114 @@ ReadKeyStroke (
if (Char == '[') { if (Char == '[') {
SerialPortRead ((UINT8 *)&Char, 1); SerialPortRead ((UINT8 *)&Char, 1);
switch (Char) { switch (Char) {
case 'A': case 'A':
Key->ScanCode = SCAN_UP; Key->ScanCode = SCAN_UP;
break; break;
case 'B': case 'B':
Key->ScanCode = SCAN_DOWN; Key->ScanCode = SCAN_DOWN;
break; break;
case 'C': case 'C':
Key->ScanCode = SCAN_RIGHT; Key->ScanCode = SCAN_RIGHT;
break; break;
case 'D': case 'D':
Key->ScanCode = SCAN_LEFT; Key->ScanCode = SCAN_LEFT;
break; break;
case 'H': case 'H':
Key->ScanCode = SCAN_HOME; Key->ScanCode = SCAN_HOME;
break; break;
case 'K': case 'K':
case 'F': // PC ANSI case 'F': // PC ANSI
Key->ScanCode = SCAN_END; Key->ScanCode = SCAN_END;
break; break;
case '@': case '@':
case 'L': case 'L':
Key->ScanCode = SCAN_INSERT; Key->ScanCode = SCAN_INSERT;
break; break;
case 'P': case 'P':
case 'X': // PC ANSI case 'X': // PC ANSI
Key->ScanCode = SCAN_DELETE; Key->ScanCode = SCAN_DELETE;
break; break;
case 'U': case 'U':
case '/': case '/':
case 'G': // PC ANSI case 'G': // PC ANSI
Key->ScanCode = SCAN_PAGE_DOWN; Key->ScanCode = SCAN_PAGE_DOWN;
break; break;
case 'V': case 'V':
case '?': case '?':
case 'I': // PC ANSI case 'I': // PC ANSI
Key->ScanCode = SCAN_PAGE_UP; Key->ScanCode = SCAN_PAGE_UP;
break; break;
// PCANSI that does not conflict with VT100 // PCANSI that does not conflict with VT100
case 'M': case 'M':
Key->ScanCode = SCAN_F1; Key->ScanCode = SCAN_F1;
break; break;
case 'N': case 'N':
Key->ScanCode = SCAN_F2; Key->ScanCode = SCAN_F2;
break; break;
case 'O': case 'O':
Key->ScanCode = SCAN_F3; Key->ScanCode = SCAN_F3;
break; break;
case 'Q': case 'Q':
Key->ScanCode = SCAN_F5; Key->ScanCode = SCAN_F5;
break; break;
case 'R': case 'R':
Key->ScanCode = SCAN_F6; Key->ScanCode = SCAN_F6;
break; break;
case 'S': case 'S':
Key->ScanCode = SCAN_F7; Key->ScanCode = SCAN_F7;
break; break;
case 'T': case 'T':
Key->ScanCode = SCAN_F8; Key->ScanCode = SCAN_F8;
break; break;
default: default:
Key->UnicodeChar = Char; Key->UnicodeChar = Char;
break; break;
} }
} else if (Char == '0') { } else if (Char == '0') {
SerialPortRead ((UINT8 *)&Char, 1); SerialPortRead ((UINT8 *)&Char, 1);
switch (Char) { switch (Char) {
case 'P': case 'P':
Key->ScanCode = SCAN_F1; Key->ScanCode = SCAN_F1;
break; break;
case 'Q': case 'Q':
Key->ScanCode = SCAN_F2; Key->ScanCode = SCAN_F2;
break; break;
case 'w': case 'w':
Key->ScanCode = SCAN_F3; Key->ScanCode = SCAN_F3;
break; break;
case 'x': case 'x':
Key->ScanCode = SCAN_F4; Key->ScanCode = SCAN_F4;
break; break;
case 't': case 't':
Key->ScanCode = SCAN_F5; Key->ScanCode = SCAN_F5;
break; break;
case 'u': case 'u':
Key->ScanCode = SCAN_F6; Key->ScanCode = SCAN_F6;
break; break;
case 'q': case 'q':
Key->ScanCode = SCAN_F7; Key->ScanCode = SCAN_F7;
break; break;
case 'r': case 'r':
Key->ScanCode = SCAN_F8; Key->ScanCode = SCAN_F8;
break; break;
case 'p': case 'p':
Key->ScanCode = SCAN_F9; Key->ScanCode = SCAN_F9;
break; break;
case 'm': case 'm':
Key->ScanCode = SCAN_F10; Key->ScanCode = SCAN_F10;
break; break;
default : default:
break; break;
} }
} }
} else if (Char < ' ') { } else if (Char < ' ') {
if ((Char == CHAR_BACKSPACE) || if ((Char == CHAR_BACKSPACE) ||
(Char == CHAR_TAB) || (Char == CHAR_TAB) ||
(Char == CHAR_LINEFEED) || (Char == CHAR_LINEFEED) ||
(Char == CHAR_CARRIAGE_RETURN)) { (Char == CHAR_CARRIAGE_RETURN))
{
// Only let through EFI required control characters // Only let through EFI required control characters
Key->UnicodeChar = (CHAR16)Char; Key->UnicodeChar = (CHAR16)Char;
} }
@ -429,7 +415,6 @@ ReadKeyStroke (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TextOutReset ( TextOutReset (
@ -437,12 +422,12 @@ TextOutReset (
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
This->SetAttribute( This->SetAttribute (
This, This,
EFI_TEXT_ATTR(This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK) EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK)
); );
Status = This->SetMode (This, 0); Status = This->SetMode (This, 0);
@ -452,11 +437,11 @@ TextOutReset (
CHAR8 * CHAR8 *
EFIAPI EFIAPI
SafeUnicodeStrToAsciiStr ( SafeUnicodeStrToAsciiStr (
IN CONST CHAR16 *Source, IN CONST CHAR16 *Source,
OUT CHAR8 *Destination OUT CHAR8 *Destination
) )
{ {
CHAR8 *ReturnValue; CHAR8 *ReturnValue;
ASSERT (Destination != NULL); ASSERT (Destination != NULL);
@ -469,9 +454,8 @@ SafeUnicodeStrToAsciiStr (
// //
// Source and Destination should not overlap // Source and Destination should not overlap
// //
ASSERT ((UINTN) ((CHAR16 *) Destination - Source) > StrLen (Source)); ASSERT ((UINTN)((CHAR16 *)Destination - Source) > StrLen (Source));
ASSERT ((UINTN) ((CHAR8 *) Source - Destination) > StrLen (Source)); ASSERT ((UINTN)((CHAR8 *)Source - Destination) > StrLen (Source));
ReturnValue = Destination; ReturnValue = Destination;
while (*Source != '\0') { while (*Source != '\0') {
@ -479,11 +463,11 @@ SafeUnicodeStrToAsciiStr (
// If any non-ascii characters in Source then replace it with '?'. // If any non-ascii characters in Source then replace it with '?'.
// //
if (*Source < 0x80) { if (*Source < 0x80) {
*Destination = (CHAR8) *Source; *Destination = (CHAR8)*Source;
} else { } else {
*Destination = '?'; *Destination = '?';
//Surrogate pair check. // Surrogate pair check.
if ((*Source >= 0xD800) && (*Source <= 0xDFFF)) { if ((*Source >= 0xD800) && (*Source <= 0xDFFF)) {
Source++; Source++;
} }
@ -511,19 +495,19 @@ OutputString (
IN CHAR16 *String IN CHAR16 *String
) )
{ {
UINTN Size; UINTN Size;
CHAR8* OutputString; CHAR8 *OutputString;
EFI_STATUS Status; EFI_STATUS Status;
EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode; EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;
UINTN MaxColumn; UINTN MaxColumn;
UINTN MaxRow; UINTN MaxRow;
Size = StrLen(String) + 1; Size = StrLen (String) + 1;
OutputString = AllocatePool(Size); OutputString = AllocatePool (Size);
//If there is any non-ascii characters in String buffer then replace it with '?' // If there is any non-ascii characters in String buffer then replace it with '?'
//Eventually, UnicodeStrToAsciiStr API should be fixed. // Eventually, UnicodeStrToAsciiStr API should be fixed.
SafeUnicodeStrToAsciiStr(String, OutputString); SafeUnicodeStrToAsciiStr (String, OutputString);
SerialPortWrite ((UINT8 *)OutputString, Size - 1); SerialPortWrite ((UINT8 *)OutputString, Size - 1);
// //
@ -542,47 +526,49 @@ OutputString (
return Status; return Status;
} }
for (; *String != CHAR_NULL; String++) { for ( ; *String != CHAR_NULL; String++) {
switch (*String) { switch (*String) {
case CHAR_BACKSPACE: case CHAR_BACKSPACE:
if (Mode->CursorColumn > 0) { if (Mode->CursorColumn > 0) {
Mode->CursorColumn--; Mode->CursorColumn--;
} }
break;
case CHAR_LINEFEED: break;
if (Mode->CursorRow < (INT32) (MaxRow - 1)) {
Mode->CursorRow++;
}
break;
case CHAR_CARRIAGE_RETURN: case CHAR_LINEFEED:
Mode->CursorColumn = 0; if (Mode->CursorRow < (INT32)(MaxRow - 1)) {
break;
default:
if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) {
// Move the cursor as if we print CHAR_CARRIAGE_RETURN & CHAR_LINE_FEED
// CHAR_LINEFEED
if (Mode->CursorRow < (INT32) (MaxRow - 1)) {
Mode->CursorRow++; Mode->CursorRow++;
} }
// CHAR_CARIAGE_RETURN
break;
case CHAR_CARRIAGE_RETURN:
Mode->CursorColumn = 0; Mode->CursorColumn = 0;
} else { break;
Mode->CursorColumn++;
} default:
break; if (Mode->CursorColumn >= (INT32)(MaxColumn - 1)) {
// Move the cursor as if we print CHAR_CARRIAGE_RETURN & CHAR_LINE_FEED
// CHAR_LINEFEED
if (Mode->CursorRow < (INT32)(MaxRow - 1)) {
Mode->CursorRow++;
}
// CHAR_CARIAGE_RETURN
Mode->CursorColumn = 0;
} else {
Mode->CursorColumn++;
}
break;
} }
} }
FreePool(OutputString); FreePool (OutputString);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TestString ( TestString (
@ -590,7 +576,7 @@ TestString (
IN CHAR16 *String IN CHAR16 *String
) )
{ {
CHAR8 Character; CHAR8 Character;
for ( ; *String != CHAR_NULL; String++) { for ( ; *String != CHAR_NULL; String++) {
Character = (CHAR8)*String; Character = (CHAR8)*String;
@ -602,14 +588,13 @@ TestString (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
QueryMode ( QueryMode (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
IN UINTN ModeNumber, IN UINTN ModeNumber,
OUT UINTN *Columns, OUT UINTN *Columns,
OUT UINTN *Rows OUT UINTN *Rows
) )
{ {
if (This->Mode->MaxMode > 1) { if (This->Mode->MaxMode > 1) {
@ -617,20 +602,19 @@ QueryMode (
} }
if (ModeNumber == 0) { if (ModeNumber == 0) {
*Columns = MODE0_COLUMN_COUNT; *Columns = MODE0_COLUMN_COUNT;
*Rows = MODE0_ROW_COUNT; *Rows = MODE0_ROW_COUNT;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetMode ( SetMode (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
IN UINTN ModeNumber IN UINTN ModeNumber
) )
{ {
if (ModeNumber != 0) { if (ModeNumber != 0) {
@ -642,54 +626,51 @@ SetMode (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetAttribute( SetAttribute (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
IN UINTN Attribute IN UINTN Attribute
) )
{ {
This->Mode->Attribute = (INT32)Attribute; This->Mode->Attribute = (INT32)Attribute;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ClearScreen ( ClearScreen (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = This->SetCursorPosition (This, 0, 0); Status = This->SetCursorPosition (This, 0, 0);
return Status; return Status;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SetCursorPosition ( SetCursorPosition (
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
IN UINTN Column, IN UINTN Column,
IN UINTN Row IN UINTN Row
) )
{ {
EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode; EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;
EFI_STATUS Status; EFI_STATUS Status;
UINTN MaxColumn; UINTN MaxColumn;
UINTN MaxRow; UINTN MaxRow;
Mode = This->Mode; Mode = This->Mode;
Status = This->QueryMode( Status = This->QueryMode (
This, This,
Mode->Mode, Mode->Mode,
&MaxColumn, &MaxColumn,
&MaxRow &MaxRow
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -698,12 +679,11 @@ SetCursorPosition (
} }
Mode->CursorColumn = (INT32)Column; Mode->CursorColumn = (INT32)Column;
Mode->CursorRow = (INT32)Row; Mode->CursorRow = (INT32)Row;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EnableCursor ( EnableCursor (
@ -718,15 +698,14 @@ EnableCursor (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SimpleTextInOutEntryPoint ( SimpleTextInOutEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = gBS->CreateEvent ( Status = gBS->CreateEvent (
EVT_NOTIFY_WAIT, EVT_NOTIFY_WAIT,
@ -737,16 +716,19 @@ SimpleTextInOutEntryPoint (
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = gBS->InstallMultipleProtocolInterfaces( Status = gBS->InstallMultipleProtocolInterfaces (
&mInstallHandle, &mInstallHandle,
&gEfiSimpleTextInProtocolGuid, &mSimpleTextIn, &gEfiSimpleTextInProtocolGuid,
&gEfiSimpleTextOutProtocolGuid, &mSimpleTextOut, &mSimpleTextIn,
&gEfiDevicePathProtocolGuid, &mDevicePath, &gEfiSimpleTextOutProtocolGuid,
&mSimpleTextOut,
&gEfiDevicePathProtocolGuid,
&mDevicePath,
NULL NULL
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gST->ConOut = &mSimpleTextOut; gST->ConOut = &mSimpleTextOut;
gST->ConIn = &mSimpleTextIn; gST->ConIn = &mSimpleTextIn;
} }
return Status; return Status;

View File

@ -21,16 +21,16 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gMmcComponentName = {
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gMmcComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gMmcComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) MmcGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)MmcGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) MmcGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)MmcGetControllerName,
"en" "en"
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
mMmcDriverNameTable[] = { mMmcDriverNameTable[] = {
{"eng;en", L"MMC/SD Card Interface Driver"}, { "eng;en", L"MMC/SD Card Interface Driver" },
{NULL, NULL} { NULL, NULL }
}; };
/** /**
@ -145,11 +145,11 @@ MmcGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
MmcGetControllerName ( MmcGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;

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