Take 2. This time the corresponding flags have actually been merged into
the Linux x86 maintainers' git tree.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: David Woodhouse <[email protected]>
---
 OvmfPkg/Include/IndustryStandard/LinuxBzimage.h    |  3 ++-
 OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S   | 19 ++++++++++++++++-
 OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm | 21 ++++++++++++++++++-
 OvmfPkg/Library/LoadLinuxLib/Linux.c               | 16 +++++++++++----
 OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h        | 11 +++++++++-
 OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S    | 22 ++++++++++++++++++++
 OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm  | 24 ++++++++++++++++++++++
 7 files changed, 108 insertions(+), 8 deletions(-)

diff --git a/OvmfPkg/Include/IndustryStandard/LinuxBzimage.h 
b/OvmfPkg/Include/IndustryStandard/LinuxBzimage.h
index d16b112..29362de 100644
--- a/OvmfPkg/Include/IndustryStandard/LinuxBzimage.h
+++ b/OvmfPkg/Include/IndustryStandard/LinuxBzimage.h
@@ -55,7 +55,8 @@ struct setup_header {
        UINT32 ramdisk_max;    /* Highest legal initrd address */
        UINT32 kernel_alignment; /* Physical addr alignment required for kernel 
*/
        UINT8 relocatable_kernel; /* Whether kernel is relocatable or not */
-       UINT8 _pad2[3];
+       UINT8 min_alignment;
+       UINT16 xloadflags;
        UINT32 cmdline_size;
        UINT32 hardware_subarch;
        UINT64 hardware_subarch_data;
diff --git a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S 
b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S
index b8cd4ca..f7440f7 100644
--- a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S
+++ b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S
@@ -1,6 +1,6 @@
 #------------------------------------------------------------------------------
 #
-# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
 #
 # This program and the accompanying materials
 # are licensed and made available under the terms and conditions of the BSD 
License
@@ -13,6 +13,7 @@
 #------------------------------------------------------------------------------
 
 ASM_GLOBAL ASM_PFX(JumpToKernel)
+ASM_GLOBAL ASM_PFX(JumpToUefiKernel)
 
 #------------------------------------------------------------------------------
 # VOID
@@ -27,3 +28,19 @@ ASM_PFX(JumpToKernel):
     calll   0x4(%esp)
     ret
 
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# JumpToUefiKernel (
+#   EFI_HANDLE ImageHandle,
+#   EFI_SYSTEM_TABLE *SystemTable,
+#   VOID *KernelBootParams,
+#   VOID *KernelStart
+#   );
+#------------------------------------------------------------------------------
+ASM_PFX(JumpToUefiKernel):
+    movl    0xc(%esp), %eax
+    movl    0x264(%eax), %eax
+    addl    0x10(%esp), %eax
+    jmp     %eax
+
diff --git a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm 
b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm
index a8f3965..21d0c4e 100644
--- a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm
+++ b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------
 ;
-; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
 ;
 ; This program and the accompanying materials
 ; are licensed and made available under the terms and conditions of the BSD 
License
@@ -32,4 +32,23 @@ JumpToKernel PROC
 
 JumpToKernel ENDP
 
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; JumpToUefiKernel (
+;   EFI_HANDLE ImageHandle,
+;   EFI_SYSTEM_TABLE *SystemTable,
+;   VOID *KernelBootParams,
+;   VOID *KernelStart
+;   );
+;------------------------------------------------------------------------------
+JumpToUefiKernel PROC
+
+    mov     eax, [esp + 12]
+    mov     eax, [eax + 264h]
+    add     eax, [esp + 16]
+    jmp     eax
+
+JumpToUefiKernel ENDP
+
 END
diff --git a/OvmfPkg/Library/LoadLinuxLib/Linux.c 
b/OvmfPkg/Library/LoadLinuxLib/Linux.c
index 1da5507..d64b5bc 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 >= 0x20c && Bp->hdr.handover_offset &&
+      (Bp->hdr.xloadflags & sizeof(long))) {
+    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 ();
diff --git a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h 
b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
index f869797..045cbf9 100644
--- a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
+++ b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
@@ -1,7 +1,7 @@
 /** @file
   Boot UEFI Linux.
 
-  Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.<BR>
 
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
@@ -37,6 +37,15 @@ JumpToKernel (
   );
 
 VOID
+EFIAPI
+JumpToUefiKernel (
+  EFI_HANDLE ImageHandle,
+  EFI_SYSTEM_TABLE *SystemTable,
+  VOID *KernelBootParams,
+  VOID *KernelStart
+  );
+
+VOID
 InitLinuxDescriptorTables (
   VOID
   );
diff --git a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S 
b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
index edc6e7b..06d0a1f 100644
--- a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
+++ b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
@@ -13,6 +13,7 @@
 #------------------------------------------------------------------------------
 
 ASM_GLOBAL ASM_PFX(JumpToKernel)
+ASM_GLOBAL ASM_PFX(JumpToUefiKernel)
 
 #------------------------------------------------------------------------------
 # VOID
@@ -67,3 +68,24 @@ ASM_PFX(JumpToKernel):
     ret
 .code64
 
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# JumpToUefiKernel (
+#   EFI_HANDLE ImageHandle,
+#   EFI_SYSTEM_TABLE *SystemTable,
+#   VOID *KernelBootParams,
+#   VOID *KernelStart
+#   );
+#------------------------------------------------------------------------------
+ASM_PFX(JumpToUefiKernel):
+    movq    %rcx, %rdi
+    movq    %rdx, %rsi
+    movq    %r8, %rdx
+    xor     %rax, %rax
+    movl    0x264(%r8), %eax
+    addq    %rax, %r9
+    addq    $0x200, %r9
+    callq   %r9
+    ret
+
diff --git a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm 
b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm
index bcf6260..fc07eab 100644
--- a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm
+++ b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm
@@ -68,4 +68,28 @@ JumpToKernel PROC
 
 JumpToKernel ENDP
 
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; JumpToUefiKernel (
+;   EFI_HANDLE ImageHandle,        // rcx
+;   EFI_SYSTEM_TABLE *SystemTable, // rdx
+;   VOID *KernelBootParams         // r8
+;   VOID *KernelStart,             // r9
+;   );
+;------------------------------------------------------------------------------
+JumpToUefiKernel PROC
+
+    mov     rdi, rcx
+    mov     rsi, rdx
+    mov     rdx, r8
+    xor     rax, rax
+    mov     eax, [r8 + 264h]
+    add     r9, rax
+    add     r9, 200h
+    call    r9
+    ret
+
+JumpToUefiKernel ENDP
+
 END
-- 
1.8.0.2


-- 
dwmw2

Attachment: smime.p7s
Description: S/MIME cryptographic signature

------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. ON SALE this month only -- learn more at:
http://p.sf.net/sfu/learnnow-d2d
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to