OvmfPkg: Duplicate PlatformBdsLib to PlatformBootManagerLib
It will be changed to build with MdeModulePkg/BDS. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
1592
OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c
Normal file
1592
OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c
Normal file
File diff suppressed because it is too large
Load Diff
292
OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.h
Normal file
292
OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.h
Normal file
@ -0,0 +1,292 @@
|
|||||||
|
/** @file
|
||||||
|
Platform BDS customizations include file.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2007, 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.
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
BdsPlatform.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Head file for BDS Platform specific code
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
|
||||||
|
#define _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <PiDxe.h>
|
||||||
|
|
||||||
|
#include <IndustryStandard/Pci.h>
|
||||||
|
#include <IndustryStandard/Acpi.h>
|
||||||
|
#include <IndustryStandard/SmBios.h>
|
||||||
|
#include <IndustryStandard/PeImage.h>
|
||||||
|
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/BaseLib.h>
|
||||||
|
#include <Library/PcdLib.h>
|
||||||
|
#include <Library/PciLib.h>
|
||||||
|
#include <Library/GenericBdsLib.h>
|
||||||
|
#include <Library/PlatformBdsLib.h>
|
||||||
|
#include <Library/HobLib.h>
|
||||||
|
#include <Library/UefiLib.h>
|
||||||
|
#include <Library/DxeServicesTableLib.h>
|
||||||
|
#include <Library/DevicePathLib.h>
|
||||||
|
#include <Library/IoLib.h>
|
||||||
|
#include <Library/NvVarsFileLib.h>
|
||||||
|
#include <Library/QemuFwCfgLib.h>
|
||||||
|
|
||||||
|
#include <Protocol/Decompress.h>
|
||||||
|
#include <Protocol/PciIo.h>
|
||||||
|
#include <Protocol/FirmwareVolume2.h>
|
||||||
|
#include <Protocol/SimpleFileSystem.h>
|
||||||
|
#include <Protocol/PciRootBridgeIo.h>
|
||||||
|
#include <Protocol/S3SaveState.h>
|
||||||
|
#include <Protocol/DxeSmmReadyToLock.h>
|
||||||
|
|
||||||
|
#include <Guid/Acpi.h>
|
||||||
|
#include <Guid/SmBios.h>
|
||||||
|
#include <Guid/Mps.h>
|
||||||
|
#include <Guid/HobList.h>
|
||||||
|
#include <Guid/GlobalVariable.h>
|
||||||
|
#include <Guid/EventGroup.h>
|
||||||
|
|
||||||
|
#include <OvmfPlatforms.h>
|
||||||
|
|
||||||
|
extern BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
|
||||||
|
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[];
|
||||||
|
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformDriverOption[];
|
||||||
|
extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode;
|
||||||
|
extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode;
|
||||||
|
extern UART_DEVICE_PATH gUartDeviceNode;
|
||||||
|
extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#define VarConsoleInpDev L"ConInDev"
|
||||||
|
#define VarConsoleInp L"ConIn"
|
||||||
|
#define VarConsoleOutDev L"ConOutDev"
|
||||||
|
#define VarConsoleOut L"ConOut"
|
||||||
|
#define VarErrorOutDev L"ErrOutDev"
|
||||||
|
#define VarErrorOut L"ErrOut"
|
||||||
|
|
||||||
|
#define PCI_DEVICE_PATH_NODE(Func, Dev) \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
HARDWARE_DEVICE_PATH, \
|
||||||
|
HW_PCI_DP, \
|
||||||
|
{ \
|
||||||
|
(UINT8) (sizeof (PCI_DEVICE_PATH)), \
|
||||||
|
(UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \
|
||||||
|
} \
|
||||||
|
}, \
|
||||||
|
(Func), \
|
||||||
|
(Dev) \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PNPID_DEVICE_PATH_NODE(PnpId) \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
ACPI_DEVICE_PATH, \
|
||||||
|
ACPI_DP, \
|
||||||
|
{ \
|
||||||
|
(UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
|
||||||
|
(UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
|
||||||
|
}, \
|
||||||
|
}, \
|
||||||
|
EISA_PNP_ID((PnpId)), \
|
||||||
|
0 \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define gPciIsaBridge \
|
||||||
|
PCI_DEVICE_PATH_NODE(0, 0x1f)
|
||||||
|
|
||||||
|
#define gP2PBridge \
|
||||||
|
PCI_DEVICE_PATH_NODE(0, 0x1e)
|
||||||
|
|
||||||
|
#define gPnpPs2Keyboard \
|
||||||
|
PNPID_DEVICE_PATH_NODE(0x0303)
|
||||||
|
|
||||||
|
#define gPnp16550ComPort \
|
||||||
|
PNPID_DEVICE_PATH_NODE(0x0501)
|
||||||
|
|
||||||
|
#define gUart \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
MESSAGING_DEVICE_PATH, \
|
||||||
|
MSG_UART_DP, \
|
||||||
|
{ \
|
||||||
|
(UINT8) (sizeof (UART_DEVICE_PATH)), \
|
||||||
|
(UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
|
||||||
|
} \
|
||||||
|
}, \
|
||||||
|
0, \
|
||||||
|
115200, \
|
||||||
|
8, \
|
||||||
|
1, \
|
||||||
|
1 \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define gPcAnsiTerminal \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
MESSAGING_DEVICE_PATH, \
|
||||||
|
MSG_VENDOR_DP, \
|
||||||
|
{ \
|
||||||
|
(UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
|
||||||
|
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
|
||||||
|
} \
|
||||||
|
}, \
|
||||||
|
DEVICE_PATH_MESSAGING_PC_ANSI \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PCI_CLASS_SCC 0x07
|
||||||
|
#define PCI_SUBCLASS_SERIAL 0x00
|
||||||
|
#define PCI_IF_16550 0x02
|
||||||
|
#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
|
||||||
|
|
||||||
|
#define EFI_SYSTEM_TABLE_MAX_ADDRESS 0xFFFFFFFF
|
||||||
|
#define SYS_TABLE_PAD(ptr) (((~ptr) +1) & 0x07 )
|
||||||
|
|
||||||
|
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ACPI_HID_DEVICE_PATH PciRootBridge;
|
||||||
|
PCI_DEVICE_PATH IsaBridge;
|
||||||
|
ACPI_HID_DEVICE_PATH Keyboard;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL End;
|
||||||
|
} PLATFORM_DUMMY_ISA_KEYBOARD_DEVICE_PATH;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ACPI_HID_DEVICE_PATH PciRootBridge;
|
||||||
|
PCI_DEVICE_PATH IsaBridge;
|
||||||
|
ACPI_HID_DEVICE_PATH IsaSerial;
|
||||||
|
UART_DEVICE_PATH Uart;
|
||||||
|
VENDOR_DEVICE_PATH TerminalType;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL End;
|
||||||
|
} PLATFORM_DUMMY_ISA_SERIAL_DEVICE_PATH;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ACPI_HID_DEVICE_PATH PciRootBridge;
|
||||||
|
PCI_DEVICE_PATH VgaDevice;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL End;
|
||||||
|
} PLATFORM_DUMMY_PCI_VGA_DEVICE_PATH;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ACPI_HID_DEVICE_PATH PciRootBridge;
|
||||||
|
PCI_DEVICE_PATH PciBridge;
|
||||||
|
PCI_DEVICE_PATH SerialDevice;
|
||||||
|
UART_DEVICE_PATH Uart;
|
||||||
|
VENDOR_DEVICE_PATH TerminalType;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL End;
|
||||||
|
} PLATFORM_DUMMY_PCI_SERIAL_DEVICE_PATH;
|
||||||
|
|
||||||
|
//
|
||||||
|
// the short form device path for Usb keyboard
|
||||||
|
//
|
||||||
|
#define CLASS_HID 3
|
||||||
|
#define SUBCLASS_BOOT 1
|
||||||
|
#define PROTOCOL_KEYBOARD 1
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
USB_CLASS_DEVICE_PATH UsbClass;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL End;
|
||||||
|
} USB_CLASS_FORMAT_DEVICE_PATH;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Platform BDS Functions
|
||||||
|
//
|
||||||
|
|
||||||
|
VOID
|
||||||
|
PlatformBdsGetDriverOption (
|
||||||
|
IN LIST_ENTRY *BdsDriverLists
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
BdsMemoryTest (
|
||||||
|
EXTENDMEM_COVERAGE_LEVEL Level
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
PlatformBdsShowProgress (
|
||||||
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,
|
||||||
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,
|
||||||
|
CHAR16 *Title,
|
||||||
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,
|
||||||
|
UINTN Progress,
|
||||||
|
UINTN PreviousValue
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
PlatformBdsConnectSequence (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ProcessCapsules (
|
||||||
|
EFI_BOOT_MODE BootMode
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
PlatformBdsConnectConsole (
|
||||||
|
IN BDS_CONSOLE_CONNECT_ENTRY *PlatformConsole
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
PlatformBdsNoConsoleAction (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ConvertMpsTable (
|
||||||
|
IN OUT VOID **Table
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ConvertSmbiosTable (
|
||||||
|
IN OUT VOID **Table
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ConvertAcpiTable (
|
||||||
|
IN UINTN TableLen,
|
||||||
|
IN OUT VOID **Table
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ConvertSystemTable (
|
||||||
|
IN EFI_GUID *TableGuid,
|
||||||
|
IN OUT VOID **Table
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
PlatformBdsEnterFrontPage (
|
||||||
|
IN UINT16 TimeoutDefault,
|
||||||
|
IN BOOLEAN ConnectAllHappened
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Loads and boots UEFI Linux via the FwCfg interface.
|
||||||
|
|
||||||
|
@retval EFI_NOT_FOUND - The Linux kernel was not found
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
TryRunningQemuKernel (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif // _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
|
73
OvmfPkg/Library/PlatformBootManagerLib/PlatformBdsLib.inf
Normal file
73
OvmfPkg/Library/PlatformBootManagerLib/PlatformBdsLib.inf
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
## @file
|
||||||
|
# Platform BDS customizations library.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2007 - 2016, 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 = PlatformBdsLib
|
||||||
|
FILE_GUID = FB65006C-AC9F-4992-AD80-184B2BDBBD83
|
||||||
|
MODULE_TYPE = DXE_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
LIBRARY_CLASS = PlatformBdsLib|DXE_DRIVER
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following information is for reference only and not required by the build tools.
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||||
|
#
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
BdsPlatform.c
|
||||||
|
PlatformData.c
|
||||||
|
QemuKernel.c
|
||||||
|
BdsPlatform.h
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
|
||||||
|
OvmfPkg/OvmfPkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
BaseLib
|
||||||
|
MemoryAllocationLib
|
||||||
|
UefiBootServicesTableLib
|
||||||
|
BaseMemoryLib
|
||||||
|
DebugLib
|
||||||
|
PcdLib
|
||||||
|
GenericBdsLib
|
||||||
|
PciLib
|
||||||
|
NvVarsFileLib
|
||||||
|
QemuFwCfgLib
|
||||||
|
LoadLinuxLib
|
||||||
|
QemuBootOrderLib
|
||||||
|
UefiLib
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
|
||||||
|
|
||||||
|
[Pcd.IA32, Pcd.X64]
|
||||||
|
gEfiMdePkgTokenSpaceGuid.PcdFSBClock
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gEfiDecompressProtocolGuid
|
||||||
|
gEfiPciRootBridgeIoProtocolGuid
|
||||||
|
gEfiS3SaveStateProtocolGuid # PROTOCOL SOMETIMES_CONSUMED
|
||||||
|
gEfiDxeSmmReadyToLockProtocolGuid # PROTOCOL SOMETIMES_PRODUCED
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
gEfiEndOfDxeEventGroupGuid
|
||||||
|
gRootBridgesConnectedEventGroupGuid
|
51
OvmfPkg/Library/PlatformBootManagerLib/PlatformData.c
Normal file
51
OvmfPkg/Library/PlatformBootManagerLib/PlatformData.c
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/** @file
|
||||||
|
Defined the platform specific device path which will be used by
|
||||||
|
platform Bbd to perform the platform policy connect.
|
||||||
|
|
||||||
|
Copyright (c) 2004 - 2008, 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 "BdsPlatform.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Predefined platform default time out value
|
||||||
|
//
|
||||||
|
UINT16 gPlatformBootTimeOutDefault = 5;
|
||||||
|
|
||||||
|
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
|
||||||
|
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
|
||||||
|
UART_DEVICE_PATH gUartDeviceNode = gUart;
|
||||||
|
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Platform specific keyboard device path
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Predefined platform default console device path
|
||||||
|
//
|
||||||
|
BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
|
||||||
|
{
|
||||||
|
NULL,
|
||||||
|
0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Predefined platform specific driver option
|
||||||
|
//
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *gPlatformDriverOption[] = { NULL };
|
||||||
|
|
||||||
|
//
|
||||||
|
// Predefined platform connect sequence
|
||||||
|
//
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[] = { NULL };
|
||||||
|
|
170
OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
Normal file
170
OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
/** @file
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2015, 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 <Uefi.h>
|
||||||
|
|
||||||
|
#include <Library/BaseLib.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/LoadLinuxLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/QemuFwCfgLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/UefiLib.h>
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
TryRunningQemuKernel (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN KernelSize;
|
||||||
|
UINTN KernelInitialSize;
|
||||||
|
VOID *KernelBuf;
|
||||||
|
UINTN SetupSize;
|
||||||
|
VOID *SetupBuf;
|
||||||
|
UINTN CommandLineSize;
|
||||||
|
CHAR8 *CommandLine;
|
||||||
|
UINTN InitrdSize;
|
||||||
|
VOID* InitrdData;
|
||||||
|
|
||||||
|
SetupBuf = NULL;
|
||||||
|
SetupSize = 0;
|
||||||
|
KernelBuf = NULL;
|
||||||
|
KernelInitialSize = 0;
|
||||||
|
CommandLine = NULL;
|
||||||
|
CommandLineSize = 0;
|
||||||
|
InitrdData = NULL;
|
||||||
|
InitrdSize = 0;
|
||||||
|
|
||||||
|
if (!QemuFwCfgIsAvailable ()) {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
QemuFwCfgSelectItem (QemuFwCfgItemKernelSize);
|
||||||
|
KernelSize = (UINTN) QemuFwCfgRead64 ();
|
||||||
|
|
||||||
|
QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize);
|
||||||
|
SetupSize = (UINTN) QemuFwCfgRead64 ();
|
||||||
|
|
||||||
|
if (KernelSize == 0 || SetupSize == 0) {
|
||||||
|
DEBUG ((EFI_D_INFO, "qemu -kernel was not used.\n"));
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetupBuf = LoadLinuxAllocateKernelSetupPages (EFI_SIZE_TO_PAGES (SetupSize));
|
||||||
|
if (SetupBuf == NULL) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel setup!\n"));
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG ((EFI_D_INFO, "Setup size: 0x%x\n", (UINT32) SetupSize));
|
||||||
|
DEBUG ((EFI_D_INFO, "Reading kernel setup image ..."));
|
||||||
|
QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupData);
|
||||||
|
QemuFwCfgReadBytes (SetupSize, SetupBuf);
|
||||||
|
DEBUG ((EFI_D_INFO, " [done]\n"));
|
||||||
|
|
||||||
|
Status = LoadLinuxCheckKernelSetup (SetupBuf, SetupSize);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto FreeAndReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = LoadLinuxInitializeKernelSetup (SetupBuf);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto FreeAndReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
KernelInitialSize = LoadLinuxGetKernelSize (SetupBuf, KernelSize);
|
||||||
|
if (KernelInitialSize == 0) {
|
||||||
|
Status = EFI_UNSUPPORTED;
|
||||||
|
goto FreeAndReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
KernelBuf = LoadLinuxAllocateKernelPages (
|
||||||
|
SetupBuf,
|
||||||
|
EFI_SIZE_TO_PAGES (KernelInitialSize));
|
||||||
|
if (KernelBuf == NULL) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel!\n"));
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto FreeAndReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG ((EFI_D_INFO, "Kernel size: 0x%x\n", (UINT32) KernelSize));
|
||||||
|
DEBUG ((EFI_D_INFO, "Reading kernel image ..."));
|
||||||
|
QemuFwCfgSelectItem (QemuFwCfgItemKernelData);
|
||||||
|
QemuFwCfgReadBytes (KernelSize, KernelBuf);
|
||||||
|
DEBUG ((EFI_D_INFO, " [done]\n"));
|
||||||
|
|
||||||
|
QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize);
|
||||||
|
CommandLineSize = (UINTN) QemuFwCfgRead64 ();
|
||||||
|
|
||||||
|
if (CommandLineSize > 0) {
|
||||||
|
CommandLine = LoadLinuxAllocateCommandLinePages (
|
||||||
|
EFI_SIZE_TO_PAGES (CommandLineSize));
|
||||||
|
QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData);
|
||||||
|
QemuFwCfgReadBytes (CommandLineSize, CommandLine);
|
||||||
|
} else {
|
||||||
|
CommandLine = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = LoadLinuxSetCommandLine (SetupBuf, CommandLine);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto FreeAndReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize);
|
||||||
|
InitrdSize = (UINTN) QemuFwCfgRead64 ();
|
||||||
|
|
||||||
|
if (InitrdSize > 0) {
|
||||||
|
InitrdData = LoadLinuxAllocateInitrdPages (
|
||||||
|
SetupBuf,
|
||||||
|
EFI_SIZE_TO_PAGES (InitrdSize)
|
||||||
|
);
|
||||||
|
DEBUG ((EFI_D_INFO, "Initrd size: 0x%x\n", (UINT32) InitrdSize));
|
||||||
|
DEBUG ((EFI_D_INFO, "Reading initrd image ..."));
|
||||||
|
QemuFwCfgSelectItem (QemuFwCfgItemInitrdData);
|
||||||
|
QemuFwCfgReadBytes (InitrdSize, InitrdData);
|
||||||
|
DEBUG ((EFI_D_INFO, " [done]\n"));
|
||||||
|
} else {
|
||||||
|
InitrdData = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = LoadLinuxSetInitrd (SetupBuf, InitrdData, InitrdSize);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto FreeAndReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signal the EVT_SIGNAL_READY_TO_BOOT event
|
||||||
|
//
|
||||||
|
EfiSignalEventReadyToBoot();
|
||||||
|
|
||||||
|
Status = LoadLinux (KernelBuf, SetupBuf);
|
||||||
|
|
||||||
|
FreeAndReturn:
|
||||||
|
if (SetupBuf != NULL) {
|
||||||
|
FreePages (SetupBuf, EFI_SIZE_TO_PAGES (SetupSize));
|
||||||
|
}
|
||||||
|
if (KernelBuf != NULL) {
|
||||||
|
FreePages (KernelBuf, EFI_SIZE_TO_PAGES (KernelInitialSize));
|
||||||
|
}
|
||||||
|
if (CommandLine != NULL) {
|
||||||
|
FreePages (CommandLine, EFI_SIZE_TO_PAGES (CommandLineSize));
|
||||||
|
}
|
||||||
|
if (InitrdData != NULL) {
|
||||||
|
FreePages (InitrdData, EFI_SIZE_TO_PAGES (InitrdSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user