Some comments:

On 10/20/12 00:38, Jordan Justen wrote:

> +
> +
> +VOID
> +SetupLinuxMemmap (
> +  struct boot_params        *Bp
> +  )

could be STATIC I think

> +{
> +  EFI_STATUS                           Status;
> +  UINT8                                TmpMemoryMap[1];
> +  UINTN                                MapKey;
> +  UINTN                                DescriptorSize;
> +  UINT32                               DescriptorVersion;
> +  UINTN                                MemoryMapSize;
> +  EFI_MEMORY_DESCRIPTOR                *MemoryMap;
> +  EFI_MEMORY_DESCRIPTOR                *MemoryMapPtr;
> +  UINTN                                Index;
> +  struct efi_info                      *Efi;
> +  struct e820_entry                    *E820Map;
> +  UINTN                                E820EntryCount;
> +
> +  //
> +  // Get System MemoryMapSize
> +  //
> +  MemoryMapSize = sizeof (TmpMemoryMap);
> +  Status = gBS->GetMemoryMap (
> +                  &MemoryMapSize,
> +                  (EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap,
> +                  &MapKey,
> +                  &DescriptorSize,
> +                  &DescriptorVersion
> +                  );
> +  ASSERT (Status == EFI_BUFFER_TOO_SMALL);
> +  //
> +  // Enlarge space here, because we will allocate pool now.
> +  //
> +  MemoryMapSize += EFI_PAGE_SIZE;

Ah. The spec explains the enlargement. The allocation of the target
buffer itself may increase the map size.

> +  MemoryMap = AllocatePool (MemoryMapSize);
> +  ASSERT (MemoryMap != NULL);
> +
> +  //
> +  // Get System MemoryMap
> +  //
> +  Status = gBS->GetMemoryMap (
> +                  &MemoryMapSize,
> +                  MemoryMap,
> +                  &MapKey,
> +                  &DescriptorSize,
> +                  &DescriptorVersion
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  E820Map = &Bp->e820_map[0];
> +  E820EntryCount = 0;
> +  MemoryMapPtr = MemoryMap;
> +  for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) {

<pedantic>

I think you could also ensure that the loop not run out of e820_map
elements (128). Unlikely, admittedly...

Plus I think here we're modifying *Bp (the e820_map array is contained
in it), therefore Bp is an OUT parameter here. The prototypes of
SetupLinuxBootParams() and LoadLinux() should be probably modified
accordingly.

</pedantic>

> +    UINTN E820Type = 0;
> +
> +    switch(MemoryMap->Type) {
> +    case EfiReservedMemoryType:
> +    case EfiRuntimeServicesCode:
> +    case EfiRuntimeServicesData:
> +    case EfiMemoryMappedIO:
> +    case EfiMemoryMappedIOPortSpace:
> +    case EfiPalCode:
> +      E820Type = E820_RESERVED;
> +      break;
> +
> +    case EfiUnusableMemory:
> +      E820Type = E820_UNUSABLE;
> +      break;
> +
> +    case EfiACPIReclaimMemory:
> +      E820Type = E820_ACPI;
> +      break;
> +
> +    case EfiLoaderCode:
> +    case EfiLoaderData:
> +    case EfiBootServicesCode:
> +    case EfiBootServicesData:
> +    case EfiConventionalMemory:
> +      E820Type = E820_RAM;
> +      break;
> +
> +    case EfiACPIMemoryNVS:
> +      E820Type = E820_NVS;
> +      break;
> +
> +    default:
> +      DEBUG ((
> +        EFI_D_ERROR,
> +        "Invalid EFI memory descriptor type (0x%x)!\n",
> +        MemoryMap->Type
> +        ));
> +      continue;
> +    }
> +
> +    E820Map->addr = MemoryMap->PhysicalStart;
> +    E820Map->size = MemoryMap->NumberOfPages << EFI_PAGE_SHIFT;
> +    E820Map->type = (UINT32) E820Type;
> +    E820Map++;
> +    E820EntryCount++;
> +
> +    //
> +    // Get next item
> +    //
> +    MemoryMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryMap + DescriptorSize);
> +  }
> +  Bp->e820_entries = (UINT8) E820EntryCount;
> +
> +  Efi = &Bp->efi_info;
> +  Efi->efi_systab = (UINT32)(UINTN) gST;
> +  Efi->efi_memdesc_size = (UINT32) DescriptorSize;
> +  Efi->efi_memdesc_version = DescriptorVersion;
> +  Efi->efi_memmap = (UINT32)(UINTN) MemoryMapPtr;
> +  Efi->efi_memmap_size = (UINT32) MemoryMapSize;
> +  Efi->efi_systab_hi = ((UINT64)(UINTN) gST) >> 32;
> +  Efi->efi_memmap_hi = ((UINT64)(UINTN) MemoryMapPtr) >> 32;
> +#ifdef MDE_CPU_IA32
> +  Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '3', '2');
> +#else
> +  Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '6', '4');
> +#endif
> +
> +  //gBS->RaiseTPL (TPL_HIGH_LEVEL);
> +  gBS->ExitBootServices (gImageHandle, MapKey);
> +}
> +


> +
> +EFI_STATUS
> +EFIAPI
> +LoadLinuxSetCommandLine (
> +  IN VOID        *KernelSetup,
> +  IN CHAR8       *CommandLine
> +  )
> +{
> +  struct boot_params     *Bp;
> +
> +  Bp = (struct boot_params*) KernelSetup;
> +
> +  Bp->hdr.cmd_line_ptr = (UINT32)(UINTN) CommandLine;
> +
> +  return EFI_SUCCESS;
> +}

In fact KernelSetup should be OUT (or IN/OUT) here.


> +
> +
> +EFI_STATUS
> +EFIAPI
> +LoadLinuxSetInitrd (
> +  IN VOID        *KernelSetup,
> +  IN VOID        *Initrd,
> +  IN UINTN       InitrdSize
> +  )
> +{
> +  struct boot_params     *Bp;
> +
> +  Bp = (struct boot_params*) KernelSetup;
> +
> +  Bp->hdr.ramdisk_start = (UINT32)(UINTN) Initrd;
> +  Bp->hdr.ramdisk_len = (UINT32) InitrdSize;
> +  Bp->hdr.ramdisk_max = Bp->hdr.ramdisk_start + Bp->hdr.ramdisk_len;
> +
> +  return EFI_SUCCESS;
> +}

Same.

Plus these two functions return constant EFI_SUCCESS, and don't check
for support level (the header documents EFI_UNSUPPORTED too).

> +
> +
> +STATIC
> +EFI_STATUS
> +SetupLinuxBootParams (
> +  IN VOID                   *Kernel,
> +  IN struct boot_params     *Bp

"OUT"

> +  )
> +{
> +  Bp->alt_mem_k = SIZE_32KB;
> +
> +  ZeroMem ((VOID*)&Bp->screen_info, sizeof(Bp->screen_info));
> +
> +  Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;
> +
> +  SetupLinuxMemmap (Bp);
> +
> +  return EFI_SUCCESS;
> +}


