This series adds support for QEMU's -kernel option by porting
the efilinux project into OvmfPkg.
v2:
* Many changes based on Laszlo Ersek's code review
* Initrd max address of 1GB (efilinux 8947b2)
* Merge E820 memory types (efilinux d0efc6)
* Only set efi_*_hi for x86-64 (efilinux 0f35b5)
* Use bzimage size rather than 8MB (efilinux f72063)
* Note: v1 vs. v2 diff is at the bottom of this email
Jordan Justen (5):
OvmfPkg: Add Linux bzimage include file
OvmfPkg: Add LoadLinuxLib library interface
OvmfPkg: Add LoadLinuxLib library implementation
OvmfPkg: Add QemuKernelDxe application
OvmfPkg: Run the QemuKernelDxe application during BDS
OvmfPkg/Application/QemuKernelDxe/QemuKernelDxe.c | 184 ++++++++
.../Application/QemuKernelDxe/QemuKernelDxe.inf | 47 ++
OvmfPkg/Include/Guid/OvmfQemuKernelFile.h | 25 +
OvmfPkg/Include/IndustryStandard/LinuxBzimage.h | 164 +++++++
OvmfPkg/Include/Library/LoadLinuxLib.h | 210 +++++++++
OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S | 29 ++
OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm | 35 ++
OvmfPkg/Library/LoadLinuxLib/Linux.c | 487 ++++++++++++++++++++
OvmfPkg/Library/LoadLinuxLib/LinuxGdt.c | 200 ++++++++
OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h | 56 +++
OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf | 50 ++
OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S | 30 ++
OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm | 34 ++
OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c | 70 +++
OvmfPkg/Library/PlatformBdsLib/BdsPlatform.h | 1 +
OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf | 4 +
OvmfPkg/OvmfPkg.dec | 6 +
OvmfPkg/OvmfPkgIa32.dsc | 4 +
OvmfPkg/OvmfPkgIa32.fdf | 2 +
OvmfPkg/OvmfPkgIa32X64.dsc | 4 +
OvmfPkg/OvmfPkgIa32X64.fdf | 2 +
OvmfPkg/OvmfPkgX64.dsc | 4 +
OvmfPkg/OvmfPkgX64.fdf | 2 +
23 files changed, 1650 insertions(+)
create mode 100644 OvmfPkg/Application/QemuKernelDxe/QemuKernelDxe.c
create mode 100644 OvmfPkg/Application/QemuKernelDxe/QemuKernelDxe.inf
create mode 100644 OvmfPkg/Include/Guid/OvmfQemuKernelFile.h
create mode 100644 OvmfPkg/Include/IndustryStandard/LinuxBzimage.h
create mode 100644 OvmfPkg/Include/Library/LoadLinuxLib.h
create mode 100644 OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S
create mode 100644 OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm
create mode 100644 OvmfPkg/Library/LoadLinuxLib/Linux.c
create mode 100644 OvmfPkg/Library/LoadLinuxLib/LinuxGdt.c
create mode 100644 OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
create mode 100644 OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf
create mode 100644 OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
create mode 100644 OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm
--
1.7.9.5
diff --git a/OvmfPkg/Application/QemuKernelDxe/QemuKernelDxe.c
b/OvmfPkg/Application/QemuKernelDxe/QemuKernelDxe.c
index f9b7092..448abcf 100644
--- a/OvmfPkg/Application/QemuKernelDxe/QemuKernelDxe.c
+++ b/OvmfPkg/Application/QemuKernelDxe/QemuKernelDxe.c
@@ -43,7 +43,15 @@ QemuFwCfgLoadLinux (
CHAR8 *CommandLine;
UINTN InitrdSize;
VOID* InitrdData;
- struct boot_params *Bp;
+
+ SetupBuf = NULL;
+ SetupSize = 0;
+ KernelBuf = NULL;
+ KernelInitialSize = 0;
+ CommandLine = NULL;
+ CommandLineSize = 0;
+ InitrdData = NULL;
+ InitrdSize = 0;
if (!QemuFwCfgIsAvailable ()) {
return EFI_NOT_FOUND;
@@ -51,11 +59,9 @@ QemuFwCfgLoadLinux (
QemuFwCfgSelectItem (QemuFwCfgItemKernelSize);
KernelSize = (UINTN) QemuFwCfgRead64 ();
- DEBUG ((EFI_D_INFO, "Kernel size: 0x%x\n", KernelSize));
QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize);
SetupSize = (UINTN) QemuFwCfgRead64 ();
- DEBUG ((EFI_D_INFO, "Setup size: 0x%x\n", SetupSize));
if (KernelSize == 0 || SetupSize == 0) {
DEBUG ((EFI_D_INFO, "qemu -kernel was not used.\n"));
@@ -68,6 +74,7 @@ QemuFwCfgLoadLinux (
return EFI_OUT_OF_RESOURCES;
}
+ DEBUG ((EFI_D_INFO, "Setup size: 0x%x\n", (UINT32) SetupSize));
DEBUG ((EFI_D_INFO, "Reading kernel setup image ..."));
QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupData);
QemuFwCfgReadBytes (SetupSize, SetupBuf);
@@ -75,24 +82,25 @@ QemuFwCfgLoadLinux (
Status = LoadLinuxCheckKernelSetup (SetupBuf, SetupSize);
if (EFI_ERROR (Status)) {
- return Status;
+ goto FreeAndReturn;
}
KernelInitialSize = LoadLinuxGetKernelSize (SetupBuf, KernelSize);
if (KernelInitialSize == 0) {
- return EFI_UNSUPPORTED;
+ Status = EFI_UNSUPPORTED;
+ goto FreeAndReturn;
}
- Bp = (struct boot_params*) SetupBuf;
-
KernelBuf = LoadLinuxAllocateKernelPages (
SetupBuf,
EFI_SIZE_TO_PAGES (KernelInitialSize));
if (KernelBuf == NULL) {
DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel!\n"));
- return EFI_OUT_OF_RESOURCES;
+ Status = EFI_OUT_OF_RESOURCES;
+ goto FreeAndReturn;
}
+ DEBUG ((EFI_D_INFO, "Kernel size: 0x%x\n", (UINT32) KernelSize));
DEBUG ((EFI_D_INFO, "Reading kernel image ..."));
QemuFwCfgSelectItem (QemuFwCfgItemKernelData);
QemuFwCfgReadBytes (KernelSize, KernelBuf);
@@ -100,7 +108,6 @@ QemuFwCfgLoadLinux (
QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize);
CommandLineSize = (UINTN) QemuFwCfgRead64 ();
- DEBUG ((EFI_D_INFO, "Command line size: 0x%x\n", CommandLineSize));
if (CommandLineSize > 0) {
CommandLine = LoadLinuxAllocateCommandLinePages (
@@ -113,15 +120,15 @@ QemuFwCfgLoadLinux (
Status = LoadLinuxSetCommandLine (SetupBuf, CommandLine);
if (EFI_ERROR (Status)) {
- return Status;
+ goto FreeAndReturn;
}
QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize);
InitrdSize = (UINTN) QemuFwCfgRead64 ();
- DEBUG ((EFI_D_INFO, "Initrd size: 0x%x\n", InitrdSize));
if (InitrdSize > 0) {
InitrdData = LoadLinuxAllocateInitrdPages (EFI_SIZE_TO_PAGES (InitrdSize));
+ DEBUG ((EFI_D_INFO, "Initrd size: 0x%x\n", (UINT32) InitrdSize));
DEBUG ((EFI_D_INFO, "Reading initrd image ..."));
QemuFwCfgSelectItem (QemuFwCfgItemInitrdData);
QemuFwCfgReadBytes (InitrdSize, InitrdData);
@@ -132,10 +139,26 @@ QemuFwCfgLoadLinux (
Status = LoadLinuxSetInitrd (SetupBuf, InitrdData, InitrdSize);
if (EFI_ERROR (Status)) {
- return Status;
+ goto FreeAndReturn;
+ }
+
+ Status = LoadLinux (KernelBuf, SetupBuf);
+
+FreeAndReturn:
+ if (SetupBuf != NULL) {
+ FreePages (SetupBuf, EFI_SIZE_TO_PAGES (SetupSize));
+ }
+ if (KernelBuf != NULL) {
+ FreePages (KernelBuf, EFI_SIZE_TO_PAGES (KernelInitialSize));
+ }
+ if (CommandLine != NULL) {
+ FreePages (CommandLine, EFI_SIZE_TO_PAGES (CommandLineSize));
+ }
+ if (InitrdData != NULL) {
+ FreePages (InitrdData, EFI_SIZE_TO_PAGES (InitrdSize));
}
- return LoadLinux (KernelBuf, SetupBuf);
+ return Status;
}
diff --git a/OvmfPkg/Include/Library/LoadLinuxLib.h
b/OvmfPkg/Include/Library/LoadLinuxLib.h
index d73ee9f..9867924 100644
--- a/OvmfPkg/Include/Library/LoadLinuxLib.h
+++ b/OvmfPkg/Include/Library/LoadLinuxLib.h
@@ -25,6 +25,7 @@
@param[in] KernelSetupSize - The kernel setup size
@retval EFI_SUCCESS - The Linux kernel setup is valid and supported
+ @retval EFI_INVALID_PARAMETER - KernelSetup was NULL
@retval EFI_UNSUPPORTED - The Linux kernel is not supported
**/
@@ -41,7 +42,7 @@ LoadLinuxCheckKernelSetup (
the kernel setup image.
@param[in] KernelSetup - The kernel setup image
- @param[in,out] KernelSize - The kernel size on disk.
+ @param[in] KernelSize - The kernel size on disk.
@retval 0 An error occured
@retval !0 The initial size required by the kernel to
@@ -61,12 +62,11 @@ LoadLinuxGetKernelSize (
Note: If successful, then this routine will not return
- @param[in] Kernel - The main kernel image
- @param[in] KernelSetup - The kernel setup image
- @param[in] Initrd - The kernel initial root disk
- @param[in] CommandLine - The kernel command line
+ @param[in] Kernel - The main kernel image
+ @param[in,out] KernelSetup - The kernel setup image
@retval EFI_NOT_FOUND - The Linux kernel was not found
+ @retval EFI_INVALID_PARAMETER - Kernel or KernelSetup was NULL
@retval EFI_UNSUPPORTED - The Linux kernel version is not supported
**/
@@ -74,7 +74,7 @@ EFI_STATUS
EFIAPI
LoadLinux (
IN VOID *Kernel,
- IN VOID *KernelSetup
+ IN OUT VOID *KernelSetup
);
@@ -83,20 +83,18 @@ LoadLinux (
Note: If successful, then this routine will not return
- @param[in] BzImage - The main kernel image
- @param[in] BzImageSize - The main kernel image size
- @param[in] Initrd - The initial root disk image
- @param[in] InitrdSize - The initial root disk image size
- @param[in] CommandLine - The kernel command line
+ @param[in,out] BzImage - The main kernel image
+ @param[in] BzImageSize - The main kernel image size
@retval EFI_NOT_FOUND - The Linux kernel was not found
+ @retval EFI_INVALID_PARAMETER - BzImage was NULL
@retval EFI_UNSUPPORTED - The Linux kernel version is not supported
**/
EFI_STATUS
EFIAPI
LoadLinuxBzImage (
- IN VOID *BzImage,
+ IN OUT VOID *BzImage,
IN UINTN BzImageSize
);
@@ -120,6 +118,7 @@ LoadLinuxAllocateKernelSetupPages (
/**
Allocates pages for the kernel.
+ @param[in] KernelSetup - The kernel setup image
@param[in] Pages - The number of pages. (It is recommended to use the
size returned from LoadLinuxGetKernelSize.)
@@ -170,17 +169,18 @@ LoadLinuxAllocateInitrdPages (
/**
Sets the kernel command line parameter within the setup image.
- @param[in] KernelSetup - The kernel setup image
+ @param[in,out] KernelSetup - The kernel setup image
@param[in] CommandLine - The kernel command line
@retval EFI_SUCCESS - The Linux kernel setup is valid and supported
+ @retval EFI_INVALID_PARAMETER - KernelSetup was NULL
@retval EFI_UNSUPPORTED - The Linux kernel is not supported
**/
EFI_STATUS
EFIAPI
LoadLinuxSetCommandLine (
- IN VOID *KernelSetup,
+ IN OUT VOID *KernelSetup,
IN CHAR8 *CommandLine
);
@@ -188,17 +188,19 @@ LoadLinuxSetCommandLine (
/**
Sets the kernel command line parameter within the setup image.
- @param[in] KernelSetup - The kernel setup image
+ @param[in,out] KernelSetup - The kernel setup image
@param[in] Initrd - The initial root disk image
+ @param[in] InitrdSize - The initial root disk image size
@retval EFI_SUCCESS - The Linux kernel setup is valid and supported
+ @retval EFI_INVALID_PARAMETER - KernelSetup was NULL
@retval EFI_UNSUPPORTED - The Linux kernel is not supported
**/
EFI_STATUS
EFIAPI
LoadLinuxSetInitrd (
- IN VOID *KernelSetup,
+ IN OUT VOID *KernelSetup,
IN VOID *Initrd,
IN UINTN InitrdSize
);
diff --git a/OvmfPkg/Library/LoadLinuxLib/Linux.c
b/OvmfPkg/Library/LoadLinuxLib/Linux.c
index b9dd5e4..e88b4ca 100644
--- a/OvmfPkg/Library/LoadLinuxLib/Linux.c
+++ b/OvmfPkg/Library/LoadLinuxLib/Linux.c
@@ -15,6 +15,30 @@
#include "LoadLinuxLib.h"
+/**
+ A simple check of the kernel setup image
+
+ An assumption is made that the size of the data is at least the
+ size of struct boot_params.
+
+ @param[in] KernelSetup - The kernel setup image
+
+ @retval EFI_SUCCESS - The kernel setup looks valid and supported
+ @retval EFI_INVALID_PARAMETER - KernelSetup was NULL
+ @retval EFI_UNSUPPORTED - The kernel setup is not valid or supported
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+BasicKernelSetupCheck (
+ IN VOID *KernelSetup
+ )
+{
+ return LoadLinuxCheckKernelSetup(KernelSetup, sizeof (struct boot_params));
+}
+
+
EFI_STATUS
EFIAPI
LoadLinuxCheckKernelSetup (
@@ -34,14 +58,14 @@ LoadLinuxCheckKernelSetup (
Bp = (struct boot_params*) KernelSetup;
- if (Bp->hdr.version < 0x205) {
- //
- // We only support relocatable kernels
- //
+ if ((Bp->hdr.signature != 0xAA55) || // Check boot sector signature
+ (Bp->hdr.header != SETUP_HDR) ||
+ (Bp->hdr.version < 0x205) // We only support relocatable kernels
+ ) {
return EFI_UNSUPPORTED;
+ } else {
+ return EFI_SUCCESS;
}
-
- return EFI_SUCCESS;
}
@@ -54,19 +78,10 @@ LoadLinuxGetKernelSize (
{
struct boot_params *Bp;
- if (KernelSetup == NULL) {
- return EFI_INVALID_PARAMETER;
- }
+ RETURN_X_ON_ERROR (BasicKernelSetupCheck (KernelSetup), 0);
Bp = (struct boot_params*) KernelSetup;
- if (Bp->hdr.version < 0x205) {
- //
- // We only support relocatable kernels
- //
- return 0;
- }
-
if (Bp->hdr.version > 0x20a) {
return Bp->hdr.init_size;
} else {
@@ -114,6 +129,8 @@ LoadLinuxAllocateKernelPages (
UINT32 Loop;
struct boot_params *Bp;
+ RETURN_X_ON_ERROR (BasicKernelSetupCheck (KernelSetup), NULL);
+
Bp = (struct boot_params*) KernelSetup;
for (Loop = 1; Loop < 512; Loop++) {
@@ -169,7 +186,7 @@ LoadLinuxAllocateInitrdPages (
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Address;
- Address = BASE_4GB;
+ Address = BASE_1GB;
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiLoaderData,
@@ -184,9 +201,10 @@ LoadLinuxAllocateInitrdPages (
}
+STATIC
VOID
SetupLinuxMemmap (
- struct boot_params *Bp
+ IN OUT struct boot_params *Bp
)
{
EFI_STATUS Status;
@@ -199,8 +217,10 @@ SetupLinuxMemmap (
EFI_MEMORY_DESCRIPTOR *MemoryMapPtr;
UINTN Index;
struct efi_info *Efi;
- struct e820_entry *E820Map;
+ struct e820_entry *LastE820;
+ struct e820_entry *E820;
UINTN E820EntryCount;
+ EFI_PHYSICAL_ADDRESS LastEndAddr;
//
// Get System MemoryMapSize
@@ -233,12 +253,18 @@ SetupLinuxMemmap (
);
ASSERT_EFI_ERROR (Status);
- E820Map = &Bp->e820_map[0];
+ LastE820 = &Bp->e820_map[0];
+ E820 = &Bp->e820_map[0];
E820EntryCount = 0;
+ LastEndAddr = 0;
MemoryMapPtr = MemoryMap;
for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) {
UINTN E820Type = 0;
+ if (MemoryMap->NumberOfPages == 0) {
+ continue;
+ }
+
switch(MemoryMap->Type) {
case EfiReservedMemoryType:
case EfiRuntimeServicesCode:
@@ -278,11 +304,22 @@ SetupLinuxMemmap (
continue;
}
- E820Map->addr = MemoryMap->PhysicalStart;
- E820Map->size = MemoryMap->NumberOfPages << EFI_PAGE_SHIFT;
- E820Map->type = (UINT32) E820Type;
- E820Map++;
- E820EntryCount++;
+ if ((LastE820 != NULL) &&
+ (LastE820->type == (UINT32) E820Type) &&
+ (MemoryMap->PhysicalStart == LastEndAddr)) {
+ LastE820->size += EFI_PAGES_TO_SIZE (MemoryMap->NumberOfPages);
+ } else {
+ if (E820EntryCount >= (sizeof (Bp->e820_map) / sizeof
(Bp->e820_map[0]))) {
+ break;
+ }
+ E820->type = (UINT32) E820Type;
+ E820->addr = MemoryMap->PhysicalStart;
+ E820->size = EFI_PAGES_TO_SIZE (MemoryMap->NumberOfPages);
+ LastE820 = E820;
+ LastEndAddr = E820->addr + E820->size;
+ E820++;
+ E820EntryCount++;
+ }
//
// Get next item
@@ -297,15 +334,14 @@ SetupLinuxMemmap (
Efi->efi_memdesc_version = DescriptorVersion;
Efi->efi_memmap = (UINT32)(UINTN) MemoryMapPtr;
Efi->efi_memmap_size = (UINT32) MemoryMapSize;
- Efi->efi_systab_hi = ((UINT64)(UINTN) gST) >> 32;
- Efi->efi_memmap_hi = ((UINT64)(UINTN) MemoryMapPtr) >> 32;
#ifdef MDE_CPU_IA32
Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '3', '2');
#else
+ Efi->efi_systab_hi = ((UINT64)(UINTN) gST) >> 32;
+ Efi->efi_memmap_hi = ((UINT64)(UINTN) MemoryMapPtr) >> 32;
Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '6', '4');
#endif
- //gBS->RaiseTPL (TPL_HIGH_LEVEL);
gBS->ExitBootServices (gImageHandle, MapKey);
}
@@ -313,12 +349,14 @@ SetupLinuxMemmap (
EFI_STATUS
EFIAPI
LoadLinuxSetCommandLine (
- IN VOID *KernelSetup,
+ IN OUT VOID *KernelSetup,
IN CHAR8 *CommandLine
)
{
struct boot_params *Bp;
+ RETURN_STATUS_ON_ERROR (BasicKernelSetupCheck (KernelSetup));
+
Bp = (struct boot_params*) KernelSetup;
Bp->hdr.cmd_line_ptr = (UINT32)(UINTN) CommandLine;
@@ -330,13 +368,15 @@ LoadLinuxSetCommandLine (
EFI_STATUS
EFIAPI
LoadLinuxSetInitrd (
- IN VOID *KernelSetup,
+ IN OUT VOID *KernelSetup,
IN VOID *Initrd,
IN UINTN InitrdSize
)
{
struct boot_params *Bp;
+ RETURN_STATUS_ON_ERROR (BasicKernelSetupCheck (KernelSetup));
+
Bp = (struct boot_params*) KernelSetup;
Bp->hdr.ramdisk_start = (UINT32)(UINTN) Initrd;
@@ -351,7 +391,7 @@ STATIC
EFI_STATUS
SetupLinuxBootParams (
IN VOID *Kernel,
- IN struct boot_params *Bp
+ IN OUT struct boot_params *Bp
)
{
Bp->alt_mem_k = SIZE_32KB;
@@ -366,22 +406,10 @@ SetupLinuxBootParams (
}
-/**
- Loads and boots UEFI Linux.
-
- @param[in] BzImage - The main kernel image
- @param[in] BzImageSize - The main kernel image size
- @param[in] Initrd - The initial root disk image
- @param[in] InitrdSize - The initial root disk image size
- @param[in] CommandLine - The kernel command line
-
- @retval EFI_NOT_FOUND - The Linux kernel was not found
-
-**/
EFI_STATUS
EFIAPI
LoadLinuxBzImage (
- IN VOID *BzImage,
+ IN OUT VOID *BzImage,
IN UINTN BzImageSize
)
{
@@ -393,6 +421,8 @@ LoadLinuxBzImage (
Bp = (struct boot_params *) BzImage;
+ RETURN_STATUS_ON_ERROR (LoadLinuxCheckKernelSetup (BzImage, BzImageSize));
+
SetupSize = (Bp->hdr.setup_secs + 1) * 512;
if (SetupSize > BzImageSize) {
@@ -412,7 +442,7 @@ LoadLinuxBzImage (
Bp = (struct boot_params *) KernelSetup;
- Kernel = LoadLinuxAllocateKernelPages (Bp, EFI_SIZE_TO_PAGES (SIZE_8MB));
+ Kernel = LoadLinuxAllocateKernelPages (Bp, EFI_SIZE_TO_PAGES (BzImageSize));
if (Kernel == NULL) {
FreePages (KernelSetup, EFI_SIZE_TO_PAGES (SetupSize));
return EFI_OUT_OF_RESOURCES;
@@ -423,25 +453,17 @@ LoadLinuxBzImage (
}
-/**
- Loads and boots UEFI Linux.
-
- @param[in] Kernel - The main kernel image
- @param[in] KernelSetup - The kernel setup image
- @param[in] CommandLine - The kernel command line
-
- @retval EFI_NOT_FOUND - The Linux kernel was not found
-
-**/
EFI_STATUS
EFIAPI
LoadLinux (
IN VOID *Kernel,
- IN VOID *KernelSetup
+ IN OUT VOID *KernelSetup
)
{
struct boot_params *Bp;
+ RETURN_STATUS_ON_ERROR (BasicKernelSetupCheck (KernelSetup));
+
Bp = (struct boot_params *) KernelSetup;
if (Bp->hdr.version < 0x205) {
diff --git a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
index 49abb8c..0c5f8e6 100644
--- a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
+++ b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
@@ -27,6 +27,14 @@
#include <IndustryStandard/LinuxBzimage.h>
+#define RETURN_X_ON_ERROR(Status, X) \
+ do { if (RETURN_ERROR (Status)) { return (X); } } while(0)
+
+#define RETURN_STATUS_ON_ERROR(Status) \
+ do { RETURN_STATUS __MacroStatus = (Status); \
+ if (RETURN_ERROR (__MacroStatus)) { return __MacroStatus; } \
+ } while(0)
+
VOID
EFIAPI
JumpToKernel (
diff --git a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
index 64dcb75..ae96010 100644
--- a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
+++ b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
@@ -118,25 +118,35 @@ TryRunningQemuKernel (
//
// Check if we have on flash shell
//
- gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiFirmwareVolume2ProtocolGuid,
- NULL,
- &FvHandleCount,
- &FvHandleBuffer
- );
+ Status = gBS->LocateHandleBuffer (
+ ByProtocol,
+ &gEfiFirmwareVolume2ProtocolGuid,
+ NULL,
+ &FvHandleCount,
+ &FvHandleBuffer
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
for (Index = 0; Index < FvHandleCount; Index++) {
- gBS->HandleProtocol (
- FvHandleBuffer[Index],
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath
- );
+ Status = gBS->HandleProtocol (
+ FvHandleBuffer[Index],
+ &gEfiDevicePathProtocolGuid,
+ (VOID **) &DevicePath
+ );
+ if (EFI_ERROR (Status)) {
+ continue;
+ }
//
// Build device path for QEMU Kernel executable
//
EfiInitializeFwVolDevicepathNode (&ShellNode, &gOvmfQemuKernelFile);
DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL
*) &ShellNode);
+ if (DevicePath == NULL) {
+ continue;
+ }
Status = gBS->LoadImage (
TRUE,
gImageHandle,
@@ -145,13 +155,15 @@ TryRunningQemuKernel (
0,
&ImageHandle
);
+ FreePool (DevicePath);
if (!EFI_ERROR (Status)) {
Status = gBS->StartImage (ImageHandle, NULL, NULL);
break;
}
}
- return EFI_SUCCESS;
+ FreePool (FvHandleBuffer);
+ return Status;
}
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel