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