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:
committed by
mergify[bot]
parent
731c67e1d7
commit
e7108d0e96
@ -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));
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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__
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 ();
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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).
|
||||||
|
@ -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_ */
|
||||||
|
@ -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;
|
||||||
|
@ -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
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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__ */
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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__
|
||||||
|
@ -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__ */
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -32,7 +32,7 @@ PrePeiGetHobList (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PrePeiSetHobList (
|
PrePeiSetHobList (
|
||||||
IN VOID *HobList
|
IN VOID *HobList
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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__ */
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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__
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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__ */
|
||||||
|
@ -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__ */
|
||||||
|
@ -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;
|
||||||
|
@ -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
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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>";
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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)) {
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
Reference in New Issue
Block a user