Revision: 14052
          http://edk2.svn.sourceforge.net/edk2/?rev=14052&view=rev
Author:   jljusten
Date:     2013-01-16 06:49:45 +0000 (Wed, 16 Jan 2013)
Log Message:
-----------
OvmfPkg: LoadLinuxLib: Zero kernel parameters instead of passing garbage

We're supposed to zero everything in the kernel bootparams that we don't
explicitly initialise, other than the setup_header from 0x1f1 onwards
for a precisely defined length, which is copied from the bzImage.

We're *not* supposed to just pass the garbage that we happened to find
in the bzImage file surrounding the setup_header.

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/Include/Library/LoadLinuxLib.h
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c
    trunk/edk2/OvmfPkg/Library/PlatformBdsLib/QemuKernel.c

Modified: trunk/edk2/OvmfPkg/Include/Library/LoadLinuxLib.h
===================================================================
--- trunk/edk2/OvmfPkg/Include/Library/LoadLinuxLib.h   2013-01-16 06:49:27 UTC 
(rev 14051)
+++ trunk/edk2/OvmfPkg/Include/Library/LoadLinuxLib.h   2013-01-16 06:49:45 UTC 
(rev 14052)
@@ -1,7 +1,7 @@
 /** @file
   Load/boot UEFI Linux.
 
-  Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2011 - 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
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -95,6 +95,26 @@
 
 
 /**
+  Clears the uninitialised space before and after the struct setup_header
+  in the kernel setup image. The kernel requires that these be zeroed
+  unless explicitly initialised, so this function should be called after
+  the setup_header has been copied in from a bzImage, before setting up
+  anything else.
+
+  @param[in]     KernelSetup - The kernel setup image
+
+  @retval    EFI_SUCCESS - The Linux kernel setup was successfully initialized
+  @retval    EFI_INVALID_PARAMETER - KernelSetup was NULL
+  @retval    EFI_UNSUPPORTED - The Linux kernel is not supported
+
+**/
+EFI_STATUS
+EFIAPI
+LoadLinuxInitializeKernelSetup (
+  IN VOID        *KernelSetup
+  );
+
+/**
   Allocates pages for the kernel.
 
   @param[in]     KernelSetup - The kernel setup image

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c     2013-01-16 06:49:27 UTC 
(rev 14051)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c     2013-01-16 06:49:45 UTC 
(rev 14052)
@@ -119,7 +119,35 @@
   }
 }
 
+EFI_STATUS
+EFIAPI
+LoadLinuxInitializeKernelSetup (
+  IN VOID        *KernelSetup
+  )
+{
+  EFI_STATUS                Status;
+  UINTN                     SetupEnd;
+  struct boot_params        *Bp;
 
+  Status = BasicKernelSetupCheck (KernelSetup);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Bp = (struct boot_params*) KernelSetup;
+
+  SetupEnd = 0x202 + (Bp->hdr.jump & 0xff);
+
+  //
+  // Clear all but the setup_header
+  //
+  ZeroMem (KernelSetup, 0x1f1);
+  ZeroMem (((UINT8 *)KernelSetup) + SetupEnd, 4096 - SetupEnd);
+  DEBUG ((EFI_D_INFO, "Cleared kernel setup 0-0x1f1, 0x%x-0x1000\n", 
SetupEnd));
+
+  return EFI_SUCCESS;
+}
+
 VOID*
 EFIAPI
 LoadLinuxAllocateKernelPages (

Modified: trunk/edk2/OvmfPkg/Library/PlatformBdsLib/QemuKernel.c
===================================================================
--- trunk/edk2/OvmfPkg/Library/PlatformBdsLib/QemuKernel.c      2013-01-16 
06:49:27 UTC (rev 14051)
+++ trunk/edk2/OvmfPkg/Library/PlatformBdsLib/QemuKernel.c      2013-01-16 
06:49:45 UTC (rev 14052)
@@ -1,6 +1,6 @@
 /** @file
 
-  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
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -78,6 +78,11 @@
     goto FreeAndReturn;
   }
 
+  Status = LoadLinuxInitializeKernelSetup (SetupBuf);
+  if (EFI_ERROR (Status)) {
+    goto FreeAndReturn;
+  }
+
   KernelInitialSize = LoadLinuxGetKernelSize (SetupBuf, KernelSize);
   if (KernelInitialSize == 0) {
     Status = EFI_UNSUPPORTED;

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


------------------------------------------------------------------------------
Master Java SE, Java EE, Eclipse, Spring, Hibernate, JavaScript, jQuery
and much more. Keep your Java skills current with LearnJavaNow -
200+ hours of step-by-step video tutorials by Java experts.
SALE $49.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122612 
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to