summaryrefslogtreecommitdiff
path: root/OvmfPkg/Library/LoadLinuxLib/Linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'OvmfPkg/Library/LoadLinuxLib/Linux.c')
-rw-r--r--OvmfPkg/Library/LoadLinuxLib/Linux.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/OvmfPkg/Library/LoadLinuxLib/Linux.c b/OvmfPkg/Library/LoadLinuxLib/Linux.c
index 1da5507ff1..862698a39e 100644
--- a/OvmfPkg/Library/LoadLinuxLib/Linux.c
+++ b/OvmfPkg/Library/LoadLinuxLib/Linux.c
@@ -604,14 +604,11 @@ SetupGraphics (
STATIC
EFI_STATUS
SetupLinuxBootParams (
- IN VOID *Kernel,
IN OUT struct boot_params *Bp
)
{
SetupGraphics (Bp);
- Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;
-
SetupLinuxMemmap (Bp);
return EFI_SUCCESS;
@@ -644,7 +641,18 @@ LoadLinux (
InitLinuxDescriptorTables ();
- SetupLinuxBootParams (Kernel, (struct boot_params*) KernelSetup);
+ Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;
+ if (Bp->hdr.version >= 0x20b && Bp->hdr.handover_offset &&
+ (Bp->hdr.load_flags & (sizeof(long) >> 1))) {
+ DEBUG ((EFI_D_INFO, "Jumping to kernel EFI handover point at ofs %x\n", Bp->hdr.handover_offset));
+
+ DisableInterrupts ();
+ JumpToUefiKernel ((VOID*) gImageHandle, (VOID*) gST, KernelSetup, Kernel);
+ }
+ //
+ // Old kernels without EFI handover protocol
+ //
+ SetupLinuxBootParams (KernelSetup);
DEBUG ((EFI_D_INFO, "Jumping to kernel\n"));
DisableInterrupts ();