Revision: 14132
          http://edk2.svn.sourceforge.net/edk2/?rev=14132&view=rev
Author:   jljusten
Date:     2013-02-14 19:21:39 +0000 (Thu, 14 Feb 2013)
Log Message:
-----------
OvmfPkg LoadLinuxLib: Use kernel's EFI entry point where available

Usage of the EFI entry point was made feasible in the kernel
x64 boot protocol 2.12 where a 32-bit & 64-bit entry point
became well defined.

http://git.kernel.org/linus/09c205af

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: David Woodhouse <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>

Modified Paths:
--------------
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S 2013-02-14 
19:21:12 UTC (rev 14131)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S 2013-02-14 
19:21:39 UTC (rev 14132)
@@ -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 @@
     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
+

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm       
2013-02-14 19:21:12 UTC (rev 14131)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm       
2013-02-14 19:21:39 UTC (rev 14132)
@@ -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 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

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c     2013-02-14 19:21:12 UTC 
(rev 14131)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c     2013-02-14 19:21:39 UTC 
(rev 14132)
@@ -604,14 +604,11 @@
 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,8 +641,20 @@
 
   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.load_flags & (sizeof (UINTN) == 4 ? BIT2 : BIT3))) {
+    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 ();
   SetLinuxDescriptorTables ();

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h      2013-02-14 
19:21:12 UTC (rev 14131)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h      2013-02-14 
19:21:39 UTC (rev 14132)
@@ -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 @@
   );
 
 VOID
+EFIAPI
+JumpToUefiKernel (
+  EFI_HANDLE ImageHandle,
+  EFI_SYSTEM_TABLE *SystemTable,
+  VOID *KernelBootParams,
+  VOID *KernelStart
+  );
+
+VOID
 InitLinuxDescriptorTables (
   VOID
   );

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S  2013-02-14 
19:21:12 UTC (rev 14131)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S  2013-02-14 
19:21:39 UTC (rev 14132)
@@ -13,6 +13,7 @@
 #------------------------------------------------------------------------------
 
 ASM_GLOBAL ASM_PFX(JumpToKernel)
+ASM_GLOBAL ASM_PFX(JumpToUefiKernel)
 
 #------------------------------------------------------------------------------
 # VOID
@@ -67,3 +68,24 @@
     ret
 .code64
 
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# JumpToUefiKernel (
+#   EFI_HANDLE ImageHandle,        // rcx
+#   EFI_SYSTEM_TABLE *SystemTable, // rdx
+#   VOID *KernelBootParams,        // r8
+#   VOID *KernelStart              // r9
+#   );
+#------------------------------------------------------------------------------
+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
+

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm        
2013-02-14 19:21:12 UTC (rev 14131)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm        
2013-02-14 19:21:39 UTC (rev 14132)
@@ -68,4 +68,28 @@
 
 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

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013 
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to