Skip to content

Commit

Permalink
OvmfPkg: LoadLinuxLib: Zero kernel parameters instead of passing garbage
Browse files Browse the repository at this point in the history
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]>

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14052 6f19259b-4bc3-4df7-8a09-765794883524
  • Loading branch information
jljusten committed Jan 16, 2013
1 parent 38851e7 commit c61a56f
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 2 deletions.
22 changes: 21 additions & 1 deletion OvmfPkg/Include/Library/LoadLinuxLib.h
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -94,6 +94,26 @@ LoadLinuxAllocateKernelSetupPages (
);


/**
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.
Expand Down
28 changes: 28 additions & 0 deletions OvmfPkg/Library/LoadLinuxLib/Linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,34 @@ LoadLinuxAllocateKernelSetupPages (
}
}

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
Expand Down
7 changes: 6 additions & 1 deletion OvmfPkg/Library/PlatformBdsLib/QemuKernel.c
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -78,6 +78,11 @@ TryRunningQemuKernel (
goto FreeAndReturn;
}

Status = LoadLinuxInitializeKernelSetup (SetupBuf);
if (EFI_ERROR (Status)) {
goto FreeAndReturn;
}

KernelInitialSize = LoadLinuxGetKernelSize (SetupBuf, KernelSize);
if (KernelInitialSize == 0) {
Status = EFI_UNSUPPORTED;
Expand Down

0 comments on commit c61a56f

Please sign in to comment.