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
@ -28,12 +28,15 @@ ValidateAndroidMediaDevicePath (
|
||||
NextNode = DevicePath;
|
||||
while (NextNode != NULL) {
|
||||
Node = NextNode;
|
||||
if (Node->Type == MEDIA_DEVICE_PATH &&
|
||||
Node->SubType == MEDIA_HARDDRIVE_DP) {
|
||||
if ((Node->Type == MEDIA_DEVICE_PATH) &&
|
||||
(Node->SubType == MEDIA_HARDDRIVE_DP))
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
NextNode = NextDevicePathNode (Node);
|
||||
}
|
||||
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -56,8 +59,11 @@ AndroidBootAppEntryPoint (
|
||||
|
||||
BootPathStr = (CHAR16 *)PcdGetPtr (PcdAndroidBootDevicePath);
|
||||
ASSERT (BootPathStr != NULL);
|
||||
Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL,
|
||||
(VOID **)&EfiDevicePathFromTextProtocol);
|
||||
Status = gBS->LocateProtocol (
|
||||
&gEfiDevicePathFromTextProtocolGuid,
|
||||
NULL,
|
||||
(VOID **)&EfiDevicePathFromTextProtocol
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
DevicePath = (EFI_DEVICE_PATH *)EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (BootPathStr);
|
||||
ASSERT (DevicePath != NULL);
|
||||
@ -67,8 +73,11 @@ AndroidBootAppEntryPoint (
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid,
|
||||
&DevicePath, &Handle);
|
||||
Status = gBS->LocateDevicePath (
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&DevicePath,
|
||||
&Handle
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -92,6 +101,7 @@ AndroidBootAppEntryPoint (
|
||||
if (Buffer == NULL) {
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
|
||||
/* Load header of boot.img */
|
||||
Status = BlockIo->ReadBlocks (
|
||||
BlockIo,
|
||||
@ -105,6 +115,7 @@ AndroidBootAppEntryPoint (
|
||||
DEBUG ((DEBUG_ERROR, "Failed to get AndroidBootImg Size: %r\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
BootImgSize = ALIGN_VALUE (BootImgSize, BlockSize);
|
||||
FreePages (Buffer, EFI_SIZE_TO_PAGES (sizeof (ANDROID_BOOTIMG_HEADER)));
|
||||
|
||||
|
@ -32,8 +32,12 @@ ParseAndroidBootImg (
|
||||
|
||||
Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
|
||||
|
||||
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH) != 0) {
|
||||
if (AsciiStrnCmp (
|
||||
(CONST CHAR8 *)Header->BootMagic,
|
||||
ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH
|
||||
) != 0)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -53,8 +57,12 @@ ParseAndroidBootImg (
|
||||
+ ALIGN_VALUE (Header->KernelSize, Header->PageSize));
|
||||
}
|
||||
|
||||
AsciiStrnCpyS (KernelArgs, ANDROID_BOOTIMG_KERNEL_ARGS_SIZE, Header->KernelArgs,
|
||||
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE);
|
||||
AsciiStrnCpyS (
|
||||
KernelArgs,
|
||||
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE,
|
||||
Header->KernelArgs,
|
||||
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
@ -122,8 +122,12 @@ HandleDownload (
|
||||
SEND_LITERAL ("FAILNot enough memory");
|
||||
} else {
|
||||
ZeroMem (Response, sizeof Response);
|
||||
AsciiSPrint (Response, sizeof Response, "DATA%x",
|
||||
(UINT32)mNumDataBytes);
|
||||
AsciiSPrint (
|
||||
Response,
|
||||
sizeof Response,
|
||||
"DATA%x",
|
||||
(UINT32)mNumDataBytes
|
||||
);
|
||||
mTransport->Send (sizeof Response - 1, Response, &mFatalSendErrorEvent);
|
||||
|
||||
mState = ExpectDataState;
|
||||
@ -214,6 +218,7 @@ HandleBoot (
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "Failed to boot downloaded image: %r\n", Status));
|
||||
}
|
||||
|
||||
// We shouldn't get here
|
||||
}
|
||||
|
||||
@ -282,6 +287,7 @@ AcceptCmd (
|
||||
// Here we just reboot normally.
|
||||
SEND_LITERAL ("INFOreboot-bootloader not supported, rebooting normally.");
|
||||
}
|
||||
|
||||
SEND_LITERAL ("OKAY");
|
||||
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
|
||||
|
||||
@ -331,7 +337,7 @@ AcceptData (
|
||||
|
||||
// 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
|
||||
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)
|
||||
UnicodeSPrint (
|
||||
OutputString,
|
||||
@ -380,6 +386,7 @@ DataReady (
|
||||
} else {
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
|
||||
FreePool (Data);
|
||||
}
|
||||
} while (!EFI_ERROR (Status));
|
||||
@ -448,8 +455,10 @@ FastbootAppEntryPoint (
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiSimpleTextOutProtocolGuid, NULL, (VOID **)&mTextOut);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR,
|
||||
"Fastboot: Couldn't open Text Output Protocol: %r\n", Status
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"Fastboot: Couldn't open Text Output Protocol: %r\n",
|
||||
Status
|
||||
));
|
||||
return Status;
|
||||
}
|
||||
@ -491,7 +500,6 @@ FastbootAppEntryPoint (
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
// Start listening for data
|
||||
Status = mTransport->Start (
|
||||
ReceiveEvent
|
||||
@ -502,8 +510,10 @@ FastbootAppEntryPoint (
|
||||
}
|
||||
|
||||
// Talk to the user
|
||||
mTextOut->OutputString (mTextOut,
|
||||
L"Android Fastboot mode - version " ANDROID_FASTBOOT_VERSION ". Press RETURN or SPACE key to quit.\r\n");
|
||||
mTextOut->OutputString (
|
||||
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
|
||||
WaitEventArray[0] = mFinishedEvent;
|
||||
@ -513,7 +523,8 @@ FastbootAppEntryPoint (
|
||||
Status = TextIn->ReadKeyStroke (gST->ConIn, &Key);
|
||||
if (Key.ScanCode == SCAN_NULL) {
|
||||
if ((Key.UnicodeChar == CHAR_CARRIAGE_RETURN) ||
|
||||
(Key.UnicodeChar == L' ')) {
|
||||
(Key.UnicodeChar == L' '))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -523,6 +534,7 @@ FastbootAppEntryPoint (
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "Warning: Fastboot Transport Stop: %r\n", Status));
|
||||
}
|
||||
|
||||
mPlatform->UnInit ();
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
@ -44,7 +44,6 @@ STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate =
|
||||
} // End
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Start an EFI Application from a Device Path
|
||||
|
||||
@ -70,8 +69,14 @@ StartEfiApplication (
|
||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||
|
||||
// Load the image from the device path with Boot Services function
|
||||
Status = gBS->LoadImage (TRUE, ParentImageHandle, DevicePath, NULL, 0,
|
||||
&ImageHandle);
|
||||
Status = gBS->LoadImage (
|
||||
TRUE,
|
||||
ParentImageHandle,
|
||||
DevicePath,
|
||||
NULL,
|
||||
0,
|
||||
&ImageHandle
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// With EFI_SECURITY_VIOLATION retval, the Image was loaded and an ImageHandle was created
|
||||
@ -82,13 +87,17 @@ StartEfiApplication (
|
||||
if (Status == EFI_SECURITY_VIOLATION) {
|
||||
gBS->UnloadImage (ImageHandle);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Passed LoadOptions to the EFI Application
|
||||
if (LoadOptionsSize != 0) {
|
||||
Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid,
|
||||
(VOID **) &LoadedImage);
|
||||
Status = gBS->HandleProtocol (
|
||||
ImageHandle,
|
||||
&gEfiLoadedImageProtocolGuid,
|
||||
(VOID **)&LoadedImage
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -148,19 +157,26 @@ BootAndroidBootImg (
|
||||
}
|
||||
|
||||
if (RamdiskSize != 0) {
|
||||
NewLoadOptions = CatSPrint (LoadOptions, L" initrd=0x%x,0x%x",
|
||||
(UINTN)Ramdisk, RamdiskSize);
|
||||
NewLoadOptions = CatSPrint (
|
||||
LoadOptions,
|
||||
L" initrd=0x%x,0x%x",
|
||||
(UINTN)Ramdisk,
|
||||
RamdiskSize
|
||||
);
|
||||
FreePool (LoadOptions);
|
||||
if (NewLoadOptions == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
LoadOptions = NewLoadOptions;
|
||||
}
|
||||
|
||||
Status = StartEfiApplication (gImageHandle,
|
||||
Status = StartEfiApplication (
|
||||
gImageHandle,
|
||||
(EFI_DEVICE_PATH_PROTOCOL *)&KernelDevicePath,
|
||||
StrSize (LoadOptions),
|
||||
LoadOptions);
|
||||
LoadOptions
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "Couldn't Boot Linux: %d\n", Status));
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
|
@ -224,7 +224,6 @@ DataReceived (
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Event notify function to be called when we accept an incoming TCP connection.
|
||||
*/
|
||||
@ -247,6 +246,7 @@ ConnectionAccepted (
|
||||
DEBUG ((DEBUG_ERROR, "TCP Fastboot: Connection Error: %r\n", Status));
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_ERROR, "TCP Fastboot: Connection Received.\n"));
|
||||
|
||||
//
|
||||
@ -308,10 +308,16 @@ TcpFastbootTransportStart (
|
||||
255, // IPv4 Time to Live
|
||||
{ // AccessPoint:
|
||||
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
|
||||
{ {0, 0, 0, 0} }, // Remote address: accept any
|
||||
{
|
||||
{ 0, 0, 0, 0 }
|
||||
}, // Remote address: accept any
|
||||
0, // Remote Port: accept any
|
||||
FALSE // ActiveFlag: be a "server"
|
||||
},
|
||||
@ -414,13 +420,17 @@ TcpFastbootTransportStart (
|
||||
if (Status == EFI_NO_MAPPING) {
|
||||
// Wait until the IP configuration process (probably DHCP) has finished
|
||||
do {
|
||||
Status = mTcpListener->GetModeData (mTcpListener,
|
||||
NULL, NULL,
|
||||
Status = mTcpListener->GetModeData (
|
||||
mTcpListener,
|
||||
NULL,
|
||||
NULL,
|
||||
&Ip4ModeData,
|
||||
NULL, NULL
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
} while (!Ip4ModeData.IsConfigured);
|
||||
|
||||
Status = mTcpListener->Configure (mTcpListener, &TcpConfigData);
|
||||
} else if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "TCP Configure: %r\n", Status));
|
||||
@ -494,7 +504,6 @@ TcpFastbootTransportStop (
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
|
||||
gBS->CloseEvent (mAcceptToken.CompletionToken.Event);
|
||||
|
||||
// Stop listening for connections.
|
||||
@ -514,6 +523,7 @@ TcpFastbootTransportStop (
|
||||
if (Entry->Buffer) {
|
||||
FreePool (Entry->Buffer);
|
||||
}
|
||||
|
||||
FreePool (Entry);
|
||||
|
||||
Entry = NextEntry;
|
||||
@ -591,7 +601,6 @@ TcpFastbootTransportSend (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
TcpFastbootTransportReceive (
|
||||
OUT UINTN *BufferSize,
|
||||
@ -635,7 +644,6 @@ TcpFastbootTransportEntryPoint (
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
|
||||
Status = gBS->LocateProtocol (
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
NULL,
|
||||
|
@ -40,7 +40,6 @@ typedef struct _FASTBOOT_USB_PACKET_LIST {
|
||||
UINTN BufferSize;
|
||||
} FASTBOOT_USB_PACKET_LIST;
|
||||
|
||||
|
||||
/*
|
||||
No string descriptors - all string descriptor members are set to 0
|
||||
*/
|
||||
|
@ -69,27 +69,34 @@ InstallHiiPages (
|
||||
EFI_HANDLE DriverHandle;
|
||||
|
||||
DriverHandle = NULL;
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (&DriverHandle,
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&DriverHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&mConsolePrefDxeVendorDevicePath,
|
||||
NULL);
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
HiiHandle = HiiAddPackages (&gConsolePrefFormSetGuid,
|
||||
HiiHandle = HiiAddPackages (
|
||||
&gConsolePrefFormSetGuid,
|
||||
DriverHandle,
|
||||
ConsolePrefDxeStrings,
|
||||
ConsolePrefHiiBin,
|
||||
NULL);
|
||||
NULL
|
||||
);
|
||||
|
||||
if (HiiHandle == NULL) {
|
||||
gBS->UninstallMultipleProtocolInterfaces (DriverHandle,
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
DriverHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&mConsolePrefDxeVendorDevicePath,
|
||||
NULL);
|
||||
NULL
|
||||
);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -106,8 +113,12 @@ RemoveDtStdoutPath (
|
||||
|
||||
Status = EfiGetSystemConfigurationTable (&gFdtTableGuid, &Dtb);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_INFO, "%a: could not retrieve DT blob - %r\n", __FUNCTION__,
|
||||
Status));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
"%a: could not retrieve DT blob - %r\n",
|
||||
__FUNCTION__,
|
||||
Status
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -118,8 +129,12 @@ RemoveDtStdoutPath (
|
||||
|
||||
Error = fdt_delprop (Dtb, Node, "stdout-path");
|
||||
if (Error) {
|
||||
DEBUG ((DEBUG_INFO, "%a: Failed to delete 'stdout-path' property: %a\n",
|
||||
__FUNCTION__, fdt_strerror (Error)));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
"%a: Failed to delete 'stdout-path' property: %a\n",
|
||||
__FUNCTION__,
|
||||
fdt_strerror (Error)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,8 +152,11 @@ RemoveSpcrTable (
|
||||
EFI_ACPI_TABLE_VERSION TableVersion;
|
||||
UINTN TableKey;
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL,
|
||||
(VOID **)&AcpiTable);
|
||||
Status = gBS->LocateProtocol (
|
||||
&gEfiAcpiTableProtocolGuid,
|
||||
NULL,
|
||||
(VOID **)&AcpiTable
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return;
|
||||
}
|
||||
@ -153,8 +171,12 @@ RemoveSpcrTable (
|
||||
TableHeader = NULL;
|
||||
|
||||
do {
|
||||
Status = Sdt->GetAcpiTable (TableIndex++, &TableHeader, &TableVersion,
|
||||
&TableKey);
|
||||
Status = Sdt->GetAcpiTable (
|
||||
TableIndex++,
|
||||
&TableHeader,
|
||||
&TableVersion,
|
||||
&TableKey
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
@ -165,9 +187,14 @@ RemoveSpcrTable (
|
||||
|
||||
Status = AcpiTable->UninstallAcpiTable (AcpiTable, TableKey);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_WARN, "%a: failed to uninstall SPCR table - %r\n",
|
||||
__FUNCTION__, Status));
|
||||
DEBUG ((
|
||||
DEBUG_WARN,
|
||||
"%a: failed to uninstall SPCR table - %r\n",
|
||||
__FUNCTION__,
|
||||
Status
|
||||
));
|
||||
}
|
||||
|
||||
break;
|
||||
} while (TRUE);
|
||||
}
|
||||
@ -186,18 +213,29 @@ OnReadyToBoot (
|
||||
VOID *Gop;
|
||||
|
||||
BufferSize = sizeof (ConsolePref);
|
||||
Status = gRT->GetVariable (CONSOLE_PREF_VARIABLE_NAME,
|
||||
&gConsolePrefFormSetGuid, NULL, &BufferSize, &ConsolePref);
|
||||
Status = gRT->GetVariable (
|
||||
CONSOLE_PREF_VARIABLE_NAME,
|
||||
&gConsolePrefFormSetGuid,
|
||||
NULL,
|
||||
&BufferSize,
|
||||
&ConsolePref
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR,
|
||||
"%a: variable '%s' could not be read - bailing!\n", __FUNCTION__,
|
||||
CONSOLE_PREF_VARIABLE_NAME));
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: variable '%s' could not be read - bailing!\n",
|
||||
__FUNCTION__,
|
||||
CONSOLE_PREF_VARIABLE_NAME
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
if (ConsolePref.Console == CONSOLE_PREF_SERIAL) {
|
||||
DEBUG ((DEBUG_INFO,
|
||||
"%a: serial console preferred - doing nothing\n", __FUNCTION__));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
"%a: serial console preferred - doing nothing\n",
|
||||
__FUNCTION__
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -206,9 +244,12 @@ OnReadyToBoot (
|
||||
//
|
||||
Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, &Gop);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_INFO,
|
||||
"%a: no GOP instances found - doing nothing (%r)\n", __FUNCTION__,
|
||||
Status));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
"%a: no GOP instances found - doing nothing (%r)\n",
|
||||
__FUNCTION__,
|
||||
Status
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -244,20 +285,32 @@ ConsolePrefDxeEntryPoint (
|
||||
// Get the current console preference from the ConsolePref variable.
|
||||
//
|
||||
BufferSize = sizeof (ConsolePref);
|
||||
Status = gRT->GetVariable (CONSOLE_PREF_VARIABLE_NAME,
|
||||
&gConsolePrefFormSetGuid, NULL, &BufferSize, &ConsolePref);
|
||||
Status = gRT->GetVariable (
|
||||
CONSOLE_PREF_VARIABLE_NAME,
|
||||
&gConsolePrefFormSetGuid,
|
||||
NULL,
|
||||
&BufferSize,
|
||||
&ConsolePref
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_INFO,
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
"%a: no console preference found, defaulting to graphical\n",
|
||||
__FUNCTION__));
|
||||
__FUNCTION__
|
||||
));
|
||||
ConsolePref.Console = CONSOLE_PREF_GRAPHICAL;
|
||||
}
|
||||
|
||||
if (!EFI_ERROR (Status) &&
|
||||
ConsolePref.Console != CONSOLE_PREF_GRAPHICAL &&
|
||||
ConsolePref.Console != CONSOLE_PREF_SERIAL) {
|
||||
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_SERIAL))
|
||||
{
|
||||
DEBUG ((
|
||||
DEBUG_WARN,
|
||||
"%a: invalid value for %s, defaulting to graphical\n",
|
||||
__FUNCTION__,
|
||||
CONSOLE_PREF_VARIABLE_NAME
|
||||
));
|
||||
ConsolePref.Console = CONSOLE_PREF_GRAPHICAL;
|
||||
Status = EFI_INVALID_PARAMETER; // trigger setvar below
|
||||
}
|
||||
@ -267,21 +320,33 @@ ConsolePrefDxeEntryPoint (
|
||||
//
|
||||
if (EFI_ERROR (Status)) {
|
||||
ZeroMem (&ConsolePref.Reserved, sizeof (ConsolePref.Reserved));
|
||||
Status = gRT->SetVariable (CONSOLE_PREF_VARIABLE_NAME,
|
||||
Status = gRT->SetVariable (
|
||||
CONSOLE_PREF_VARIABLE_NAME,
|
||||
&gConsolePrefFormSetGuid,
|
||||
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
||||
sizeof (ConsolePref), &ConsolePref);
|
||||
sizeof (ConsolePref),
|
||||
&ConsolePref
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "%a: gRT->SetVariable () failed - %r\n",
|
||||
__FUNCTION__, Status));
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: gRT->SetVariable () failed - %r\n",
|
||||
__FUNCTION__,
|
||||
Status
|
||||
));
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
|
||||
OnReadyToBoot, NULL, &gEfiEventReadyToBootGuid,
|
||||
&mReadyToBootEvent);
|
||||
Status = gBS->CreateEventEx (
|
||||
EVT_NOTIFY_SIGNAL,
|
||||
TPL_CALLBACK,
|
||||
OnReadyToBoot,
|
||||
NULL,
|
||||
&gEfiEventReadyToBootGuid,
|
||||
&mReadyToBootEvent
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return InstallHiiPages ();
|
||||
|
@ -59,27 +59,34 @@ InstallHiiPages (
|
||||
EFI_HANDLE DriverHandle;
|
||||
|
||||
DriverHandle = NULL;
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (&DriverHandle,
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&DriverHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&mDtPlatformDxeVendorDevicePath,
|
||||
NULL);
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
HiiHandle = HiiAddPackages (&gDtPlatformFormSetGuid,
|
||||
HiiHandle = HiiAddPackages (
|
||||
&gDtPlatformFormSetGuid,
|
||||
DriverHandle,
|
||||
DtPlatformDxeStrings,
|
||||
DtPlatformHiiBin,
|
||||
NULL);
|
||||
NULL
|
||||
);
|
||||
|
||||
if (HiiHandle == NULL) {
|
||||
gBS->UninstallMultipleProtocolInterfaces (DriverHandle,
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
DriverHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&mDtPlatformDxeVendorDevicePath,
|
||||
NULL);
|
||||
NULL
|
||||
);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -112,31 +119,48 @@ DtPlatformDxeEntryPoint (
|
||||
Dtb = NULL;
|
||||
Status = DtPlatformLoadDtb (&Dtb, &DtbSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_WARN,
|
||||
DEBUG ((
|
||||
DEBUG_WARN,
|
||||
"%a: no DTB blob could be loaded, defaulting to ACPI (Status == %r)\n",
|
||||
__FUNCTION__, Status));
|
||||
__FUNCTION__,
|
||||
Status
|
||||
));
|
||||
DtAcpiPref.Pref = DT_ACPI_SELECT_ACPI;
|
||||
} else {
|
||||
//
|
||||
// Get the current DT/ACPI preference from the DtAcpiPref variable.
|
||||
//
|
||||
BufferSize = sizeof (DtAcpiPref);
|
||||
Status = gRT->GetVariable(DT_ACPI_VARIABLE_NAME, &gDtPlatformFormSetGuid,
|
||||
NULL, &BufferSize, &DtAcpiPref);
|
||||
Status = gRT->GetVariable (
|
||||
DT_ACPI_VARIABLE_NAME,
|
||||
&gDtPlatformFormSetGuid,
|
||||
NULL,
|
||||
&BufferSize,
|
||||
&DtAcpiPref
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_WARN, "%a: no DT/ACPI preference found, defaulting to %a\n",
|
||||
__FUNCTION__, PcdGetBool (PcdDefaultDtPref) ? "DT" : "ACPI"));
|
||||
DEBUG ((
|
||||
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
|
||||
: DT_ACPI_SELECT_ACPI;
|
||||
}
|
||||
}
|
||||
|
||||
if (!EFI_ERROR (Status) &&
|
||||
DtAcpiPref.Pref != DT_ACPI_SELECT_ACPI &&
|
||||
DtAcpiPref.Pref != DT_ACPI_SELECT_DT) {
|
||||
DEBUG ((DEBUG_WARN, "%a: invalid value for %s, defaulting to %a\n",
|
||||
__FUNCTION__, DT_ACPI_VARIABLE_NAME,
|
||||
PcdGetBool (PcdDefaultDtPref) ? "DT" : "ACPI"));
|
||||
(DtAcpiPref.Pref != DT_ACPI_SELECT_ACPI) &&
|
||||
(DtAcpiPref.Pref != DT_ACPI_SELECT_DT))
|
||||
{
|
||||
DEBUG ((
|
||||
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
|
||||
: DT_ACPI_SELECT_ACPI;
|
||||
Status = EFI_INVALID_PARAMETER; // trigger setvar below
|
||||
@ -146,9 +170,13 @@ DtPlatformDxeEntryPoint (
|
||||
// Write the newly selected default value back to the variable store.
|
||||
//
|
||||
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,
|
||||
sizeof (DtAcpiPref), &DtAcpiPref);
|
||||
sizeof (DtAcpiPref),
|
||||
&DtAcpiPref
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto FreeDtb;
|
||||
}
|
||||
@ -159,12 +187,18 @@ DtPlatformDxeEntryPoint (
|
||||
// ACPI was selected: install the gEdkiiPlatformHasAcpiGuid GUID as a
|
||||
// NULL protocol to unlock dispatch of ACPI related drivers.
|
||||
//
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (&ImageHandle,
|
||||
&gEdkiiPlatformHasAcpiGuid, NULL, NULL);
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&ImageHandle,
|
||||
&gEdkiiPlatformHasAcpiGuid,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR,
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: failed to install gEdkiiPlatformHasAcpiGuid as a protocol\n",
|
||||
__FUNCTION__));
|
||||
__FUNCTION__
|
||||
));
|
||||
goto FreeDtb;
|
||||
}
|
||||
} else if (DtAcpiPref.Pref == DT_ACPI_SELECT_DT) {
|
||||
@ -174,8 +208,11 @@ DtPlatformDxeEntryPoint (
|
||||
//
|
||||
Status = gBS->InstallConfigurationTable (&gFdtTableGuid, Dtb);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "%a: failed to install FDT configuration table\n",
|
||||
__FUNCTION__));
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: failed to install FDT configuration table\n",
|
||||
__FUNCTION__
|
||||
));
|
||||
goto FreeDtb;
|
||||
}
|
||||
} else {
|
||||
|
@ -46,6 +46,7 @@ GetNodeProperty (
|
||||
if (PropSize != NULL) {
|
||||
*PropSize = Len;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -90,12 +91,15 @@ IsNodeEnabled (
|
||||
if (NodeStatus == NULL) {
|
||||
return TRUE;
|
||||
}
|
||||
if (Len >= 5 && AsciiStrCmp (NodeStatus, "okay") == 0) {
|
||||
|
||||
if ((Len >= 5) && (AsciiStrCmp (NodeStatus, "okay") == 0)) {
|
||||
return TRUE;
|
||||
}
|
||||
if (Len >= 3 && AsciiStrCmp (NodeStatus, "ok") == 0) {
|
||||
|
||||
if ((Len >= 3) && (AsciiStrCmp (NodeStatus, "ok") == 0)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -136,13 +140,15 @@ FindNextCompatibleNode (
|
||||
// compatible strings so check each one
|
||||
//
|
||||
for (Compatible = Type; Compatible < Type + Len && *Compatible;
|
||||
Compatible += 1 + AsciiStrLen (Compatible)) {
|
||||
Compatible += 1 + AsciiStrLen (Compatible))
|
||||
{
|
||||
if (AsciiStrCmp (CompatibleString, Compatible) == 0) {
|
||||
*Node = Next;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@ -201,16 +207,25 @@ FindCompatibleNodeReg (
|
||||
// 8 byte quantities for base and size, respectively.
|
||||
// TODO use #cells root properties instead
|
||||
//
|
||||
Status = FindCompatibleNodeProperty (This, CompatibleString, "reg", Reg,
|
||||
RegSize);
|
||||
Status = FindCompatibleNodeProperty (
|
||||
This,
|
||||
CompatibleString,
|
||||
"reg",
|
||||
Reg,
|
||||
RegSize
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
if ((*RegSize % 16) != 0) {
|
||||
DEBUG ((DEBUG_ERROR,
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: '%a' compatible node has invalid 'reg' property (size == 0x%x)\n",
|
||||
__FUNCTION__, CompatibleString, *RegSize));
|
||||
__FUNCTION__,
|
||||
CompatibleString,
|
||||
*RegSize
|
||||
));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@ -253,7 +268,7 @@ FindNextMemoryNodeReg (
|
||||
}
|
||||
|
||||
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
|
||||
// 8 byte quantities for base and size, respectively.
|
||||
@ -261,15 +276,21 @@ FindNextMemoryNodeReg (
|
||||
//
|
||||
Status = GetNodeProperty (This, Next, "reg", Reg, RegSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_WARN,
|
||||
DEBUG ((
|
||||
DEBUG_WARN,
|
||||
"%a: ignoring memory node with no 'reg' property\n",
|
||||
__FUNCTION__));
|
||||
__FUNCTION__
|
||||
));
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((*RegSize % 16) != 0) {
|
||||
DEBUG ((DEBUG_WARN,
|
||||
DEBUG ((
|
||||
DEBUG_WARN,
|
||||
"%a: ignoring memory node with invalid 'reg' property (size == 0x%x)\n",
|
||||
__FUNCTION__, *RegSize));
|
||||
__FUNCTION__,
|
||||
*RegSize
|
||||
));
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -279,6 +300,7 @@ FindNextMemoryNodeReg (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@ -294,8 +316,15 @@ FindMemoryNodeReg (
|
||||
OUT UINT32 *RegSize
|
||||
)
|
||||
{
|
||||
return FindNextMemoryNodeReg (This, 0, Node, Reg, AddressCells, SizeCells,
|
||||
RegSize);
|
||||
return FindNextMemoryNodeReg (
|
||||
This,
|
||||
0,
|
||||
Node,
|
||||
Reg,
|
||||
AddressCells,
|
||||
SizeCells,
|
||||
RegSize
|
||||
);
|
||||
}
|
||||
|
||||
STATIC
|
||||
@ -385,14 +414,19 @@ InitializeFdtClientDxe (
|
||||
VOID *Registration;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
DeviceTreeBase = (VOID *)(UINTN)*(UINT64 *)GET_GUID_HOB_DATA (Hob);
|
||||
|
||||
if (fdt_check_header (DeviceTreeBase) != 0) {
|
||||
DEBUG ((DEBUG_ERROR, "%a: No DTB found @ 0x%p\n", __FUNCTION__,
|
||||
DeviceTreeBase));
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: No DTB found @ 0x%p\n",
|
||||
__FUNCTION__,
|
||||
DeviceTreeBase
|
||||
));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
@ -138,8 +138,13 @@ NonCoherentIoMmuMap (
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return DmaMap (DmaOperation, HostAddress, NumberOfBytes,
|
||||
DeviceAddress, Mapping);
|
||||
return DmaMap (
|
||||
DmaOperation,
|
||||
HostAddress,
|
||||
NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -236,7 +241,6 @@ STATIC EDKII_IOMMU_PROTOCOL mNonCoherentIoMmuOps = {
|
||||
NonCoherentIoMmuFreeBuffer,
|
||||
};
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NonCoherentIoMmuDxeEntryPoint (
|
||||
@ -244,7 +248,10 @@ NonCoherentIoMmuDxeEntryPoint (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
return gBS->InstallMultipleProtocolInterfaces (&ImageHandle,
|
||||
&gEdkiiIoMmuProtocolGuid, &mNonCoherentIoMmuOps,
|
||||
NULL);
|
||||
return gBS->InstallMultipleProtocolInterfaces (
|
||||
&ImageHandle,
|
||||
&gEdkiiIoMmuProtocolGuid,
|
||||
&mNonCoherentIoMmuOps,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
@ -27,7 +27,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardCompo
|
||||
"en"
|
||||
};
|
||||
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mVirtualKeyboardDriverNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
|
@ -10,13 +10,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _VIRTUAL_KEYBOARD_COMPONENT_NAME_H_
|
||||
#define _VIRTUAL_KEYBOARD_COMPONENT_NAME_H_
|
||||
|
||||
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gVirtualKeyboardComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2;
|
||||
|
||||
//
|
||||
// EFI Component Name Functions
|
||||
//
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
@ -64,7 +64,6 @@ VirtualKeyboardComponentNameGetDriverName (
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -143,5 +142,4 @@ VirtualKeyboardComponentNameGetControllerName (
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -59,6 +59,7 @@ VirtualKeyboardDriverBindingSupported (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gPlatformVirtualKeyboardProtocolGuid,
|
||||
@ -162,6 +163,7 @@ VirtualKeyboardDriverBindingStart (
|
||||
(VirtualKeyboardPrivate->SimpleTextIn).WaitForKey = NULL;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_NOTIFY_WAIT,
|
||||
TPL_NOTIFY,
|
||||
@ -222,6 +224,7 @@ VirtualKeyboardDriverBindingStart (
|
||||
DEBUG ((DEBUG_ERROR, "[KBD]Reset Failed. Status - %r\n", Status));
|
||||
goto Done;
|
||||
}
|
||||
|
||||
//
|
||||
// Install protocol interfaces for the keyboard device.
|
||||
//
|
||||
@ -256,6 +259,7 @@ Done:
|
||||
if (VirtualKeyboardPrivate->TimerEvent != NULL) {
|
||||
gBS->CloseEvent (VirtualKeyboardPrivate->TimerEvent);
|
||||
}
|
||||
|
||||
FreePool (VirtualKeyboardPrivate);
|
||||
}
|
||||
}
|
||||
@ -297,7 +301,6 @@ VirtualKeyboardDriverBindingStop (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Enqueue the key.
|
||||
|
||||
@ -412,6 +415,7 @@ VirtualKeyboardFreeNotifyList (
|
||||
if (ListHead == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
while (!IsListEmpty (ListHead)) {
|
||||
NotifyNode = CR (
|
||||
ListHead->ForwardLink,
|
||||
@ -450,7 +454,8 @@ IsKeyRegistered (
|
||||
ASSERT (RegsiteredData != NULL && InputData != NULL);
|
||||
|
||||
if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
|
||||
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
|
||||
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -459,16 +464,18 @@ IsKeyRegistered (
|
||||
// these state could be ignored.
|
||||
//
|
||||
if ((RegsiteredData->KeyState.KeyShiftState != 0) &&
|
||||
(RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState)) {
|
||||
(RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ((RegsiteredData->KeyState.KeyToggleState != 0) &&
|
||||
(RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState)) {
|
||||
(RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -528,12 +535,12 @@ VirtualKeyboardWaitForKeyEx (
|
||||
|
||||
VirtualKeyboardPrivate = TEXT_INPUT_EX_VIRTUAL_KEYBOARD_DEV_FROM_THIS (Context);
|
||||
VirtualKeyboardWaitForKey (Event, &VirtualKeyboardPrivate->SimpleTextIn);
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// EFI Simple Text In Protocol Functions
|
||||
//
|
||||
|
||||
/**
|
||||
Reset the Keyboard and do BAT test for it, if (ExtendedVerification == TRUE)
|
||||
then do some extra keyboard validations.
|
||||
@ -565,7 +572,8 @@ VirtualKeyboardReset (
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
|
||||
if (VirtualKeyboardPrivate->PlatformVirtual &&
|
||||
VirtualKeyboardPrivate->PlatformVirtual->Reset) {
|
||||
VirtualKeyboardPrivate->PlatformVirtual->Reset)
|
||||
{
|
||||
Status = VirtualKeyboardPrivate->PlatformVirtual->Reset ();
|
||||
} else {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
@ -616,7 +624,6 @@ VirtualKeyboardResetEx (
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -643,6 +650,7 @@ KeyboardReadKeyStrokeWorker (
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if (KeyData == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@ -715,11 +723,13 @@ VirtualKeyboardReadKeyStroke (
|
||||
// Convert the Ctrl+[a-z] to Ctrl+[1-26]
|
||||
//
|
||||
if ((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) {
|
||||
if (KeyData.Key.UnicodeChar >= L'a' &&
|
||||
KeyData.Key.UnicodeChar <= L'z') {
|
||||
if ((KeyData.Key.UnicodeChar >= L'a') &&
|
||||
(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 <= L'Z') {
|
||||
} else if ((KeyData.Key.UnicodeChar >= L'A') &&
|
||||
(KeyData.Key.UnicodeChar <= L'Z'))
|
||||
{
|
||||
KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'A' + 1);
|
||||
}
|
||||
}
|
||||
@ -760,7 +770,6 @@ VirtualKeyboardReadKeyStrokeEx (
|
||||
VirtualKeyboardPrivate = TEXT_INPUT_EX_VIRTUAL_KEYBOARD_DEV_FROM_THIS (This);
|
||||
|
||||
return KeyboardReadKeyStrokeWorker (VirtualKeyboardPrivate, KeyData);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -829,9 +838,10 @@ VirtualKeyboardRegisterKeyNotify (
|
||||
LIST_ENTRY *Link;
|
||||
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
|
||||
|
||||
if (KeyData == NULL ||
|
||||
NotifyHandle == NULL ||
|
||||
KeyNotificationFunction == NULL) {
|
||||
if ((KeyData == NULL) ||
|
||||
(NotifyHandle == NULL) ||
|
||||
(KeyNotificationFunction == NULL))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -848,7 +858,8 @@ VirtualKeyboardRegisterKeyNotify (
|
||||
//
|
||||
for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink;
|
||||
Link != &VirtualKeyboardPrivate->NotifyList;
|
||||
Link = Link->ForwardLink) {
|
||||
Link = Link->ForwardLink)
|
||||
{
|
||||
CurrentNotify = CR (
|
||||
Link,
|
||||
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY,
|
||||
@ -888,7 +899,6 @@ Exit:
|
||||
//
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
return Status;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -924,7 +934,8 @@ VirtualKeyboardUnregisterKeyNotify (
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -937,7 +948,8 @@ VirtualKeyboardUnregisterKeyNotify (
|
||||
|
||||
for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink;
|
||||
Link != &VirtualKeyboardPrivate->NotifyList;
|
||||
Link = Link->ForwardLink) {
|
||||
Link = Link->ForwardLink)
|
||||
{
|
||||
CurrentNotify = CR (
|
||||
Link,
|
||||
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY,
|
||||
@ -1001,11 +1013,14 @@ VirtualKeyboardTimerHandler (
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
|
||||
if (VirtualKeyboardPrivate->PlatformVirtual &&
|
||||
VirtualKeyboardPrivate->PlatformVirtual->Query) {
|
||||
VirtualKeyboardPrivate->PlatformVirtual->Query)
|
||||
{
|
||||
if (VirtualKeyboardPrivate->PlatformVirtual->Query (&VirtualKey) ==
|
||||
FALSE) {
|
||||
FALSE)
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// Found key
|
||||
KeyData.Key.ScanCode = VirtualKey.Key.ScanCode;
|
||||
KeyData.Key.UnicodeChar = VirtualKey.Key.UnicodeChar;
|
||||
@ -1023,7 +1038,8 @@ VirtualKeyboardTimerHandler (
|
||||
//
|
||||
for (Link = VirtualKeyboardPrivate->NotifyList.ForwardLink;
|
||||
Link != &VirtualKeyboardPrivate->NotifyList;
|
||||
Link = Link->ForwardLink) {
|
||||
Link = Link->ForwardLink)
|
||||
{
|
||||
CurrentNotify = CR (
|
||||
Link,
|
||||
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY,
|
||||
@ -1091,10 +1107,13 @@ KeyNotifyProcessHandler (
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
|
||||
for (Link = GetFirstNode (NotifyList);
|
||||
!IsNull (NotifyList, Link);
|
||||
Link = GetNextNode (NotifyList, Link)) {
|
||||
CurrentNotify = CR (Link,
|
||||
Link = GetNextNode (NotifyList, Link))
|
||||
{
|
||||
CurrentNotify = CR (
|
||||
Link,
|
||||
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY,
|
||||
NotifyEntry,
|
||||
VIRTUAL_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE
|
||||
|
@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _VIRTUAL_KEYBOARD_H_
|
||||
#define _VIRTUAL_KEYBOARD_H_
|
||||
|
||||
|
||||
#include <Guid/StatusCodeDataTypeId.h>
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include <Protocol/PlatformVirtualKeyboard.h>
|
||||
@ -35,7 +34,6 @@ extern EFI_DRIVER_BINDING_PROTOCOL gVirtualKeyboardDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gVirtualKeyboardComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2;
|
||||
|
||||
|
||||
//
|
||||
// VIRTUAL Keyboard Defines
|
||||
//
|
||||
@ -222,7 +220,6 @@ VirtualKeyboardComponentNameGetDriverName (
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -301,10 +298,10 @@ VirtualKeyboardComponentNameGetControllerName (
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// Simple Text Input Protocol functions
|
||||
//
|
||||
|
||||
/**
|
||||
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
|
||||
//
|
||||
|
||||
/**
|
||||
Free keyboard notify list.
|
||||
|
||||
|
@ -48,7 +48,6 @@ GetNextHighMonotonicCount (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MonotonicCounterDriverInitialize (
|
||||
@ -69,7 +68,8 @@ MonotonicCounterDriverInitialize (
|
||||
// Install the Monotonic Counter Architectural Protocol onto a new handle
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&Handle,
|
||||
&gEfiMonotonicCounterArchProtocolGuid, NULL,
|
||||
&gEfiMonotonicCounterArchProtocolGuid,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
return Status;
|
||||
|
@ -91,7 +91,6 @@ MaxEfiException (
|
||||
return sizeof (gExceptionType) / sizeof (EFI_EXCEPTION_TYPE_ENTRY);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gRegisters[]
|
||||
|
||||
@ -105,7 +104,6 @@ MaxRegisterCount (
|
||||
return sizeof (gRegisterOffsets) / sizeof (UINTN);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check to see if the ISA is supported.
|
||||
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
|
||||
It is, by default, set to find the register pointer of the ARM member
|
||||
@ -140,12 +137,12 @@ FindPointerToRegister (
|
||||
)
|
||||
{
|
||||
UINT8 *TempPtr;
|
||||
|
||||
ASSERT (gRegisterOffsets[RegNumber] < 0xF00);
|
||||
TempPtr = ((UINT8 *)SystemContext.SystemContextArm) + gRegisterOffsets[RegNumber];
|
||||
return (UINT32 *)TempPtr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -175,20 +172,22 @@ BasicReadRegister (
|
||||
if ((Char >= 'A') && (Char <= 'F')) {
|
||||
Char = Char - 'A' + 'a';
|
||||
}
|
||||
|
||||
*OutBufPtr++ = Char;
|
||||
|
||||
Char = mHexToStr[(UINT8)((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
|
||||
if ((Char >= 'A') && (Char <= 'F')) {
|
||||
Char = Char - 'A' + 'a';
|
||||
}
|
||||
|
||||
*OutBufPtr++ = Char;
|
||||
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
|
||||
return OutBufPtr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -218,7 +217,6 @@ ReadNthRegister (
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reads the general registers into an output buffer and sends it as a packet
|
||||
@param SystemContext Register content at time of the exception
|
||||
@ -246,7 +244,6 @@ ReadGeneralRegisters (
|
||||
FreePool (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -255,7 +252,8 @@ ReadGeneralRegisters (
|
||||
@retval the pointer to the next character of the input buffer that can be used
|
||||
**/
|
||||
CHAR8
|
||||
*BasicWriteRegister (
|
||||
*
|
||||
BasicWriteRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *InBufPtr
|
||||
@ -290,11 +288,11 @@ CHAR8
|
||||
NewValue += (TempValue << RegSize);
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
|
||||
*(FindPointerToRegister (SystemContext, RegNumber)) = NewValue;
|
||||
return InBufPtr;
|
||||
}
|
||||
|
||||
|
||||
/** ‘P n...=r...’
|
||||
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
|
||||
@ -317,6 +315,7 @@ WriteNthRegister (
|
||||
while (*InBufPtr != '=') {
|
||||
*RegNumBufPtr++ = *InBufPtr++;
|
||||
}
|
||||
|
||||
*RegNumBufPtr = '\0';
|
||||
RegNumber = AsciiStrHexToUintn (RegNumBuffer);
|
||||
|
||||
@ -325,18 +324,17 @@ WriteNthRegister (
|
||||
SendError (GDB_EINVALIDREGNUM);
|
||||
return;
|
||||
}
|
||||
|
||||
InBufPtr++; // skips the '=' character
|
||||
BasicWriteRegister (SystemContext, RegNumber, InBufPtr);
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/** ‘G XX...’
|
||||
Writes the new values received into the input buffer to the general registers
|
||||
@param SystemContext Register content at time of the exception
|
||||
@param InBuffer Pointer to the input buffer received from gdb server
|
||||
**/
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
WriteGeneralRegisters (
|
||||
@ -403,6 +401,7 @@ AddSingleStep (
|
||||
// Currently don't support nesting
|
||||
return;
|
||||
}
|
||||
|
||||
mSingleStepActive = TRUE;
|
||||
|
||||
mSingleStepPC = SystemContext.SystemContextArm->PC;
|
||||
@ -419,7 +418,6 @@ AddSingleStep (
|
||||
// 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
|
||||
|
||||
@ -440,12 +438,11 @@ RemoveSingleStep (
|
||||
// DEBUG((DEBUG_ERROR, "RemoveSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, *(UINT32 *)mSingleStepPC, mSingleStepData));
|
||||
*(UINT32 *)mSingleStepPC = mSingleStepData;
|
||||
}
|
||||
|
||||
InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize);
|
||||
mSingleStepActive = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Continue. addr is Address to resume. If addr is omitted, resume at current
|
||||
Address.
|
||||
@ -464,7 +461,6 @@ ContinueAtAddress (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** ‘s [addr ]’
|
||||
Single step. addr is the Address at which to resume. If addr is omitted, resume
|
||||
at same Address.
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include <GdbStubInternal.h>
|
||||
#include <Protocol/DebugPort.h>
|
||||
|
||||
|
||||
UINTN gMaxProcessorIndex = 0;
|
||||
|
||||
//
|
||||
@ -40,7 +39,6 @@ CHAR8 gXferLibraryBuffer[2000];
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mHexToStr[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GdbSymbolEventHandler (
|
||||
@ -50,7 +48,6 @@ GdbSymbolEventHandler (
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
The user Entry Point for Application. The user code starts with this function
|
||||
as the real entry point for the image goes into a library that calls this
|
||||
@ -113,6 +110,7 @@ GdbStubEntry (
|
||||
}
|
||||
}
|
||||
} while (HandleCount > 0);
|
||||
|
||||
FreePool (Handles);
|
||||
|
||||
if (!IsaSupported) {
|
||||
@ -135,6 +133,7 @@ GdbStubEntry (
|
||||
Status = DebugSupport->RegisterExceptionCallback (DebugSupport, Processor, GdbExceptionHandler, gExceptionType[Index].Exception);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
//
|
||||
// Current edk2 DebugPort is not interrupt context safe so we can not use it
|
||||
//
|
||||
@ -165,7 +164,6 @@ GdbStubEntry (
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
if (PcdGetBool (PcdGdbSerial)) {
|
||||
GdbInitializeSerialConsole ();
|
||||
}
|
||||
@ -180,7 +178,6 @@ GdbStubEntry (
|
||||
@param *address the start address of the transferring/writing the memory
|
||||
@param *new_data the new data to be written to memory
|
||||
**/
|
||||
|
||||
VOID
|
||||
TransferFromInBufToMem (
|
||||
IN UINTN Length,
|
||||
@ -200,13 +197,13 @@ TransferFromInBufToMem (
|
||||
SendError (GDB_EBADMEMDATA);
|
||||
return;
|
||||
}
|
||||
|
||||
*Address++ = (UINT8)((c1 << 4) + c2);
|
||||
}
|
||||
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Transfer Length bytes of memory starting at Address to an output buffer, OutBuffer. This function will finally send the buffer
|
||||
as a packet.
|
||||
@ -214,7 +211,6 @@ TransferFromInBufToMem (
|
||||
@param Length the number of the bytes to be transferred/read
|
||||
@param *address pointer to the start address of the transferring/reading the memory
|
||||
**/
|
||||
|
||||
VOID
|
||||
TransferFromMemToOutBufAndSend (
|
||||
IN UINTN Length,
|
||||
@ -233,17 +229,18 @@ TransferFromMemToOutBufAndSend (
|
||||
|
||||
OutBufPtr = OutBuffer;
|
||||
while (Length > 0) {
|
||||
|
||||
Char = mHexToStr[*Address >> 4];
|
||||
if ((Char >= 'A') && (Char <= 'F')) {
|
||||
Char = Char - 'A' + 'a';
|
||||
}
|
||||
|
||||
*OutBufPtr++ = Char;
|
||||
|
||||
Char = mHexToStr[*Address & 0x0f];
|
||||
if ((Char >= 'A') && (Char <= 'F')) {
|
||||
Char = Char - 'A' + 'a';
|
||||
}
|
||||
|
||||
*OutBufPtr++ = Char;
|
||||
|
||||
Address++;
|
||||
@ -254,8 +251,6 @@ TransferFromMemToOutBufAndSend (
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Send a GDB Remote Serial Protocol Packet
|
||||
|
||||
@ -286,7 +281,6 @@ SendPacket (
|
||||
|
||||
Count = 0;
|
||||
do {
|
||||
|
||||
Ptr = PacketData;
|
||||
|
||||
if (Timeout-- == 0) {
|
||||
@ -348,7 +342,7 @@ ReceivePacket (
|
||||
TestChar = GdbGetChar ();
|
||||
while (TestChar != '$') {
|
||||
TestChar = GdbGetChar ();
|
||||
};
|
||||
}
|
||||
|
||||
retry:
|
||||
for (Index = 0, CheckSum = 0; Index < (PacketDataSize - 1); Index++) {
|
||||
@ -356,6 +350,7 @@ ReceivePacket (
|
||||
if (Char == '$') {
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (Char == '#') {
|
||||
break;
|
||||
}
|
||||
@ -363,6 +358,7 @@ ReceivePacket (
|
||||
PacketData[Index] = Char;
|
||||
CheckSum = CheckSum + Char;
|
||||
}
|
||||
|
||||
PacketData[Index] = '\0';
|
||||
|
||||
if (Index == PacketDataSize) {
|
||||
@ -389,7 +385,6 @@ ReceivePacket (
|
||||
// return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Empties the given buffer
|
||||
@param Buf pointer to the first element in buffer to be emptied
|
||||
@ -402,7 +397,6 @@ EmptyBuffer (
|
||||
*Buf = '\0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Converts an 8-bit Hex Char into a INTN.
|
||||
|
||||
@ -421,7 +415,8 @@ HexCharToInt (
|
||||
return Char - 'a' + 10;
|
||||
} else if ((Char >= '0') && (Char <= '9')) {
|
||||
return Char - '0';
|
||||
} else { // if not a hex value, return a negative value
|
||||
} else {
|
||||
// if not a hex value, return a negative value
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -451,8 +446,6 @@ SendError (
|
||||
SendPacket (gError); // send buffer
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Send 'OK' when the function is done executing successfully.
|
||||
**/
|
||||
@ -465,7 +458,6 @@ SendSuccess (
|
||||
SendPacket ("OK"); // send buffer
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Send empty packet to specify that particular command/functionality is not supported.
|
||||
**/
|
||||
@ -478,7 +470,6 @@ SendNotSupported (
|
||||
SendPacket ("");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Send the T signal with the given exception type (in gdb order) and possibly with n:r pairs related to the watchpoints
|
||||
|
||||
@ -519,10 +510,9 @@ GdbSendTSignal (
|
||||
while (*WatchStrPtr != '\0') {
|
||||
*TSignalPtr++ = *WatchStrPtr++;
|
||||
}
|
||||
|
||||
gSymbolTableUpdate = FALSE;
|
||||
} else {
|
||||
|
||||
|
||||
//
|
||||
// possible n:r pairs
|
||||
//
|
||||
@ -535,7 +525,6 @@ GdbSendTSignal (
|
||||
|
||||
// INFO: rwatch is not supported due to the way IA32 debug registers work
|
||||
if ((BreakType == DataWrite) || (BreakType == DataRead) || (BreakType == DataReadWrite)) {
|
||||
|
||||
// Construct n:r pair
|
||||
DataAddress = GetBreakpointDataAddress (SystemContext, BreakpointDetected);
|
||||
|
||||
@ -572,7 +561,6 @@ GdbSendTSignal (
|
||||
SendPacket (TSignalBuffer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Translates the EFI mapping to GDB mapping
|
||||
|
||||
@ -591,16 +579,15 @@ ConvertEFItoGDBtype (
|
||||
return gExceptionType[Index].SignalNo;
|
||||
}
|
||||
}
|
||||
|
||||
return GDB_SIGTRAP; // this is a GDB trap
|
||||
}
|
||||
|
||||
|
||||
/** "m addr,length"
|
||||
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
|
||||
send it as a packet.
|
||||
**/
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ReadFromMemory (
|
||||
@ -618,6 +605,7 @@ ReadFromMemory (
|
||||
while (*InBufPtr != ',') {
|
||||
*AddrBufPtr++ = *InBufPtr++;
|
||||
}
|
||||
|
||||
*AddrBufPtr = '\0';
|
||||
|
||||
InBufPtr++; // this skips ',' in the buffer
|
||||
@ -642,7 +630,6 @@ ReadFromMemory (
|
||||
TransferFromMemToOutBufAndSend (Length, (unsigned char *)Address);
|
||||
}
|
||||
|
||||
|
||||
/** "M addr,length :XX..."
|
||||
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
|
||||
@ -670,6 +657,7 @@ WriteToMemory (
|
||||
while (*InBufPtr != ',') {
|
||||
*AddrBufPtr++ = *InBufPtr++;
|
||||
}
|
||||
|
||||
*AddrBufPtr = '\0';
|
||||
|
||||
InBufPtr++; // this skips ',' in the buffer
|
||||
@ -677,6 +665,7 @@ WriteToMemory (
|
||||
while (*InBufPtr != ':') {
|
||||
*LengthBufPtr++ = *InBufPtr++;
|
||||
}
|
||||
|
||||
*LengthBufPtr = '\0';
|
||||
|
||||
InBufPtr++; // this skips ':' in the buffer
|
||||
@ -708,6 +697,7 @@ WriteToMemory (
|
||||
SendError (GDB_EBADMEMDATASIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
TransferFromInBufToMem (Length, (unsigned char *)Address, InBufPtr);
|
||||
}
|
||||
|
||||
@ -749,12 +739,14 @@ ParseBreakpointPacket (
|
||||
}
|
||||
|
||||
// Skip ',' in the buffer.
|
||||
while (*PacketDataPtr++ != ',');
|
||||
while (*PacketDataPtr++ != ',') {
|
||||
}
|
||||
|
||||
// Parse Address information
|
||||
while (*PacketDataPtr != ',') {
|
||||
*AddressBufferPtr++ = *PacketDataPtr++;
|
||||
}
|
||||
|
||||
*AddressBufferPtr = '\0';
|
||||
|
||||
// Check if Address is not too long.
|
||||
@ -804,6 +796,7 @@ gXferObjectReadResponse (
|
||||
|
||||
Char ^= 0x20;
|
||||
}
|
||||
|
||||
*OutBufPtr++ = Char;
|
||||
Count++;
|
||||
}
|
||||
@ -814,7 +807,6 @@ gXferObjectReadResponse (
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Note: This should be a library function. In the Apple case you have to add
|
||||
the size of the PE/COFF header into the starting address to make things work
|
||||
@ -888,15 +880,14 @@ PeCoffLoaderGetDebuggerInfo (
|
||||
Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress +
|
||||
TEImageAdjust);
|
||||
}
|
||||
|
||||
SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;
|
||||
|
||||
// __APPLE__ check this math...
|
||||
*DebugBase = ((CHAR8 *)Pe32Data) - TEImageAdjust;
|
||||
} else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
|
||||
|
||||
*DebugBase = Pe32Data;
|
||||
|
||||
|
||||
//
|
||||
// NOTE: We use Machine field to identify PE32/PE32+, instead of Magic.
|
||||
// It is due to backward-compatibility, for some system might
|
||||
@ -949,7 +940,7 @@ PeCoffLoaderGetDebuggerInfo (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (DebugEntry == NULL || DirectoryEntry == NULL) {
|
||||
if ((DebugEntry == NULL) || (DirectoryEntry == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -976,7 +967,6 @@ PeCoffLoaderGetDebuggerInfo (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Process "qXfer:object:read:annex:offset,length" request.
|
||||
|
||||
@ -1045,7 +1035,8 @@ QxferLibrary (
|
||||
for ( ; gEfiDebugImageTableEntry < gDebugImageTableHeader->TableSize; gEfiDebugImageTableEntry++, gDebugTable++) {
|
||||
if (gDebugTable->NormalImage != NULL) {
|
||||
if ((gDebugTable->NormalImage->ImageInfoType == EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL) &&
|
||||
(gDebugTable->NormalImage->LoadedImageProtocolInstance != NULL)) {
|
||||
(gDebugTable->NormalImage->LoadedImageProtocolInstance != NULL))
|
||||
{
|
||||
Pdb = PeCoffLoaderGetDebuggerInfo (
|
||||
gDebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase,
|
||||
&LoadAddress
|
||||
@ -1080,13 +1071,11 @@ QxferLibrary (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
gXferObjectReadResponse ('l', "</library-list>\n");
|
||||
gPacketqXferLibraryOffset = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Exception Handler for GDB. It will be called for all exceptions
|
||||
registered via the gExceptionType[] array.
|
||||
@ -1104,7 +1093,6 @@ GdbExceptionHandler (
|
||||
UINT8 GdbExceptionType;
|
||||
CHAR8 *Ptr;
|
||||
|
||||
|
||||
if (ValidateException (ExceptionType, SystemContext) == FALSE) {
|
||||
return;
|
||||
}
|
||||
@ -1163,17 +1151,21 @@ GdbExceptionHandler (
|
||||
} else if (AsciiStrnCmp (gInBuffer, "qXfer:libraries:read::", 22) == 0) {
|
||||
// ‘qXfer:libraries:read::offset,length
|
||||
// gInBuffer[22] is offset string, ++Ptr is length string’
|
||||
for (Ptr = &gInBuffer[22]; *Ptr != ','; Ptr++);
|
||||
for (Ptr = &gInBuffer[22]; *Ptr != ','; Ptr++) {
|
||||
}
|
||||
|
||||
// Not sure if multi-radix support is required. Currently only support decimal
|
||||
QxferLibrary (AsciiStrHexToUintn (&gInBuffer[22]), AsciiStrHexToUintn (++Ptr));
|
||||
} if (AsciiStrnCmp (gInBuffer, "qOffsets", 10) == 0) {
|
||||
}
|
||||
|
||||
if (AsciiStrnCmp (gInBuffer, "qOffsets", 10) == 0) {
|
||||
AsciiSPrint (gOutBuffer, MAX_BUF_SIZE, "Text=1000;Data=f000;Bss=f000");
|
||||
SendPacket (gOutBuffer);
|
||||
} else {
|
||||
// Send empty packet
|
||||
SendNotSupported ();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 's':
|
||||
@ -1196,7 +1188,6 @@ GdbExceptionHandler (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Periodic callback for GDB. This function is used to catch a ctrl-c or other
|
||||
break in type command from GDB.
|
||||
|
@ -49,7 +49,6 @@ extern CONST CHAR8 mHexToStr[];
|
||||
// the mask used to clear all the cache
|
||||
#define TF_BIT 0x00000100
|
||||
|
||||
|
||||
//
|
||||
// GDB Signal definitions - generic names for interrupts
|
||||
//
|
||||
@ -59,7 +58,6 @@ extern CONST CHAR8 mHexToStr[];
|
||||
#define GDB_SIGFPE 8 // Floating point exception
|
||||
#define GDB_SIGSEGV 11 // Segment violation, page fault
|
||||
|
||||
|
||||
//
|
||||
// GDB File I/O Error values, zero means no error
|
||||
// Includes all general GDB Unix like error values
|
||||
@ -76,7 +74,6 @@ extern CONST CHAR8 mHexToStr[];
|
||||
#define GDB_EINVALIDREGNUM 61 // given register number is not valid: either <0 or >=Number of Registers
|
||||
#define GDB_EUNKNOWN 255 // unknown
|
||||
|
||||
|
||||
//
|
||||
// These devices are open by GDB so we can just read and write to them
|
||||
//
|
||||
@ -122,16 +119,13 @@ typedef struct {
|
||||
INTN OutFileDescriptor;
|
||||
} GDB_SERIAL_DEV;
|
||||
|
||||
|
||||
#define GDB_SERIAL_DEV_FROM_THIS(a) CR (a, GDB_SERIAL_DEV, SerialIo, GDB_SERIAL_DEV_SIGNATURE)
|
||||
|
||||
|
||||
typedef struct {
|
||||
EFI_EXCEPTION_TYPE Exception;
|
||||
UINT8 SignalNo;
|
||||
} EFI_EXCEPTION_TYPE_ENTRY;
|
||||
|
||||
|
||||
#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
|
||||
|
||||
//
|
||||
@ -215,7 +209,6 @@ extern BOOLEAN gCtrlCBreakFlag;
|
||||
//
|
||||
extern BOOLEAN gProcessingFPacket;
|
||||
|
||||
|
||||
// The offsets of registers SystemContext.
|
||||
// The fields in the array are in the gdb ordering.
|
||||
//
|
||||
@ -231,7 +224,6 @@ MaxEfiException (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gRegisters[]
|
||||
|
||||
@ -242,7 +234,6 @@ MaxRegisterCount (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Check to see if the ISA is supported.
|
||||
ISA = Instruction Set Architecture
|
||||
@ -255,7 +246,6 @@ CheckIsa (
|
||||
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
|
||||
|
||||
@ -269,7 +259,6 @@ GdbSendTSignal (
|
||||
IN UINT8 GdbExceptionType
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Translates the EFI mapping to GDB mapping
|
||||
|
||||
@ -281,7 +270,6 @@ ConvertEFItoGDBtype (
|
||||
IN EFI_EXCEPTION_TYPE EFIExceptionType
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Empties the given buffer
|
||||
@param *Buf pointer to the first element in buffer to be emptied
|
||||
@ -291,7 +279,6 @@ EmptyBuffer (
|
||||
IN CHAR8 *Buf
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Converts an 8-bit Hex Char into a INTN.
|
||||
|
||||
@ -304,7 +291,6 @@ HexCharToInt (
|
||||
IN CHAR8 Char
|
||||
);
|
||||
|
||||
|
||||
/** 'E NN'
|
||||
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.
|
||||
@ -318,7 +304,6 @@ SendError (
|
||||
IN UINT8 ErrorNum
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send 'OK' when the function is done executing successfully.
|
||||
**/
|
||||
@ -328,7 +313,6 @@ SendSuccess (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send empty packet to specify that particular command/functionality is not supported.
|
||||
**/
|
||||
@ -349,7 +333,6 @@ ReadNthRegister (
|
||||
IN CHAR8 *InBuffer
|
||||
);
|
||||
|
||||
|
||||
/** ‘g’
|
||||
Reads the general registers into an output buffer and sends it as a packet
|
||||
@param SystemContext Register content at time of the exception
|
||||
@ -360,7 +343,6 @@ ReadGeneralRegisters (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/** ‘P n...=r...’
|
||||
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
|
||||
@ -373,7 +355,6 @@ WriteNthRegister (
|
||||
IN CHAR8 *InBuffer
|
||||
);
|
||||
|
||||
|
||||
/** ‘G XX...’
|
||||
Writes the new values received into the input buffer to the general registers
|
||||
@param SystemContext Register content at time of the exception
|
||||
@ -387,7 +368,6 @@ WriteGeneralRegisters (
|
||||
IN CHAR8 *InBuffer
|
||||
);
|
||||
|
||||
|
||||
/** ‘m addr,length ’
|
||||
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
|
||||
@ -401,7 +381,6 @@ ReadFromMemory (
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/** ‘M addr,length :XX...’
|
||||
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
|
||||
@ -415,7 +394,6 @@ WriteToMemory (
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/** ‘c [addr ]’
|
||||
Continue. addr is Address to resume. If addr is omitted, resume at current
|
||||
Address.
|
||||
@ -431,7 +409,6 @@ ContinueAtAddress (
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/** ‘s [addr ]’
|
||||
Single step. addr is the Address at which to resume. If addr is omitted, resume
|
||||
at same Address.
|
||||
@ -466,7 +443,6 @@ RemoveSingleStep (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
‘Z1, [addr], [length]’
|
||||
‘Z2, [addr], [length]’
|
||||
@ -486,7 +462,6 @@ InsertBreakPoint(
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
‘z1, [addr], [length]’
|
||||
‘z2, [addr], [length]’
|
||||
@ -506,7 +481,6 @@ RemoveBreakPoint(
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Exception Handler for GDB. It will be called for all exceptions
|
||||
registered via the gExceptionType[] array.
|
||||
@ -522,7 +496,6 @@ GdbExceptionHandler (
|
||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Periodic callback for GDB. This function is used to catch a ctrl-c or other
|
||||
break in type command from GDB.
|
||||
@ -536,7 +509,6 @@ GdbPeriodicCallBack (
|
||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
|
||||
|
||||
@ -549,7 +521,6 @@ GdbInitializeSerialConsole (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send a GDB Remote Serial Protocol Packet
|
||||
|
||||
@ -569,7 +540,6 @@ SendPacket (
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Receive a GDB Remote Serial Protocol Packet
|
||||
|
||||
@ -592,7 +562,6 @@ ReceivePacket (
|
||||
IN UINTN PacketDataSize
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
@ -612,7 +581,6 @@ GdbRead (
|
||||
IN UINTN Count
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates
|
||||
nothing was written. On error -1 is returned.
|
||||
|
@ -30,7 +30,6 @@ EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
|
||||
{ EXCEPT_IA32_MACHINE_CHECK, GDB_SIGEMT }
|
||||
};
|
||||
|
||||
|
||||
// The offsets of registers SystemContext.
|
||||
// The fields in the array are in the gdb ordering.
|
||||
//
|
||||
@ -54,7 +53,6 @@ UINTN gRegisterOffsets[] = {
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Gs)
|
||||
};
|
||||
|
||||
|
||||
// Debug only..
|
||||
VOID
|
||||
PrintReg (
|
||||
@ -87,7 +85,6 @@ PrintDRreg (
|
||||
Print ((CHAR16 *)L"DR7: %x\n", SystemContext.SystemContextIa32->Dr7);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gExceptionType[]
|
||||
|
||||
@ -101,7 +98,6 @@ MaxEfiException (
|
||||
return sizeof (gExceptionType)/sizeof (EFI_EXCEPTION_TYPE_ENTRY);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gRegisters[]
|
||||
|
||||
@ -115,7 +111,6 @@ MaxRegisterCount (
|
||||
return sizeof (gRegisterOffsets)/sizeof (UINTN);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check to see if the ISA is supported.
|
||||
ISA = Instruction Set Architecture
|
||||
@ -131,7 +126,6 @@ CheckIsa (
|
||||
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
|
||||
It is, by default, set to find the register pointer of the IA32 member
|
||||
@ -147,11 +141,11 @@ FindPointerToRegister (
|
||||
)
|
||||
{
|
||||
UINT8 *TempPtr;
|
||||
|
||||
TempPtr = ((UINT8 *)SystemContext.SystemContextIa32) + gRegisterOffsets[RegNumber];
|
||||
return (UINTN *)TempPtr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
|
||||
|
||||
@ -175,10 +169,10 @@ BasicReadRegister (
|
||||
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
|
||||
return OutBufPtr;
|
||||
}
|
||||
|
||||
|
||||
/** ‘p n’
|
||||
Reads the n-th register's value into an output buffer and sends it as a packet
|
||||
|
||||
@ -210,7 +204,6 @@ ReadNthRegister (
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/** ‘g’
|
||||
Reads the general registers into an output buffer and sends it as a packet
|
||||
|
||||
@ -227,7 +220,8 @@ ReadGeneralRegisters (
|
||||
CHAR8 *OutBufPtr; // pointer to the output buffer
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -235,7 +229,6 @@ ReadGeneralRegisters (
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
|
||||
|
||||
@ -276,11 +269,11 @@ BasicWriteRegister (
|
||||
NewValue += (TempValue << RegSize);
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
|
||||
*(FindPointerToRegister (SystemContext, RegNumber)) = NewValue;
|
||||
return InBufPtr;
|
||||
}
|
||||
|
||||
|
||||
/** ‘P n...=r...’
|
||||
Writes the new value of n-th register received into the input buffer to the n-th register
|
||||
|
||||
@ -305,6 +298,7 @@ WriteNthRegister (
|
||||
while (*InBufPtr != '=') {
|
||||
*RegNumBufPtr++ = *InBufPtr++;
|
||||
}
|
||||
|
||||
*RegNumBufPtr = '\0';
|
||||
RegNumber = AsciiStrHexToUintn (RegNumBuffer);
|
||||
|
||||
@ -313,12 +307,12 @@ WriteNthRegister (
|
||||
SendError (GDB_EINVALIDREGNUM);
|
||||
return;
|
||||
}
|
||||
|
||||
InBufPtr++; // skips the '=' character
|
||||
BasicWriteRegister (SystemContext, RegNumber, InBufPtr);
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/** ‘G XX...’
|
||||
Writes the new values received into the input buffer to the general registers
|
||||
|
||||
@ -337,7 +331,8 @@ WriteGeneralRegisters (
|
||||
|
||||
// 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
|
||||
if (AsciiStrLen(InBuffer) != 129) { // 16 regs, 8 hex chars each, and the end '\0' (escape seq)
|
||||
if (AsciiStrLen (InBuffer) != 129) {
|
||||
// 16 regs, 8 hex chars each, and the end '\0' (escape seq)
|
||||
// Bad message. Message is not the right length
|
||||
SendError (GDB_EBADBUFSIZE);
|
||||
return;
|
||||
@ -347,14 +342,14 @@ WriteGeneralRegisters (
|
||||
|
||||
// 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
|
||||
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);
|
||||
}
|
||||
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Insert Single Step in the SystemContext
|
||||
|
||||
@ -368,7 +363,6 @@ AddSingleStep (
|
||||
SystemContext.SystemContextIa32->Eflags |= TF_BIT; // Setting the TF bit.
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Remove Single Step in the SystemContext
|
||||
|
||||
@ -382,8 +376,6 @@ RemoveSingleStep (
|
||||
SystemContext.SystemContextIa32->Eflags &= ~TF_BIT; // clearing the TF bit.
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** ‘c [addr ]’
|
||||
Continue. addr is Address to resume. If addr is omitted, resume at current
|
||||
Address.
|
||||
@ -402,7 +394,6 @@ ContinueAtAddress (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** ‘s [addr ]’
|
||||
Single step. addr is the Address at which to resume. If addr is omitted, resume
|
||||
at same Address.
|
||||
@ -423,7 +414,6 @@ SingleStep (
|
||||
AddSingleStep (SystemContext);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns breakpoint data address from DR0-DR3 based on the input breakpoint number
|
||||
|
||||
@ -456,7 +446,6 @@ GetBreakpointDataAddress (
|
||||
return Address;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns currently detected breakpoint value based on the register DR6 B0-B3 field.
|
||||
If no breakpoint is detected then it returns 0.
|
||||
@ -492,7 +481,6 @@ GetBreakpointDetected (
|
||||
return BreakpointNumber;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns Breakpoint type (InstructionExecution, DataWrite, DataRead or DataReadWrite)
|
||||
based on the Breakpoint number
|
||||
@ -528,7 +516,6 @@ GetBreakpointType (
|
||||
return Type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Parses Length and returns the length which DR7 LENn field accepts.
|
||||
For example: If we receive 1-Byte length then we should return 0.
|
||||
@ -544,18 +531,21 @@ ConvertLengthData (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
if (Length == 1) { //1-Byte length
|
||||
if (Length == 1) {
|
||||
// 1-Byte length
|
||||
return 0;
|
||||
} else if (Length == 2) { //2-Byte length
|
||||
} else if (Length == 2) {
|
||||
// 2-Byte length
|
||||
return 1;
|
||||
} else if (Length == 4) { //4-Byte length
|
||||
} else if (Length == 4) {
|
||||
// 4-Byte length
|
||||
return 3;
|
||||
} else { //Undefined or 8-byte length
|
||||
} else {
|
||||
// Undefined or 8-byte length
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Finds the next free debug register. If all the registers are occupied then
|
||||
EFI_OUT_OF_RESOURCES is returned.
|
||||
@ -591,7 +581,6 @@ FindNextFreeDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Enables the debug register. Writes Address value to appropriate DR0-3 register.
|
||||
Sets LENn, Gn, RWn bits in DR7 register.
|
||||
@ -628,7 +617,8 @@ EnableDebugRegister (
|
||||
// Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
// software breakpoint. We should send empty packet in both these cases.
|
||||
if ((Type == (BREAK_TYPE)DataRead) ||
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@ -665,7 +655,6 @@ EnableDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns register number 0 - 3 for the matching debug register.
|
||||
This function compares incoming Address, Type, Length and
|
||||
@ -696,7 +685,8 @@ FindMatchingDebugRegister (
|
||||
// Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
// software breakpoint. We should send empty packet in both these cases.
|
||||
if ((Type == (BREAK_TYPE)DataRead) ||
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@ -708,22 +698,26 @@ FindMatchingDebugRegister (
|
||||
if ((Dr7.Bits.G0 == 1) &&
|
||||
(Dr7.Bits.LEN0 == Length) &&
|
||||
(Dr7.Bits.RW0 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr0)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr0))
|
||||
{
|
||||
*Register = 0;
|
||||
} else if ((Dr7.Bits.G1 == 1) &&
|
||||
(Dr7.Bits.LEN1 == Length) &&
|
||||
(Dr7.Bits.RW1 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr1)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr1))
|
||||
{
|
||||
*Register = 1;
|
||||
} else if ((Dr7.Bits.G2 == 1) &&
|
||||
(Dr7.Bits.LEN2 == Length) &&
|
||||
(Dr7.Bits.RW2 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr2)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr2))
|
||||
{
|
||||
*Register = 2;
|
||||
} else if ((Dr7.Bits.G3 == 1) &&
|
||||
(Dr7.Bits.LEN3 == Length) &&
|
||||
(Dr7.Bits.RW3 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr3)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr3))
|
||||
{
|
||||
*Register = 3;
|
||||
} else {
|
||||
Print ((CHAR16 *)L"No match found..\n");
|
||||
@ -733,7 +727,6 @@ FindMatchingDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Disables the particular debug register.
|
||||
|
||||
@ -785,7 +778,6 @@ DisableDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
‘Z1, [addr], [length]’
|
||||
‘Z2, [addr], [length]’
|
||||
@ -820,7 +812,6 @@ InsertBreakPoint (
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
|
||||
case 0: // Software breakpoint
|
||||
BreakType = SoftwareBreakpoint;
|
||||
break;
|
||||
@ -858,7 +849,6 @@ InsertBreakPoint (
|
||||
// Write Address, length data at particular DR register
|
||||
Status = EnableDebugRegister (SystemContext, Register, Address, Length, (UINTN)BreakType);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
||||
if (Status == EFI_UNSUPPORTED) {
|
||||
Print ((CHAR16 *)L"Not supported\n");
|
||||
SendNotSupported ();
|
||||
@ -873,7 +863,6 @@ InsertBreakPoint (
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
‘z1, [addr], [length]’
|
||||
‘z2, [addr], [length]’
|
||||
@ -908,7 +897,6 @@ RemoveBreakPoint (
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
|
||||
case 0: // Software breakpoint
|
||||
BreakType = SoftwareBreakpoint;
|
||||
break;
|
||||
@ -937,7 +925,6 @@ RemoveBreakPoint (
|
||||
// Find matching debug register
|
||||
Status = FindMatchingDebugRegister (SystemContext, Address, Length, (UINTN)BreakType, &Register);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
||||
if (Status == EFI_UNSUPPORTED) {
|
||||
Print ((CHAR16 *)L"Not supported.\n");
|
||||
SendNotSupported ();
|
||||
@ -960,7 +947,6 @@ RemoveBreakPoint (
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
InitializeProcessor (
|
||||
VOID
|
||||
@ -984,4 +970,3 @@ ValidateException (
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,6 @@ BOOLEAN gProcessingFPacket = FALSE;
|
||||
@param ErrNo Error information from the F reply packet or other source
|
||||
|
||||
**/
|
||||
|
||||
VOID
|
||||
GdbCtrlCBreakMessage (
|
||||
IN UINTN ErrNo
|
||||
@ -49,7 +48,6 @@ GdbCtrlCBreakMessage (
|
||||
gCtrlCBreakFlag = TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Parse the F reply packet and extract the return value and an ErrNo if it exists.
|
||||
|
||||
@ -76,7 +74,9 @@ GdbParseFReplyPacket (
|
||||
RetCode = AsciiStrHexToUintn (&Packet[1]);
|
||||
|
||||
// Find 1st comma
|
||||
for (;*Packet != '\0' && *Packet != ','; Packet++);
|
||||
for ( ; *Packet != '\0' && *Packet != ','; Packet++) {
|
||||
}
|
||||
|
||||
if (*Packet == '\0') {
|
||||
*ErrNo = 0;
|
||||
return RetCode;
|
||||
@ -85,7 +85,9 @@ GdbParseFReplyPacket (
|
||||
*ErrNo = AsciiStrHexToUintn (++Packet);
|
||||
|
||||
// Find 2nd comma
|
||||
for (;*Packet != '\0' && *Packet != ','; Packet++);
|
||||
for ( ; *Packet != '\0' && *Packet != ','; Packet++) {
|
||||
}
|
||||
|
||||
if (*Packet == '\0') {
|
||||
return RetCode;
|
||||
}
|
||||
@ -97,7 +99,6 @@ GdbParseFReplyPacket (
|
||||
return RetCode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
@ -180,7 +181,6 @@ GdbRead (
|
||||
return RetCode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates
|
||||
nothing was written. On error -1 is returned.
|
||||
@ -260,7 +260,6 @@ GdbWrite (
|
||||
return RetCode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reset the serial device.
|
||||
|
||||
@ -279,7 +278,6 @@ GdbSerialReset (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Sets the baud rate, receive FIFO depth, transmit/receive time out, parity,
|
||||
data buts, and stop bits on a serial device.
|
||||
@ -321,7 +319,6 @@ GdbSerialSetAttributes (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Set the control bits on a serial device
|
||||
|
||||
@ -343,7 +340,6 @@ GdbSerialSetControl (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Retrieves the status of the control bits on a serial device
|
||||
|
||||
@ -364,7 +360,6 @@ GdbSerialGetControl (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Writes data to a serial device.
|
||||
|
||||
@ -416,7 +411,6 @@ GdbSerialWrite (
|
||||
@retval EFI_TIMEOUT The data write was stopped due to a timeout.
|
||||
|
||||
**/
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GdbSerialRead (
|
||||
@ -442,7 +436,6 @@ GdbSerialRead (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Template used to initialize the GDB Serial IO protocols
|
||||
//
|
||||
@ -495,7 +488,6 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
|
||||
GDB_STDOUT
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
|
||||
|
||||
@ -529,8 +521,10 @@ GdbInitializeSerialConsole (
|
||||
// Make a new handle with Serial IO protocol and its device path on it.
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&StdOutSerialDev->Handle,
|
||||
&gEfiSerialIoProtocolGuid, &StdOutSerialDev->SerialIo,
|
||||
&gEfiDevicePathProtocolGuid, &StdOutSerialDev->DevicePath,
|
||||
&gEfiSerialIoProtocolGuid,
|
||||
&StdOutSerialDev->SerialIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&StdOutSerialDev->DevicePath,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
@ -538,10 +532,11 @@ GdbInitializeSerialConsole (
|
||||
// Make a new handle with Serial IO protocol and its device path on it.
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&StdErrSerialDev->Handle,
|
||||
&gEfiSerialIoProtocolGuid, &StdErrSerialDev->SerialIo,
|
||||
&gEfiDevicePathProtocolGuid, &StdErrSerialDev->DevicePath,
|
||||
&gEfiSerialIoProtocolGuid,
|
||||
&StdErrSerialDev->SerialIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&StdErrSerialDev->DevicePath,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,6 @@ EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
|
||||
{ EXCEPT_X64_MACHINE_CHECK, GDB_SIGEMT }
|
||||
};
|
||||
|
||||
|
||||
// The offsets of registers SystemContextX64.
|
||||
// The fields in the array are in the gdb ordering.
|
||||
// HAVE TO DOUBLE-CHECK THE ORDER of the 24 regs
|
||||
@ -61,7 +60,6 @@ UINTN gRegisterOffsets[] = {
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R15)
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gExceptionType[]
|
||||
|
||||
@ -75,7 +73,6 @@ MaxEfiException (
|
||||
return sizeof (gExceptionType)/sizeof (EFI_EXCEPTION_TYPE_ENTRY);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gRegisters[]
|
||||
|
||||
@ -89,7 +86,6 @@ MaxRegisterCount (
|
||||
return sizeof (gRegisterOffsets)/sizeof (UINTN);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check to see if the ISA is supported.
|
||||
ISA = Instruction Set Architecture
|
||||
@ -104,7 +100,6 @@ CheckIsa (
|
||||
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
|
||||
It is, by default, set to find the register pointer of the X64 member
|
||||
@ -119,11 +114,11 @@ FindPointerToRegister(
|
||||
)
|
||||
{
|
||||
UINT8 *TempPtr;
|
||||
|
||||
TempPtr = ((UINT8 *)SystemContext.SystemContextX64) + gRegisterOffsets[RegNumber];
|
||||
return (UINTN *)TempPtr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -146,10 +141,10 @@ BasicReadRegister (
|
||||
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
|
||||
return OutBufPtr;
|
||||
}
|
||||
|
||||
|
||||
/** ‘p n’
|
||||
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
|
||||
@ -179,7 +174,6 @@ ReadNthRegister (
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/** ‘g’
|
||||
Reads the general registers into an output buffer and sends it as a packet
|
||||
|
||||
@ -196,7 +190,8 @@ ReadGeneralRegisters (
|
||||
CHAR8 *OutBufPtr; // pointer to the output buffer
|
||||
|
||||
OutBufPtr = OutBuffer;
|
||||
for(i = 0 ; i < MaxRegisterCount() ; i++) { // there are only 24 registers to read
|
||||
for (i = 0; i < MaxRegisterCount (); i++) {
|
||||
// there are only 24 registers to read
|
||||
OutBufPtr = BasicReadRegister (SystemContext, i, OutBufPtr);
|
||||
}
|
||||
|
||||
@ -204,7 +199,6 @@ ReadGeneralRegisters (
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
|
||||
|
||||
@ -245,11 +239,11 @@ BasicWriteRegister (
|
||||
NewValue += (TempValue << RegSize);
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
|
||||
*(FindPointerToRegister (SystemContext, RegNumber)) = NewValue;
|
||||
return InBufPtr;
|
||||
}
|
||||
|
||||
|
||||
/** ‘P n...=r...’
|
||||
Writes the new value of n-th register received into the input buffer to the n-th register
|
||||
|
||||
@ -274,6 +268,7 @@ WriteNthRegister (
|
||||
while (*InBufPtr != '=') {
|
||||
*RegNumBufPtr++ = *InBufPtr++;
|
||||
}
|
||||
|
||||
*RegNumBufPtr = '\0';
|
||||
RegNumber = AsciiStrHexToUintn (RegNumBuffer);
|
||||
|
||||
@ -282,12 +277,12 @@ WriteNthRegister (
|
||||
SendError (GDB_EINVALIDREGNUM);
|
||||
return;
|
||||
}
|
||||
|
||||
InBufPtr++; // skips the '=' character
|
||||
BasicWriteRegister (SystemContext, RegNumber, InBufPtr);
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/** ‘G XX...’
|
||||
Writes the new values received into the input buffer to the general registers
|
||||
|
||||
@ -306,7 +301,8 @@ WriteGeneralRegisters (
|
||||
|
||||
// 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
|
||||
if (AsciiStrLen(InBuffer) != 385) { // 24 regs, 16 hex chars each, and the end '\0' (escape seq)
|
||||
if (AsciiStrLen (InBuffer) != 385) {
|
||||
// 24 regs, 16 hex chars each, and the end '\0' (escape seq)
|
||||
// Bad message. Message is not the right length
|
||||
SendError (GDB_EBADBUFSIZE);
|
||||
return;
|
||||
@ -316,14 +312,14 @@ WriteGeneralRegisters (
|
||||
|
||||
// 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
|
||||
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);
|
||||
}
|
||||
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Insert Single Step in the SystemContext
|
||||
|
||||
@ -337,8 +333,6 @@ AddSingleStep (
|
||||
SystemContext.SystemContextX64->Rflags |= TF_BIT; // Setting the TF bit.
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Remove Single Step in the SystemContext
|
||||
|
||||
@ -352,8 +346,6 @@ RemoveSingleStep (
|
||||
SystemContext.SystemContextX64->Rflags &= ~TF_BIT; // clearing the TF bit.
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** ‘c [addr ]’
|
||||
Continue. addr is Address to resume. If addr is omitted, resume at current
|
||||
Address.
|
||||
@ -372,7 +364,6 @@ ContinueAtAddress (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** ‘s [addr ]’
|
||||
Single step. addr is the Address at which to resume. If addr is omitted, resume
|
||||
at same Address.
|
||||
@ -393,7 +384,6 @@ SingleStep (
|
||||
AddSingleStep (SystemContext);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns breakpoint data address from DR0-DR3 based on the input breakpoint
|
||||
number
|
||||
@ -499,7 +489,6 @@ GetBreakpointType (
|
||||
return Type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Parses Length and returns the length which DR7 LENn field accepts.
|
||||
For example: If we receive 1-Byte length then we should return 0.
|
||||
@ -515,18 +504,21 @@ ConvertLengthData (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
if (Length == 1) { //1-Byte length
|
||||
if (Length == 1) {
|
||||
// 1-Byte length
|
||||
return 0;
|
||||
} else if (Length == 2) { //2-Byte length
|
||||
} else if (Length == 2) {
|
||||
// 2-Byte length
|
||||
return 1;
|
||||
} else if (Length == 4) { //4-Byte length
|
||||
} else if (Length == 4) {
|
||||
// 4-Byte length
|
||||
return 3;
|
||||
} else { //Undefined or 8-byte length
|
||||
} else {
|
||||
// Undefined or 8-byte length
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Finds the next free debug register. If all the registers are occupied then
|
||||
EFI_OUT_OF_RESOURCES is returned.
|
||||
@ -562,7 +554,6 @@ FindNextFreeDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Enables the debug register. Writes Address value to appropriate DR0-3 register.
|
||||
Sets LENn, Gn, RWn bits in DR7 register.
|
||||
@ -599,7 +590,8 @@ EnableDebugRegister (
|
||||
// Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
// software breakpoint. We should send empty packet in both these cases.
|
||||
if ((Type == (BREAK_TYPE)DataRead) ||
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@ -636,7 +628,6 @@ EnableDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns register number 0 - 3 for the matching debug register.
|
||||
This function compares incoming Address, Type, Length and
|
||||
@ -667,7 +658,8 @@ FindMatchingDebugRegister (
|
||||
// Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
// software breakpoint. We should send empty packet in both these cases.
|
||||
if ((Type == (BREAK_TYPE)DataRead) ||
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@ -679,22 +671,26 @@ FindMatchingDebugRegister (
|
||||
if ((Dr7.Bits.G0 == 1) &&
|
||||
(Dr7.Bits.LEN0 == Length) &&
|
||||
(Dr7.Bits.RW0 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr0)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr0))
|
||||
{
|
||||
*Register = 0;
|
||||
} else if ((Dr7.Bits.G1 == 1) &&
|
||||
(Dr7.Bits.LEN1 == Length) &&
|
||||
(Dr7.Bits.RW1 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr1)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr1))
|
||||
{
|
||||
*Register = 1;
|
||||
} else if ((Dr7.Bits.G2 == 1) &&
|
||||
(Dr7.Bits.LEN2 == Length) &&
|
||||
(Dr7.Bits.RW2 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr2)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr2))
|
||||
{
|
||||
*Register = 2;
|
||||
} else if ((Dr7.Bits.G3 == 1) &&
|
||||
(Dr7.Bits.LEN3 == Length) &&
|
||||
(Dr7.Bits.RW3 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr3)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr3))
|
||||
{
|
||||
*Register = 3;
|
||||
} else {
|
||||
Print ((CHAR16 *)L"No match found..\n");
|
||||
@ -704,7 +700,6 @@ FindMatchingDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Disables the particular debug register.
|
||||
|
||||
@ -790,7 +785,6 @@ InsertBreakPoint (
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
|
||||
case 0: // Software breakpoint
|
||||
BreakType = SoftwareBreakpoint;
|
||||
break;
|
||||
@ -828,7 +822,6 @@ InsertBreakPoint (
|
||||
// Write Address, length data at particular DR register
|
||||
Status = EnableDebugRegister (SystemContext, Register, Address, Length, (UINTN)BreakType);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
||||
if (Status == EFI_UNSUPPORTED) {
|
||||
Print ((CHAR16 *)L"Not supported\n");
|
||||
SendNotSupported ();
|
||||
@ -843,7 +836,6 @@ InsertBreakPoint (
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
‘z1, [addr], [length]’
|
||||
‘z2, [addr], [length]’
|
||||
@ -878,7 +870,6 @@ RemoveBreakPoint (
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
|
||||
case 0: // Software breakpoint
|
||||
BreakType = SoftwareBreakpoint;
|
||||
break;
|
||||
@ -907,7 +898,6 @@ RemoveBreakPoint (
|
||||
// Find matching debug register
|
||||
Status = FindMatchingDebugRegister (SystemContext, Address, Length, (UINTN)BreakType, &Register);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
||||
if (Status == EFI_UNSUPPORTED) {
|
||||
Print ((CHAR16 *)L"Not supported.\n");
|
||||
SendNotSupported ();
|
||||
@ -930,7 +920,6 @@ RemoveBreakPoint (
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
InitializeProcessor (
|
||||
VOID
|
||||
@ -954,4 +943,3 @@ ValidateException (
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,6 @@
|
||||
|
||||
#include <Library/ExtractGuidedSectionLib.h>
|
||||
|
||||
|
||||
//
|
||||
// The GUID for this protocol mathes the Decompression scheme being used
|
||||
// So for example LZMA would be gLzmaCustomDecompressGuid
|
||||
@ -27,4 +26,3 @@ typedef struct {
|
||||
} EXTRACT_SECTION_HOB;
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -18,7 +18,6 @@
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
|
||||
|
||||
#ifndef __EDKII_NV_VAR_STORE_FORMATTED_H__
|
||||
#define __EDKII_NV_VAR_STORE_FORMATTED_H__
|
||||
|
||||
|
@ -14,7 +14,6 @@
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
|
||||
|
||||
#ifndef __EDKII_PLATFORM_HAS_DEVICE_TREE_H__
|
||||
#define __EDKII_PLATFORM_HAS_DEVICE_TREE_H__
|
||||
|
||||
|
@ -45,6 +45,7 @@ typedef struct {
|
||||
|
||||
/* 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))
|
||||
|
||||
/* Android boot image page size is not specified, but it should be power of 2
|
||||
* and larger than boot header */
|
||||
#define IS_VALID_ANDROID_PAGE_SIZE(Val) \
|
||||
|
@ -12,8 +12,6 @@
|
||||
#ifndef __GDB_TIMER_LIB__
|
||||
#define __GDB_TIMER_LIB__
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Setup all the hardware needed for the debug agents timer.
|
||||
|
||||
@ -26,7 +24,6 @@ DebugAgentTimerIntialize (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Set the period for the debug agent timer. Zero means disable the timer.
|
||||
|
||||
@ -39,7 +36,6 @@ DebugAgentTimerSetPeriod (
|
||||
IN UINT32 TimerPeriodMilliseconds
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Perform End Of Interrupt for the debug agent timer. This is called in the
|
||||
interrupt handler after the interrupt has been processed.
|
||||
@ -52,5 +48,3 @@ DebugAgentTimerEndOfInterrupt (
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -51,9 +51,6 @@ typedef enum {
|
||||
MapOperationMaximum
|
||||
} DMA_MAP_OPERATION;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Provides the DMA controller-specific addresses needed to access system memory.
|
||||
|
||||
@ -84,9 +81,6 @@ DmaMap (
|
||||
OUT VOID **Mapping
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Completes the DmaMapBusMasterRead, DmaMapBusMasterWrite, or DmaMapBusMasterCommonBuffer
|
||||
operation and releases any corresponding resources.
|
||||
@ -103,7 +97,6 @@ DmaUnmap (
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Allocates pages that are suitable for an DmaMap() of type MapOperationBusMasterCommonBuffer.
|
||||
mapping.
|
||||
@ -129,7 +122,6 @@ DmaAllocateBuffer (
|
||||
OUT VOID **HostAddress
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Frees memory that was allocated with DmaAllocateBuffer().
|
||||
|
||||
@ -148,7 +140,6 @@ DmaFreeBuffer (
|
||||
IN VOID *HostAddress
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Allocates pages that are suitable for an DmaMap() of type
|
||||
MapOperationBusMasterCommonBuffer mapping, at the requested alignment.
|
||||
@ -177,5 +168,4 @@ DmaAllocateAlignedBuffer (
|
||||
OUT VOID **HostAddress
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -55,7 +55,6 @@ typedef enum {
|
||||
EfiOpenMaxValue
|
||||
} EFI_OPEN_FILE_TYPE;
|
||||
|
||||
|
||||
/// Public information about the open file
|
||||
typedef struct {
|
||||
UINTN Version; // Common information
|
||||
@ -97,10 +96,8 @@ typedef struct {
|
||||
EFI_IP_ADDRESS ServerIp; // Information valid for t:
|
||||
BOOLEAN IsDirty;
|
||||
BOOLEAN IsBufferValid;
|
||||
|
||||
} EFI_OPEN_FILE;
|
||||
|
||||
|
||||
/// Type of Seek to perform
|
||||
typedef enum {
|
||||
EfiSeekStart,
|
||||
@ -109,7 +106,6 @@ typedef enum {
|
||||
EfiSeekMax
|
||||
} EFI_SEEK_TYPE;
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -158,7 +154,6 @@ EfiDeviceOpenByType (
|
||||
IN UINTN Index
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Close a file handle opened by EfiOpen() and free all resources allocated by
|
||||
EfiOpen().
|
||||
@ -174,7 +169,6 @@ EfiClose (
|
||||
IN EFI_OPEN_FILE *Stream
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
@ -191,7 +185,6 @@ EfiTell (
|
||||
OUT UINT64 *CurrentPosition OPTIONAL
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -220,7 +213,6 @@ EfiSeek (
|
||||
IN EFI_SEEK_TYPE SeekType
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Read BufferSize bytes from the current location in the file. For load file
|
||||
and FV case you must read the entire file.
|
||||
@ -244,7 +236,6 @@ EfiRead (
|
||||
OUT UINTN *BufferSize
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Read the entire file into a buffer. This routine allocates the buffer and
|
||||
returns it to the user full of the read data.
|
||||
@ -271,7 +262,6 @@ EfiReadAllocatePool (
|
||||
OUT UINTN *BufferSize
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Write data back to the file.
|
||||
|
||||
@ -294,7 +284,6 @@ EfiWrite (
|
||||
OUT UINTN *BufferSize
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Return the number of devices of the current type active in the system
|
||||
|
||||
@ -308,7 +297,6 @@ EfiGetDeviceCounts (
|
||||
IN EFI_OPEN_FILE_TYPE Type
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
|
@ -6,11 +6,9 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef __EFI_RESET_SYSTEM_LIB_H___
|
||||
#define __EFI_RESET_SYSTEM_LIB_H___
|
||||
|
||||
|
||||
/**
|
||||
Resets the entire platform.
|
||||
|
||||
@ -31,8 +29,6 @@ LibResetSystem (
|
||||
IN CHAR16 *ResetData OPTIONAL
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Initialize any infrastructure required for LibResetSystem () to function.
|
||||
|
||||
|
@ -10,8 +10,6 @@
|
||||
#ifndef __GDB_SERIAL_LIB_H__
|
||||
#define __GDB_SERIAL_LIB_H__
|
||||
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -40,7 +38,6 @@ GdbSerialInit (
|
||||
IN UINT8 StopBits
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Check to see if a character is available from GDB. Do not read the character as that is
|
||||
done via GdbGetChar().
|
||||
@ -67,7 +64,6 @@ GdbGetChar (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send a character to GDB. This function must be able to run in interrupt context.
|
||||
|
||||
@ -82,7 +78,6 @@ GdbPutChar (
|
||||
IN CHAR8 Char
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send an ASCII string to GDB. This function must be able to run in interrupt context.
|
||||
|
||||
@ -96,6 +91,4 @@ GdbPutString (
|
||||
IN CHAR8 *String
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -6,15 +6,18 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef __RUNTIME_SERVICES_LIB_H__
|
||||
#define __RUNTIME_SERVICES_LIB_H__
|
||||
|
||||
VOID
|
||||
LibMtcInitialize (VOID);
|
||||
LibMtcInitialize (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
LibMtcVirtualAddressChangeEvent (VOID);
|
||||
LibMtcVirtualAddressChangeEvent (
|
||||
VOID
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
@ -27,13 +30,15 @@ LibMtcGetNextMonotonicCount (
|
||||
OUT UINT64 *Count
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
LibVariableInitialize (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
LibVariableInitialize (VOID);
|
||||
|
||||
LibVariableVirtualAddressChangeEvent (
|
||||
VOID
|
||||
LibVariableVirtualAddressChangeEvent (VOID);
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
LibGetVariable (
|
||||
@ -68,13 +73,15 @@ LibQueryVariableInfo (
|
||||
OUT UINT64 *MaximumVariableSize
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
LibResetInitializeReset (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
LibResetInitializeReset (VOID);
|
||||
|
||||
LibResetVirtualAddressChangeEvent (
|
||||
VOID
|
||||
LibResetVirtualAddressChangeEvent (VOID);
|
||||
);
|
||||
|
||||
VOID
|
||||
LibResetSystem (
|
||||
@ -84,12 +91,15 @@ LibResetSystem (
|
||||
IN CHAR16 *ResetData OPTIONAL
|
||||
);
|
||||
|
||||
VOID
|
||||
LibCapsuleInitialize (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
LibCapsuleInitialize (VOID);
|
||||
|
||||
LibCapsuleVirtualAddressChangeEvent (
|
||||
VOID
|
||||
LibCapsuleVirtualAddressChangeEvent (VOID);
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
LibUpdateCapsule (
|
||||
@ -106,13 +116,15 @@ QueryCapsuleCapabilities (
|
||||
OUT EFI_RESET_TYPE *ResetType
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
LibRtcInitialize (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
LibRtcInitialize (VOID);
|
||||
|
||||
LibRtcVirtualAddressChangeEvent (
|
||||
VOID
|
||||
LibRtcVirtualAddressChangeEvent (VOID);
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
LibGetTime (
|
||||
@ -138,12 +150,15 @@ LibSetWakeupTime (
|
||||
OUT EFI_TIME *Time
|
||||
);
|
||||
|
||||
VOID
|
||||
LibReportStatusCodeInitialize (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
LibReportStatusCodeInitialize (VOID);
|
||||
|
||||
LibReportStatusCodeVirtualAddressChangeEvent (
|
||||
VOID
|
||||
LibReportStatusCodeVirtualAddressChangeEvent (VOID);
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
LibReportStatusCode (
|
||||
@ -154,6 +169,4 @@ LibReportStatusCode (
|
||||
IN EFI_STATUS_CODE_DATA *Data OPTIONAL
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -87,4 +87,5 @@ EFIAPI
|
||||
NorFlashPrintInfo (
|
||||
IN NOR_FLASH_INFO *Info
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -31,7 +31,6 @@ FfsFindNextVolume (
|
||||
IN OUT EFI_PEI_FV_HANDLE *VolumeHandle
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This service enables discovery of additional firmware files.
|
||||
|
||||
@ -53,7 +52,6 @@ FfsFindNextFile (
|
||||
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This service enables discovery sections of a given type within a valid FFS file.
|
||||
|
||||
@ -74,7 +72,6 @@ FfsFindSectionData (
|
||||
OUT VOID **SectionData
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Find a file in the volume by name
|
||||
|
||||
@ -101,7 +98,6 @@ FfsFindFileByName (
|
||||
OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Get information about the file by name.
|
||||
|
||||
@ -125,7 +121,6 @@ FfsGetFileInfo (
|
||||
OUT EFI_FV_FILE_INFO *FileInfo
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Get Information about the volume by name
|
||||
|
||||
@ -149,8 +144,6 @@ FfsGetVolumeInfo (
|
||||
OUT EFI_FV_INFO *VolumeInfo
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Get Fv image from the FV type file, then add FV & FV2 Hob.
|
||||
|
||||
@ -166,7 +159,6 @@ FfsProcessFvFile (
|
||||
IN EFI_PEI_FILE_HANDLE FvFileHandle
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Search through every FV until you find a file of type FileType
|
||||
|
||||
@ -186,7 +178,6 @@ FfsAnyFvFindFirstFile (
|
||||
OUT EFI_PEI_FILE_HANDLE *FileHandle
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Get Fv image from the FV type file, then add FV & FV2 Hob.
|
||||
|
||||
@ -203,7 +194,6 @@ FfsProcessFvFile (
|
||||
IN EFI_PEI_FILE_HANDLE FvFileHandle
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This service enables PEIMs to ascertain the present value of the boot mode.
|
||||
|
||||
@ -217,7 +207,6 @@ GetBootMode (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This service enables PEIMs to update the boot mode variable.
|
||||
|
||||
@ -247,7 +236,6 @@ GetHobList (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Updates the pointer to the HOB list.
|
||||
|
||||
@ -284,7 +272,6 @@ CreateHob (
|
||||
IN UINT16 HobLenght
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Returns the next instance of a HOB type from the starting HOB.
|
||||
|
||||
@ -371,7 +358,6 @@ GetFirstGuidHob (
|
||||
IN CONST EFI_GUID *Guid
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Builds a HOB for a loaded PE32 module.
|
||||
|
||||
@ -511,7 +497,6 @@ BuildFvHobs (
|
||||
IN EFI_RESOURCE_ATTRIBUTE_TYPE *ResourceAttribute OPTIONAL
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Builds a EFI_HOB_TYPE_FV2 HOB.
|
||||
|
||||
@ -605,7 +590,6 @@ UpdateStackHob (
|
||||
IN UINT64 Length
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Builds a HOB for the BSP store.
|
||||
|
||||
@ -648,7 +632,6 @@ BuildMemoryAllocationHob (
|
||||
IN EFI_MEMORY_TYPE MemoryType
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
BuildExtractSectionHob (
|
||||
@ -663,7 +646,6 @@ BuildPeCoffLoaderHob (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of type EfiBootServicesData.
|
||||
|
||||
@ -701,7 +683,6 @@ AllocatePool (
|
||||
IN UINTN AllocationSize
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
@ -725,7 +706,6 @@ AllocateAlignedPages (
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LoadPeCoffImage (
|
||||
|
@ -12,7 +12,6 @@
|
||||
#ifndef __REAL_TIME_CLOCK_LIB__
|
||||
#define __REAL_TIME_CLOCK_LIB__
|
||||
|
||||
|
||||
/**
|
||||
Returns the current time and date information, and the time-keeping capabilities
|
||||
of the hardware platform.
|
||||
@ -33,7 +32,6 @@ LibGetTime (
|
||||
OUT EFI_TIME_CAPABILITIES *Capabilities
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Sets the current local time and date information.
|
||||
|
||||
@ -50,7 +48,6 @@ LibSetTime (
|
||||
IN EFI_TIME *Time
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Returns the current wakeup alarm clock setting.
|
||||
|
||||
@ -71,7 +68,6 @@ LibGetWakeupTime (
|
||||
OUT EFI_TIME *Time
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Sets the system wakeup alarm clock time.
|
||||
|
||||
@ -92,8 +88,6 @@ LibSetWakeupTime (
|
||||
OUT EFI_TIME *Time
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
@ -111,7 +105,6 @@ LibRtcInitialize (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Fixup internal data so that EFI can be call in virtual mode.
|
||||
Call the passed in Child Notify event and convert any pointers in
|
||||
@ -127,6 +120,4 @@ LibRtcVirtualNotifyEvent (
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -88,7 +88,6 @@ EFI_STATUS
|
||||
IN EMBEDDED_GPIO_MODE Mode
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Gets the mode (function) of a GPIO pin
|
||||
@ -110,7 +109,6 @@ EFI_STATUS
|
||||
OUT EMBEDDED_GPIO_MODE *Mode
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Sets the pull-up / pull-down resistor of a GPIO pin
|
||||
@ -132,7 +130,6 @@ EFI_STATUS
|
||||
IN EMBEDDED_GPIO_PULL Direction
|
||||
);
|
||||
|
||||
|
||||
struct _EMBEDDED_GPIO_PPI {
|
||||
EMBEDDED_GPIO_GET Get;
|
||||
EMBEDDED_GPIO_SET Set;
|
||||
|
@ -23,7 +23,6 @@
|
||||
#ifndef __EMBEDDED_DEVICE_PROTOCOL_H__
|
||||
#define __EMBEDDED_DEVICE_PROTOCOL_H__
|
||||
|
||||
|
||||
//
|
||||
// Protocol GUID
|
||||
//
|
||||
@ -32,8 +31,6 @@
|
||||
#define EMBEDDED_DEVICE_PROTOCOL_GUID \
|
||||
{ 0xbf4b9d10, 0x13ec, 0x43dd, { 0x88, 0x80, 0xe9, 0xb, 0x71, 0x8f, 0x27, 0xde } }
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
UINT16 VendorId;
|
||||
UINT16 DeviceId;
|
||||
@ -48,5 +45,3 @@ typedef struct {
|
||||
extern EFI_GUID gEmbeddedDeviceGuid;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -30,6 +30,7 @@ EFI_STATUS
|
||||
IN UINTN Length,
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -58,6 +59,7 @@ EFI_STATUS
|
||||
IN UINTN Length,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
@ -51,6 +51,7 @@ EFI_STATUS
|
||||
IN EMBEDDED_GPIO_PIN Gpio,
|
||||
OUT UINTN *Value
|
||||
);
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -69,7 +70,6 @@ Returns:
|
||||
|
||||
--*/
|
||||
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMBEDDED_GPIO_SET)(
|
||||
@ -77,6 +77,7 @@ EFI_STATUS
|
||||
IN EMBEDDED_GPIO_PIN Gpio,
|
||||
IN EMBEDDED_GPIO_MODE Mode
|
||||
);
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -95,7 +96,6 @@ Returns:
|
||||
|
||||
--*/
|
||||
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMBEDDED_GPIO_GET_MODE)(
|
||||
@ -103,6 +103,7 @@ EFI_STATUS
|
||||
IN EMBEDDED_GPIO_PIN Gpio,
|
||||
OUT EMBEDDED_GPIO_MODE *Mode
|
||||
);
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -121,7 +122,6 @@ Returns:
|
||||
|
||||
--*/
|
||||
|
||||
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *EMBEDDED_GPIO_SET_PULL)(
|
||||
@ -129,6 +129,7 @@ EFI_STATUS
|
||||
IN EMBEDDED_GPIO_PIN Gpio,
|
||||
IN EMBEDDED_GPIO_PULL Direction
|
||||
);
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
@ -147,8 +148,6 @@ Returns:
|
||||
|
||||
--*/
|
||||
|
||||
|
||||
|
||||
struct _EMBEDDED_GPIO {
|
||||
EMBEDDED_GPIO_GET Get;
|
||||
EMBEDDED_GPIO_SET Set;
|
||||
|
@ -20,7 +20,6 @@
|
||||
|
||||
#include <Protocol/DebugSupport.h>
|
||||
|
||||
|
||||
//
|
||||
// Protocol GUID
|
||||
//
|
||||
@ -29,13 +28,10 @@
|
||||
#define EFI_HARDWARE_INTERRUPT_PROTOCOL_GGUID \
|
||||
{ 0x2890B3EA, 0x053D, 0x1643, { 0xAD, 0x0C, 0xD6, 0x48, 0x08, 0xDA, 0x3F, 0xF1 } }
|
||||
|
||||
|
||||
typedef struct _EFI_HARDWARE_INTERRUPT_PROTOCOL EFI_HARDWARE_INTERRUPT_PROTOCOL;
|
||||
|
||||
|
||||
typedef UINTN HARDWARE_INTERRUPT_SOURCE;
|
||||
|
||||
|
||||
/**
|
||||
C Interrupt Handler calledin the interrupt context when Source interrupt is active.
|
||||
|
||||
@ -53,7 +49,6 @@ VOID
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Register Handler for the specified interrupt source.
|
||||
|
||||
@ -73,7 +68,6 @@ EFI_STATUS
|
||||
IN HARDWARE_INTERRUPT_HANDLER Handler
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Enable interrupt source Source.
|
||||
|
||||
@ -91,8 +85,6 @@ EFI_STATUS
|
||||
IN HARDWARE_INTERRUPT_SOURCE Source
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Disable interrupt source Source.
|
||||
|
||||
@ -110,7 +102,6 @@ EFI_STATUS
|
||||
IN HARDWARE_INTERRUPT_SOURCE Source
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Return current state of interrupt source Source.
|
||||
|
||||
@ -148,7 +139,6 @@ EFI_STATUS
|
||||
IN HARDWARE_INTERRUPT_SOURCE Source
|
||||
);
|
||||
|
||||
|
||||
struct _EFI_HARDWARE_INTERRUPT_PROTOCOL {
|
||||
HARDWARE_INTERRUPT_REGISTER RegisterInterruptSource;
|
||||
HARDWARE_INTERRUPT_ENABLE EnableInterruptSource;
|
||||
@ -160,5 +150,3 @@ struct _EFI_HARDWARE_INTERRUPT_PROTOCOL {
|
||||
extern EFI_GUID gHardwareInterruptProtocolGuid;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -46,7 +46,6 @@ EFI_STATUS
|
||||
IN HARDWARE_INTERRUPT_HANDLER Handler
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Enable interrupt source Source.
|
||||
|
||||
@ -64,7 +63,6 @@ EFI_STATUS
|
||||
IN HARDWARE_INTERRUPT_SOURCE Source
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Disable interrupt source Source.
|
||||
|
||||
@ -82,7 +80,6 @@ EFI_STATUS
|
||||
IN HARDWARE_INTERRUPT_SOURCE Source
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Return current state of interrupt source Source.
|
||||
|
||||
@ -139,7 +136,6 @@ EFI_STATUS
|
||||
OUT EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE *TriggerType
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Configure the trigger type for an interrupt source
|
||||
|
||||
|
@ -152,7 +152,6 @@ typedef BOOLEAN (EFIAPI *MMC_ISMULTIBLOCK) (
|
||||
);
|
||||
|
||||
struct _EFI_MMC_HOST_PROTOCOL {
|
||||
|
||||
UINT32 Revision;
|
||||
MMC_ISCARDPRESENT IsCardPresent;
|
||||
MMC_ISREADONLY IsReadOnly;
|
||||
@ -168,7 +167,6 @@ struct _EFI_MMC_HOST_PROTOCOL {
|
||||
|
||||
MMC_SETIOS SetIos;
|
||||
MMC_ISMULTIBLOCK IsMultiBlock;
|
||||
|
||||
};
|
||||
|
||||
#define MMC_HOST_PROTOCOL_REVISION 0x00010002 // 1.2
|
||||
@ -181,4 +179,3 @@ struct _EFI_MMC_HOST_PROTOCOL {
|
||||
extern EFI_GUID gEmbeddedMmcHostProtocolGuid;
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -16,11 +16,8 @@
|
||||
#define PE_COFF_LOADER_PROTOCOL_GUID \
|
||||
{ 0xB323179B, 0x97FB, 0x477E, { 0xB0, 0xFE, 0xD8, 0x85, 0x91, 0xFA, 0x11, 0xAB } }
|
||||
|
||||
|
||||
typedef struct _PE_COFF_LOADER_PROTOCOL PE_COFF_LOADER_PROTOCOL;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Retrieves information about a PE/COFF image.
|
||||
|
||||
@ -50,7 +47,6 @@ RETURN_STATUS
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage().
|
||||
|
||||
@ -87,7 +83,6 @@ RETURN_STATUS
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Loads a PE/COFF image into memory.
|
||||
|
||||
@ -125,8 +120,6 @@ RETURN_STATUS
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Reads contents of a PE/COFF image from a buffer in system memory.
|
||||
|
||||
@ -159,8 +152,6 @@ RETURN_STATUS
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Reapply fixups on a fixed up PE32/PE32+ image to allow virtual calling at EFI
|
||||
runtime.
|
||||
@ -193,8 +184,6 @@ VOID
|
||||
IN VOID *RelocationData
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Unloads a loaded PE/COFF image from memory and releases its taken resource.
|
||||
Releases any environment specific resources that were allocated when the image
|
||||
@ -217,7 +206,6 @@ RETURN_STATUS
|
||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
);
|
||||
|
||||
|
||||
struct _PE_COFF_LOADER_PROTOCOL {
|
||||
PE_COFF_LOADER_GET_IMAGE_INFO GetImageInfo;
|
||||
PE_COFF_LOADER_LOAD_IMAGE LoadImage;
|
||||
@ -227,9 +215,6 @@ struct _PE_COFF_LOADER_PROTOCOL {
|
||||
PE_COFF_LOADER_UNLOAD_IMAGE UnloadImage;
|
||||
};
|
||||
|
||||
|
||||
extern EFI_GUID gPeCoffLoaderProtocolGuid;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
#ifndef _FDT_H
|
||||
#define _FDT_H
|
||||
|
||||
/*
|
||||
* libfdt - Flat Device Tree manipulation
|
||||
* Copyright (C) 2006 David Gibson, IBM Corporation.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -23,68 +23,142 @@ typedef UINT64 uint64_t;
|
||||
typedef UINTN uintptr_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);
|
||||
}
|
||||
|
||||
#define cpu_to_fdt16(x) fdt16_to_cpu(x)
|
||||
|
||||
static inline uint32_t fdt32_to_cpu(fdt32_t x)
|
||||
static inline uint32_t
|
||||
fdt32_to_cpu (
|
||||
fdt32_t x
|
||||
)
|
||||
{
|
||||
return SwapBytes32 (x);
|
||||
}
|
||||
|
||||
#define cpu_to_fdt32(x) fdt32_to_cpu(x)
|
||||
|
||||
static inline uint64_t fdt64_to_cpu(fdt64_t x)
|
||||
static inline uint64_t
|
||||
fdt64_to_cpu (
|
||||
fdt64_t 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) {
|
||||
static inline void *
|
||||
memcpy (
|
||||
void *dest,
|
||||
const void *src,
|
||||
size_t 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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static inline size_t strlen (const char* str) {
|
||||
static inline size_t
|
||||
strlen (
|
||||
const char *str
|
||||
)
|
||||
{
|
||||
return AsciiStrLen (str);
|
||||
}
|
||||
|
||||
static inline char *strchr(const char *s, int c) {
|
||||
static inline char *
|
||||
strchr (
|
||||
const char *s,
|
||||
int c
|
||||
)
|
||||
{
|
||||
char pattern[2];
|
||||
|
||||
pattern[0] = c;
|
||||
pattern[1] = 0;
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -108,11 +108,14 @@ LocateAndInstallAcpiFromFvConditional (
|
||||
AcpiTableSize = ((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable)->Length;
|
||||
ASSERT (SectionSize >= AcpiTableSize);
|
||||
|
||||
DEBUG ((DEBUG_ERROR, "- Found '%c%c%c%c' ACPI Table\n",
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"- Found '%c%c%c%c' ACPI Table\n",
|
||||
(((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable)->Signature & 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)));
|
||||
((((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable)->Signature >> 24) & 0xFF)
|
||||
));
|
||||
|
||||
// Is the ACPI table valid?
|
||||
if (CheckAcpiTableFunction) {
|
||||
|
@ -116,10 +116,11 @@ AndroidBootImgLoadFile2 (
|
||||
|
||||
{
|
||||
// Verify if the valid parameters
|
||||
if (This == NULL ||
|
||||
BufferSize == NULL ||
|
||||
FilePath == NULL ||
|
||||
!IsDevicePathValid (FilePath, 0)) {
|
||||
if ((This == NULL) ||
|
||||
(BufferSize == NULL) ||
|
||||
(FilePath == NULL) ||
|
||||
!IsDevicePathValid (FilePath, 0))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -132,7 +133,8 @@ AndroidBootImgLoadFile2 (
|
||||
if (mRamdiskSize == 0) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
if (Buffer == NULL || *BufferSize < mRamdiskSize) {
|
||||
|
||||
if ((Buffer == NULL) || (*BufferSize < mRamdiskSize)) {
|
||||
*BufferSize = mRamdiskSize;
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
@ -161,8 +163,12 @@ AndroidBootImgGetImgSize (
|
||||
|
||||
Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
|
||||
|
||||
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH) != 0) {
|
||||
if (AsciiStrnCmp (
|
||||
(CONST CHAR8 *)Header->BootMagic,
|
||||
ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH
|
||||
) != 0)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -188,8 +194,12 @@ AndroidBootImgGetKernelInfo (
|
||||
|
||||
Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
|
||||
|
||||
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH) != 0) {
|
||||
if (AsciiStrnCmp (
|
||||
(CONST CHAR8 *)Header->BootMagic,
|
||||
ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH
|
||||
) != 0)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -215,8 +225,12 @@ AndroidBootImgGetRamdiskInfo (
|
||||
|
||||
Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
|
||||
|
||||
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH) != 0) {
|
||||
if (AsciiStrnCmp (
|
||||
(CONST CHAR8 *)Header->BootMagic,
|
||||
ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH
|
||||
) != 0)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -229,6 +243,7 @@ AndroidBootImgGetRamdiskInfo (
|
||||
+ Header->PageSize
|
||||
+ ALIGN_VALUE (Header->KernelSize, Header->PageSize));
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -243,8 +258,12 @@ AndroidBootImgGetSecondBootLoaderInfo (
|
||||
|
||||
Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
|
||||
|
||||
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH) != 0) {
|
||||
if (AsciiStrnCmp (
|
||||
(CONST CHAR8 *)Header->BootMagic,
|
||||
ANDROID_BOOT_MAGIC,
|
||||
ANDROID_BOOT_MAGIC_LENGTH
|
||||
) != 0)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -258,6 +277,7 @@ AndroidBootImgGetSecondBootLoaderInfo (
|
||||
+ ALIGN_VALUE (Header->KernelSize, Header->PageSize)
|
||||
+ ALIGN_VALUE (Header->RamdiskSize, Header->PageSize));
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -270,8 +290,12 @@ AndroidBootImgGetKernelArgs (
|
||||
ANDROID_BOOTIMG_HEADER *Header;
|
||||
|
||||
Header = (ANDROID_BOOTIMG_HEADER *)BootImg;
|
||||
AsciiStrnCpyS (KernelArgs, ANDROID_BOOTIMG_KERNEL_ARGS_SIZE, Header->KernelArgs,
|
||||
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE);
|
||||
AsciiStrnCpyS (
|
||||
KernelArgs,
|
||||
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE,
|
||||
Header->KernelArgs,
|
||||
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -309,13 +333,20 @@ AndroidBootImgUpdateArgs (
|
||||
if (EFI_ERROR (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
|
||||
if (mAndroidBootImg->AppendArgs) {
|
||||
Status = mAndroidBootImg->AppendArgs (KernelArgs,
|
||||
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE);
|
||||
Status = mAndroidBootImg->AppendArgs (
|
||||
KernelArgs,
|
||||
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE
|
||||
);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -359,10 +390,12 @@ AndroidBootImgUninstallLoadFile2 (
|
||||
);
|
||||
mRamDiskLoadFileHandle = NULL;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
BOOLEAN AndroidBootImgAcpiSupported (
|
||||
BOOLEAN
|
||||
AndroidBootImgAcpiSupported (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
@ -391,12 +424,17 @@ AndroidBootImgLocateFdt (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Err = fdt_check_header (*FdtBase);
|
||||
if (Err != 0) {
|
||||
DEBUG ((DEBUG_ERROR, "ERROR: Device Tree header not valid (Err:%d)\n",
|
||||
Err));
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"ERROR: Device Tree header not valid (Err:%d)\n",
|
||||
Err
|
||||
));
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -415,6 +453,7 @@ AndroidBootImgGetChosenNode (
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return ChosenNode;
|
||||
}
|
||||
|
||||
@ -430,19 +469,32 @@ AndroidBootImgSetProperty64 (
|
||||
struct fdt_property *Property;
|
||||
int Len;
|
||||
|
||||
Property = fdt_get_property_w((VOID *)UpdatedFdtBase, ChosenNode,
|
||||
PropertyName, &Len);
|
||||
if (NULL == Property && Len == -FDT_ERR_NOTFOUND) {
|
||||
Property = fdt_get_property_w (
|
||||
(VOID *)UpdatedFdtBase,
|
||||
ChosenNode,
|
||||
PropertyName,
|
||||
&Len
|
||||
);
|
||||
if ((NULL == Property) && (Len == -FDT_ERR_NOTFOUND)) {
|
||||
Val = cpu_to_fdt64 (Val);
|
||||
Err = fdt_appendprop ((VOID *)UpdatedFdtBase, ChosenNode,
|
||||
PropertyName, &Val, sizeof (UINT64));
|
||||
Err = fdt_appendprop (
|
||||
(VOID *)UpdatedFdtBase,
|
||||
ChosenNode,
|
||||
PropertyName,
|
||||
&Val,
|
||||
sizeof (UINT64)
|
||||
);
|
||||
if (Err) {
|
||||
DEBUG ((DEBUG_ERROR, "fdt_appendprop() fail: %a\n", fdt_strerror (Err)));
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
} else if (Property != NULL) {
|
||||
Err = fdt_setprop_u64((VOID *)UpdatedFdtBase, ChosenNode,
|
||||
PropertyName, Val);
|
||||
Err = fdt_setprop_u64 (
|
||||
(VOID *)UpdatedFdtBase,
|
||||
ChosenNode,
|
||||
PropertyName,
|
||||
Val
|
||||
);
|
||||
if (Err) {
|
||||
DEBUG ((DEBUG_ERROR, "fdt_setprop_u64() fail: %a\n", fdt_strerror (Err)));
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -451,6 +503,7 @@ AndroidBootImgSetProperty64 (
|
||||
DEBUG ((DEBUG_ERROR, "Failed to set fdt Property %a\n", PropertyName));
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -468,11 +521,18 @@ AndroidBootImgUpdateFdt (
|
||||
|
||||
NewFdtSize = (UINTN)fdt_totalsize (FdtBase)
|
||||
+ FDT_ADDITIONAL_ENTRIES_SIZE;
|
||||
Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesData,
|
||||
EFI_SIZE_TO_PAGES (NewFdtSize), &UpdatedFdtBase);
|
||||
Status = gBS->AllocatePages (
|
||||
AllocateAnyPages,
|
||||
EfiBootServicesData,
|
||||
EFI_SIZE_TO_PAGES (NewFdtSize),
|
||||
&UpdatedFdtBase
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_WARN, "Warning: Failed to reallocate FDT, err %d.\n",
|
||||
Status));
|
||||
DEBUG ((
|
||||
DEBUG_WARN,
|
||||
"Warning: Failed to reallocate FDT, err %d.\n",
|
||||
Status
|
||||
));
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -495,16 +555,22 @@ AndroidBootImgUpdateFdt (
|
||||
goto Fdt_Exit;
|
||||
}
|
||||
|
||||
Status = AndroidBootImgSetProperty64 (UpdatedFdtBase, ChosenNode,
|
||||
Status = AndroidBootImgSetProperty64 (
|
||||
UpdatedFdtBase,
|
||||
ChosenNode,
|
||||
"linux,initrd-start",
|
||||
(UINTN)RamdiskData);
|
||||
(UINTN)RamdiskData
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Fdt_Exit;
|
||||
}
|
||||
|
||||
Status = AndroidBootImgSetProperty64 (UpdatedFdtBase, ChosenNode,
|
||||
Status = AndroidBootImgSetProperty64 (
|
||||
UpdatedFdtBase,
|
||||
ChosenNode,
|
||||
"linux,initrd-end",
|
||||
(UINTN)RamdiskData + RamdiskSize);
|
||||
(UINTN)RamdiskData + RamdiskSize
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Fdt_Exit;
|
||||
}
|
||||
@ -518,6 +584,7 @@ AndroidBootImgUpdateFdt (
|
||||
} else {
|
||||
NewFdtBase = UpdatedFdtBase;
|
||||
}
|
||||
|
||||
Status = gBS->InstallConfigurationTable (
|
||||
&gFdtTableGuid,
|
||||
(VOID *)(UINTN)NewFdtBase
|
||||
@ -552,8 +619,11 @@ AndroidBootImgBoot (
|
||||
NewKernelArg = NULL;
|
||||
ImageHandle = NULL;
|
||||
|
||||
Status = gBS->LocateProtocol (&gAndroidBootImgProtocolGuid, NULL,
|
||||
(VOID **) &mAndroidBootImg);
|
||||
Status = gBS->LocateProtocol (
|
||||
&gAndroidBootImgProtocolGuid,
|
||||
NULL,
|
||||
(VOID **)&mAndroidBootImg
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
@ -611,19 +681,28 @@ AndroidBootImgBoot (
|
||||
KernelDevicePath.Node1.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Kernel
|
||||
+ KernelSize;
|
||||
|
||||
Status = gBS->LoadImage (TRUE, gImageHandle,
|
||||
Status = gBS->LoadImage (
|
||||
TRUE,
|
||||
gImageHandle,
|
||||
(EFI_DEVICE_PATH *)&KernelDevicePath,
|
||||
(VOID*)(UINTN)Kernel, KernelSize, &ImageHandle);
|
||||
(VOID *)(UINTN)Kernel,
|
||||
KernelSize,
|
||||
&ImageHandle
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// Set kernel arguments
|
||||
Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid,
|
||||
(VOID **) &ImageInfo);
|
||||
Status = gBS->HandleProtocol (
|
||||
ImageHandle,
|
||||
&gEfiLoadedImageProtocolGuid,
|
||||
(VOID **)&ImageInfo
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
ImageInfo->LoadOptions = NewKernelArg;
|
||||
ImageInfo->LoadOptionsSize = StrLen (NewKernelArg) * sizeof (CHAR16);
|
||||
|
||||
@ -640,12 +719,14 @@ Exit:
|
||||
gBS->UnloadImage (ImageHandle);
|
||||
ImageHandle = NULL;
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
if (NewKernelArg != NULL) {
|
||||
FreePool (NewKernelArg);
|
||||
NewKernelArg = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
AndroidBootImgUninstallLoadFile2 ();
|
||||
return Status;
|
||||
}
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include <Library/DmaLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
|
||||
|
||||
STATIC
|
||||
PHYSICAL_ADDRESS
|
||||
HostToDeviceAddress (
|
||||
@ -52,18 +51,19 @@ DmaMap (
|
||||
OUT VOID **Mapping
|
||||
)
|
||||
{
|
||||
if (HostAddress == NULL ||
|
||||
NumberOfBytes == NULL ||
|
||||
DeviceAddress == NULL ||
|
||||
Mapping == NULL ) {
|
||||
if ((HostAddress == NULL) ||
|
||||
(NumberOfBytes == NULL) ||
|
||||
(DeviceAddress == NULL) ||
|
||||
(Mapping == NULL))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*DeviceAddress = HostToDeviceAddress (HostAddress);
|
||||
*Mapping = NULL;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or DmaMapBusMasterCommonBuffer()
|
||||
operation and releases any corresponding resources.
|
||||
@ -111,7 +111,6 @@ DmaAllocateBuffer (
|
||||
return DmaAllocateAlignedBuffer (MemoryType, Pages, 0, HostAddress);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allocates pages that are suitable for an DmaMap() of type
|
||||
MapOperationBusMasterCommonBuffer mapping, at the requested alignment.
|
||||
@ -144,8 +143,9 @@ DmaAllocateAlignedBuffer (
|
||||
Alignment = EFI_PAGE_SIZE;
|
||||
}
|
||||
|
||||
if (HostAddress == NULL ||
|
||||
(Alignment & (Alignment - 1)) != 0) {
|
||||
if ((HostAddress == NULL) ||
|
||||
((Alignment & (Alignment - 1)) != 0))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -163,10 +163,10 @@ DmaAllocateAlignedBuffer (
|
||||
if (*HostAddress == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Frees memory that was allocated with DmaAllocateBuffer().
|
||||
|
||||
@ -192,4 +192,3 @@ DmaFreeBuffer (
|
||||
FreePages (HostAddress, Pages);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,6 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
|
||||
@ -41,7 +39,6 @@ DebugAgentTimerSetPeriod (
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Perform End Of Interrupt for the debug agent timer. This is called in the
|
||||
interrupt handler after the interrupt has been processed.
|
||||
@ -54,4 +51,3 @@ DebugAgentTimerEndOfInterrupt (
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -36,8 +36,13 @@ DtPlatformLoadDtb (
|
||||
VOID *CopyDtb;
|
||||
UINTN OrigDtbSize;
|
||||
|
||||
Status = GetSectionFromAnyFv (&gDtPlatformDefaultDtbFileGuid,
|
||||
EFI_SECTION_RAW, 0, &OrigDtb, &OrigDtbSize);
|
||||
Status = GetSectionFromAnyFv (
|
||||
&gDtPlatformDefaultDtbFileGuid,
|
||||
EFI_SECTION_RAW,
|
||||
0,
|
||||
&OrigDtb,
|
||||
&OrigDtbSize
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
@ -55,18 +55,25 @@
|
||||
|
||||
#include "libfdt_internal.h"
|
||||
|
||||
int fdt_check_header(const void *fdt)
|
||||
int
|
||||
fdt_check_header (
|
||||
const void *fdt
|
||||
)
|
||||
{
|
||||
if (fdt_magic (fdt) == FDT_MAGIC) {
|
||||
/* Complete tree */
|
||||
if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
|
||||
if (fdt_version (fdt) < FDT_FIRST_SUPPORTED_VERSION) {
|
||||
return -FDT_ERR_BADVERSION;
|
||||
if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
|
||||
}
|
||||
|
||||
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)
|
||||
if (fdt_size_dt_struct (fdt) == 0) {
|
||||
return -FDT_ERR_BADSTATE;
|
||||
}
|
||||
} else {
|
||||
return -FDT_ERR_BADMAGIC;
|
||||
}
|
||||
@ -74,24 +81,39 @@ int fdt_check_header(const void *fdt)
|
||||
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);
|
||||
|
||||
if ( (absoffset < offset)
|
||||
|| ((absoffset + len) < absoffset)
|
||||
|| (absoffset + len) > fdt_totalsize(fdt))
|
||||
|| ((absoffset + len) > fdt_totalsize (fdt)))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (fdt_version(fdt) >= 0x11)
|
||||
if (fdt_version (fdt) >= 0x11) {
|
||||
if ( ((offset + len) < offset)
|
||||
|| ((offset + len) > fdt_size_dt_struct (fdt)))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
uint32_t tag;
|
||||
@ -100,8 +122,10 @@ uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
|
||||
|
||||
*nextoffset = -FDT_ERR_TRUNCATED;
|
||||
tagp = fdt_offset_ptr (fdt, offset, FDT_TAGSIZE);
|
||||
if (!tagp)
|
||||
if (!tagp) {
|
||||
return FDT_END; /* premature end */
|
||||
}
|
||||
|
||||
tag = fdt32_to_cpu (*tagp);
|
||||
offset += FDT_TAGSIZE;
|
||||
|
||||
@ -112,14 +136,19 @@ uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
|
||||
do {
|
||||
p = fdt_offset_ptr (fdt, offset++, 1);
|
||||
} while (p && (*p != '\0'));
|
||||
if (!p)
|
||||
|
||||
if (!p) {
|
||||
return FDT_END; /* premature end */
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case FDT_PROP:
|
||||
lenp = fdt_offset_ptr (fdt, offset, sizeof (*lenp));
|
||||
if (!lenp)
|
||||
if (!lenp) {
|
||||
return FDT_END; /* premature end */
|
||||
}
|
||||
|
||||
/* skip-name offset, length and value */
|
||||
offset += sizeof (struct fdt_property) - FDT_TAGSIZE
|
||||
+ fdt32_to_cpu (*lenp);
|
||||
@ -134,39 +163,59 @@ uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
|
||||
return FDT_END;
|
||||
}
|
||||
|
||||
if (!fdt_offset_ptr(fdt, startoffset, offset - startoffset))
|
||||
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)
|
||||
|| (fdt_next_tag (fdt, offset, &offset) != FDT_BEGIN_NODE))
|
||||
{
|
||||
return -FDT_ERR_BADOFFSET;
|
||||
}
|
||||
|
||||
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)
|
||||
|| (fdt_next_tag (fdt, offset, &offset) != FDT_PROP))
|
||||
{
|
||||
return -FDT_ERR_BADOFFSET;
|
||||
}
|
||||
|
||||
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;
|
||||
uint32_t tag;
|
||||
|
||||
if (offset >= 0)
|
||||
if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0)
|
||||
if (offset >= 0) {
|
||||
if ((nextoffset = _fdt_check_node_offset (fdt, offset)) < 0) {
|
||||
return nextoffset;
|
||||
}
|
||||
}
|
||||
|
||||
do {
|
||||
offset = nextoffset;
|
||||
@ -178,39 +227,54 @@ int fdt_next_node(const void *fdt, int offset, int *depth)
|
||||
break;
|
||||
|
||||
case FDT_BEGIN_NODE:
|
||||
if (depth)
|
||||
if (depth) {
|
||||
(*depth)++;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case FDT_END_NODE:
|
||||
if (depth && ((--(*depth)) < 0))
|
||||
if (depth && ((--(*depth)) < 0)) {
|
||||
return nextoffset;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case FDT_END:
|
||||
if ( (nextoffset >= 0)
|
||||
|| ((nextoffset == -FDT_ERR_TRUNCATED) && !depth))
|
||||
{
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
else
|
||||
} 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;
|
||||
|
||||
offset = fdt_next_node (fdt, offset, &depth);
|
||||
if (offset < 0 || depth != 1)
|
||||
if ((offset < 0) || (depth != 1)) {
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
int fdt_next_subnode(const void *fdt, int offset)
|
||||
int
|
||||
fdt_next_subnode (
|
||||
const void *fdt,
|
||||
int offset
|
||||
)
|
||||
{
|
||||
int depth = 1;
|
||||
|
||||
@ -220,31 +284,46 @@ int fdt_next_subnode(const void *fdt, int offset)
|
||||
*/
|
||||
do {
|
||||
offset = fdt_next_node (fdt, offset, &depth);
|
||||
if (offset < 0 || depth < 1)
|
||||
if ((offset < 0) || (depth < 1)) {
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
}
|
||||
} while (depth > 1);
|
||||
|
||||
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;
|
||||
const char *last = strtab + tabsize - len;
|
||||
const char *p;
|
||||
|
||||
for (p = strtab; p <= last; p++)
|
||||
if (memcmp(p, s, len) == 0)
|
||||
for (p = strtab; p <= last; p++) {
|
||||
if (memcmp (p, s, len) == 0) {
|
||||
return p;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (fdt_totalsize(fdt) > bufsize)
|
||||
if (fdt_totalsize (fdt) > bufsize) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
memmove (buf, fdt, fdt_totalsize (fdt));
|
||||
return 0;
|
||||
|
@ -55,42 +55,56 @@
|
||||
|
||||
#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;
|
||||
int val;
|
||||
int len;
|
||||
|
||||
ac = fdt_getprop (fdt, nodeoffset, "#address-cells", &len);
|
||||
if (!ac)
|
||||
if (!ac) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (len != sizeof(*ac))
|
||||
if (len != sizeof (*ac)) {
|
||||
return -FDT_ERR_BADNCELLS;
|
||||
}
|
||||
|
||||
val = fdt32_to_cpu (*ac);
|
||||
if ((val <= 0) || (val > FDT_MAX_NCELLS))
|
||||
if ((val <= 0) || (val > FDT_MAX_NCELLS)) {
|
||||
return -FDT_ERR_BADNCELLS;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
int fdt_size_cells(const void *fdt, int nodeoffset)
|
||||
int
|
||||
fdt_size_cells (
|
||||
const void *fdt,
|
||||
int nodeoffset
|
||||
)
|
||||
{
|
||||
const fdt32_t *sc;
|
||||
int val;
|
||||
int len;
|
||||
|
||||
sc = fdt_getprop (fdt, nodeoffset, "#size-cells", &len);
|
||||
if (!sc)
|
||||
if (!sc) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (len != sizeof(*sc))
|
||||
if (len != sizeof (*sc)) {
|
||||
return -FDT_ERR_BADNCELLS;
|
||||
}
|
||||
|
||||
val = fdt32_to_cpu (*sc);
|
||||
if ((val < 0) || (val > FDT_MAX_NCELLS))
|
||||
if ((val < 0) || (val > FDT_MAX_NCELLS)) {
|
||||
return -FDT_ERR_BADNCELLS;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
@ -55,29 +55,38 @@
|
||||
|
||||
#include "libfdt_internal.h"
|
||||
|
||||
int fdt_create_empty_tree(void *buf, int bufsize)
|
||||
int
|
||||
fdt_create_empty_tree (
|
||||
void *buf,
|
||||
int bufsize
|
||||
)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = fdt_create (buf, bufsize);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
err = fdt_finish_reservemap (buf);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
err = fdt_begin_node (buf, "");
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
err = fdt_end_node (buf);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
err = fdt_finish (buf);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
return fdt_open_into (buf, buf, bufsize);
|
||||
}
|
||||
|
@ -70,17 +70,23 @@
|
||||
* 0, if the phandle was not found
|
||||
* -1, if the phandle was malformed
|
||||
*/
|
||||
static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)
|
||||
static uint32_t
|
||||
overlay_get_target_phandle (
|
||||
const void *fdto,
|
||||
int fragment
|
||||
)
|
||||
{
|
||||
const fdt32_t *val;
|
||||
int len;
|
||||
|
||||
val = fdt_getprop (fdto, fragment, "target", &len);
|
||||
if (!val)
|
||||
if (!val) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((len != sizeof(*val)) || (fdt32_to_cpu(*val) == (uint32_t)-1))
|
||||
if ((len != sizeof (*val)) || (fdt32_to_cpu (*val) == (uint32_t)-1)) {
|
||||
return (uint32_t)-1;
|
||||
}
|
||||
|
||||
return fdt32_to_cpu (*val);
|
||||
}
|
||||
@ -100,8 +106,13 @@ static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)
|
||||
* the targetted node offset in the base device tree
|
||||
* Negative error code on error
|
||||
*/
|
||||
static int overlay_get_target(const void *fdt, const void *fdto,
|
||||
int fragment, char const **pathp)
|
||||
static int
|
||||
overlay_get_target (
|
||||
const void *fdt,
|
||||
const void *fdto,
|
||||
int fragment,
|
||||
char const **pathp
|
||||
)
|
||||
{
|
||||
uint32_t phandle;
|
||||
const char *path = NULL;
|
||||
@ -109,19 +120,22 @@ static int overlay_get_target(const void *fdt, const void *fdto,
|
||||
|
||||
/* Try first to do a phandle based lookup */
|
||||
phandle = overlay_get_target_phandle (fdto, fragment);
|
||||
if (phandle == (uint32_t)-1)
|
||||
if (phandle == (uint32_t)-1) {
|
||||
return -FDT_ERR_BADPHANDLE;
|
||||
}
|
||||
|
||||
/* no phandle, try path */
|
||||
if (!phandle) {
|
||||
/* And then a path based lookup */
|
||||
path = fdt_getprop (fdto, fragment, "target-path", &path_len);
|
||||
if (path)
|
||||
if (path) {
|
||||
ret = fdt_path_offset (fdt, path);
|
||||
else
|
||||
} else {
|
||||
ret = path_len;
|
||||
} else
|
||||
}
|
||||
} else {
|
||||
ret = fdt_node_offset_by_phandle (fdt, phandle);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we haven't found either a target or a
|
||||
@ -130,16 +144,19 @@ static int overlay_get_target(const void *fdt, const void *fdto,
|
||||
* otherwise), consider it a improperly written
|
||||
* overlay
|
||||
*/
|
||||
if (ret < 0 && path_len == -FDT_ERR_NOTFOUND)
|
||||
if ((ret < 0) && (path_len == -FDT_ERR_NOTFOUND)) {
|
||||
ret = -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
/* return on error */
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* return pointer to path (if available) */
|
||||
if (pathp)
|
||||
if (pathp) {
|
||||
*pathp = path ? path : NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -158,27 +175,36 @@ static int overlay_get_target(const void *fdt, const void *fdto,
|
||||
* 0 on success.
|
||||
* Negative error code on error
|
||||
*/
|
||||
static int overlay_phandle_add_offset(void *fdt, int node,
|
||||
const char *name, uint32_t delta)
|
||||
static int
|
||||
overlay_phandle_add_offset (
|
||||
void *fdt,
|
||||
int node,
|
||||
const char *name,
|
||||
uint32_t delta
|
||||
)
|
||||
{
|
||||
const fdt32_t *val;
|
||||
uint32_t adj_val;
|
||||
int len;
|
||||
|
||||
val = fdt_getprop (fdt, node, name, &len);
|
||||
if (!val)
|
||||
if (!val) {
|
||||
return len;
|
||||
}
|
||||
|
||||
if (len != sizeof(*val))
|
||||
if (len != sizeof (*val)) {
|
||||
return -FDT_ERR_BADPHANDLE;
|
||||
}
|
||||
|
||||
adj_val = fdt32_to_cpu (*val);
|
||||
if ((adj_val + delta) < adj_val)
|
||||
if ((adj_val + delta) < adj_val) {
|
||||
return -FDT_ERR_NOPHANDLES;
|
||||
}
|
||||
|
||||
adj_val += delta;
|
||||
if (adj_val == (uint32_t)-1)
|
||||
if (adj_val == (uint32_t)-1) {
|
||||
return -FDT_ERR_NOPHANDLES;
|
||||
}
|
||||
|
||||
return fdt_setprop_inplace_u32 (fdt, node, name, adj_val);
|
||||
}
|
||||
@ -198,25 +224,32 @@ static int overlay_phandle_add_offset(void *fdt, int node,
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_adjust_node_phandles(void *fdto, int node,
|
||||
uint32_t delta)
|
||||
static int
|
||||
overlay_adjust_node_phandles (
|
||||
void *fdto,
|
||||
int node,
|
||||
uint32_t delta
|
||||
)
|
||||
{
|
||||
int child;
|
||||
int ret;
|
||||
|
||||
ret = overlay_phandle_add_offset (fdto, node, "phandle", delta);
|
||||
if (ret && ret != -FDT_ERR_NOTFOUND)
|
||||
if (ret && (ret != -FDT_ERR_NOTFOUND)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = overlay_phandle_add_offset (fdto, node, "linux,phandle", delta);
|
||||
if (ret && ret != -FDT_ERR_NOTFOUND)
|
||||
if (ret && (ret != -FDT_ERR_NOTFOUND)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
fdt_for_each_subnode (child, fdto, node) {
|
||||
ret = overlay_adjust_node_phandles (fdto, child, delta);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -235,7 +268,11 @@ static int overlay_adjust_node_phandles(void *fdto, int node,
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_adjust_local_phandles(void *fdto, uint32_t delta)
|
||||
static int
|
||||
overlay_adjust_local_phandles (
|
||||
void *fdto,
|
||||
uint32_t delta
|
||||
)
|
||||
{
|
||||
/*
|
||||
* Start adjusting the phandles from the overlay root
|
||||
@ -262,10 +299,13 @@ static int overlay_adjust_local_phandles(void *fdto, uint32_t delta)
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_update_local_node_references(void *fdto,
|
||||
static int
|
||||
overlay_update_local_node_references (
|
||||
void *fdto,
|
||||
int tree_node,
|
||||
int fixup_node,
|
||||
uint32_t delta)
|
||||
uint32_t delta
|
||||
)
|
||||
{
|
||||
int fixup_prop;
|
||||
int fixup_child;
|
||||
@ -279,18 +319,25 @@ static int overlay_update_local_node_references(void *fdto,
|
||||
int tree_len;
|
||||
int i;
|
||||
|
||||
fixup_val = fdt_getprop_by_offset(fdto, fixup_prop,
|
||||
&name, &fixup_len);
|
||||
if (!fixup_val)
|
||||
fixup_val = fdt_getprop_by_offset (
|
||||
fdto,
|
||||
fixup_prop,
|
||||
&name,
|
||||
&fixup_len
|
||||
);
|
||||
if (!fixup_val) {
|
||||
return fixup_len;
|
||||
}
|
||||
|
||||
if (fixup_len % sizeof(uint32_t))
|
||||
if (fixup_len % sizeof (uint32_t)) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
tree_val = fdt_getprop (fdto, tree_node, name, &tree_len);
|
||||
if (!tree_val) {
|
||||
if (tree_len == -FDT_ERR_NOTFOUND)
|
||||
if (tree_len == -FDT_ERR_NOTFOUND) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
return tree_len;
|
||||
}
|
||||
@ -311,40 +358,56 @@ static int overlay_update_local_node_references(void *fdto,
|
||||
|
||||
adj_val = cpu_to_fdt32 (fdt32_to_cpu (adj_val) + delta);
|
||||
|
||||
ret = fdt_setprop_inplace_namelen_partial(fdto,
|
||||
ret = fdt_setprop_inplace_namelen_partial (
|
||||
fdto,
|
||||
tree_node,
|
||||
name,
|
||||
strlen (name),
|
||||
poffset,
|
||||
&adj_val,
|
||||
sizeof(adj_val));
|
||||
if (ret == -FDT_ERR_NOSPACE)
|
||||
sizeof (adj_val)
|
||||
);
|
||||
if (ret == -FDT_ERR_NOSPACE) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fdt_for_each_subnode (fixup_child, fdto, fixup_node) {
|
||||
const char *fixup_child_name = fdt_get_name(fdto, fixup_child,
|
||||
NULL);
|
||||
const char *fixup_child_name = fdt_get_name (
|
||||
fdto,
|
||||
fixup_child,
|
||||
NULL
|
||||
);
|
||||
int tree_child;
|
||||
|
||||
tree_child = fdt_subnode_offset(fdto, tree_node,
|
||||
fixup_child_name);
|
||||
if (tree_child == -FDT_ERR_NOTFOUND)
|
||||
tree_child = fdt_subnode_offset (
|
||||
fdto,
|
||||
tree_node,
|
||||
fixup_child_name
|
||||
);
|
||||
if (tree_child == -FDT_ERR_NOTFOUND) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
if (tree_child < 0)
|
||||
return tree_child;
|
||||
}
|
||||
|
||||
ret = overlay_update_local_node_references(fdto,
|
||||
if (tree_child < 0) {
|
||||
return tree_child;
|
||||
}
|
||||
|
||||
ret = overlay_update_local_node_references (
|
||||
fdto,
|
||||
tree_child,
|
||||
fixup_child,
|
||||
delta);
|
||||
if (ret)
|
||||
delta
|
||||
);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -366,15 +429,20 @@ static int overlay_update_local_node_references(void *fdto,
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_update_local_references(void *fdto, uint32_t delta)
|
||||
static int
|
||||
overlay_update_local_references (
|
||||
void *fdto,
|
||||
uint32_t delta
|
||||
)
|
||||
{
|
||||
int fixups;
|
||||
|
||||
fixups = fdt_path_offset (fdto, "/__local_fixups__");
|
||||
if (fixups < 0) {
|
||||
/* There's no local phandles to adjust, bail out */
|
||||
if (fixups == -FDT_ERR_NOTFOUND)
|
||||
if (fixups == -FDT_ERR_NOTFOUND) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return fixups;
|
||||
}
|
||||
@ -382,8 +450,12 @@ static int overlay_update_local_references(void *fdto, uint32_t delta)
|
||||
/*
|
||||
* Update our local references from the root of the tree
|
||||
*/
|
||||
return overlay_update_local_node_references(fdto, 0, fixups,
|
||||
delta);
|
||||
return overlay_update_local_node_references (
|
||||
fdto,
|
||||
0,
|
||||
fixups,
|
||||
delta
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -409,11 +481,18 @@ static int overlay_update_local_references(void *fdto, uint32_t delta)
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_fixup_one_phandle(void *fdt, void *fdto,
|
||||
static int
|
||||
overlay_fixup_one_phandle (
|
||||
void *fdt,
|
||||
void *fdto,
|
||||
int symbols_off,
|
||||
const char *path, uint32_t path_len,
|
||||
const char *name, uint32_t name_len,
|
||||
int poffset, const char *label)
|
||||
const char *path,
|
||||
uint32_t path_len,
|
||||
const char *name,
|
||||
uint32_t name_len,
|
||||
int poffset,
|
||||
const char *label
|
||||
)
|
||||
{
|
||||
const char *symbol_path;
|
||||
uint32_t phandle;
|
||||
@ -421,36 +500,57 @@ static int overlay_fixup_one_phandle(void *fdt, void *fdto,
|
||||
int symbol_off, fixup_off;
|
||||
int prop_len;
|
||||
|
||||
if (symbols_off < 0)
|
||||
if (symbols_off < 0) {
|
||||
return symbols_off;
|
||||
}
|
||||
|
||||
symbol_path = fdt_getprop(fdt, symbols_off, label,
|
||||
&prop_len);
|
||||
if (!symbol_path)
|
||||
symbol_path = fdt_getprop (
|
||||
fdt,
|
||||
symbols_off,
|
||||
label,
|
||||
&prop_len
|
||||
);
|
||||
if (!symbol_path) {
|
||||
return prop_len;
|
||||
}
|
||||
|
||||
symbol_off = fdt_path_offset (fdt, symbol_path);
|
||||
if (symbol_off < 0)
|
||||
if (symbol_off < 0) {
|
||||
return symbol_off;
|
||||
}
|
||||
|
||||
phandle = fdt_get_phandle (fdt, symbol_off);
|
||||
if (!phandle)
|
||||
if (!phandle) {
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
}
|
||||
|
||||
fixup_off = fdt_path_offset_namelen (fdto, path, path_len);
|
||||
if (fixup_off == -FDT_ERR_NOTFOUND)
|
||||
if (fixup_off == -FDT_ERR_NOTFOUND) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
if (fixup_off < 0)
|
||||
}
|
||||
|
||||
if (fixup_off < 0) {
|
||||
return fixup_off;
|
||||
}
|
||||
|
||||
phandle_prop = cpu_to_fdt32 (phandle);
|
||||
return fdt_setprop_inplace_namelen_partial(fdto, fixup_off,
|
||||
name, name_len, poffset,
|
||||
return fdt_setprop_inplace_namelen_partial (
|
||||
fdto,
|
||||
fixup_off,
|
||||
name,
|
||||
name_len,
|
||||
poffset,
|
||||
&phandle_prop,
|
||||
sizeof(phandle_prop));
|
||||
};
|
||||
sizeof (phandle_prop)
|
||||
);
|
||||
}
|
||||
|
||||
unsigned long strtoul(const char *nptr, char **endptr, int base);
|
||||
unsigned long
|
||||
strtoul (
|
||||
const char *nptr,
|
||||
char **endptr,
|
||||
int base
|
||||
);
|
||||
|
||||
/**
|
||||
* overlay_fixup_phandle - Set an overlay phandle to the base one
|
||||
@ -471,18 +571,28 @@ unsigned long strtoul(const char *nptr, char **endptr, int base);
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,
|
||||
int property)
|
||||
static int
|
||||
overlay_fixup_phandle (
|
||||
void *fdt,
|
||||
void *fdto,
|
||||
int symbols_off,
|
||||
int property
|
||||
)
|
||||
{
|
||||
const char *value;
|
||||
const char *label;
|
||||
int len;
|
||||
|
||||
value = fdt_getprop_by_offset(fdto, property,
|
||||
&label, &len);
|
||||
value = fdt_getprop_by_offset (
|
||||
fdto,
|
||||
property,
|
||||
&label,
|
||||
&len
|
||||
);
|
||||
if (!value) {
|
||||
if (len == -FDT_ERR_NOTFOUND)
|
||||
if (len == -FDT_ERR_NOTFOUND) {
|
||||
return -FDT_ERR_INTERNAL;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
@ -496,8 +606,10 @@ static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,
|
||||
int poffset, ret;
|
||||
|
||||
fixup_end = memchr (value, '\0', len);
|
||||
if (!fixup_end)
|
||||
if (!fixup_end) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
fixup_len = fixup_end - fixup_str;
|
||||
|
||||
len -= fixup_len + 1;
|
||||
@ -505,32 +617,46 @@ static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,
|
||||
|
||||
path = fixup_str;
|
||||
sep = memchr (fixup_str, ':', fixup_len);
|
||||
if (!sep || *sep != ':')
|
||||
if (!sep || (*sep != ':')) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
path_len = sep - path;
|
||||
if (path_len == (fixup_len - 1))
|
||||
if (path_len == (fixup_len - 1)) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
fixup_len -= path_len + 1;
|
||||
name = sep + 1;
|
||||
sep = memchr (name, ':', fixup_len);
|
||||
if (!sep || *sep != ':')
|
||||
if (!sep || (*sep != ':')) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
name_len = sep - name;
|
||||
if (!name_len)
|
||||
if (!name_len) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
poffset = strtoul (sep + 1, &endptr, 10);
|
||||
if ((*endptr != '\0') || (endptr <= (sep + 1)))
|
||||
if ((*endptr != '\0') || (endptr <= (sep + 1))) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
ret = overlay_fixup_one_phandle(fdt, fdto, symbols_off,
|
||||
path, path_len, name, name_len,
|
||||
poffset, label);
|
||||
if (ret)
|
||||
ret = overlay_fixup_one_phandle (
|
||||
fdt,
|
||||
fdto,
|
||||
symbols_off,
|
||||
path,
|
||||
path_len,
|
||||
name,
|
||||
name_len,
|
||||
poffset,
|
||||
label
|
||||
);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
} while (len > 0);
|
||||
|
||||
return 0;
|
||||
@ -553,30 +679,39 @@ static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_fixup_phandles(void *fdt, void *fdto)
|
||||
static int
|
||||
overlay_fixup_phandles (
|
||||
void *fdt,
|
||||
void *fdto
|
||||
)
|
||||
{
|
||||
int fixups_off, symbols_off;
|
||||
int property;
|
||||
|
||||
/* We can have overlays without any fixups */
|
||||
fixups_off = fdt_path_offset (fdto, "/__fixups__");
|
||||
if (fixups_off == -FDT_ERR_NOTFOUND)
|
||||
if (fixups_off == -FDT_ERR_NOTFOUND) {
|
||||
return 0; /* nothing to do */
|
||||
if (fixups_off < 0)
|
||||
}
|
||||
|
||||
if (fixups_off < 0) {
|
||||
return fixups_off;
|
||||
}
|
||||
|
||||
/* And base DTs without symbols */
|
||||
symbols_off = fdt_path_offset (fdt, "/__symbols__");
|
||||
if ((symbols_off < 0 && (symbols_off != -FDT_ERR_NOTFOUND)))
|
||||
if (((symbols_off < 0) && (symbols_off != -FDT_ERR_NOTFOUND))) {
|
||||
return symbols_off;
|
||||
}
|
||||
|
||||
fdt_for_each_property_offset (property, fdto, fixups_off) {
|
||||
int ret;
|
||||
|
||||
ret = overlay_fixup_phandle (fdt, fdto, symbols_off, property);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -600,8 +735,13 @@ static int overlay_fixup_phandles(void *fdt, void *fdto)
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_apply_node(void *fdt, int target,
|
||||
void *fdto, int node)
|
||||
static int
|
||||
overlay_apply_node (
|
||||
void *fdt,
|
||||
int target,
|
||||
void *fdto,
|
||||
int node
|
||||
)
|
||||
{
|
||||
int property;
|
||||
int subnode;
|
||||
@ -612,17 +752,25 @@ static int overlay_apply_node(void *fdt, int target,
|
||||
int prop_len;
|
||||
int ret;
|
||||
|
||||
prop = fdt_getprop_by_offset(fdto, property, &name,
|
||||
&prop_len);
|
||||
if (prop_len == -FDT_ERR_NOTFOUND)
|
||||
prop = fdt_getprop_by_offset (
|
||||
fdto,
|
||||
property,
|
||||
&name,
|
||||
&prop_len
|
||||
);
|
||||
if (prop_len == -FDT_ERR_NOTFOUND) {
|
||||
return -FDT_ERR_INTERNAL;
|
||||
if (prop_len < 0)
|
||||
}
|
||||
|
||||
if (prop_len < 0) {
|
||||
return prop_len;
|
||||
}
|
||||
|
||||
ret = fdt_setprop (fdt, target, name, prop, prop_len);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
fdt_for_each_subnode (subnode, fdto, node) {
|
||||
const char *name = fdt_get_name (fdto, subnode, NULL);
|
||||
@ -632,17 +780,20 @@ static int overlay_apply_node(void *fdt, int target,
|
||||
nnode = fdt_add_subnode (fdt, target, name);
|
||||
if (nnode == -FDT_ERR_EXISTS) {
|
||||
nnode = fdt_subnode_offset (fdt, target, name);
|
||||
if (nnode == -FDT_ERR_NOTFOUND)
|
||||
if (nnode == -FDT_ERR_NOTFOUND) {
|
||||
return -FDT_ERR_INTERNAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (nnode < 0)
|
||||
if (nnode < 0) {
|
||||
return nnode;
|
||||
}
|
||||
|
||||
ret = overlay_apply_node (fdt, nnode, fdto, subnode);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -662,7 +813,11 @@ static int overlay_apply_node(void *fdt, int target,
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_merge(void *fdt, void *fdto)
|
||||
static int
|
||||
overlay_merge (
|
||||
void *fdt,
|
||||
void *fdto
|
||||
)
|
||||
{
|
||||
int fragment;
|
||||
|
||||
@ -676,25 +831,33 @@ static int overlay_merge(void *fdt, void *fdto)
|
||||
* they don't, it's not supposed to be merged
|
||||
*/
|
||||
overlay = fdt_subnode_offset (fdto, fragment, "__overlay__");
|
||||
if (overlay == -FDT_ERR_NOTFOUND)
|
||||
if (overlay == -FDT_ERR_NOTFOUND) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (overlay < 0)
|
||||
if (overlay < 0) {
|
||||
return overlay;
|
||||
}
|
||||
|
||||
target = overlay_get_target (fdt, fdto, fragment, NULL);
|
||||
if (target < 0)
|
||||
if (target < 0) {
|
||||
return target;
|
||||
}
|
||||
|
||||
ret = overlay_apply_node (fdt, target, fdto, overlay);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_path_len(const void *fdt, int nodeoffset)
|
||||
static int
|
||||
get_path_len (
|
||||
const void *fdt,
|
||||
int nodeoffset
|
||||
)
|
||||
{
|
||||
int len = 0, namelen;
|
||||
const char *name;
|
||||
@ -703,22 +866,28 @@ static int get_path_len(const void *fdt, int nodeoffset)
|
||||
|
||||
for ( ; ;) {
|
||||
name = fdt_get_name (fdt, nodeoffset, &namelen);
|
||||
if (!name)
|
||||
if (!name) {
|
||||
return namelen;
|
||||
}
|
||||
|
||||
/* root? we're done */
|
||||
if (namelen == 0)
|
||||
if (namelen == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
nodeoffset = fdt_parent_offset (fdt, nodeoffset);
|
||||
if (nodeoffset < 0)
|
||||
if (nodeoffset < 0) {
|
||||
return nodeoffset;
|
||||
}
|
||||
|
||||
len += namelen + 1;
|
||||
}
|
||||
|
||||
/* in case of root pretend it's "/" */
|
||||
if (len == 0)
|
||||
if (len == 0) {
|
||||
len++;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -738,7 +907,11 @@ static int get_path_len(const void *fdt, int nodeoffset)
|
||||
* 0 on success
|
||||
* Negative error code on failure
|
||||
*/
|
||||
static int overlay_symbol_update(void *fdt, void *fdto)
|
||||
static int
|
||||
overlay_symbol_update (
|
||||
void *fdt,
|
||||
void *fdto
|
||||
)
|
||||
{
|
||||
int root_sym, ov_sym, prop, path_len, fragment, target;
|
||||
int len, frag_name_len, ret, rel_path_len;
|
||||
@ -754,106 +927,136 @@ static int overlay_symbol_update(void *fdt, void *fdto)
|
||||
ov_sym = fdt_subnode_offset (fdto, 0, "__symbols__");
|
||||
|
||||
/* if no overlay symbols exist no problem */
|
||||
if (ov_sym < 0)
|
||||
if (ov_sym < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
root_sym = fdt_subnode_offset (fdt, 0, "__symbols__");
|
||||
|
||||
/* it no root symbols exist we should create them */
|
||||
if (root_sym == -FDT_ERR_NOTFOUND)
|
||||
if (root_sym == -FDT_ERR_NOTFOUND) {
|
||||
root_sym = fdt_add_subnode (fdt, 0, "__symbols__");
|
||||
}
|
||||
|
||||
/* any error is fatal now */
|
||||
if (root_sym < 0)
|
||||
if (root_sym < 0) {
|
||||
return root_sym;
|
||||
}
|
||||
|
||||
/* iterate over each overlay symbol */
|
||||
fdt_for_each_property_offset (prop, fdto, ov_sym) {
|
||||
path = fdt_getprop_by_offset (fdto, prop, &name, &path_len);
|
||||
if (!path)
|
||||
if (!path) {
|
||||
return path_len;
|
||||
}
|
||||
|
||||
/* verify it's a string property (terminated by a single \0) */
|
||||
if (path_len < 1 || memchr(path, '\0', path_len) != &path[path_len - 1])
|
||||
if ((path_len < 1) || (memchr (path, '\0', path_len) != &path[path_len - 1])) {
|
||||
return -FDT_ERR_BADVALUE;
|
||||
}
|
||||
|
||||
/* keep end marker to avoid strlen() */
|
||||
e = path + path_len;
|
||||
|
||||
/* format: /<fragment-name>/__overlay__/<relative-subnode-path> */
|
||||
|
||||
if (*path != '/')
|
||||
if (*path != '/') {
|
||||
return -FDT_ERR_BADVALUE;
|
||||
}
|
||||
|
||||
/* get fragment name first */
|
||||
s = strchr (path + 1, '/');
|
||||
if (!s)
|
||||
if (!s) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
frag_name = path + 1;
|
||||
frag_name_len = s - path - 1;
|
||||
|
||||
/* verify format; safe since "s" lies in \0 terminated prop */
|
||||
len = sizeof ("/__overlay__/") - 1;
|
||||
if ((e - s) < len || memcmp(s, "/__overlay__/", len))
|
||||
if (((e - s) < len) || memcmp (s, "/__overlay__/", len)) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
rel_path = s + len;
|
||||
rel_path_len = e - rel_path;
|
||||
|
||||
/* find the fragment index in which the symbol lies */
|
||||
ret = fdt_subnode_offset_namelen(fdto, 0, frag_name,
|
||||
frag_name_len);
|
||||
ret = fdt_subnode_offset_namelen (
|
||||
fdto,
|
||||
0,
|
||||
frag_name,
|
||||
frag_name_len
|
||||
);
|
||||
/* not found? */
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
fragment = ret;
|
||||
|
||||
/* an __overlay__ subnode must exist */
|
||||
ret = fdt_subnode_offset (fdto, fragment, "__overlay__");
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
return -FDT_ERR_BADOVERLAY;
|
||||
}
|
||||
|
||||
/* get the target of the fragment */
|
||||
ret = overlay_get_target (fdt, fdto, fragment, &target_path);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
target = ret;
|
||||
|
||||
/* if we have a target path use */
|
||||
if (!target_path) {
|
||||
ret = get_path_len (fdt, target);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
len = ret;
|
||||
} else {
|
||||
len = strlen (target_path);
|
||||
}
|
||||
|
||||
ret = fdt_setprop_placeholder(fdt, root_sym, name,
|
||||
len + (len > 1) + rel_path_len + 1, &p);
|
||||
if (ret < 0)
|
||||
ret = fdt_setprop_placeholder (
|
||||
fdt,
|
||||
root_sym,
|
||||
name,
|
||||
len + (len > 1) + rel_path_len + 1,
|
||||
&p
|
||||
);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!target_path) {
|
||||
/* again in case setprop_placeholder changed it */
|
||||
ret = overlay_get_target (fdt, fdto, fragment, &target_path);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
target = ret;
|
||||
}
|
||||
|
||||
buf = p;
|
||||
if (len > 1) { /* target is not root */
|
||||
if (len > 1) {
|
||||
/* target is not root */
|
||||
if (!target_path) {
|
||||
ret = fdt_get_path (fdt, target, buf, len + 1);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
} else
|
||||
}
|
||||
} else {
|
||||
memcpy (buf, target_path, len + 1);
|
||||
|
||||
} else
|
||||
}
|
||||
} else {
|
||||
len--;
|
||||
}
|
||||
|
||||
buf[len] = '/';
|
||||
memcpy (buf + len + 1, rel_path, rel_path_len);
|
||||
@ -863,7 +1066,11 @@ static int overlay_symbol_update(void *fdt, void *fdto)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_overlay_apply(void *fdt, void *fdto)
|
||||
int
|
||||
fdt_overlay_apply (
|
||||
void *fdt,
|
||||
void *fdto
|
||||
)
|
||||
{
|
||||
uint32_t delta = fdt_get_max_phandle (fdt);
|
||||
int ret;
|
||||
@ -872,24 +1079,29 @@ int fdt_overlay_apply(void *fdt, void *fdto)
|
||||
FDT_CHECK_HEADER (fdto);
|
||||
|
||||
ret = overlay_adjust_local_phandles (fdto, delta);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = overlay_update_local_references (fdto, delta);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = overlay_fixup_phandles (fdt, fdto);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = overlay_merge (fdt, fdto);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = overlay_symbol_update (fdt, fdto);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* The overlay has been damaged, erase its magic.
|
||||
@ -899,6 +1111,7 @@ int fdt_overlay_apply(void *fdt, void *fdto)
|
||||
return 0;
|
||||
|
||||
err:
|
||||
|
||||
/*
|
||||
* The overlay might have been damaged, erase its magic.
|
||||
*/
|
||||
|
@ -55,66 +55,97 @@
|
||||
|
||||
#include "libfdt_internal.h"
|
||||
|
||||
static int _fdt_nodename_eq(const void *fdt, int offset,
|
||||
const char *s, int len)
|
||||
static int
|
||||
_fdt_nodename_eq (
|
||||
const void *fdt,
|
||||
int offset,
|
||||
const char *s,
|
||||
int len
|
||||
)
|
||||
{
|
||||
const char *p = fdt_offset_ptr (fdt, offset + FDT_TAGSIZE, len+1);
|
||||
|
||||
if (!p)
|
||||
if (!p) {
|
||||
/* short match */
|
||||
return 0;
|
||||
|
||||
if (memcmp(p, s, len) != 0)
|
||||
return 0;
|
||||
|
||||
if (p[len] == '\0')
|
||||
return 1;
|
||||
else if (!memchr(s, '@', len) && (p[len] == '@'))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *fdt_string(const void *fdt, int stroffset)
|
||||
if (memcmp (p, s, len) != 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (p[len] == '\0') {
|
||||
return 1;
|
||||
} else if (!memchr (s, '@', len) && (p[len] == '@')) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
fdt_string (
|
||||
const void *fdt,
|
||||
int stroffset
|
||||
)
|
||||
{
|
||||
return (const char *)fdt + fdt_off_dt_strings (fdt) + stroffset;
|
||||
}
|
||||
|
||||
static int _fdt_string_eq(const void *fdt, int stroffset,
|
||||
const char *s, int len)
|
||||
static int
|
||||
_fdt_string_eq (
|
||||
const void *fdt,
|
||||
int stroffset,
|
||||
const char *s,
|
||||
int len
|
||||
)
|
||||
{
|
||||
const char *p = fdt_string (fdt, stroffset);
|
||||
|
||||
return (strlen (p) == len) && (memcmp (p, s, len) == 0);
|
||||
}
|
||||
|
||||
uint32_t fdt_get_max_phandle(const void *fdt)
|
||||
uint32_t
|
||||
fdt_get_max_phandle (
|
||||
const void *fdt
|
||||
)
|
||||
{
|
||||
uint32_t max_phandle = 0;
|
||||
int offset;
|
||||
|
||||
for (offset = fdt_next_node (fdt, -1, NULL); ;
|
||||
offset = fdt_next_node(fdt, offset, NULL)) {
|
||||
offset = fdt_next_node (fdt, offset, NULL))
|
||||
{
|
||||
uint32_t phandle;
|
||||
|
||||
if (offset == -FDT_ERR_NOTFOUND)
|
||||
if (offset == -FDT_ERR_NOTFOUND) {
|
||||
return max_phandle;
|
||||
}
|
||||
|
||||
if (offset < 0)
|
||||
if (offset < 0) {
|
||||
return (uint32_t)-1;
|
||||
}
|
||||
|
||||
phandle = fdt_get_phandle (fdt, offset);
|
||||
if (phandle == (uint32_t)-1)
|
||||
if (phandle == (uint32_t)-1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (phandle > max_phandle)
|
||||
if (phandle > max_phandle) {
|
||||
max_phandle = phandle;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
|
||||
int
|
||||
fdt_get_mem_rsv (
|
||||
const void *fdt,
|
||||
int n,
|
||||
uint64_t *address,
|
||||
uint64_t *size
|
||||
)
|
||||
{
|
||||
FDT_CHECK_HEADER (fdt);
|
||||
*address = fdt64_to_cpu (_fdt_mem_rsv (fdt, n)->address);
|
||||
@ -122,16 +153,25 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_num_mem_rsv(const void *fdt)
|
||||
int
|
||||
fdt_num_mem_rsv (
|
||||
const void *fdt
|
||||
)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0)
|
||||
while (fdt64_to_cpu (_fdt_mem_rsv (fdt, i)->size) != 0) {
|
||||
i++;
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static int _nextprop(const void *fdt, int offset)
|
||||
static int
|
||||
_nextprop (
|
||||
const void *fdt,
|
||||
int offset
|
||||
)
|
||||
{
|
||||
uint32_t tag;
|
||||
int nextoffset;
|
||||
@ -141,22 +181,29 @@ static int _nextprop(const void *fdt, int offset)
|
||||
|
||||
switch (tag) {
|
||||
case FDT_END:
|
||||
if (nextoffset >= 0)
|
||||
if (nextoffset >= 0) {
|
||||
return -FDT_ERR_BADSTRUCTURE;
|
||||
else
|
||||
} else {
|
||||
return nextoffset;
|
||||
}
|
||||
|
||||
case FDT_PROP:
|
||||
return offset;
|
||||
}
|
||||
|
||||
offset = nextoffset;
|
||||
} while (tag == FDT_NOP);
|
||||
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
}
|
||||
|
||||
int fdt_subnode_offset_namelen(const void *fdt, int offset,
|
||||
const char *name, int namelen)
|
||||
int
|
||||
fdt_subnode_offset_namelen (
|
||||
const void *fdt,
|
||||
int offset,
|
||||
const char *name,
|
||||
int namelen
|
||||
)
|
||||
{
|
||||
int depth;
|
||||
|
||||
@ -165,22 +212,37 @@ int fdt_subnode_offset_namelen(const void *fdt, int offset,
|
||||
for (depth = 0;
|
||||
(offset >= 0) && (depth >= 0);
|
||||
offset = fdt_next_node (fdt, offset, &depth))
|
||||
{
|
||||
if ( (depth == 1)
|
||||
&& _fdt_nodename_eq (fdt, offset, name, namelen))
|
||||
{
|
||||
return offset;
|
||||
}
|
||||
}
|
||||
|
||||
if (depth < 0)
|
||||
if (depth < 0) {
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
}
|
||||
|
||||
return offset; /* error */
|
||||
}
|
||||
|
||||
int fdt_subnode_offset(const void *fdt, int parentoffset,
|
||||
const char *name)
|
||||
int
|
||||
fdt_subnode_offset (
|
||||
const void *fdt,
|
||||
int parentoffset,
|
||||
const char *name
|
||||
)
|
||||
{
|
||||
return fdt_subnode_offset_namelen (fdt, parentoffset, name, strlen (name));
|
||||
}
|
||||
|
||||
int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen)
|
||||
int
|
||||
fdt_path_offset_namelen (
|
||||
const void *fdt,
|
||||
const char *path,
|
||||
int namelen
|
||||
)
|
||||
{
|
||||
const char *end = path + namelen;
|
||||
const char *p = path;
|
||||
@ -192,12 +254,15 @@ int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen)
|
||||
if (*path != '/') {
|
||||
const char *q = memchr (path, '/', end - p);
|
||||
|
||||
if (!q)
|
||||
if (!q) {
|
||||
q = end;
|
||||
}
|
||||
|
||||
p = fdt_get_alias_namelen (fdt, p, q - p);
|
||||
if (!p)
|
||||
if (!p) {
|
||||
return -FDT_ERR_BADPATH;
|
||||
}
|
||||
|
||||
offset = fdt_path_offset (fdt, p);
|
||||
|
||||
p = q;
|
||||
@ -208,16 +273,20 @@ int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen)
|
||||
|
||||
while (*p == '/') {
|
||||
p++;
|
||||
if (p == end)
|
||||
if (p == end) {
|
||||
return offset;
|
||||
}
|
||||
}
|
||||
|
||||
q = memchr (p, '/', end - p);
|
||||
if (! q)
|
||||
if (!q) {
|
||||
q = end;
|
||||
}
|
||||
|
||||
offset = fdt_subnode_offset_namelen (fdt, offset, p, q-p);
|
||||
if (offset < 0)
|
||||
if (offset < 0) {
|
||||
return offset;
|
||||
}
|
||||
|
||||
p = q;
|
||||
}
|
||||
@ -225,134 +294,212 @@ int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen)
|
||||
return offset;
|
||||
}
|
||||
|
||||
int fdt_path_offset(const void *fdt, const char *path)
|
||||
int
|
||||
fdt_path_offset (
|
||||
const void *fdt,
|
||||
const char *path
|
||||
)
|
||||
{
|
||||
return fdt_path_offset_namelen (fdt, path, strlen (path));
|
||||
}
|
||||
|
||||
const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)
|
||||
const char *
|
||||
fdt_get_name (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
int *len
|
||||
)
|
||||
{
|
||||
const struct fdt_node_header *nh = _fdt_offset_ptr (fdt, nodeoffset);
|
||||
int err;
|
||||
|
||||
if ( ((err = fdt_check_header (fdt)) != 0)
|
||||
|| ((err = _fdt_check_node_offset (fdt, nodeoffset)) < 0))
|
||||
{
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (len)
|
||||
if (len) {
|
||||
*len = strlen (nh->name);
|
||||
}
|
||||
|
||||
return nh->name;
|
||||
|
||||
fail:
|
||||
if (len)
|
||||
if (len) {
|
||||
*len = err;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int fdt_first_property_offset(const void *fdt, int nodeoffset)
|
||||
int
|
||||
fdt_first_property_offset (
|
||||
const void *fdt,
|
||||
int nodeoffset
|
||||
)
|
||||
{
|
||||
int offset;
|
||||
|
||||
if ((offset = _fdt_check_node_offset(fdt, nodeoffset)) < 0)
|
||||
if ((offset = _fdt_check_node_offset (fdt, nodeoffset)) < 0) {
|
||||
return offset;
|
||||
}
|
||||
|
||||
return _nextprop (fdt, offset);
|
||||
}
|
||||
|
||||
int fdt_next_property_offset(const void *fdt, int offset)
|
||||
int
|
||||
fdt_next_property_offset (
|
||||
const void *fdt,
|
||||
int offset
|
||||
)
|
||||
{
|
||||
if ((offset = _fdt_check_prop_offset(fdt, offset)) < 0)
|
||||
if ((offset = _fdt_check_prop_offset (fdt, offset)) < 0) {
|
||||
return offset;
|
||||
}
|
||||
|
||||
return _nextprop (fdt, offset);
|
||||
}
|
||||
|
||||
const struct fdt_property *fdt_get_property_by_offset(const void *fdt,
|
||||
const struct fdt_property *
|
||||
fdt_get_property_by_offset (
|
||||
const void *fdt,
|
||||
int offset,
|
||||
int *lenp)
|
||||
int *lenp
|
||||
)
|
||||
{
|
||||
int err;
|
||||
const struct fdt_property *prop;
|
||||
|
||||
if ((err = _fdt_check_prop_offset (fdt, offset)) < 0) {
|
||||
if (lenp)
|
||||
if (lenp) {
|
||||
*lenp = err;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
prop = _fdt_offset_ptr (fdt, offset);
|
||||
|
||||
if (lenp)
|
||||
if (lenp) {
|
||||
*lenp = fdt32_to_cpu (prop->len);
|
||||
}
|
||||
|
||||
return prop;
|
||||
}
|
||||
|
||||
const struct fdt_property *fdt_get_property_namelen(const void *fdt,
|
||||
const struct fdt_property *
|
||||
fdt_get_property_namelen (
|
||||
const void *fdt,
|
||||
int offset,
|
||||
const char *name,
|
||||
int namelen, int *lenp)
|
||||
int namelen,
|
||||
int *lenp
|
||||
)
|
||||
{
|
||||
for (offset = fdt_first_property_offset (fdt, offset);
|
||||
(offset >= 0);
|
||||
(offset = fdt_next_property_offset(fdt, offset))) {
|
||||
(offset = fdt_next_property_offset (fdt, offset)))
|
||||
{
|
||||
const struct fdt_property *prop;
|
||||
|
||||
if (!(prop = fdt_get_property_by_offset (fdt, offset, lenp))) {
|
||||
offset = -FDT_ERR_INTERNAL;
|
||||
break;
|
||||
}
|
||||
if (_fdt_string_eq(fdt, fdt32_to_cpu(prop->nameoff),
|
||||
name, namelen))
|
||||
|
||||
if (_fdt_string_eq (
|
||||
fdt,
|
||||
fdt32_to_cpu (prop->nameoff),
|
||||
name,
|
||||
namelen
|
||||
))
|
||||
{
|
||||
return prop;
|
||||
}
|
||||
}
|
||||
|
||||
if (lenp)
|
||||
if (lenp) {
|
||||
*lenp = offset;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const struct fdt_property *fdt_get_property(const void *fdt,
|
||||
const struct fdt_property *
|
||||
fdt_get_property (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name, int *lenp)
|
||||
const char *name,
|
||||
int *lenp
|
||||
)
|
||||
{
|
||||
return fdt_get_property_namelen(fdt, nodeoffset, name,
|
||||
strlen(name), lenp);
|
||||
return fdt_get_property_namelen (
|
||||
fdt,
|
||||
nodeoffset,
|
||||
name,
|
||||
strlen (name),
|
||||
lenp
|
||||
);
|
||||
}
|
||||
|
||||
const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
|
||||
const char *name, int namelen, int *lenp)
|
||||
const void *
|
||||
fdt_getprop_namelen (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
int namelen,
|
||||
int *lenp
|
||||
)
|
||||
{
|
||||
const struct fdt_property *prop;
|
||||
|
||||
prop = fdt_get_property_namelen (fdt, nodeoffset, name, namelen, lenp);
|
||||
if (!prop)
|
||||
if (!prop) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return prop->data;
|
||||
}
|
||||
|
||||
const void *fdt_getprop_by_offset(const void *fdt, int offset,
|
||||
const char **namep, int *lenp)
|
||||
const void *
|
||||
fdt_getprop_by_offset (
|
||||
const void *fdt,
|
||||
int offset,
|
||||
const char **namep,
|
||||
int *lenp
|
||||
)
|
||||
{
|
||||
const struct fdt_property *prop;
|
||||
|
||||
prop = fdt_get_property_by_offset (fdt, offset, lenp);
|
||||
if (!prop)
|
||||
if (!prop) {
|
||||
return NULL;
|
||||
if (namep)
|
||||
}
|
||||
|
||||
if (namep) {
|
||||
*namep = fdt_string (fdt, fdt32_to_cpu (prop->nameoff));
|
||||
}
|
||||
|
||||
return prop->data;
|
||||
}
|
||||
|
||||
const void *fdt_getprop(const void *fdt, int nodeoffset,
|
||||
const char *name, int *lenp)
|
||||
const void *
|
||||
fdt_getprop (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
int *lenp
|
||||
)
|
||||
{
|
||||
return fdt_getprop_namelen (fdt, nodeoffset, name, strlen (name), lenp);
|
||||
}
|
||||
|
||||
uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
|
||||
uint32_t
|
||||
fdt_get_phandle (
|
||||
const void *fdt,
|
||||
int nodeoffset
|
||||
)
|
||||
{
|
||||
const fdt32_t *php;
|
||||
int len;
|
||||
@ -362,31 +509,47 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
|
||||
php = fdt_getprop (fdt, nodeoffset, "phandle", &len);
|
||||
if (!php || (len != sizeof (*php))) {
|
||||
php = fdt_getprop (fdt, nodeoffset, "linux,phandle", &len);
|
||||
if (!php || (len != sizeof(*php)))
|
||||
if (!php || (len != sizeof (*php))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return fdt32_to_cpu (*php);
|
||||
}
|
||||
|
||||
const char *fdt_get_alias_namelen(const void *fdt,
|
||||
const char *name, int namelen)
|
||||
const char *
|
||||
fdt_get_alias_namelen (
|
||||
const void *fdt,
|
||||
const char *name,
|
||||
int namelen
|
||||
)
|
||||
{
|
||||
int aliasoffset;
|
||||
|
||||
aliasoffset = fdt_path_offset (fdt, "/aliases");
|
||||
if (aliasoffset < 0)
|
||||
if (aliasoffset < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fdt_getprop_namelen (fdt, aliasoffset, name, namelen, NULL);
|
||||
}
|
||||
|
||||
const char *fdt_get_alias(const void *fdt, const char *name)
|
||||
const char *
|
||||
fdt_get_alias (
|
||||
const void *fdt,
|
||||
const char *name
|
||||
)
|
||||
{
|
||||
return fdt_get_alias_namelen (fdt, name, strlen (name));
|
||||
}
|
||||
|
||||
int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
|
||||
int
|
||||
fdt_get_path (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
char *buf,
|
||||
int buflen
|
||||
)
|
||||
{
|
||||
int pdepth = 0, p = 0;
|
||||
int offset, depth, namelen;
|
||||
@ -394,23 +557,28 @@ int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
|
||||
|
||||
FDT_CHECK_HEADER (fdt);
|
||||
|
||||
if (buflen < 2)
|
||||
if (buflen < 2) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
for (offset = 0, depth = 0;
|
||||
(offset >= 0) && (offset <= nodeoffset);
|
||||
offset = fdt_next_node(fdt, offset, &depth)) {
|
||||
offset = fdt_next_node (fdt, offset, &depth))
|
||||
{
|
||||
while (pdepth > depth) {
|
||||
do {
|
||||
p--;
|
||||
} while (buf[p-1] != '/');
|
||||
|
||||
pdepth--;
|
||||
}
|
||||
|
||||
if (pdepth >= depth) {
|
||||
name = fdt_get_name (fdt, offset, &namelen);
|
||||
if (!name)
|
||||
if (!name) {
|
||||
return namelen;
|
||||
}
|
||||
|
||||
if ((p + namelen + 1) <= buflen) {
|
||||
memcpy (buf + p, name, namelen);
|
||||
p += namelen;
|
||||
@ -420,84 +588,121 @@ int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
|
||||
}
|
||||
|
||||
if (offset == nodeoffset) {
|
||||
if (pdepth < (depth + 1))
|
||||
if (pdepth < (depth + 1)) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
if (p > 1) /* special case so that root path is "/", not "" */
|
||||
if (p > 1) {
|
||||
/* special case so that root path is "/", not "" */
|
||||
p--;
|
||||
}
|
||||
|
||||
buf[p] = '\0';
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0))
|
||||
if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) {
|
||||
return -FDT_ERR_BADOFFSET;
|
||||
else if (offset == -FDT_ERR_BADOFFSET)
|
||||
} else if (offset == -FDT_ERR_BADOFFSET) {
|
||||
return -FDT_ERR_BADSTRUCTURE;
|
||||
}
|
||||
|
||||
return offset; /* error from fdt_next_node() */
|
||||
}
|
||||
|
||||
int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
|
||||
int supernodedepth, int *nodedepth)
|
||||
int
|
||||
fdt_supernode_atdepth_offset (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
int supernodedepth,
|
||||
int *nodedepth
|
||||
)
|
||||
{
|
||||
int offset, depth;
|
||||
int supernodeoffset = -FDT_ERR_INTERNAL;
|
||||
|
||||
FDT_CHECK_HEADER (fdt);
|
||||
|
||||
if (supernodedepth < 0)
|
||||
if (supernodedepth < 0) {
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
}
|
||||
|
||||
for (offset = 0, depth = 0;
|
||||
(offset >= 0) && (offset <= nodeoffset);
|
||||
offset = fdt_next_node(fdt, offset, &depth)) {
|
||||
if (depth == supernodedepth)
|
||||
offset = fdt_next_node (fdt, offset, &depth))
|
||||
{
|
||||
if (depth == supernodedepth) {
|
||||
supernodeoffset = offset;
|
||||
}
|
||||
|
||||
if (offset == nodeoffset) {
|
||||
if (nodedepth)
|
||||
if (nodedepth) {
|
||||
*nodedepth = depth;
|
||||
}
|
||||
|
||||
if (supernodedepth > depth)
|
||||
if (supernodedepth > depth) {
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
else
|
||||
} else {
|
||||
return supernodeoffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0))
|
||||
if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) {
|
||||
return -FDT_ERR_BADOFFSET;
|
||||
else if (offset == -FDT_ERR_BADOFFSET)
|
||||
} else if (offset == -FDT_ERR_BADOFFSET) {
|
||||
return -FDT_ERR_BADSTRUCTURE;
|
||||
}
|
||||
|
||||
return offset; /* error from fdt_next_node() */
|
||||
}
|
||||
|
||||
int fdt_node_depth(const void *fdt, int nodeoffset)
|
||||
int
|
||||
fdt_node_depth (
|
||||
const void *fdt,
|
||||
int nodeoffset
|
||||
)
|
||||
{
|
||||
int nodedepth;
|
||||
int err;
|
||||
|
||||
err = fdt_supernode_atdepth_offset (fdt, nodeoffset, 0, &nodedepth);
|
||||
if (err)
|
||||
if (err) {
|
||||
return (err < 0) ? err : -FDT_ERR_INTERNAL;
|
||||
}
|
||||
|
||||
return nodedepth;
|
||||
}
|
||||
|
||||
int fdt_parent_offset(const void *fdt, int nodeoffset)
|
||||
int
|
||||
fdt_parent_offset (
|
||||
const void *fdt,
|
||||
int nodeoffset
|
||||
)
|
||||
{
|
||||
int nodedepth = fdt_node_depth (fdt, nodeoffset);
|
||||
|
||||
if (nodedepth < 0)
|
||||
if (nodedepth < 0) {
|
||||
return nodedepth;
|
||||
return fdt_supernode_atdepth_offset(fdt, nodeoffset,
|
||||
nodedepth - 1, NULL);
|
||||
}
|
||||
|
||||
int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
|
||||
return fdt_supernode_atdepth_offset (
|
||||
fdt,
|
||||
nodeoffset,
|
||||
nodedepth - 1,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
int
|
||||
fdt_node_offset_by_prop_value (
|
||||
const void *fdt,
|
||||
int startoffset,
|
||||
const char *propname,
|
||||
const void *propval, int proplen)
|
||||
const void *propval,
|
||||
int proplen
|
||||
)
|
||||
{
|
||||
int offset;
|
||||
const void *val;
|
||||
@ -512,22 +717,30 @@ int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
|
||||
* approach; performance can come later. */
|
||||
for (offset = fdt_next_node (fdt, startoffset, NULL);
|
||||
offset >= 0;
|
||||
offset = fdt_next_node(fdt, offset, NULL)) {
|
||||
offset = fdt_next_node (fdt, offset, NULL))
|
||||
{
|
||||
val = fdt_getprop (fdt, offset, propname, &len);
|
||||
if ( val && (len == proplen)
|
||||
&& (memcmp (val, propval, len) == 0))
|
||||
{
|
||||
return offset;
|
||||
}
|
||||
}
|
||||
|
||||
return offset; /* error from fdt_next_node() */
|
||||
}
|
||||
|
||||
int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
|
||||
int
|
||||
fdt_node_offset_by_phandle (
|
||||
const void *fdt,
|
||||
uint32_t phandle
|
||||
)
|
||||
{
|
||||
int offset;
|
||||
|
||||
if ((phandle == 0) || (phandle == -1))
|
||||
if ((phandle == 0) || (phandle == -1)) {
|
||||
return -FDT_ERR_BADPHANDLE;
|
||||
}
|
||||
|
||||
FDT_CHECK_HEADER (fdt);
|
||||
|
||||
@ -539,39 +752,57 @@ int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
|
||||
* performance can come later. */
|
||||
for (offset = fdt_next_node (fdt, -1, NULL);
|
||||
offset >= 0;
|
||||
offset = fdt_next_node(fdt, offset, NULL)) {
|
||||
if (fdt_get_phandle(fdt, offset) == phandle)
|
||||
offset = fdt_next_node (fdt, offset, NULL))
|
||||
{
|
||||
if (fdt_get_phandle (fdt, offset) == phandle) {
|
||||
return offset;
|
||||
}
|
||||
}
|
||||
|
||||
return offset; /* error from fdt_next_node() */
|
||||
}
|
||||
|
||||
int fdt_stringlist_contains(const char *strlist, int listlen, const char *str)
|
||||
int
|
||||
fdt_stringlist_contains (
|
||||
const char *strlist,
|
||||
int listlen,
|
||||
const char *str
|
||||
)
|
||||
{
|
||||
int len = strlen (str);
|
||||
const char *p;
|
||||
|
||||
while (listlen >= len) {
|
||||
if (memcmp(str, strlist, len+1) == 0)
|
||||
if (memcmp (str, strlist, len+1) == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
p = memchr (strlist, '\0', listlen);
|
||||
if (!p)
|
||||
if (!p) {
|
||||
return 0; /* malformed strlist.. */
|
||||
}
|
||||
|
||||
listlen -= (p-strlist) + 1;
|
||||
strlist = p + 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property)
|
||||
int
|
||||
fdt_stringlist_count (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
const char *property
|
||||
)
|
||||
{
|
||||
const char *list, *end;
|
||||
int length, count = 0;
|
||||
|
||||
list = fdt_getprop (fdt, nodeoffset, property, &length);
|
||||
if (!list)
|
||||
if (!list) {
|
||||
return length;
|
||||
}
|
||||
|
||||
end = list + length;
|
||||
|
||||
@ -579,8 +810,9 @@ int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property)
|
||||
length = strnlen (list, end - list) + 1;
|
||||
|
||||
/* Abort if the last string isn't properly NUL-terminated. */
|
||||
if (list + length > end)
|
||||
if (list + length > end) {
|
||||
return -FDT_ERR_BADVALUE;
|
||||
}
|
||||
|
||||
list += length;
|
||||
count++;
|
||||
@ -589,15 +821,21 @@ int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property)
|
||||
return count;
|
||||
}
|
||||
|
||||
int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,
|
||||
const char *string)
|
||||
int
|
||||
fdt_stringlist_search (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
const char *property,
|
||||
const char *string
|
||||
)
|
||||
{
|
||||
int length, len, idx = 0;
|
||||
const char *list, *end;
|
||||
|
||||
list = fdt_getprop (fdt, nodeoffset, property, &length);
|
||||
if (!list)
|
||||
if (!list) {
|
||||
return length;
|
||||
}
|
||||
|
||||
len = strlen (string) + 1;
|
||||
end = list + length;
|
||||
@ -606,11 +844,13 @@ int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,
|
||||
length = strnlen (list, end - list) + 1;
|
||||
|
||||
/* Abort if the last string isn't properly NUL-terminated. */
|
||||
if (list + length > end)
|
||||
if (list + length > end) {
|
||||
return -FDT_ERR_BADVALUE;
|
||||
}
|
||||
|
||||
if (length == len && memcmp(list, string, length) == 0)
|
||||
if ((length == len) && (memcmp (list, string, length) == 0)) {
|
||||
return idx;
|
||||
}
|
||||
|
||||
list += length;
|
||||
idx++;
|
||||
@ -619,17 +859,23 @@ int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
}
|
||||
|
||||
const char *fdt_stringlist_get(const void *fdt, int nodeoffset,
|
||||
const char *property, int idx,
|
||||
int *lenp)
|
||||
const char *
|
||||
fdt_stringlist_get (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
const char *property,
|
||||
int idx,
|
||||
int *lenp
|
||||
)
|
||||
{
|
||||
const char *list, *end;
|
||||
int length;
|
||||
|
||||
list = fdt_getprop (fdt, nodeoffset, property, &length);
|
||||
if (!list) {
|
||||
if (lenp)
|
||||
if (lenp) {
|
||||
*lenp = length;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -641,15 +887,17 @@ const char *fdt_stringlist_get(const void *fdt, int nodeoffset,
|
||||
|
||||
/* Abort if the last string isn't properly NUL-terminated. */
|
||||
if (list + length > end) {
|
||||
if (lenp)
|
||||
if (lenp) {
|
||||
*lenp = -FDT_ERR_BADVALUE;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (idx == 0) {
|
||||
if (lenp)
|
||||
if (lenp) {
|
||||
*lenp = length - 1;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
@ -658,27 +906,37 @@ const char *fdt_stringlist_get(const void *fdt, int nodeoffset,
|
||||
idx--;
|
||||
}
|
||||
|
||||
if (lenp)
|
||||
if (lenp) {
|
||||
*lenp = -FDT_ERR_NOTFOUND;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int fdt_node_check_compatible(const void *fdt, int nodeoffset,
|
||||
const char *compatible)
|
||||
int
|
||||
fdt_node_check_compatible (
|
||||
const void *fdt,
|
||||
int nodeoffset,
|
||||
const char *compatible
|
||||
)
|
||||
{
|
||||
const void *prop;
|
||||
int len;
|
||||
|
||||
prop = fdt_getprop (fdt, nodeoffset, "compatible", &len);
|
||||
if (!prop)
|
||||
if (!prop) {
|
||||
return len;
|
||||
}
|
||||
|
||||
return !fdt_stringlist_contains (prop, len, compatible);
|
||||
}
|
||||
|
||||
int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
|
||||
const char *compatible)
|
||||
int
|
||||
fdt_node_offset_by_compatible (
|
||||
const void *fdt,
|
||||
int startoffset,
|
||||
const char *compatible
|
||||
)
|
||||
{
|
||||
int offset, err;
|
||||
|
||||
@ -691,13 +949,15 @@ int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
|
||||
* implement approach; performance can come later. */
|
||||
for (offset = fdt_next_node (fdt, startoffset, NULL);
|
||||
offset >= 0;
|
||||
offset = fdt_next_node(fdt, offset, NULL)) {
|
||||
offset = fdt_next_node (fdt, offset, NULL))
|
||||
{
|
||||
err = fdt_node_check_compatible (fdt, offset, compatible);
|
||||
if ((err < 0) && (err != -FDT_ERR_NOTFOUND))
|
||||
if ((err < 0) && (err != -FDT_ERR_NOTFOUND)) {
|
||||
return err;
|
||||
else if (err == 0)
|
||||
} else if (err == 0) {
|
||||
return offset;
|
||||
}
|
||||
}
|
||||
|
||||
return offset; /* error from fdt_next_node() */
|
||||
}
|
||||
|
@ -55,8 +55,12 @@
|
||||
|
||||
#include "libfdt_internal.h"
|
||||
|
||||
static int _fdt_blocks_misordered(const void *fdt,
|
||||
int mem_rsv_size, int struct_size)
|
||||
static int
|
||||
_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))
|
||||
|| (fdt_off_dt_struct (fdt) <
|
||||
@ -67,17 +71,29 @@ static int _fdt_blocks_misordered(const void *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);
|
||||
|
||||
if (fdt_version(fdt) < 17)
|
||||
if (fdt_version (fdt) < 17) {
|
||||
return -FDT_ERR_BADVERSION;
|
||||
if (_fdt_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry),
|
||||
fdt_size_dt_struct(fdt)))
|
||||
}
|
||||
|
||||
if (_fdt_blocks_misordered (
|
||||
fdt,
|
||||
sizeof (struct fdt_reserve_entry),
|
||||
fdt_size_dt_struct (fdt)
|
||||
))
|
||||
{
|
||||
return -FDT_ERR_BADLAYOUT;
|
||||
if (fdt_version(fdt) > 17)
|
||||
}
|
||||
|
||||
if (fdt_version (fdt) > 17) {
|
||||
fdt_set_version (fdt, 17);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -89,67 +105,105 @@ static int _fdt_rw_check_header(void *fdt)
|
||||
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);
|
||||
}
|
||||
|
||||
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 *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;
|
||||
if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt))
|
||||
}
|
||||
|
||||
if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt)) {
|
||||
return -FDT_ERR_BADOFFSET;
|
||||
if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
|
||||
}
|
||||
|
||||
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,
|
||||
int oldn, int newn)
|
||||
static int
|
||||
_fdt_splice_mem_rsv (
|
||||
void *fdt,
|
||||
struct fdt_reserve_entry *p,
|
||||
int oldn,
|
||||
int newn
|
||||
)
|
||||
{
|
||||
int delta = (newn - oldn) * sizeof (*p);
|
||||
int err;
|
||||
|
||||
err = _fdt_splice (fdt, p, oldn * sizeof (*p), newn * sizeof (*p));
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
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,
|
||||
int oldlen, int newlen)
|
||||
static int
|
||||
_fdt_splice_struct (
|
||||
void *fdt,
|
||||
void *p,
|
||||
int oldlen,
|
||||
int newlen
|
||||
)
|
||||
{
|
||||
int delta = newlen - oldlen;
|
||||
int err;
|
||||
|
||||
if ((err = _fdt_splice(fdt, p, oldlen, newlen)))
|
||||
if ((err = _fdt_splice (fdt, p, oldlen, newlen))) {
|
||||
return err;
|
||||
}
|
||||
|
||||
fdt_set_size_dt_struct (fdt, fdt_size_dt_struct (fdt) + delta);
|
||||
fdt_set_off_dt_strings (fdt, fdt_off_dt_strings (fdt) + delta);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _fdt_splice_string(void *fdt, int newlen)
|
||||
static int
|
||||
_fdt_splice_string (
|
||||
void *fdt,
|
||||
int newlen
|
||||
)
|
||||
{
|
||||
void *p = (char *)fdt
|
||||
+ fdt_off_dt_strings (fdt) + fdt_size_dt_strings (fdt);
|
||||
int err;
|
||||
|
||||
if ((err = _fdt_splice(fdt, p, 0, newlen)))
|
||||
if ((err = _fdt_splice (fdt, p, 0, newlen))) {
|
||||
return err;
|
||||
}
|
||||
|
||||
fdt_set_size_dt_strings (fdt, fdt_size_dt_strings (fdt) + newlen);
|
||||
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);
|
||||
const char *p;
|
||||
@ -158,20 +212,27 @@ static int _fdt_find_add_string(void *fdt, const char *s)
|
||||
int err;
|
||||
|
||||
p = _fdt_find_string (strtab, fdt_size_dt_strings (fdt), s);
|
||||
if (p)
|
||||
if (p) {
|
||||
/* found it */
|
||||
return (p - strtab);
|
||||
}
|
||||
|
||||
new = strtab + fdt_size_dt_strings (fdt);
|
||||
err = _fdt_splice_string (fdt, len);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
memcpy (new, s, len);
|
||||
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;
|
||||
int err;
|
||||
@ -180,65 +241,93 @@ int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
|
||||
|
||||
re = _fdt_mem_rsv_w (fdt, fdt_num_mem_rsv (fdt));
|
||||
err = _fdt_splice_mem_rsv (fdt, re, 0, 1);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
re->address = cpu_to_fdt64 (address);
|
||||
re->size = cpu_to_fdt64 (size);
|
||||
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);
|
||||
|
||||
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_splice_mem_rsv (fdt, re, 1, 0);
|
||||
}
|
||||
|
||||
static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name,
|
||||
int len, struct fdt_property **prop)
|
||||
static int
|
||||
_fdt_resize_property (
|
||||
void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
int len,
|
||||
struct fdt_property **prop
|
||||
)
|
||||
{
|
||||
int oldlen;
|
||||
int err;
|
||||
|
||||
*prop = fdt_get_property_w (fdt, nodeoffset, name, &oldlen);
|
||||
if (!*prop)
|
||||
if (!*prop) {
|
||||
return oldlen;
|
||||
}
|
||||
|
||||
if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen),
|
||||
FDT_TAGALIGN(len))))
|
||||
if ((err = _fdt_splice_struct (
|
||||
fdt,
|
||||
(*prop)->data,
|
||||
FDT_TAGALIGN (oldlen),
|
||||
FDT_TAGALIGN (len)
|
||||
)))
|
||||
{
|
||||
return err;
|
||||
}
|
||||
|
||||
(*prop)->len = cpu_to_fdt32 (len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _fdt_add_property(void *fdt, int nodeoffset, const char *name,
|
||||
int len, struct fdt_property **prop)
|
||||
static int
|
||||
_fdt_add_property (
|
||||
void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
int len,
|
||||
struct fdt_property **prop
|
||||
)
|
||||
{
|
||||
int proplen;
|
||||
int nextoffset;
|
||||
int namestroff;
|
||||
int err;
|
||||
|
||||
if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0)
|
||||
if ((nextoffset = _fdt_check_node_offset (fdt, nodeoffset)) < 0) {
|
||||
return nextoffset;
|
||||
}
|
||||
|
||||
namestroff = _fdt_find_add_string (fdt, name);
|
||||
if (namestroff < 0)
|
||||
if (namestroff < 0) {
|
||||
return namestroff;
|
||||
}
|
||||
|
||||
*prop = _fdt_offset_ptr_w (fdt, nextoffset);
|
||||
proplen = sizeof (**prop) + FDT_TAGALIGN (len);
|
||||
|
||||
err = _fdt_splice_struct (fdt, *prop, 0, proplen);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
(*prop)->tag = cpu_to_fdt32 (FDT_PROP);
|
||||
(*prop)->nameoff = cpu_to_fdt32 (namestroff);
|
||||
@ -246,7 +335,12 @@ static int _fdt_add_property(void *fdt, int nodeoffset, const char *name,
|
||||
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;
|
||||
int oldlen, newlen;
|
||||
@ -255,22 +349,34 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name)
|
||||
FDT_RW_CHECK_HEADER (fdt);
|
||||
|
||||
namep = (char *)(uintptr_t)fdt_get_name (fdt, nodeoffset, &oldlen);
|
||||
if (!namep)
|
||||
if (!namep) {
|
||||
return oldlen;
|
||||
}
|
||||
|
||||
newlen = strlen (name);
|
||||
|
||||
err = _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1),
|
||||
FDT_TAGALIGN(newlen+1));
|
||||
if (err)
|
||||
err = _fdt_splice_struct (
|
||||
fdt,
|
||||
namep,
|
||||
FDT_TAGALIGN (oldlen+1),
|
||||
FDT_TAGALIGN (newlen+1)
|
||||
);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
memcpy (namep, name, newlen+1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
|
||||
int len, void **prop_data)
|
||||
int
|
||||
fdt_setprop_placeholder (
|
||||
void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
int len,
|
||||
void **prop_data
|
||||
)
|
||||
{
|
||||
struct fdt_property *prop;
|
||||
int err;
|
||||
@ -278,32 +384,50 @@ int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
|
||||
FDT_RW_CHECK_HEADER (fdt);
|
||||
|
||||
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);
|
||||
if (err)
|
||||
}
|
||||
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
*prop_data = prop->data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_setprop(void *fdt, int nodeoffset, const char *name,
|
||||
const void *val, int len)
|
||||
int
|
||||
fdt_setprop (
|
||||
void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
const void *val,
|
||||
int len
|
||||
)
|
||||
{
|
||||
void *prop_data;
|
||||
int err;
|
||||
|
||||
err = fdt_setprop_placeholder (fdt, nodeoffset, name, len, &prop_data);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (len)
|
||||
if (len) {
|
||||
memcpy (prop_data, val, len);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
|
||||
const void *val, int len)
|
||||
int
|
||||
fdt_appendprop (
|
||||
void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
const void *val,
|
||||
int len
|
||||
)
|
||||
{
|
||||
struct fdt_property *prop;
|
||||
int err, oldlen, newlen;
|
||||
@ -313,23 +437,36 @@ int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
|
||||
prop = fdt_get_property_w (fdt, nodeoffset, name, &oldlen);
|
||||
if (prop) {
|
||||
newlen = len + oldlen;
|
||||
err = _fdt_splice_struct(fdt, prop->data,
|
||||
err = _fdt_splice_struct (
|
||||
fdt,
|
||||
prop->data,
|
||||
FDT_TAGALIGN (oldlen),
|
||||
FDT_TAGALIGN(newlen));
|
||||
if (err)
|
||||
FDT_TAGALIGN (newlen)
|
||||
);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
prop->len = cpu_to_fdt32 (newlen);
|
||||
memcpy (prop->data + oldlen, val, len);
|
||||
} else {
|
||||
err = _fdt_add_property (fdt, nodeoffset, name, len, &prop);
|
||||
if (err)
|
||||
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;
|
||||
int len, proplen;
|
||||
@ -337,15 +474,21 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name)
|
||||
FDT_RW_CHECK_HEADER (fdt);
|
||||
|
||||
prop = fdt_get_property_w (fdt, nodeoffset, name, &len);
|
||||
if (!prop)
|
||||
if (!prop) {
|
||||
return len;
|
||||
}
|
||||
|
||||
proplen = sizeof (*prop) + FDT_TAGALIGN (len);
|
||||
return _fdt_splice_struct (fdt, prop, proplen, 0);
|
||||
}
|
||||
|
||||
int fdt_add_subnode_namelen(void *fdt, int parentoffset,
|
||||
const char *name, int namelen)
|
||||
int
|
||||
fdt_add_subnode_namelen (
|
||||
void *fdt,
|
||||
int parentoffset,
|
||||
const char *name,
|
||||
int namelen
|
||||
)
|
||||
{
|
||||
struct fdt_node_header *nh;
|
||||
int offset, nextoffset;
|
||||
@ -357,10 +500,11 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
|
||||
FDT_RW_CHECK_HEADER (fdt);
|
||||
|
||||
offset = fdt_subnode_offset_namelen (fdt, parentoffset, name, namelen);
|
||||
if (offset >= 0)
|
||||
if (offset >= 0) {
|
||||
return -FDT_ERR_EXISTS;
|
||||
else if (offset != -FDT_ERR_NOTFOUND)
|
||||
} else if (offset != -FDT_ERR_NOTFOUND) {
|
||||
return offset;
|
||||
}
|
||||
|
||||
/* Try to place the new node after the parent's properties */
|
||||
fdt_next_tag (fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */
|
||||
@ -373,8 +517,9 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
|
||||
nodelen = sizeof (*nh) + FDT_TAGALIGN (namelen+1) + FDT_TAGSIZE;
|
||||
|
||||
err = _fdt_splice_struct (fdt, nh, 0, nodelen);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
nh->tag = cpu_to_fdt32 (FDT_BEGIN_NODE);
|
||||
memset (nh->name, 0, FDT_TAGALIGN (namelen+1));
|
||||
@ -385,27 +530,46 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
|
||||
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));
|
||||
}
|
||||
|
||||
int fdt_del_node(void *fdt, int nodeoffset)
|
||||
int
|
||||
fdt_del_node (
|
||||
void *fdt,
|
||||
int nodeoffset
|
||||
)
|
||||
{
|
||||
int endoffset;
|
||||
|
||||
FDT_RW_CHECK_HEADER (fdt);
|
||||
|
||||
endoffset = _fdt_node_end_offset (fdt, nodeoffset);
|
||||
if (endoffset < 0)
|
||||
if (endoffset < 0) {
|
||||
return endoffset;
|
||||
|
||||
return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
|
||||
endoffset - nodeoffset, 0);
|
||||
}
|
||||
|
||||
static void _fdt_packblocks(const char *old, char *new,
|
||||
int mem_rsv_size, int struct_size)
|
||||
return _fdt_splice_struct (
|
||||
fdt,
|
||||
_fdt_offset_ptr_w (fdt, nodeoffset),
|
||||
endoffset - nodeoffset,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
static void
|
||||
_fdt_packblocks (
|
||||
const char *old,
|
||||
char *new,
|
||||
int mem_rsv_size,
|
||||
int struct_size
|
||||
)
|
||||
{
|
||||
int mem_rsv_off, struct_off, strings_off;
|
||||
|
||||
@ -420,13 +584,21 @@ static void _fdt_packblocks(const char *old, char *new,
|
||||
fdt_set_off_dt_struct (new, struct_off);
|
||||
fdt_set_size_dt_struct (new, struct_size);
|
||||
|
||||
memmove(new + strings_off, old + fdt_off_dt_strings(old),
|
||||
fdt_size_dt_strings(old));
|
||||
memmove (
|
||||
new + strings_off,
|
||||
old + fdt_off_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 mem_rsv_size, struct_size;
|
||||
@ -444,17 +616,21 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
|
||||
struct_size = fdt_size_dt_struct (fdt);
|
||||
} else {
|
||||
struct_size = 0;
|
||||
while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END)
|
||||
;
|
||||
if (struct_size < 0)
|
||||
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)) {
|
||||
/* no further work necessary */
|
||||
err = fdt_move (fdt, buf, bufsize);
|
||||
if (err)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
fdt_set_version (buf, 17);
|
||||
fdt_set_size_dt_struct (buf, struct_size);
|
||||
fdt_set_totalsize (buf, bufsize);
|
||||
@ -465,8 +641,9 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
|
||||
newsize = FDT_ALIGN (sizeof (struct fdt_header), 8) + mem_rsv_size
|
||||
+ struct_size + fdt_size_dt_strings (fdt);
|
||||
|
||||
if (bufsize < newsize)
|
||||
if (bufsize < newsize) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
/* First attempt to build converted tree at beginning of buffer */
|
||||
tmp = buf;
|
||||
@ -474,9 +651,10 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
|
||||
if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) {
|
||||
/* Try right after the old tree instead */
|
||||
tmp = (char *)(uintptr_t)fdtend;
|
||||
if ((tmp + newsize) > ((char *)buf + bufsize))
|
||||
if ((tmp + newsize) > ((char *)buf + bufsize)) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
}
|
||||
|
||||
_fdt_packblocks (fdt, tmp, mem_rsv_size, struct_size);
|
||||
memmove (buf, tmp, newsize);
|
||||
@ -490,7 +668,10 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_pack(void *fdt)
|
||||
int
|
||||
fdt_pack (
|
||||
void *fdt
|
||||
)
|
||||
{
|
||||
int mem_rsv_size;
|
||||
|
||||
|
@ -85,18 +85,22 @@ static struct fdt_errtabent fdt_errtable[] = {
|
||||
};
|
||||
#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>";
|
||||
else if (errval == 0)
|
||||
} else if (errval == 0) {
|
||||
return "<no error>";
|
||||
else if (errval > -FDT_ERRTABSIZE) {
|
||||
} else if (errval > -FDT_ERRTABSIZE) {
|
||||
const char *s = fdt_errtable[-errval].str;
|
||||
|
||||
if (s)
|
||||
if (s) {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
return "<unknown error>";
|
||||
}
|
||||
|
@ -9,7 +9,12 @@
|
||||
#include <Library/BaseLib.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;
|
||||
UINTN ReturnValue;
|
||||
|
@ -55,10 +55,15 @@
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
/* FIXME: should check more details about the header state */
|
||||
return 0;
|
||||
}
|
||||
@ -70,7 +75,11 @@ static int _fdt_sw_check_header(void *fdt)
|
||||
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 spaceleft;
|
||||
@ -78,19 +87,25 @@ static void *_fdt_grab_space(void *fdt, size_t len)
|
||||
spaceleft = fdt_totalsize (fdt) - fdt_off_dt_struct (fdt)
|
||||
- fdt_size_dt_strings (fdt);
|
||||
|
||||
if ((offset + len < offset) || (offset + len > spaceleft))
|
||||
if ((offset + len < offset) || (offset + len > spaceleft)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fdt_set_size_dt_struct (fdt, offset + len);
|
||||
return _fdt_offset_ptr_w (fdt, offset);
|
||||
}
|
||||
|
||||
int fdt_create(void *buf, int bufsize)
|
||||
int
|
||||
fdt_create (
|
||||
void *buf,
|
||||
int bufsize
|
||||
)
|
||||
{
|
||||
void *fdt = buf;
|
||||
|
||||
if (bufsize < sizeof(struct fdt_header))
|
||||
if (bufsize < sizeof (struct fdt_header)) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
memset (buf, 0, bufsize);
|
||||
|
||||
@ -99,15 +114,25 @@ int fdt_create(void *buf, int bufsize)
|
||||
fdt_set_last_comp_version (fdt, FDT_FIRST_SUPPORTED_VERSION);
|
||||
fdt_set_totalsize (fdt, bufsize);
|
||||
|
||||
fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header),
|
||||
sizeof(struct fdt_reserve_entry)));
|
||||
fdt_set_off_mem_rsvmap (
|
||||
fdt,
|
||||
FDT_ALIGN (
|
||||
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;
|
||||
}
|
||||
|
||||
int fdt_resize(void *fdt, void *buf, int bufsize)
|
||||
int
|
||||
fdt_resize (
|
||||
void *fdt,
|
||||
void *buf,
|
||||
int bufsize
|
||||
)
|
||||
{
|
||||
size_t headsize, tailsize;
|
||||
char *oldtail, *newtail;
|
||||
@ -117,8 +142,9 @@ int fdt_resize(void *fdt, void *buf, int bufsize)
|
||||
headsize = fdt_off_dt_struct (fdt);
|
||||
tailsize = fdt_size_dt_strings (fdt);
|
||||
|
||||
if ((headsize + tailsize) > bufsize)
|
||||
if ((headsize + tailsize) > bufsize) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
oldtail = (char *)fdt + fdt_totalsize (fdt) - tailsize;
|
||||
newtail = (char *)buf + bufsize - tailsize;
|
||||
@ -139,19 +165,26 @@ int fdt_resize(void *fdt, void *buf, int bufsize)
|
||||
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;
|
||||
int offset;
|
||||
|
||||
FDT_SW_CHECK_HEADER (fdt);
|
||||
|
||||
if (fdt_size_dt_struct(fdt))
|
||||
if (fdt_size_dt_struct (fdt)) {
|
||||
return -FDT_ERR_BADSTATE;
|
||||
}
|
||||
|
||||
offset = fdt_off_dt_struct (fdt);
|
||||
if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
|
||||
if ((offset + sizeof (*re)) > fdt_totalsize (fdt)) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
re = (struct fdt_reserve_entry *)((char *)fdt + offset);
|
||||
re->address = cpu_to_fdt64 (addr);
|
||||
@ -162,12 +195,19 @@ int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_finish_reservemap(void *fdt)
|
||||
int
|
||||
fdt_finish_reservemap (
|
||||
void *fdt
|
||||
)
|
||||
{
|
||||
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;
|
||||
int namelen = strlen (name) + 1;
|
||||
@ -175,29 +215,38 @@ int fdt_begin_node(void *fdt, const char *name)
|
||||
FDT_SW_CHECK_HEADER (fdt);
|
||||
|
||||
nh = _fdt_grab_space (fdt, sizeof (*nh) + FDT_TAGALIGN (namelen));
|
||||
if (! nh)
|
||||
if (!nh) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
nh->tag = cpu_to_fdt32 (FDT_BEGIN_NODE);
|
||||
memcpy (nh->name, name, namelen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_end_node(void *fdt)
|
||||
int
|
||||
fdt_end_node (
|
||||
void *fdt
|
||||
)
|
||||
{
|
||||
fdt32_t *en;
|
||||
|
||||
FDT_SW_CHECK_HEADER (fdt);
|
||||
|
||||
en = _fdt_grab_space (fdt, FDT_TAGSIZE);
|
||||
if (! en)
|
||||
if (!en) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
*en = cpu_to_fdt32 (FDT_END_NODE);
|
||||
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);
|
||||
const char *p;
|
||||
@ -206,21 +255,29 @@ static int _fdt_find_add_string(void *fdt, const char *s)
|
||||
int struct_top, offset;
|
||||
|
||||
p = _fdt_find_string (strtab - strtabsize, strtabsize, s);
|
||||
if (p)
|
||||
if (p) {
|
||||
return p - strtab;
|
||||
}
|
||||
|
||||
/* Add it */
|
||||
offset = -strtabsize - len;
|
||||
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 :( */
|
||||
}
|
||||
|
||||
memcpy (strtab + offset, s, len);
|
||||
fdt_set_size_dt_strings (fdt, strtabsize + len);
|
||||
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;
|
||||
int nameoff;
|
||||
@ -228,12 +285,14 @@ int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)
|
||||
FDT_SW_CHECK_HEADER (fdt);
|
||||
|
||||
nameoff = _fdt_find_add_string (fdt, name);
|
||||
if (nameoff == 0)
|
||||
if (nameoff == 0) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
prop = _fdt_grab_space (fdt, sizeof (*prop) + FDT_TAGALIGN (len));
|
||||
if (! prop)
|
||||
if (!prop) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
prop->tag = cpu_to_fdt32 (FDT_PROP);
|
||||
prop->nameoff = cpu_to_fdt32 (nameoff);
|
||||
@ -242,19 +301,30 @@ int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)
|
||||
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;
|
||||
int ret;
|
||||
|
||||
ret = fdt_property_placeholder (fdt, name, len, &ptr);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
memcpy (ptr, val, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_finish(void *fdt)
|
||||
int
|
||||
fdt_finish (
|
||||
void *fdt
|
||||
)
|
||||
{
|
||||
char *p = (char *)fdt;
|
||||
fdt32_t *end;
|
||||
@ -266,8 +336,10 @@ int fdt_finish(void *fdt)
|
||||
|
||||
/* Add terminator */
|
||||
end = _fdt_grab_space (fdt, sizeof (*end));
|
||||
if (! end)
|
||||
if (!end) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
*end = cpu_to_fdt32 (FDT_END);
|
||||
|
||||
/* Relocate the string table */
|
||||
@ -288,10 +360,13 @@ int fdt_finish(void *fdt)
|
||||
nameoff += fdt_size_dt_strings (fdt);
|
||||
prop->nameoff = cpu_to_fdt32 (nameoff);
|
||||
}
|
||||
|
||||
offset = nextoffset;
|
||||
}
|
||||
if (nextoffset < 0)
|
||||
|
||||
if (nextoffset < 0) {
|
||||
return nextoffset;
|
||||
}
|
||||
|
||||
/* Finally, adjust the header */
|
||||
fdt_set_totalsize (fdt, newstroffset + fdt_size_dt_strings (fdt));
|
||||
|
@ -55,85 +55,135 @@
|
||||
|
||||
#include "libfdt_internal.h"
|
||||
|
||||
int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
|
||||
const char *name, int namelen,
|
||||
uint32_t idx, const void *val,
|
||||
int len)
|
||||
int
|
||||
fdt_setprop_inplace_namelen_partial (
|
||||
void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
int namelen,
|
||||
uint32_t idx,
|
||||
const void *val,
|
||||
int len
|
||||
)
|
||||
{
|
||||
void *propval;
|
||||
int proplen;
|
||||
|
||||
propval = fdt_getprop_namelen_w(fdt, nodeoffset, name, namelen,
|
||||
&proplen);
|
||||
if (!propval)
|
||||
propval = fdt_getprop_namelen_w (
|
||||
fdt,
|
||||
nodeoffset,
|
||||
name,
|
||||
namelen,
|
||||
&proplen
|
||||
);
|
||||
if (!propval) {
|
||||
return proplen;
|
||||
}
|
||||
|
||||
if (proplen < (len + idx))
|
||||
if (proplen < (len + idx)) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
memcpy ((char *)propval + idx, val, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
|
||||
const void *val, int len)
|
||||
int
|
||||
fdt_setprop_inplace (
|
||||
void *fdt,
|
||||
int nodeoffset,
|
||||
const char *name,
|
||||
const void *val,
|
||||
int len
|
||||
)
|
||||
{
|
||||
const void *propval;
|
||||
int proplen;
|
||||
|
||||
propval = fdt_getprop (fdt, nodeoffset, name, &proplen);
|
||||
if (!propval)
|
||||
if (!propval) {
|
||||
return proplen;
|
||||
|
||||
if (proplen != len)
|
||||
return -FDT_ERR_NOSPACE;
|
||||
|
||||
return fdt_setprop_inplace_namelen_partial(fdt, nodeoffset, name,
|
||||
strlen(name), 0,
|
||||
val, len);
|
||||
}
|
||||
|
||||
static void _fdt_nop_region(void *start, int len)
|
||||
if (proplen != len) {
|
||||
return -FDT_ERR_NOSPACE;
|
||||
}
|
||||
|
||||
return fdt_setprop_inplace_namelen_partial (
|
||||
fdt,
|
||||
nodeoffset,
|
||||
name,
|
||||
strlen (name),
|
||||
0,
|
||||
val,
|
||||
len
|
||||
);
|
||||
}
|
||||
|
||||
static void
|
||||
_fdt_nop_region (
|
||||
void *start,
|
||||
int len
|
||||
)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
int len;
|
||||
|
||||
prop = fdt_get_property_w (fdt, nodeoffset, name, &len);
|
||||
if (!prop)
|
||||
if (!prop) {
|
||||
return len;
|
||||
}
|
||||
|
||||
_fdt_nop_region (prop, len + sizeof (*prop));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int _fdt_node_end_offset(void *fdt, int offset)
|
||||
int
|
||||
_fdt_node_end_offset (
|
||||
void *fdt,
|
||||
int offset
|
||||
)
|
||||
{
|
||||
int depth = 0;
|
||||
|
||||
while ((offset >= 0) && (depth >= 0))
|
||||
while ((offset >= 0) && (depth >= 0)) {
|
||||
offset = fdt_next_node (fdt, offset, &depth);
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
int fdt_nop_node(void *fdt, int nodeoffset)
|
||||
int
|
||||
fdt_nop_node (
|
||||
void *fdt,
|
||||
int nodeoffset
|
||||
)
|
||||
{
|
||||
int endoffset;
|
||||
|
||||
endoffset = _fdt_node_end_offset (fdt, nodeoffset);
|
||||
if (endoffset < 0)
|
||||
if (endoffset < 0) {
|
||||
return endoffset;
|
||||
}
|
||||
|
||||
_fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0),
|
||||
endoffset - nodeoffset);
|
||||
_fdt_nop_region (
|
||||
fdt_offset_ptr_w (fdt, nodeoffset, 0),
|
||||
endoffset - nodeoffset
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
#ifndef _LIBFDT_INTERNAL_H
|
||||
#define _LIBFDT_INTERNAL_H
|
||||
|
||||
/*
|
||||
* libfdt - Flat Device Tree manipulation
|
||||
* Copyright (C) 2006 David Gibson, IBM Corporation.
|
||||
@ -62,22 +63,54 @@
|
||||
return __err; \
|
||||
}
|
||||
|
||||
int _fdt_check_node_offset(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);
|
||||
int
|
||||
_fdt_check_node_offset (
|
||||
const void *fdt,
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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 *)
|
||||
@ -85,7 +118,12 @@ static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int
|
||||
|
||||
return rsv_table + n;
|
||||
}
|
||||
static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n)
|
||||
|
||||
static inline struct fdt_reserve_entry *
|
||||
_fdt_mem_rsv_w (
|
||||
void *fdt,
|
||||
int n
|
||||
)
|
||||
{
|
||||
return (void *)(uintptr_t)_fdt_mem_rsv (fdt, n);
|
||||
}
|
||||
|
@ -16,7 +16,6 @@
|
||||
|
||||
#include <Protocol/DebugPort.h>
|
||||
|
||||
|
||||
EFI_DEBUGPORT_PROTOCOL *gDebugPort = NULL;
|
||||
UINTN gTimeOut = 0;
|
||||
|
||||
@ -47,8 +46,6 @@ GdbSerialLibDebugPortConstructor (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -83,7 +80,6 @@ GdbSerialInit (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check to see if a character is available from GDB. Do not read the character as that is
|
||||
done via GdbGetChar().
|
||||
@ -105,7 +101,6 @@ GdbIsCharAvailable (
|
||||
return (Status == EFI_SUCCESS ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get a character from GDB. This function must be able to run in interrupt context.
|
||||
|
||||
@ -130,7 +125,6 @@ GdbGetChar (
|
||||
return Char;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Send a character to GDB. This function must be able to run in interrupt context.
|
||||
|
||||
@ -138,7 +132,6 @@ GdbGetChar (
|
||||
@param Char Send a character to GDB
|
||||
|
||||
**/
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GdbPutChar (
|
||||
@ -163,7 +156,6 @@ GdbPutChar (
|
||||
@param String Send a string to GDB
|
||||
|
||||
**/
|
||||
|
||||
VOID
|
||||
GdbPutString (
|
||||
IN CHAR8 *String
|
||||
@ -175,7 +167,3 @@ GdbPutString (
|
||||
String++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
|
||||
// ---------------------------------------------
|
||||
// UART Register Offsets
|
||||
// ---------------------------------------------
|
||||
@ -40,12 +39,9 @@
|
||||
#define ENABLE_FIFO 0x01U
|
||||
#define CLEAR_FIFOS 0x06U
|
||||
|
||||
|
||||
|
||||
// IO Port Base for the UART
|
||||
UINTN gPort;
|
||||
|
||||
|
||||
/**
|
||||
The constructor function initializes the UART.
|
||||
|
||||
@ -77,8 +73,6 @@ GdbSerialLibConstructor (
|
||||
return GdbSerialInit (BaudRate, Parity, DataBits, StopBits);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -138,7 +132,6 @@ GdbSerialInit (
|
||||
IoWrite8 (gPort + BAUD_HIGH_OFFSET, (UINT8)(Divisor >> 8));
|
||||
IoWrite8 (gPort + BAUD_LOW_OFFSET, (UINT8)(Divisor & 0xff));
|
||||
|
||||
|
||||
//
|
||||
// Switch back to bank 0
|
||||
//
|
||||
@ -149,12 +142,10 @@ GdbSerialInit (
|
||||
// We probably need the FIFO enabled to not drop input
|
||||
IoWrite8 (gPort + FCR_SHADOW_OFFSET, ENABLE_FIFO);
|
||||
|
||||
|
||||
// Configure the UART hardware here
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check to see if a character is available from GDB. Do not read the character as that is
|
||||
done via GdbGetChar().
|
||||
@ -176,7 +167,6 @@ GdbIsCharAvailable (
|
||||
return ((Data & LSR_RXDA) == LSR_RXDA);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get a character from GDB. This function must be able to run in interrupt context.
|
||||
|
||||
@ -204,7 +194,6 @@ GdbGetChar (
|
||||
return Char;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Send a character to GDB. This function must be able to run in interrupt context.
|
||||
|
||||
@ -212,7 +201,6 @@ GdbGetChar (
|
||||
@param Char Send a character to GDB
|
||||
|
||||
**/
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
GdbPutChar (
|
||||
@ -239,7 +227,6 @@ GdbPutChar (
|
||||
@param String Send a string to GDB
|
||||
|
||||
**/
|
||||
|
||||
VOID
|
||||
GdbPutString (
|
||||
IN CHAR8 *String
|
||||
|
@ -29,7 +29,6 @@ typedef struct {
|
||||
BOOLEAN DoubleBuffer;
|
||||
} MAP_INFO_INSTANCE;
|
||||
|
||||
|
||||
typedef struct {
|
||||
LIST_ENTRY Link;
|
||||
VOID *HostAddress;
|
||||
@ -95,6 +94,7 @@ InternalAllocateAlignedPages (
|
||||
if (Pages == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (Alignment > EFI_PAGE_SIZE) {
|
||||
//
|
||||
// Calculate the total number of pages since alignment is larger than page
|
||||
@ -109,11 +109,16 @@ InternalAllocateAlignedPages (
|
||||
ASSERT (RealPages > Pages);
|
||||
|
||||
Memory = mDmaHostAddressLimit;
|
||||
Status = gBS->AllocatePages (AllocateMaxAddress, MemoryType, RealPages,
|
||||
&Memory);
|
||||
Status = gBS->AllocatePages (
|
||||
AllocateMaxAddress,
|
||||
MemoryType,
|
||||
RealPages,
|
||||
&Memory
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
AlignedMemory = ((UINTN)Memory + AlignmentMask) & ~AlignmentMask;
|
||||
UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN)Memory);
|
||||
if (UnalignedPages > 0) {
|
||||
@ -123,6 +128,7 @@ InternalAllocateAlignedPages (
|
||||
Status = gBS->FreePages (Memory, UnalignedPages);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
Memory = AlignedMemory + EFI_PAGES_TO_SIZE (Pages);
|
||||
UnalignedPages = RealPages - Pages - UnalignedPages;
|
||||
if (UnalignedPages > 0) {
|
||||
@ -137,13 +143,19 @@ InternalAllocateAlignedPages (
|
||||
// Do not over-allocate pages in this case.
|
||||
//
|
||||
Memory = mDmaHostAddressLimit;
|
||||
Status = gBS->AllocatePages (AllocateMaxAddress, MemoryType, Pages,
|
||||
&Memory);
|
||||
Status = gBS->AllocatePages (
|
||||
AllocateMaxAddress,
|
||||
MemoryType,
|
||||
Pages,
|
||||
&Memory
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
AlignedMemory = (UINTN)Memory;
|
||||
}
|
||||
|
||||
return (VOID *)AlignedMemory;
|
||||
}
|
||||
|
||||
@ -190,10 +202,11 @@ DmaMap (
|
||||
EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;
|
||||
UINTN AllocSize;
|
||||
|
||||
if (HostAddress == NULL ||
|
||||
NumberOfBytes == NULL ||
|
||||
DeviceAddress == NULL ||
|
||||
Mapping == NULL ) {
|
||||
if ((HostAddress == NULL) ||
|
||||
(NumberOfBytes == NULL) ||
|
||||
(DeviceAddress == NULL) ||
|
||||
(Mapping == NULL))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -210,15 +223,16 @@ DmaMap (
|
||||
}
|
||||
|
||||
if (((UINTN)HostAddress + *NumberOfBytes) > mDmaHostAddressLimit) {
|
||||
|
||||
if (Operation == MapOperationBusMasterCommonBuffer) {
|
||||
goto CommonBufferError;
|
||||
}
|
||||
|
||||
AllocSize = ALIGN_VALUE (*NumberOfBytes, mCpu->DmaBufferAlignment);
|
||||
Map->BufferAddress = InternalAllocateAlignedPages (EfiBootServicesData,
|
||||
Map->BufferAddress = InternalAllocateAlignedPages (
|
||||
EfiBootServicesData,
|
||||
EFI_SIZE_TO_PAGES (AllocSize),
|
||||
mCpu->DmaBufferAlignment);
|
||||
mCpu->DmaBufferAlignment
|
||||
);
|
||||
if (Map->BufferAddress == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto FreeMapInfo;
|
||||
@ -227,14 +241,19 @@ DmaMap (
|
||||
if (Operation == MapOperationBusMasterRead) {
|
||||
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);
|
||||
} else if (Operation != MapOperationBusMasterRead &&
|
||||
} else if ((Operation != MapOperationBusMasterRead) &&
|
||||
((((UINTN)HostAddress & (mCpu->DmaBufferAlignment - 1)) != 0) ||
|
||||
((*NumberOfBytes & (mCpu->DmaBufferAlignment - 1)) != 0))) {
|
||||
|
||||
((*NumberOfBytes & (mCpu->DmaBufferAlignment - 1)) != 0)))
|
||||
{
|
||||
// Get the cacheability of the region
|
||||
Status = gDS->GetMemorySpaceDescriptor ((UINTN)HostAddress, &GcdDescriptor);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -275,8 +294,12 @@ DmaMap (
|
||||
// prevents them from being written back unexpectedly, potentially
|
||||
// overwriting the data we receive from the device.
|
||||
//
|
||||
mCpu->FlushDataCache (mCpu, (UINTN)Buffer, *NumberOfBytes,
|
||||
EfiCpuFlushTypeWriteBack);
|
||||
mCpu->FlushDataCache (
|
||||
mCpu,
|
||||
(UINTN)Buffer,
|
||||
*NumberOfBytes,
|
||||
EfiCpuFlushTypeWriteBack
|
||||
);
|
||||
} else {
|
||||
Map->DoubleBuffer = FALSE;
|
||||
}
|
||||
@ -295,15 +318,21 @@ DmaMap (
|
||||
Status = gDS->GetMemorySpaceDescriptor ((UINTN)HostAddress, &GcdDescriptor);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
ASSERT (Operation != MapOperationBusMasterCommonBuffer ||
|
||||
(GcdDescriptor.Attributes & (EFI_MEMORY_WB | EFI_MEMORY_WT)) == 0);
|
||||
ASSERT (
|
||||
Operation != MapOperationBusMasterCommonBuffer ||
|
||||
(GcdDescriptor.Attributes & (EFI_MEMORY_WB | EFI_MEMORY_WT)) == 0
|
||||
);
|
||||
|
||||
DEBUG_CODE_END ();
|
||||
|
||||
// Flush the Data Cache (should not have any effect if the memory region is
|
||||
// uncached)
|
||||
mCpu->FlushDataCache (mCpu, (UINTN)HostAddress, *NumberOfBytes,
|
||||
EfiCpuFlushTypeWriteBackInvalidate);
|
||||
mCpu->FlushDataCache (
|
||||
mCpu,
|
||||
(UINTN)HostAddress,
|
||||
*NumberOfBytes,
|
||||
EfiCpuFlushTypeWriteBackInvalidate
|
||||
);
|
||||
}
|
||||
|
||||
Map->HostAddress = (UINTN)HostAddress;
|
||||
@ -315,10 +344,13 @@ DmaMap (
|
||||
return EFI_SUCCESS;
|
||||
|
||||
CommonBufferError:
|
||||
DEBUG ((DEBUG_ERROR,
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: Operation type 'MapOperationBusMasterCommonBuffer' is only "
|
||||
"supported\non memory regions that were allocated using "
|
||||
"DmaAllocateBuffer ()\n", __FUNCTION__));
|
||||
"DmaAllocateBuffer ()\n",
|
||||
__FUNCTION__
|
||||
));
|
||||
Status = EFI_UNSUPPORTED;
|
||||
FreeMapInfo:
|
||||
FreePool (Map);
|
||||
@ -326,7 +358,6 @@ FreeMapInfo:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or
|
||||
DmaMapBusMasterCommonBuffer() operation and releases any corresponding
|
||||
@ -363,14 +394,21 @@ DmaUnmap (
|
||||
if (((UINTN)Map->HostAddress + Map->NumberOfBytes) > mDmaHostAddressLimit) {
|
||||
AllocSize = ALIGN_VALUE (Map->NumberOfBytes, mCpu->DmaBufferAlignment);
|
||||
if (Map->Operation == MapOperationBusMasterWrite) {
|
||||
mCpu->FlushDataCache (mCpu, (UINTN)Map->BufferAddress, AllocSize,
|
||||
EfiCpuFlushTypeInvalidate);
|
||||
CopyMem ((VOID *)(UINTN)Map->HostAddress, Map->BufferAddress,
|
||||
Map->NumberOfBytes);
|
||||
mCpu->FlushDataCache (
|
||||
mCpu,
|
||||
(UINTN)Map->BufferAddress,
|
||||
AllocSize,
|
||||
EfiCpuFlushTypeInvalidate
|
||||
);
|
||||
CopyMem (
|
||||
(VOID *)(UINTN)Map->HostAddress,
|
||||
Map->BufferAddress,
|
||||
Map->NumberOfBytes
|
||||
);
|
||||
}
|
||||
|
||||
FreePages (Map->BufferAddress, EFI_SIZE_TO_PAGES (AllocSize));
|
||||
} else if (Map->DoubleBuffer) {
|
||||
|
||||
ASSERT (Map->Operation == MapOperationBusMasterWrite);
|
||||
|
||||
if (Map->Operation != MapOperationBusMasterWrite) {
|
||||
@ -378,8 +416,12 @@ DmaUnmap (
|
||||
} else {
|
||||
Buffer = ALIGN_POINTER (Map->BufferAddress, mCpu->DmaBufferAlignment);
|
||||
|
||||
mCpu->FlushDataCache (mCpu, (UINTN)Buffer, Map->NumberOfBytes,
|
||||
EfiCpuFlushTypeInvalidate);
|
||||
mCpu->FlushDataCache (
|
||||
mCpu,
|
||||
(UINTN)Buffer,
|
||||
Map->NumberOfBytes,
|
||||
EfiCpuFlushTypeInvalidate
|
||||
);
|
||||
|
||||
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
|
||||
//
|
||||
mCpu->FlushDataCache (mCpu, Map->HostAddress, Map->NumberOfBytes,
|
||||
EfiCpuFlushTypeInvalidate);
|
||||
mCpu->FlushDataCache (
|
||||
mCpu,
|
||||
Map->HostAddress,
|
||||
Map->NumberOfBytes,
|
||||
EfiCpuFlushTypeInvalidate
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -462,13 +508,15 @@ DmaAllocateAlignedBuffer (
|
||||
Alignment = EFI_PAGE_SIZE;
|
||||
}
|
||||
|
||||
if (HostAddress == NULL ||
|
||||
(Alignment & (Alignment - 1)) != 0) {
|
||||
if ((HostAddress == NULL) ||
|
||||
((Alignment & (Alignment - 1)) != 0))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (MemoryType == EfiBootServicesData ||
|
||||
MemoryType == EfiRuntimeServicesData) {
|
||||
if ((MemoryType == EfiBootServicesData) ||
|
||||
(MemoryType == EfiRuntimeServicesData))
|
||||
{
|
||||
Allocation = InternalAllocateAlignedPages (MemoryType, Pages, Alignment);
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -506,17 +554,21 @@ DmaAllocateAlignedBuffer (
|
||||
InsertHeadList (&UncachedAllocationList, &Alloc->Link);
|
||||
|
||||
// Remap the region with the new attributes
|
||||
Status = gDS->SetMemorySpaceAttributes ((PHYSICAL_ADDRESS)(UINTN)Allocation,
|
||||
Status = gDS->SetMemorySpaceAttributes (
|
||||
(PHYSICAL_ADDRESS)(UINTN)Allocation,
|
||||
EFI_PAGES_TO_SIZE (Pages),
|
||||
MemType);
|
||||
MemType
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto FreeAlloc;
|
||||
}
|
||||
|
||||
Status = mCpu->FlushDataCache (mCpu,
|
||||
Status = mCpu->FlushDataCache (
|
||||
mCpu,
|
||||
(PHYSICAL_ADDRESS)(UINTN)Allocation,
|
||||
EFI_PAGES_TO_SIZE (Pages),
|
||||
EfiCpuFlushTypeInvalidate);
|
||||
EfiCpuFlushTypeInvalidate
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto FreeAlloc;
|
||||
}
|
||||
@ -534,7 +586,6 @@ FreeBuffer:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Frees memory that was allocated with DmaAllocateBuffer().
|
||||
|
||||
@ -566,10 +617,10 @@ DmaFreeBuffer (
|
||||
|
||||
for (Link = GetFirstNode (&UncachedAllocationList), Found = FALSE;
|
||||
!IsNull (&UncachedAllocationList, Link);
|
||||
Link = GetNextNode (&UncachedAllocationList, Link)) {
|
||||
|
||||
Link = GetNextNode (&UncachedAllocationList, Link))
|
||||
{
|
||||
Alloc = BASE_CR (Link, UNCACHED_ALLOCATION, Link);
|
||||
if (Alloc->HostAddress == HostAddress && Alloc->NumPages == Pages) {
|
||||
if ((Alloc->HostAddress == HostAddress) && (Alloc->NumPages == Pages)) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
@ -582,9 +633,11 @@ DmaFreeBuffer (
|
||||
|
||||
RemoveEntryList (&Alloc->Link);
|
||||
|
||||
Status = gDS->SetMemorySpaceAttributes ((PHYSICAL_ADDRESS)(UINTN)HostAddress,
|
||||
Status = gDS->SetMemorySpaceAttributes (
|
||||
(PHYSICAL_ADDRESS)(UINTN)HostAddress,
|
||||
EFI_PAGES_TO_SIZE (Pages),
|
||||
Alloc->Attributes);
|
||||
Alloc->Attributes
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto FreeAlloc;
|
||||
}
|
||||
@ -600,7 +653,6 @@ FreeAlloc:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NonCoherentDmaLibConstructor (
|
||||
|
@ -183,6 +183,7 @@ NorFlashGetInfo (
|
||||
} else {
|
||||
*FlashInfo = AllocateCopyPool (sizeof (NOR_FLASH_INFO), TmpInfo);
|
||||
}
|
||||
|
||||
if (FlashInfo == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@ -211,10 +212,12 @@ NorFlashPrintInfo (
|
||||
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",
|
||||
Info->Name,
|
||||
Info->PageSize,
|
||||
EraseSize / 1024,
|
||||
(Info->SectorSize * Info->SectorCount) / 1024 / 1024));
|
||||
(Info->SectorSize * Info->SectorCount) / 1024 / 1024
|
||||
));
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ ExtractGuidedSectionRegisterHandlers (
|
||||
{
|
||||
PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;
|
||||
UINT32 Index;
|
||||
|
||||
//
|
||||
// Check input parameter.
|
||||
//
|
||||
|
@ -44,8 +44,6 @@ GetHobList (
|
||||
return PrePeiGetHobList ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Updates the pointer to the HOB list.
|
||||
|
||||
@ -177,7 +175,6 @@ BuildFvHobs (
|
||||
IN EFI_RESOURCE_ATTRIBUTE_TYPE *ResourceAttribute
|
||||
)
|
||||
{
|
||||
|
||||
EFI_RESOURCE_ATTRIBUTE_TYPE Resource;
|
||||
|
||||
BuildFvHob (PhysicalStart, NumberOfBytes);
|
||||
@ -229,13 +226,13 @@ GetNextHob (
|
||||
if (Hob.Header->HobType == Type) {
|
||||
return Hob.Raw;
|
||||
}
|
||||
|
||||
Hob.Raw = GET_NEXT_HOB (Hob);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Returns the first instance of a HOB type among the whole HOB list.
|
||||
|
||||
@ -259,7 +256,6 @@ GetFirstHob (
|
||||
return GetNextHob (Type, HobList);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function searches the first instance of a HOB from the starting HOB pointer.
|
||||
Such HOB should satisfy two conditions:
|
||||
@ -284,7 +280,8 @@ EFIAPI
|
||||
GetNextGuidHob (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN CONST VOID *HobStart
|
||||
){
|
||||
)
|
||||
{
|
||||
EFI_PEI_HOB_POINTERS GuidHob;
|
||||
|
||||
GuidHob.Raw = (UINT8 *)HobStart;
|
||||
@ -292,12 +289,13 @@ GetNextGuidHob (
|
||||
if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
|
||||
break;
|
||||
}
|
||||
|
||||
GuidHob.Raw = GET_NEXT_HOB (GuidHob);
|
||||
}
|
||||
|
||||
return GuidHob.Raw;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function searches the first instance of a HOB among the whole HOB list.
|
||||
Such HOB should satisfy two conditions:
|
||||
@ -324,7 +322,6 @@ GetFirstGuidHob (
|
||||
return GetNextGuidHob (Guid, HobList);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get the Boot Mode from the HOB list.
|
||||
|
||||
@ -348,7 +345,6 @@ GetBootMode (
|
||||
return Hob.HandoffInformationTable->BootMode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get the Boot Mode from the HOB list.
|
||||
|
||||
@ -399,8 +395,10 @@ BuildModuleHob (
|
||||
{
|
||||
EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob;
|
||||
|
||||
ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&
|
||||
((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0));
|
||||
ASSERT (
|
||||
((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));
|
||||
|
||||
@ -455,7 +453,6 @@ BuildGuidHob (
|
||||
return Hob + 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Copies a data buffer to a newly-built HOB.
|
||||
|
||||
@ -493,7 +490,6 @@ BuildGuidDataHob (
|
||||
return CopyMem (HobData, Data, DataLength);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Builds a Firmware Volume HOB.
|
||||
|
||||
@ -521,7 +517,6 @@ BuildFvHob (
|
||||
Hob->Length = Length;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Builds a EFI_HOB_TYPE_FV2 HOB.
|
||||
|
||||
@ -622,7 +617,6 @@ BuildCvHob (
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Builds a HOB for the CPU.
|
||||
|
||||
@ -655,7 +649,6 @@ BuildCpuHob (
|
||||
ZeroMem (Hob->Reserved, sizeof (Hob->Reserved));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Builds a HOB for the Stack.
|
||||
|
||||
@ -677,8 +670,10 @@ BuildStackHob (
|
||||
{
|
||||
EFI_HOB_MEMORY_ALLOCATION_STACK *Hob;
|
||||
|
||||
ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
|
||||
((Length & (EFI_PAGE_SIZE - 1)) == 0));
|
||||
ASSERT (
|
||||
((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));
|
||||
|
||||
@ -693,7 +688,6 @@ BuildStackHob (
|
||||
ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Update the Stack Hob if the stack has been moved
|
||||
|
||||
@ -728,12 +722,11 @@ UpdateStackHob (
|
||||
Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength = Length;
|
||||
break;
|
||||
}
|
||||
|
||||
Hob.Raw = GET_NEXT_HOB (Hob);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Builds a HOB for the memory allocation.
|
||||
|
||||
@ -757,8 +750,10 @@ BuildMemoryAllocationHob (
|
||||
{
|
||||
EFI_HOB_MEMORY_ALLOCATION *Hob;
|
||||
|
||||
ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
|
||||
((Length & (EFI_PAGE_SIZE - 1)) == 0));
|
||||
ASSERT (
|
||||
((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
|
||||
((Length & (EFI_PAGE_SIZE - 1)) == 0)
|
||||
);
|
||||
|
||||
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));
|
||||
|
||||
@ -772,8 +767,6 @@ BuildMemoryAllocationHob (
|
||||
ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
BuildExtractSectionHob (
|
||||
@ -798,8 +791,6 @@ PE_COFF_LOADER_PROTOCOL gPeCoffProtocol = {
|
||||
PeCoffLoaderUnloadImage
|
||||
};
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
BuildPeCoffLoaderHob (
|
||||
@ -843,6 +834,5 @@ BuildMemoryTypeInformationHob (
|
||||
Info[9].Type = EfiMaxMemoryType;
|
||||
Info[9].NumberOfPages = 0;
|
||||
|
||||
|
||||
BuildGuidDataHob (&gEfiMemoryTypeInformationGuid, &Info, sizeof (Info));
|
||||
}
|
||||
|
@ -12,11 +12,9 @@
|
||||
#include <PrePi.h>
|
||||
#include <Library/ExtractGuidedSectionLib.h>
|
||||
|
||||
|
||||
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
|
||||
(ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
|
||||
|
||||
|
||||
/**
|
||||
Returns the highest bit set of the State field
|
||||
|
||||
@ -52,7 +50,6 @@ GetFileState(
|
||||
return HighestBit;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Calculates the checksum of the header of a file.
|
||||
The header is a zero byte checksum, so zero means header is good
|
||||
@ -98,7 +95,6 @@ CalculateHeaderChecksum (
|
||||
return Sum;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Given a FileHandle return the VolumeHandle
|
||||
|
||||
@ -129,7 +125,8 @@ FileHandleToVolume (
|
||||
if (Hob.Raw != NULL) {
|
||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)(Hob.FirmwareVolume->BaseAddress);
|
||||
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;
|
||||
return TRUE;
|
||||
}
|
||||
@ -141,8 +138,6 @@ FileHandleToVolume (
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -216,7 +211,6 @@ FindFileEx (
|
||||
FileState = GetFileState (ErasePolarity, FfsFileHeader);
|
||||
|
||||
switch (FileState) {
|
||||
|
||||
case EFI_FILE_HEADER_INVALID:
|
||||
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
|
||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
|
||||
@ -239,7 +233,8 @@ FindFileEx (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
} else if (((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) &&
|
||||
(FfsFileHeader->Type != EFI_FV_FILETYPE_FFS_PAD)) {
|
||||
(FfsFileHeader->Type != EFI_FV_FILETYPE_FFS_PAD))
|
||||
{
|
||||
*FileHeader = FfsFileHeader;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -261,12 +256,10 @@ FindFileEx (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
*FileHeader = NULL;
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Go through the file to search SectionType section,
|
||||
when meeting an encapsuled section.
|
||||
@ -300,7 +293,6 @@ FfsProcessSection (
|
||||
CHAR8 *CompressedData;
|
||||
UINTN CompressedDataLength;
|
||||
|
||||
|
||||
*OutputBuffer = NULL;
|
||||
ParsedLength = 0;
|
||||
Status = EFI_NOT_FOUND;
|
||||
@ -318,7 +310,6 @@ FfsProcessSection (
|
||||
|
||||
return EFI_SUCCESS;
|
||||
} else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) {
|
||||
|
||||
if (Section->Type == EFI_SECTION_COMPRESSION) {
|
||||
if (IS_SECTION2 (Section)) {
|
||||
CompressionSection2 = (EFI_COMPRESSION_SECTION2 *)Section;
|
||||
@ -364,6 +355,7 @@ FfsProcessSection (
|
||||
DEBUG ((DEBUG_ERROR, "Decompress GetInfo Failed - %r\n", Status));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate scratch buffer
|
||||
//
|
||||
@ -371,6 +363,7 @@ FfsProcessSection (
|
||||
if (ScratchBuffer == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate destination buffer, extra one page for adjustment
|
||||
//
|
||||
@ -378,22 +371,24 @@ FfsProcessSection (
|
||||
if (DstBuffer == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// DstBuffer still is one section. Adjust DstBuffer offset, skip EFI section header
|
||||
// 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);
|
||||
else
|
||||
} else {
|
||||
DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER);
|
||||
}
|
||||
|
||||
//
|
||||
// Call decompress function
|
||||
//
|
||||
if (Section->Type == EFI_SECTION_COMPRESSION) {
|
||||
if (IS_SECTION2 (Section)) {
|
||||
CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION2 *)Section + 1);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION *)Section + 1);
|
||||
}
|
||||
|
||||
@ -432,6 +427,7 @@ FfsProcessSection (
|
||||
} else {
|
||||
SectionLength = SECTION_SIZE (Section);
|
||||
}
|
||||
|
||||
//
|
||||
// SectionLength is adjusted it is 4 byte aligned.
|
||||
// Go to the next section
|
||||
@ -445,8 +441,6 @@ FfsProcessSection (
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
This service enables discovery sections of a given type within a valid FFS file.
|
||||
|
||||
@ -490,11 +484,6 @@ FfsFindSectionData (
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
This service enables discovery of additional firmware files.
|
||||
|
||||
@ -519,7 +508,6 @@ FfsFindNextFile (
|
||||
return FindFileEx (VolumeHandle, NULL, SearchType, FileHandle);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This service enables discovery of additional firmware volumes.
|
||||
|
||||
@ -540,7 +528,6 @@ FfsFindNextVolume (
|
||||
{
|
||||
EFI_PEI_HOB_POINTERS Hob;
|
||||
|
||||
|
||||
Hob.Raw = GetHobList ();
|
||||
if (Hob.Raw == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
@ -559,10 +546,8 @@ FfsFindNextVolume (
|
||||
} while (Hob.Raw != NULL);
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Find a file in the volume by name
|
||||
|
||||
@ -590,19 +575,19 @@ FfsFindFileByName (
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
if ((VolumeHandle == NULL) || (FileName == NULL) || (FileHandle == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = FindFileEx (VolumeHandle, FileName, 0, FileHandle);
|
||||
if (Status == EFI_NOT_FOUND) {
|
||||
*FileHandle = NULL;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Get information about the file by name.
|
||||
|
||||
@ -671,7 +656,6 @@ FfsGetFileInfo (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get Information about the volume by name
|
||||
|
||||
@ -714,6 +698,7 @@ FfsGetVolumeInfo (
|
||||
if (FwVolHeader.Signature != EFI_FVH_SIGNATURE) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
VolumeInfo->FvAttributes = FwVolHeader.Attributes;
|
||||
VolumeInfo->FvStart = (VOID *)VolumeHandle;
|
||||
VolumeInfo->FvSize = FwVolHeader.FvLength;
|
||||
@ -723,11 +708,10 @@ FfsGetVolumeInfo (
|
||||
FwVolExHeaderInfo = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(((UINT8 *)VolumeHandle) + FwVolHeader.ExtHeaderOffset);
|
||||
CopyMem (&VolumeInfo->FvName, &FwVolExHeaderInfo->FvName, sizeof (EFI_GUID));
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Search through every FV until you find a file of type FileType
|
||||
|
||||
@ -756,17 +740,14 @@ FfsAnyFvFindFirstFile (
|
||||
Instance = 0;
|
||||
*FileHandle = NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
while (1) {
|
||||
Status = FfsFindNextVolume (Instance++, VolumeHandle);
|
||||
if (EFI_ERROR (Status))
|
||||
{
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
|
||||
Status = FfsFindNextFile (FileType, *VolumeHandle, FileHandle);
|
||||
if (!EFI_ERROR (Status))
|
||||
{
|
||||
if (!EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -774,8 +755,6 @@ FfsAnyFvFindFirstFile (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Get Fv image from the FV type file, then add FV & FV2 Hob.
|
||||
|
||||
@ -801,7 +780,6 @@ FfsProcessFvFile (
|
||||
|
||||
FvBuffer = NULL;
|
||||
|
||||
|
||||
//
|
||||
// Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already
|
||||
// been extracted.
|
||||
@ -814,6 +792,7 @@ FfsProcessFvFile (
|
||||
//
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
HobFv2.Raw = GET_NEXT_HOB (HobFv2);
|
||||
}
|
||||
|
||||
@ -848,6 +827,7 @@ FfsProcessFvFile (
|
||||
if (FvBuffer == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
CopyMem (FvBuffer, FvImageInfo.FvStart, (UINTN)FvImageInfo.FvSize);
|
||||
//
|
||||
// Update FvImageInfo after reload FvImage to new aligned memory
|
||||
@ -855,7 +835,6 @@ FfsProcessFvFile (
|
||||
FfsGetVolumeInfo ((EFI_PEI_FV_HANDLE)FvBuffer, &FvImageInfo);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Inform HOB consumer phase, i.e. DXE core, the existence of this FV
|
||||
//
|
||||
|
@ -26,7 +26,6 @@
|
||||
|
||||
#include <Guid/MemoryAllocationHob.h>
|
||||
|
||||
|
||||
#define GET_HOB_TYPE(Hob) ((Hob).Header->HobType)
|
||||
#define GET_HOB_LENGTH(Hob) ((Hob).Header->HobLength)
|
||||
#define GET_NEXT_HOB(Hob) ((Hob).Raw + GET_HOB_LENGTH (Hob))
|
||||
|
@ -44,6 +44,7 @@ AllocateCodePages (
|
||||
Hob.MemoryAllocation->AllocDescriptor.MemoryType = EfiBootServicesCode;
|
||||
return Alloc;
|
||||
}
|
||||
|
||||
Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, GET_NEXT_HOB (Hob));
|
||||
}
|
||||
|
||||
@ -53,7 +54,6 @@ AllocateCodePages (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LoadPeCoffImage (
|
||||
@ -75,14 +75,12 @@ LoadPeCoffImage (
|
||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
//
|
||||
// Allocate Memory for the image
|
||||
//
|
||||
Buffer = AllocateCodePages (EFI_SIZE_TO_PAGES ((UINT32)ImageContext.ImageSize));
|
||||
ASSERT (Buffer != 0);
|
||||
|
||||
|
||||
ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;
|
||||
|
||||
//
|
||||
@ -97,7 +95,6 @@ LoadPeCoffImage (
|
||||
Status = PeCoffLoaderRelocateImage (&ImageContext);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
*ImageAddress = ImageContext.ImageAddress;
|
||||
*ImageSize = ImageContext.ImageSize;
|
||||
*EntryPoint = ImageContext.EntryPoint;
|
||||
@ -111,8 +108,6 @@ LoadPeCoffImage (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
typedef
|
||||
VOID
|
||||
(EFIAPI *DXE_CORE_ENTRY_POINT)(
|
||||
@ -141,7 +136,6 @@ LoadDxeCoreFromFfsFile (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
Status = LoadPeCoffImage (PeCoffImage, &ImageAddress, &ImageSize, &EntryPoint);
|
||||
// For NT32 Debug Status = SecWinNtPeiLoadFile (PeCoffImage, &ImageAddress, &ImageSize, &EntryPoint);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
@ -162,7 +156,6 @@ LoadDxeCoreFromFfsFile (
|
||||
|
||||
((DXE_CORE_ENTRY_POINT)(UINTN)EntryPoint)(Hob);
|
||||
} else {
|
||||
|
||||
//
|
||||
// Allocate 128KB for the Stack
|
||||
//
|
||||
@ -187,7 +180,6 @@ LoadDxeCoreFromFfsFile (
|
||||
NULL,
|
||||
TopOfStack
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
// Should never get here as DXE Core does not return
|
||||
@ -197,8 +189,6 @@ LoadDxeCoreFromFfsFile (
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LoadDxeCoreFromFv (
|
||||
@ -229,7 +219,6 @@ LoadDxeCoreFromFv (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
DecompressFirstFv (
|
||||
|
@ -14,8 +14,6 @@
|
||||
#include <Library/PrePiLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of type EfiBootServicesData.
|
||||
|
||||
@ -73,7 +71,6 @@ AllocatePages (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
@ -108,6 +105,7 @@ AllocateAlignedPages (
|
||||
if (Pages == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
|
||||
//
|
||||
@ -121,10 +119,10 @@ AllocateAlignedPages (
|
||||
} else {
|
||||
AlignmentMask = Alignment - 1;
|
||||
}
|
||||
|
||||
return (VOID *)(UINTN)(((UINTN)Memory + AlignmentMask) & ~AlignmentMask);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Frees one or more 4KB pages that were previously allocated with one of the page allocation
|
||||
functions in the Memory Allocation Library.
|
||||
@ -175,7 +173,6 @@ AllocatePool (
|
||||
|
||||
Hob = GetHobList ();
|
||||
|
||||
|
||||
//
|
||||
// Verify that there is sufficient memory to satisfy the allocation
|
||||
//
|
||||
@ -183,10 +180,11 @@ AllocatePool (
|
||||
// Please call AllocatePages for big allocations
|
||||
return 0;
|
||||
} else {
|
||||
|
||||
Hob = (EFI_HOB_MEMORY_POOL *)CreateHob (EFI_HOB_TYPE_MEMORY_POOL,
|
||||
Hob = (EFI_HOB_MEMORY_POOL *)CreateHob (
|
||||
EFI_HOB_TYPE_MEMORY_POOL,
|
||||
(UINT16)(sizeof (EFI_HOB_MEMORY_POOL) +
|
||||
AllocationSize));
|
||||
AllocationSize)
|
||||
);
|
||||
return (VOID *)(Hob + 1);
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/RealTimeClockLib.h>
|
||||
|
||||
|
||||
/**
|
||||
Returns the current time and date information, and the time-keeping capabilities
|
||||
of the hardware platform.
|
||||
@ -42,7 +41,6 @@ LibGetTime (
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Sets the current local time and date information.
|
||||
|
||||
@ -65,7 +63,6 @@ LibSetTime (
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns the current wakeup alarm clock setting.
|
||||
|
||||
@ -90,7 +87,6 @@ LibGetWakeupTime (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Sets the system wakeup alarm clock time.
|
||||
|
||||
@ -115,8 +111,6 @@ LibSetWakeupTime (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
@ -140,7 +134,6 @@ LibRtcInitialize (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Fixup internal data so that EFI can be call in virtual mode.
|
||||
Call the passed in Child Notify event and convert any pointers in
|
||||
@ -164,6 +157,3 @@ LibRtcVirtualNotifyEvent (
|
||||
//
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -10,14 +10,12 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/EfiResetSystemLib.h>
|
||||
|
||||
|
||||
/**
|
||||
Resets the entire platform.
|
||||
|
||||
@ -41,7 +39,6 @@ LibResetSystem (
|
||||
UINTN Address;
|
||||
UINT8 Data;
|
||||
|
||||
|
||||
switch (ResetType) {
|
||||
case EfiResetCold:
|
||||
// system power cycle
|
||||
@ -74,8 +71,6 @@ LibResetSystem (
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Initialize any infrastructure required for LibResetSystem () to function.
|
||||
|
||||
@ -94,4 +89,3 @@ LibInitializeResetSystem (
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -72,7 +72,6 @@ EpochToEfiTime (
|
||||
Time->Minute = (UINT8)mm;
|
||||
Time->Second = (UINT8)ss;
|
||||
Time->Nanosecond = 0;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -200,10 +199,11 @@ IsDayValid (
|
||||
{
|
||||
STATIC CONST INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||
|
||||
if (Time->Day < 1 ||
|
||||
Time->Day > DayOfMonth[Time->Month - 1] ||
|
||||
(Time->Month == 2 && (!IsLeapYear (Time) && Time->Day > 28))
|
||||
) {
|
||||
if ((Time->Day < 1) ||
|
||||
(Time->Day > DayOfMonth[Time->Month - 1]) ||
|
||||
((Time->Month == 2) && (!IsLeapYear (Time) && (Time->Day > 28)))
|
||||
)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -281,7 +281,8 @@ IsTimeValid (
|
||||
(Time->Second > 59) ||
|
||||
(Time->Nanosecond > 999999999) ||
|
||||
(!IsValidTimeZone (Time->TimeZone)) ||
|
||||
(!IsValidDaylight(Time->Daylight))) {
|
||||
(!IsValidDaylight (Time->Daylight)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -101,6 +101,7 @@ LibGetTime (
|
||||
&EpochSeconds
|
||||
);
|
||||
}
|
||||
|
||||
Counter = GetPerformanceCounter ();
|
||||
EpochSeconds += DivU64x64Remainder (Counter, Freq, &Remainder);
|
||||
|
||||
@ -147,7 +148,8 @@ LibGetTime (
|
||||
|
||||
// Check TimeZone bounds: -1440 to 1440 or 2047
|
||||
if ( ((Time->TimeZone < -1440) || (Time->TimeZone > 1440))
|
||||
&& (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE)) {
|
||||
&& (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE))
|
||||
{
|
||||
Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE;
|
||||
}
|
||||
|
||||
@ -254,13 +256,15 @@ LibSetTime (
|
||||
|
||||
// Adjust for the correct time zone, i.e. convert to UTC time zone
|
||||
if ( (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE)
|
||||
&& (EpochSeconds > Time->TimeZone * SEC_PER_MIN)) {
|
||||
&& (EpochSeconds > Time->TimeZone * SEC_PER_MIN))
|
||||
{
|
||||
EpochSeconds -= Time->TimeZone * SEC_PER_MIN;
|
||||
}
|
||||
|
||||
// Adjust for the correct period
|
||||
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
|
||||
EpochSeconds -= SEC_PER_HOUR;
|
||||
}
|
||||
|
@ -54,7 +54,6 @@ EFI_METRONOME_ARCH_PROTOCOL gMetronome = {
|
||||
FixedPcdGet32 (PcdMetronomeTickPeriod)
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
The WaitForTick() function waits for the number of ticks specified by
|
||||
TickNumber from a known time source in the platform. If TickNumber of
|
||||
@ -93,11 +92,8 @@ WaitForTick (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_HANDLE gMetronomeHandle = NULL;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Initialize the state information for the CPU Architectural Protocol
|
||||
|
||||
@ -124,11 +120,11 @@ MetronomeInitialize (
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&gMetronomeHandle,
|
||||
&gEfiMetronomeArchProtocolGuid, &gMetronome,
|
||||
&gEfiMetronomeArchProtocolGuid,
|
||||
&gMetronome,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -67,8 +67,6 @@ GetTime (
|
||||
return LibGetTime (Time, Capabilities);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Sets the current local time and date information.
|
||||
|
||||
@ -88,14 +86,14 @@ SetTime (
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN TimeSettingsChanged;
|
||||
|
||||
if (Time == NULL || !IsTimeValid (Time)) {
|
||||
if ((Time == NULL) || !IsTimeValid (Time)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
TimeSettingsChanged = FALSE;
|
||||
if (mTimeSettings.TimeZone != Time->TimeZone ||
|
||||
mTimeSettings.Daylight != Time->Daylight) {
|
||||
|
||||
if ((mTimeSettings.TimeZone != Time->TimeZone) ||
|
||||
(mTimeSettings.Daylight != Time->Daylight))
|
||||
{
|
||||
mTimeSettings.TimeZone = Time->TimeZone;
|
||||
mTimeSettings.Daylight = Time->Daylight;
|
||||
TimeSettingsChanged = TRUE;
|
||||
@ -114,15 +112,16 @@ SetTime (
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof (mTimeSettings),
|
||||
(VOID *)&mTimeSettings);
|
||||
(VOID *)&mTimeSettings
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns the current wakeup alarm clock setting.
|
||||
|
||||
@ -143,7 +142,7 @@ GetWakeupTime (
|
||||
OUT EFI_TIME *Time
|
||||
)
|
||||
{
|
||||
if (Time == NULL || Enabled == NULL || Pending == NULL) {
|
||||
if ((Time == NULL) || (Enabled == NULL) || (Pending == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -157,7 +156,6 @@ GetWakeupTime (
|
||||
return LibGetWakeupTime (Enabled, Pending, Time);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Sets the system wakeup alarm clock time.
|
||||
|
||||
@ -181,8 +179,6 @@ SetWakeupTime (
|
||||
return LibSetWakeupTime (Enabled, Time);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
@ -209,13 +205,22 @@ InitializeRealTimeClock (
|
||||
}
|
||||
|
||||
Size = sizeof (mTimeSettings);
|
||||
Status = EfiGetVariable ((CHAR16 *)mTimeSettingsVariableName,
|
||||
&gEfiCallerIdGuid, NULL, &Size, (VOID *)&mTimeSettings);
|
||||
Status = EfiGetVariable (
|
||||
(CHAR16 *)mTimeSettingsVariableName,
|
||||
&gEfiCallerIdGuid,
|
||||
NULL,
|
||||
&Size,
|
||||
(VOID *)&mTimeSettings
|
||||
);
|
||||
if (EFI_ERROR (Status) ||
|
||||
!IsValidTimeZone (mTimeSettings.TimeZone) ||
|
||||
!IsValidDaylight (mTimeSettings.Daylight)) {
|
||||
DEBUG ((DEBUG_WARN, "%a: using default timezone/daylight settings\n",
|
||||
__FUNCTION__));
|
||||
!IsValidDaylight (mTimeSettings.Daylight))
|
||||
{
|
||||
DEBUG ((
|
||||
DEBUG_WARN,
|
||||
"%a: using default timezone/daylight settings\n",
|
||||
__FUNCTION__
|
||||
));
|
||||
|
||||
mTimeSettings.TimeZone = EFI_UNSPECIFIED_TIMEZONE;
|
||||
mTimeSettings.Daylight = 0;
|
||||
@ -235,4 +240,3 @@ InitializeRealTimeClock (
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/EfiResetSystemLib.h>
|
||||
|
||||
|
||||
/**
|
||||
Resets the entire platform.
|
||||
|
||||
@ -38,8 +37,6 @@ ResetSystemViaLib (
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeReset (
|
||||
@ -65,4 +62,3 @@ InitializeReset (
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -65,11 +65,9 @@
|
||||
#include <Protocol/SimpleTextOut.h>
|
||||
#include <Protocol/DevicePath.h>
|
||||
|
||||
|
||||
#define MODE0_COLUMN_COUNT 80
|
||||
#define MODE0_ROW_COUNT 25
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TextInReset (
|
||||
@ -77,7 +75,6 @@ TextInReset(
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ReadKeyStroke (
|
||||
@ -85,7 +82,6 @@ ReadKeyStroke(
|
||||
OUT EFI_INPUT_KEY *Key
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TextOutReset (
|
||||
@ -107,7 +103,6 @@ OutputString (
|
||||
IN CHAR16 *String
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TestString (
|
||||
@ -115,7 +110,6 @@ TestString (
|
||||
IN CHAR16 *String
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
QueryMode (
|
||||
@ -125,7 +119,6 @@ QueryMode (
|
||||
OUT UINTN *Rows
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetMode (
|
||||
@ -133,7 +126,6 @@ SetMode(
|
||||
IN UINTN ModeNumber
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetAttribute (
|
||||
@ -141,14 +133,12 @@ SetAttribute(
|
||||
IN UINTN Attribute
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ClearScreen (
|
||||
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetCursorPosition (
|
||||
@ -157,7 +147,6 @@ SetCursorPosition (
|
||||
IN UINTN Row
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EnableCursor (
|
||||
@ -165,7 +154,6 @@ EnableCursor (
|
||||
IN BOOLEAN Enable
|
||||
);
|
||||
|
||||
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL mSimpleTextIn = {
|
||||
TextInReset,
|
||||
ReadKeyStroke,
|
||||
@ -204,23 +192,23 @@ typedef struct {
|
||||
|
||||
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
|
||||
},
|
||||
{
|
||||
{ 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
|
||||
FixedPcdGet8 (PcdUartDefaultDataBits), // DataBits
|
||||
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
|
||||
TextOutIsValidAscii (
|
||||
IN CHAR16 Ascii
|
||||
@ -236,7 +224,6 @@ TextOutIsValidAscii (
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
TextOutIsValidEfiCntlChar (
|
||||
IN CHAR16 Char
|
||||
@ -245,18 +232,18 @@ TextOutIsValidEfiCntlChar (
|
||||
//
|
||||
// only support four control characters.
|
||||
//
|
||||
if (Char == CHAR_NULL ||
|
||||
Char == CHAR_BACKSPACE ||
|
||||
Char == CHAR_LINEFEED ||
|
||||
Char == CHAR_CARRIAGE_RETURN ||
|
||||
Char == CHAR_TAB ) {
|
||||
if ((Char == CHAR_NULL) ||
|
||||
(Char == CHAR_BACKSPACE) ||
|
||||
(Char == CHAR_LINEFEED) ||
|
||||
(Char == CHAR_CARRIAGE_RETURN) ||
|
||||
(Char == CHAR_TAB))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
WaitForKeyEvent (
|
||||
@ -269,7 +256,6 @@ WaitForKeyEvent (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TextInReset (
|
||||
@ -280,7 +266,6 @@ TextInReset (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ReadKeyStroke (
|
||||
@ -416,7 +401,8 @@ ReadKeyStroke (
|
||||
if ((Char == CHAR_BACKSPACE) ||
|
||||
(Char == CHAR_TAB) ||
|
||||
(Char == CHAR_LINEFEED) ||
|
||||
(Char == CHAR_CARRIAGE_RETURN)) {
|
||||
(Char == CHAR_CARRIAGE_RETURN))
|
||||
{
|
||||
// Only let through EFI required control characters
|
||||
Key->UnicodeChar = (CHAR16)Char;
|
||||
}
|
||||
@ -429,7 +415,6 @@ ReadKeyStroke (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TextOutReset (
|
||||
@ -472,7 +457,6 @@ SafeUnicodeStrToAsciiStr (
|
||||
ASSERT ((UINTN)((CHAR16 *)Destination - Source) > StrLen (Source));
|
||||
ASSERT ((UINTN)((CHAR8 *)Source - Destination) > StrLen (Source));
|
||||
|
||||
|
||||
ReturnValue = Destination;
|
||||
while (*Source != '\0') {
|
||||
//
|
||||
@ -543,18 +527,19 @@ OutputString (
|
||||
}
|
||||
|
||||
for ( ; *String != CHAR_NULL; String++) {
|
||||
|
||||
switch (*String) {
|
||||
case CHAR_BACKSPACE:
|
||||
if (Mode->CursorColumn > 0) {
|
||||
Mode->CursorColumn--;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case CHAR_LINEFEED:
|
||||
if (Mode->CursorRow < (INT32)(MaxRow - 1)) {
|
||||
Mode->CursorRow++;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case CHAR_CARRIAGE_RETURN:
|
||||
@ -568,11 +553,13 @@ OutputString (
|
||||
if (Mode->CursorRow < (INT32)(MaxRow - 1)) {
|
||||
Mode->CursorRow++;
|
||||
}
|
||||
|
||||
// CHAR_CARIAGE_RETURN
|
||||
Mode->CursorColumn = 0;
|
||||
} else {
|
||||
Mode->CursorColumn++;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -582,7 +569,6 @@ OutputString (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TestString (
|
||||
@ -602,7 +588,6 @@ TestString (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
QueryMode (
|
||||
@ -625,7 +610,6 @@ QueryMode (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetMode (
|
||||
@ -642,7 +626,6 @@ SetMode (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetAttribute (
|
||||
@ -654,7 +637,6 @@ SetAttribute(
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ClearScreen (
|
||||
@ -667,7 +649,6 @@ ClearScreen (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetCursorPosition (
|
||||
@ -703,7 +684,6 @@ SetCursorPosition (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EnableCursor (
|
||||
@ -718,7 +698,6 @@ EnableCursor (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SimpleTextInOutEntryPoint (
|
||||
@ -739,9 +718,12 @@ SimpleTextInOutEntryPoint (
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&mInstallHandle,
|
||||
&gEfiSimpleTextInProtocolGuid, &mSimpleTextIn,
|
||||
&gEfiSimpleTextOutProtocolGuid, &mSimpleTextOut,
|
||||
&gEfiDevicePathProtocolGuid, &mDevicePath,
|
||||
&gEfiSimpleTextInProtocolGuid,
|
||||
&mSimpleTextIn,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
&mSimpleTextOut,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&mDevicePath,
|
||||
NULL
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
|
@ -36,6 +36,7 @@ DiagnosticLog (
|
||||
)
|
||||
{
|
||||
UINTN len = StrLen (Str);
|
||||
|
||||
if (len < mLogRemainChar) {
|
||||
StrCpyS (mLogBuffer, mLogRemainChar, Str);
|
||||
mLogRemainChar -= len;
|
||||
@ -78,9 +79,11 @@ CompareBuffer (
|
||||
DEBUG ((DEBUG_ERROR, "(0x%lX) != (0x%lX)\n", *BufferA64, *BufferB64));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BufferA64++;
|
||||
BufferB64++;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -183,7 +186,8 @@ MmcDriverDiagnosticsRunDiagnostics (
|
||||
(ErrorType == NULL) ||
|
||||
(Buffer == NULL) ||
|
||||
(ControllerHandle == NULL) ||
|
||||
(BufferSize == NULL)) {
|
||||
(BufferSize == NULL))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -208,12 +212,14 @@ MmcDriverDiagnosticsRunDiagnostics (
|
||||
if (MmcHostInstance->MmcHandle == ControllerHandle) {
|
||||
break;
|
||||
}
|
||||
|
||||
CurrentLink = CurrentLink->ForwardLink;
|
||||
}
|
||||
|
||||
// If we didn't find the controller, return EFI_UNSUPPORTED
|
||||
if ( (MmcHostInstance == NULL)
|
||||
|| (MmcHostInstance->MmcHandle != ControllerHandle)) {
|
||||
|| (MmcHostInstance->MmcHandle != ControllerHandle))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
@ -76,7 +76,8 @@ RemoveMmcHost (
|
||||
RemoveEntryList (&(MmcHostInstance->Link));
|
||||
}
|
||||
|
||||
MMC_HOST_INSTANCE* CreateMmcHostInstance (
|
||||
MMC_HOST_INSTANCE *
|
||||
CreateMmcHostInstance (
|
||||
IN EFI_MMC_HOST_PROTOCOL *MmcHost
|
||||
)
|
||||
{
|
||||
@ -124,8 +125,10 @@ MMC_HOST_INSTANCE* CreateMmcHostInstance (
|
||||
// Publish BlockIO protocol interface
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&MmcHostInstance->MmcHandle,
|
||||
&gEfiBlockIoProtocolGuid,&MmcHostInstance->BlockIo,
|
||||
&gEfiDevicePathProtocolGuid,MmcHostInstance->DevicePath,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
&MmcHostInstance->BlockIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
MmcHostInstance->DevicePath,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -146,7 +149,8 @@ FREE_INSTANCE:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EFI_STATUS DestroyMmcHostInstance (
|
||||
EFI_STATUS
|
||||
DestroyMmcHostInstance (
|
||||
IN MMC_HOST_INSTANCE *MmcHostInstance
|
||||
)
|
||||
{
|
||||
@ -155,8 +159,10 @@ EFI_STATUS DestroyMmcHostInstance (
|
||||
// Uninstall Protocol Interfaces
|
||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||
MmcHostInstance->MmcHandle,
|
||||
&gEfiBlockIoProtocolGuid,&(MmcHostInstance->BlockIo),
|
||||
&gEfiDevicePathProtocolGuid,MmcHostInstance->DevicePath,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
&(MmcHostInstance->BlockIo),
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
MmcHostInstance->DevicePath,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
@ -165,9 +171,11 @@ EFI_STATUS DestroyMmcHostInstance (
|
||||
if (MmcHostInstance->BlockIo.Media) {
|
||||
FreePool (MmcHostInstance->BlockIo.Media);
|
||||
}
|
||||
|
||||
if (MmcHostInstance->CardInfo.ECSDData) {
|
||||
FreePages (MmcHostInstance->CardInfo.ECSDData, EFI_SIZE_TO_PAGES (sizeof (ECSD)));
|
||||
}
|
||||
|
||||
FreePool (MmcHostInstance);
|
||||
|
||||
return Status;
|
||||
@ -203,9 +211,10 @@ MmcDriverBindingSupported (
|
||||
// check its validation
|
||||
//
|
||||
Node.DevPath = RemainingDevicePath;
|
||||
if (Node.DevPath->Type != HARDWARE_DEVICE_PATH ||
|
||||
Node.DevPath->SubType != HW_VENDOR_DP ||
|
||||
DevicePathNodeLength(Node.DevPath) != sizeof(VENDOR_DEVICE_PATH)) {
|
||||
if ((Node.DevPath->Type != HARDWARE_DEVICE_PATH) ||
|
||||
(Node.DevPath->SubType != HW_VENDOR_DP) ||
|
||||
(DevicePathNodeLength (Node.DevPath) != sizeof (VENDOR_DEVICE_PATH)))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
@ -225,6 +234,7 @@ MmcDriverBindingSupported (
|
||||
if (Status == EFI_ALREADY_STARTED) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -285,6 +295,7 @@ MmcDriverBindingStart (
|
||||
if (Status == EFI_ALREADY_STARTED) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -385,7 +396,6 @@ CheckCardsCallback (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
EFI_DRIVER_BINDING_PROTOCOL gMmcDriverBinding = {
|
||||
MmcDriverBindingSupported,
|
||||
MmcDriverBindingStart,
|
||||
@ -428,7 +438,8 @@ MmcDxeInitialize (
|
||||
// Install driver diagnostics
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&ImageHandle,
|
||||
&gEfiDriverDiagnostics2ProtocolGuid,&gMmcDriverDiagnostics2,
|
||||
&gEfiDriverDiagnostics2ProtocolGuid,
|
||||
&gMmcDriverDiagnostics2,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
@ -439,13 +450,15 @@ MmcDxeInitialize (
|
||||
TPL_CALLBACK,
|
||||
CheckCardsCallback,
|
||||
NULL,
|
||||
&gCheckCardsEvent);
|
||||
&gCheckCardsEvent
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = gBS->SetTimer (
|
||||
gCheckCardsEvent,
|
||||
TimerPeriodic,
|
||||
(UINT64)(10*1000*200)); // 200 ms
|
||||
(UINT64)(10*1000*200)
|
||||
); // 200 ms
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return Status;
|
||||
|
@ -344,7 +344,6 @@ typedef struct _MMC_HOST_INSTANCE {
|
||||
#define MMC_HOST_INSTANCE_FROM_BLOCK_IO_THIS(a) CR (a, MMC_HOST_INSTANCE, BlockIo, MMC_HOST_INSTANCE_SIGNATURE)
|
||||
#define MMC_HOST_INSTANCE_FROM_LINK(a) CR (a, MMC_HOST_INSTANCE, Link, MMC_HOST_INSTANCE_SIGNATURE)
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MmcGetDriverName (
|
||||
|
@ -38,6 +38,7 @@ MmcGetCardStatus (
|
||||
if (MmcHost == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (MmcHostInstance->State != MmcHwInitializationState) {
|
||||
// Get the Status of the card.
|
||||
CmdArg = MmcHostInstance->CardInfo.RCA << 16;
|
||||
@ -108,12 +109,14 @@ MmcStopTransmission (
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 Response[4];
|
||||
|
||||
// Command 12 - Stop transmission (ends read or write)
|
||||
// Normally only needed for streaming transfers or after error.
|
||||
Status = MmcHost->SendCommand (MmcHost, MMC_CMD12, 0);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1b, Response);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -154,7 +157,8 @@ MmcTransferBlock (
|
||||
} else {
|
||||
// Set command argument based on the card access mode (Byte mode or Block mode)
|
||||
if ((MmcHostInstance->CardInfo.OCRData.AccessMode & MMC_OCR_ACCESS_MASK) ==
|
||||
MMC_OCR_ACCESS_SECTOR) {
|
||||
MMC_OCR_ACCESS_SECTOR)
|
||||
{
|
||||
CmdArg = Lba;
|
||||
} else {
|
||||
CmdArg = MultU64x32 (Lba, This->Media->BlockSize);
|
||||
@ -175,6 +179,7 @@ MmcTransferBlock (
|
||||
MmcStopTransmission (MmcHost);
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = MmcNotifyState (MmcHostInstance, MmcProgrammingState);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "%a() : Error MmcProgrammingState\n", __func__));
|
||||
@ -196,7 +201,8 @@ MmcTransferBlock (
|
||||
Response[0] = 0;
|
||||
while ( !(Response[0] & MMC_R0_READY_FOR_DATA)
|
||||
&& (MMC_R0_CURRENTSTATE (Response) != MMC_R0_STATE_TRAN)
|
||||
&& Timeout--) {
|
||||
&& Timeout--)
|
||||
{
|
||||
Status = MmcHost->SendCommand (MmcHost, MMC_CMD13, CmdArg);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1, Response);
|
||||
@ -211,6 +217,7 @@ MmcTransferBlock (
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_BLKIO, "%a(): Error and Status:%r\n", __func__, Status));
|
||||
}
|
||||
|
||||
MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1b, Response);
|
||||
}
|
||||
|
||||
@ -219,6 +226,7 @@ MmcTransferBlock (
|
||||
DEBUG ((DEBUG_ERROR, "MmcIoBlocks() : Error MmcTransferState\n"));
|
||||
return Status;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -297,7 +305,6 @@ MmcIoBlocks (
|
||||
RemainingBlock = BlockCount;
|
||||
BytesRemainingToBeTransfered = BufferSize;
|
||||
while (BytesRemainingToBeTransfered > 0) {
|
||||
|
||||
if (RemainingBlock <= MaxBlock) {
|
||||
BlockCount = RemainingBlock;
|
||||
} else {
|
||||
@ -310,7 +317,8 @@ MmcIoBlocks (
|
||||
Timeout = 20;
|
||||
while ( (!(Response[0] & MMC_R0_READY_FOR_DATA))
|
||||
&& (MMC_R0_CURRENTSTATE (Response) != MMC_R0_STATE_TRAN)
|
||||
&& Timeout--) {
|
||||
&& Timeout--)
|
||||
{
|
||||
Status = MmcHost->SendCommand (MmcHost, MMC_CMD13, CmdArg);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1, Response);
|
||||
@ -344,6 +352,7 @@ MmcIoBlocks (
|
||||
if (BytesRemainingToBeTransfered < ConsumeSize) {
|
||||
ConsumeSize = BytesRemainingToBeTransfered;
|
||||
}
|
||||
|
||||
Status = MmcTransferBlock (This, Cmd, Transfer, MediaId, Lba, ConsumeSize, Buffer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "%a(): Failed to transfer block and Status:%r\n", __func__, Status));
|
||||
|
@ -9,10 +9,14 @@
|
||||
#include "Mmc.h"
|
||||
|
||||
#if !defined (MDEPKG_NDEBUG)
|
||||
CONST CHAR8* mStrUnit[] = { "100kbit/s", "1Mbit/s", "10Mbit/s", "100MBit/s",
|
||||
"Unknown", "Unknown", "Unknown", "Unknown" };
|
||||
CONST CHAR8* mStrValue[] = { "1.0", "1.2", "1.3", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0",
|
||||
"Unknown", "Unknown", "Unknown", "Unknown" };
|
||||
CONST CHAR8 *mStrUnit[] = {
|
||||
"100kbit/s", "1Mbit/s", "10Mbit/s", "100MBit/s",
|
||||
"Unknown", "Unknown", "Unknown", "Unknown"
|
||||
};
|
||||
CONST CHAR8 *mStrValue[] = {
|
||||
"1.0", "1.2", "1.3", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0",
|
||||
"Unknown", "Unknown", "Unknown", "Unknown"
|
||||
};
|
||||
#endif
|
||||
|
||||
VOID
|
||||
@ -28,7 +32,6 @@ PrintCID (
|
||||
DEBUG ((DEBUG_ERROR, "\t- OEM ID: %c%c\n", (Cid[3] >> 8) & 0xFF, (Cid[3] >> 16) & 0xFF));
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
PrintCSD (
|
||||
IN UINT32 *Csd
|
||||
@ -95,10 +98,12 @@ PrintOCR (
|
||||
if (MinV > Volts) {
|
||||
MinV = Volts;
|
||||
}
|
||||
|
||||
if (MaxV < Volts) {
|
||||
MaxV = Volts + 1;
|
||||
}
|
||||
}
|
||||
|
||||
Volts++;
|
||||
}
|
||||
|
||||
|
@ -84,15 +84,18 @@ EmmcGetDeviceState (
|
||||
DEBUG ((DEBUG_ERROR, "EmmcGetDeviceState(): Failed to get card status, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = Host->ReceiveResponse (Host, MMC_RESPONSE_TYPE_R1, &Data);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "EmmcGetDeviceState(): Failed to get response of CMD13, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (Data & EMMC_SWITCH_ERROR) {
|
||||
DEBUG ((DEBUG_ERROR, "EmmcGetDeviceState(): Failed to switch expected mode, Status=%r.\n", Status));
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
*State = DEVICE_STATE (Data);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -119,6 +122,7 @@ EmmcSetEXTCSD (
|
||||
DEBUG ((DEBUG_ERROR, "EmmcSetEXTCSD(): Failed to send CMD6, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Make sure device exiting prog mode
|
||||
do {
|
||||
Status = EmmcGetDeviceState (MmcHostInstance, &State);
|
||||
@ -127,6 +131,7 @@ EmmcSetEXTCSD (
|
||||
return Status;
|
||||
}
|
||||
} while (State == EMMC_PRG_STATE);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -209,6 +214,7 @@ EmmcIdentificationMode (
|
||||
if (MmcHostInstance->CardInfo.ECSDData == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Status = Host->SendCommand (Host, MMC_CMD8, 0);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "EmmcIdentificationMode(): ECSD fetch error, Status=%r.\n", Status));
|
||||
@ -262,12 +268,14 @@ InitializeEmmcDevice (
|
||||
|
||||
Host = MmcHostInstance->MmcHost;
|
||||
ECSDData = MmcHostInstance->CardInfo.ECSDData;
|
||||
if (ECSDData->DEVICE_TYPE == EMMCBACKWARD)
|
||||
if (ECSDData->DEVICE_TYPE == EMMCBACKWARD) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (!MMC_HOST_HAS_SETIOS (Host)) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
Status = EmmcSetEXTCSD (MmcHostInstance, EXTCSD_HS_TIMING, EMMC_TIMING_HS);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "InitializeEmmcDevice(): Failed to switch high speed mode, Status:%r.\n", Status));
|
||||
@ -287,6 +295,7 @@ InitializeEmmcDevice (
|
||||
default:
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Status = Host->SetIos (Host, BusClockFreq, 8, TimingMode[Idx]);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
switch (TimingMode[Idx]) {
|
||||
@ -301,13 +310,16 @@ InitializeEmmcDevice (
|
||||
default:
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Status = EmmcSetEXTCSD (MmcHostInstance, EXTCSD_BUS_WIDTH, BusMode);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "InitializeEmmcDevice(): Failed to set EXTCSD bus width, Status:%r\n", Status));
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -363,6 +375,7 @@ InitializeSdMmcDevice (
|
||||
DEBUG ((DEBUG_ERROR, "InitializeSdMmcDevice(): Failed to receive CSD, Status=%r\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
PrintCSD (Response);
|
||||
if (MMC_CSD_GET_CCC (Response) & SD_CCC_SWITCH) {
|
||||
CccSwitch = TRUE;
|
||||
@ -404,11 +417,13 @@ InitializeSdMmcDevice (
|
||||
DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1, Response);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
if ((Response[0] & MMC_STATUS_APP_CMD) == 0) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -424,6 +439,7 @@ InitializeSdMmcDevice (
|
||||
DEBUG ((DEBUG_ERROR, "%a(MMC_ACMD51): ReadBlockData Error and Status = %r\n", __func__, Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
CopyMem (&Scr, Buffer, 8);
|
||||
if (Scr.SD_SPEC == 2) {
|
||||
if (Scr.SD_SPEC3 == 1) {
|
||||
@ -451,6 +467,7 @@ InitializeSdMmcDevice (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (CccSwitch) {
|
||||
/* SD Switch, Mode:0, Group:0, Value:0 */
|
||||
CmdArg = CreateSwitchCmdArgument (0, 0, 0);
|
||||
@ -491,6 +508,7 @@ InitializeSdMmcDevice (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Scr.SD_BUS_WIDTHS & SD_BUS_WIDTH_4BIT) {
|
||||
CmdArg = MmcHostInstance->CardInfo.RCA << 16;
|
||||
Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, CmdArg);
|
||||
@ -498,6 +516,7 @@ InitializeSdMmcDevice (
|
||||
DEBUG ((DEBUG_ERROR, "%a (MMC_CMD55): Error and Status = %r\n", __FUNCTION__, Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Width: 4 */
|
||||
Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, 2);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -505,6 +524,7 @@ InitializeSdMmcDevice (
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
if (MMC_HOST_HAS_SETIOS (MmcHost)) {
|
||||
Status = MmcHost->SetIos (MmcHost, Speed, BUSWIDTH_4, EMMCBACKWARD);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -512,6 +532,7 @@ InitializeSdMmcDevice (
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -553,6 +574,7 @@ MmcIdentificationMode (
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode(MMC_CMD0): Error, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = MmcNotifyState (MmcHostInstance, MmcIdleState);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Error MmcIdleState, Status=%r.\n", Status));
|
||||
@ -564,30 +586,36 @@ MmcIdentificationMode (
|
||||
Timeout = MAX_RETRY_COUNT;
|
||||
do {
|
||||
Status = MmcHost->SendCommand (MmcHost, MMC_CMD1, EMMC_CMD1_CAPACITY_GREATER_THAN_2GB);
|
||||
if (EFI_ERROR (Status))
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
|
||||
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_OCR, (UINT32 *)&OcrResponse);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
Timeout--;
|
||||
} while (!OcrResponse.Ocr.PowerUp && (Timeout > 0));
|
||||
|
||||
if (Status == EFI_SUCCESS) {
|
||||
if (!OcrResponse.Ocr.PowerUp) {
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode(MMC_CMD1): Card initialisation failure, Status=%r.\n", Status));
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
OcrResponse.Ocr.PowerUp = 0;
|
||||
if (OcrResponse.Raw == EMMC_CMD1_CAPACITY_GREATER_THAN_2GB) {
|
||||
MmcHostInstance->CardInfo.OCRData.AccessMode = BIT1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
MmcHostInstance->CardInfo.OCRData.AccessMode = 0x0;
|
||||
}
|
||||
|
||||
// Check whether MMC or eMMC
|
||||
if (OcrResponse.Raw == EMMC_CMD1_CAPACITY_GREATER_THAN_2GB ||
|
||||
OcrResponse.Raw == EMMC_CMD1_CAPACITY_LESS_THAN_2GB) {
|
||||
if ((OcrResponse.Raw == EMMC_CMD1_CAPACITY_GREATER_THAN_2GB) ||
|
||||
(OcrResponse.Raw == EMMC_CMD1_CAPACITY_LESS_THAN_2GB))
|
||||
{
|
||||
return EmmcIdentificationMode (MmcHostInstance, OcrResponse);
|
||||
}
|
||||
}
|
||||
@ -610,6 +638,7 @@ MmcIdentificationMode (
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive response to CMD8, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
PrintResponseR1 (Response[0]);
|
||||
// Check if it is valid response
|
||||
if (Response[0] != CmdArg) {
|
||||
@ -638,6 +667,7 @@ MmcIdentificationMode (
|
||||
if (IsHCS) {
|
||||
CmdArg |= BIT30;
|
||||
}
|
||||
|
||||
Status = MmcHost->SendCommand (MmcHost, MMC_ACMD41, CmdArg);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_OCR, Response);
|
||||
@ -645,6 +675,7 @@ MmcIdentificationMode (
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
((UINT32 *)&(MmcHostInstance->CardInfo.OCRData))[0] = Response[0];
|
||||
}
|
||||
} else {
|
||||
@ -658,6 +689,7 @@ MmcIdentificationMode (
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
((UINT32 *)&(MmcHostInstance->CardInfo.OCRData))[0] = Response[0];
|
||||
}
|
||||
}
|
||||
@ -671,6 +703,7 @@ MmcIdentificationMode (
|
||||
MmcHostInstance->CardInfo.CardType = SD_CARD_2_HIGH;
|
||||
DEBUG ((DEBUG_ERROR, "High capacity card.\n"));
|
||||
}
|
||||
|
||||
break; // The MMC/SD card is ready. Continue the Identification Mode
|
||||
}
|
||||
} else {
|
||||
@ -697,6 +730,7 @@ MmcIdentificationMode (
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode(MMC_CMD2): Error\n"));
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_CID, Response);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive CID, Status=%r.\n", Status));
|
||||
@ -728,6 +762,7 @@ MmcIdentificationMode (
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Failed to receive RCA, Status=%r.\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
PrintRCA (Response[0]);
|
||||
|
||||
// For MMC card, RCA is assigned by CMD3 while CMD3 dumps the RCA for SD card
|
||||
@ -736,6 +771,7 @@ MmcIdentificationMode (
|
||||
} else {
|
||||
MmcHostInstance->CardInfo.RCA = CmdArg;
|
||||
}
|
||||
|
||||
Status = MmcNotifyState (MmcHostInstance, MmcStandByState);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "MmcIdentificationMode() : Error MmcStandByState\n"));
|
||||
@ -774,6 +810,7 @@ InitializeMmcDevice (
|
||||
} else {
|
||||
Status = InitializeEmmcDevice (MmcHostInstance);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -781,8 +818,12 @@ InitializeMmcDevice (
|
||||
// Set Block Length
|
||||
Status = MmcHost->SendCommand (MmcHost, MMC_CMD16, MmcHostInstance->BlockIo.Media->BlockSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG((DEBUG_ERROR, "InitializeMmcDevice(MMC_CMD16): Error MmcHostInstance->BlockIo.Media->BlockSize: %d and Error = %r\n",
|
||||
MmcHostInstance->BlockIo.Media->BlockSize, Status));
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"InitializeMmcDevice(MMC_CMD16): Error MmcHostInstance->BlockIo.Media->BlockSize: %d and Error = %r\n",
|
||||
MmcHostInstance->BlockIo.Media->BlockSize,
|
||||
Status
|
||||
));
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user