> +
> +
> +/**
> +  Loads and boots UEFI Linux.
> +
> +  @param[in] BzImage - The main kernel image
> +  @param[in] BzImageSize - The main kernel image size
> +  @param[in] Initrd - The initial root disk image
> +  @param[in] InitrdSize - The initial root disk image size
> +  @param[in] CommandLine - The kernel command line

too many params documented

> +
> +  @retval    EFI_NOT_FOUND - The Linux kernel was not found
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LoadLinuxBzImage (
> +  IN VOID      *BzImage,
> +  IN UINTN     BzImageSize
> +  )
> +{
> +  EFI_STATUS          Status;
> +  struct boot_params  *Bp;
> +  VOID                *Kernel;
> +  VOID                *KernelSetup;
> +  UINTN               SetupSize;

Maybe check if BzImageSize >= sizeof (*Bp)?

> +  Bp = (struct boot_params *) BzImage;
> +
> +  SetupSize = (Bp->hdr.setup_secs + 1) * 512;
> +
> +  if (SetupSize > BzImageSize) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = LoadLinuxCheckKernelSetup (BzImage, SetupSize);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  KernelSetup = LoadLinuxAllocateKernelSetupPages (EFI_SIZE_TO_PAGES 
> (SetupSize));
> +  if (KernelSetup == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +  CopyMem (KernelSetup, BzImage, SetupSize);
> +
> +  Bp = (struct boot_params *) KernelSetup;
> +
> +  Kernel = LoadLinuxAllocateKernelPages (Bp, EFI_SIZE_TO_PAGES (SIZE_8MB));
> +  if (Kernel == NULL) {
> +    FreePages (KernelSetup, EFI_SIZE_TO_PAGES (SetupSize));
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +  CopyMem (Kernel, (VOID*) ((UINTN)BzImage + SetupSize), BzImageSize - 
> SetupSize);

(Pedantic again) We could compare (BzImageSize - SetupSize) against
SIZE_8MB first.

> +
> +  return LoadLinux (Kernel, KernelSetup);
> +}
> +
> +

I'll continue from here later.

Thanks
Laszlo


> +/**
> +  Loads and boots UEFI Linux.
> +
> +  @param[in] Kernel - The main kernel image
> +  @param[in] KernelSetup - The kernel setup image
> +  @param[in] CommandLine - The kernel command line
> +
> +  @retval    EFI_NOT_FOUND - The Linux kernel was not found
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LoadLinux (
> +  IN VOID      *Kernel,
> +  IN VOID      *KernelSetup
> +  )
> +{
> +  struct boot_params  *Bp;
> +
> +  Bp = (struct boot_params *) KernelSetup;
> +
> +  if (Bp->hdr.version < 0x205) {
> +    //
> +    // We only support relocatable kernels
> +    //
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  InitLinuxDescriptorTables ();
> +
> +  SetupLinuxBootParams (Kernel, (struct boot_params*) KernelSetup);
> +
> +  DEBUG ((EFI_D_INFO, "Jumping to kernel\n"));
> +  DisableInterrupts ();
> +  SetLinuxDescriptorTables ();
> +  JumpToKernel (Kernel, (VOID*) KernelSetup);
> +
> +  return EFI_SUCCESS;
> +}
> +
> diff --git a/OvmfPkg/Library/LoadLinuxLib/LinuxGdt.c 
> b/OvmfPkg/Library/LoadLinuxLib/LinuxGdt.c
> new file mode 100644
> index 0000000..653adcf
> --- /dev/null
> +++ b/OvmfPkg/Library/LoadLinuxLib/LinuxGdt.c
> @@ -0,0 +1,200 @@
> +/** @file
> +  Initialize GDT for Linux.
> +
> +  Copyright (c) 2006 - 2012, 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
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +
> +**/
> +
> +#include "LoadLinuxLib.h"
> +
> +
> +//
> +// Local structure definitions
> +//
> +
> +#pragma pack (1)
> +
> +//
> +// Global Descriptor Entry structures
> +//
> +
> +typedef struct _GDT_ENTRY {
> +  UINT16 Limit15_0;
> +  UINT16 Base15_0;
> +  UINT8  Base23_16;
> +  UINT8  Type;
> +  UINT8  Limit19_16_and_flags;
> +  UINT8  Base31_24;
> +} GDT_ENTRY;
> +
> +typedef
> +struct _GDT_ENTRIES {
> +  GDT_ENTRY Null;
> +  GDT_ENTRY Null2;
> +  GDT_ENTRY Linear;
> +  GDT_ENTRY LinearCode;
> +  GDT_ENTRY TaskSegment;
> +  GDT_ENTRY Spare4;
> +  GDT_ENTRY Spare5;
> +} GDT_ENTRIES;
> +
> +#pragma pack ()
> +
> +#define NULL_SEL          OFFSET_OF (GDT_ENTRIES, Null)
> +#define LINEAR_SEL        OFFSET_OF (GDT_ENTRIES, Linear)
> +#define LINEAR_CODE_SEL   OFFSET_OF (GDT_ENTRIES, LinearCode)
> +#define SYS_DATA_SEL      OFFSET_OF (GDT_ENTRIES, SysData)
> +#define SYS_CODE_SEL      OFFSET_OF (GDT_ENTRIES, SysCode)
> +#define LINEAR_CODE64_SEL OFFSET_OF (GDT_ENTRIES, LinearCode64)
> +#define SPARE4_SEL        OFFSET_OF (GDT_ENTRIES, Spare4)
> +#define SPARE5_SEL        OFFSET_OF (GDT_ENTRIES, Spare5)
> +
> +#if defined (MDE_CPU_IA32)
> +#define CPU_CODE_SEL LINEAR_CODE_SEL
> +#define CPU_DATA_SEL LINEAR_SEL
> +#elif defined (MDE_CPU_X64)
> +#define CPU_CODE_SEL LINEAR_CODE64_SEL
> +#define CPU_DATA_SEL LINEAR_SEL
> +#else
> +#error CPU type not supported for CPU GDT initialization!
> +#endif
> +
> +STATIC GDT_ENTRIES *mGdt = NULL;
> +
> +//
> +// Global descriptor table (GDT) Template
> +//
> +STATIC GDT_ENTRIES GdtTemplate = {
> +  //
> +  // NULL_SEL
> +  //
> +  {
> +    0x0,            // limit 15:0
> +    0x0,            // base 15:0
> +    0x0,            // base 23:16
> +    0x0,            // type
> +    0x0,            // limit 19:16, flags
> +    0x0,            // base 31:24
> +  },
> +  //
> +  // NULL_SEL
> +  //
> +  {
> +    0x0,            // limit 15:0
> +    0x0,            // base 15:0
> +    0x0,            // base 23:16
> +    0x0,            // type
> +    0x0,            // limit 19:16, flags
> +    0x0,            // base 31:24
> +  },
> +  //
> +  // LINEAR_CODE_SEL
> +  //
> +  {
> +    0x0FFFF,        // limit 0xFFFFF
> +    0x0,            // base 0
> +    0x0,
> +    0x09A,          // present, ring 0, data, expand-up, writable
> +    0x0CF,          // page-granular, 32-bit
> +    0x0,
> +  },
> +  //
> +  // LINEAR_SEL
> +  //
> +  {
> +    0x0FFFF,        // limit 0xFFFFF
> +    0x0,            // base 0
> +    0x0,
> +    0x092,          // present, ring 0, data, expand-up, writable
> +    0x0CF,          // page-granular, 32-bit
> +    0x0,
> +  },
> +  //
> +  // TASK_SEL
> +  //
> +  {
> +    0x0,            // limit 0
> +    0x0,            // base 0
> +    0x0,
> +    0x089,          // ?
> +    0x080,          // ?
> +    0x0,
> +  },
> +  //
> +  // SPARE4_SEL
> +  //
> +  {
> +    0x0,            // limit 0
> +    0x0,            // base 0
> +    0x0,
> +    0x0,            // present, ring 0, data, expand-up, writable
> +    0x0,            // page-granular, 32-bit
> +    0x0,
> +  },
> +  //
> +  // SPARE5_SEL
> +  //
> +  {
> +    0x0,            // limit 0
> +    0x0,            // base 0
> +    0x0,
> +    0x0,            // present, ring 0, data, expand-up, writable
> +    0x0,            // page-granular, 32-bit
> +    0x0,
> +  },
> +};
> +
> +/**
> +  Initialize Global Descriptor Table.
> +
> +**/
> +VOID
> +InitLinuxDescriptorTables (
> +  VOID
> +  )
> +{
> +  //
> +  // Allocate Runtime Data for the GDT
> +  //
> +  mGdt = AllocateRuntimePool (sizeof (GdtTemplate) + 8);
> +  ASSERT (mGdt != NULL);
> +  mGdt = ALIGN_POINTER (mGdt, 8);
> +
> +  //
> +  // Initialize all GDT entries
> +  //
> +  CopyMem (mGdt, &GdtTemplate, sizeof (GdtTemplate));
> +
> +}
> +
> +/**
> +  Initialize Global Descriptor Table.
> +
> +**/
> +VOID
> +SetLinuxDescriptorTables (
> +  VOID
> +  )
> +{
> +  IA32_DESCRIPTOR GdtPtr;
> +  IA32_DESCRIPTOR IdtPtr;
> +
> +  //
> +  // Write GDT register
> +  //
> +  GdtPtr.Base = (UINT32)(UINTN)(VOID*) mGdt;
> +  GdtPtr.Limit = (UINT16) (sizeof (GdtTemplate) - 1);
> +  AsmWriteGdtr (&GdtPtr);
> +
> +  IdtPtr.Base = (UINT32) 0;
> +  IdtPtr.Limit = (UINT16) 0;
> +  AsmWriteIdtr (&IdtPtr);
> +}
> +
> diff --git a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h 
> b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
> new file mode 100644
> index 0000000..49abb8c
> --- /dev/null
> +++ b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
> @@ -0,0 +1,48 @@
> +/** @file
> +  Boot UEFI Linux.
> +
> +  Copyright (c) 2008 - 2011, 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
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +
> +**/
> +
> +#ifndef _LOAD_LINUX_LIB_INCLUDED_
> +#define _LOAD_LINUX_LIB_INCLUDED_
> +
> +#include <Uefi.h>
> +#include <Library/LoadLinuxLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +
> +#include <IndustryStandard/LinuxBzimage.h>
> +
> +VOID
> +EFIAPI
> +JumpToKernel (
> +  VOID *KernelStart,
> +  VOID *KernelBootParams
> +  );
> +
> +VOID
> +InitLinuxDescriptorTables (
> +  VOID
> +  );
> +
> +VOID
> +SetLinuxDescriptorTables (
> +  VOID
> +  );
> +
> +#endif
> +
> diff --git a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf 
> b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf
> new file mode 100644
> index 0000000..b8f987c
> --- /dev/null
> +++ b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf
> @@ -0,0 +1,50 @@
> +## @file
> +#
> +#  Copyright (c) 2008 - 2012, 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
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = LoadLinuxLib
> +  FILE_GUID                      = eaec1915-65a0-43a9-bf0b-a76438da61db
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = LoadLinuxLib
> +
> +#
> +# The following information is for reference only and not required by the 
> build tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64
> +#
> +
> +[Sources.common]
> +  Linux.c
> +  LinuxGdt.c
> +
> +[Sources.IA32]
> +  Ia32/JumpToKernel.asm
> +  Ia32/JumpToKernel.S
> +
> +[Sources.X64]
> +  X64/JumpToKernel.asm
> +  X64/JumpToKernel.S
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  OvmfPkg/OvmfPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  DebugLib
> +  MemoryAllocationLib
> +  BaseMemoryLib
> +
> diff --git a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S 
> b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
> new file mode 100644
> index 0000000..9ae755b
> --- /dev/null
> +++ b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
> @@ -0,0 +1,30 @@
> +#------------------------------------------------------------------------------
> +#
> +# Copyright (c) 2006 - 2011, 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
> +# http://opensource.org/licenses/bsd-license.php.
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +#
> +#------------------------------------------------------------------------------
> +
> +ASM_GLOBAL ASM_PFX(JumpToKernel)
> +
> +#------------------------------------------------------------------------------
> +# VOID
> +# EFIAPI
> +# JumpToKernel (
> +#   VOID *KernelStart,         // %rcx
> +#   VOID *KernelBootParams     // %rdx
> +#   );
> +#------------------------------------------------------------------------------
> +ASM_PFX(JumpToKernel):
> +    movq    %rdx, %rsi
> +    addq    $0x200, %rcx
> +    callq   %rcx
> +    ret
> +
> diff --git a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm 
> b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm
> new file mode 100644
> index 0000000..ed53321
> --- /dev/null
> +++ b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm
> @@ -0,0 +1,34 @@
> +;------------------------------------------------------------------------------
> +;
> +; Copyright (c) 2006 - 2012, 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
> +; http://opensource.org/licenses/bsd-license.php.
> +;
> +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +;
> +;------------------------------------------------------------------------------
> +
> +  .code
> +
> +;------------------------------------------------------------------------------
> +; VOID
> +; EFIAPI
> +; JumpToKernel (
> +;   VOID *KernelStart,         // rcx
> +;   VOID *KernelBootParams     // rdx
> +;   );
> +;------------------------------------------------------------------------------
> +JumpToKernel PROC
> +
> +    mov     rsi, rdx
> +    add     rcx, 200h
> +    call    rcx
> +    ret
> +
> +JumpToKernel ENDP
> +
> +END
> diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
> index bd86572..c99cee3 100644
> --- a/OvmfPkg/OvmfPkgIa32.dsc
> +++ b/OvmfPkg/OvmfPkgIa32.dsc
> @@ -98,6 +98,7 @@
>    
> SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.inf
>    QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf
>    VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf
> +  LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf
>    LockBoxLib|MdeModulePkg/Library/LockBoxNullLib/LockBoxNullLib.inf
>  
>  !ifdef $(SOURCE_DEBUG_ENABLE)
> diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
> index 0a1609f..9173aae 100644
> --- a/OvmfPkg/OvmfPkgIa32X64.dsc
> +++ b/OvmfPkg/OvmfPkgIa32X64.dsc
> @@ -103,6 +103,7 @@
>    
> SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.inf
>    QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf
>    VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf
> +  LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf
>    LockBoxLib|MdeModulePkg/Library/LockBoxNullLib/LockBoxNullLib.inf
>  
>  !ifdef $(SOURCE_DEBUG_ENABLE)
> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
> index b24d1b9..dce9ce1 100644
> --- a/OvmfPkg/OvmfPkgX64.dsc
> +++ b/OvmfPkg/OvmfPkgX64.dsc
> @@ -103,6 +103,7 @@
>    
> SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.inf
>    QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf
>    VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf
> +  LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf
>    LockBoxLib|MdeModulePkg/Library/LockBoxNullLib/LockBoxNullLib.inf
>  
>  !ifdef $(SOURCE_DEBUG_ENABLE)


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to