On a Xen PVH guest, none of the existing serial or console interface works, so we add a new one, based on XenConsoleSerialPortLib, and implemented via SerialDxe. That is a simple console implementation that can work on both PVH guest and HVM guests, even if it is rarely going to be used on HVM. Have PlatformBootManagerLib look for the new console, when running as a Xen guest. Since we use VENDOR_UART_DEVICE_PATH, fix its description and coding style. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1689 Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20190813113119.14804-32-anthony.perard@citrix.com>
191 lines
4.5 KiB
C
191 lines
4.5 KiB
C
/** @file
|
|
Platform BDS customizations include file.
|
|
|
|
Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
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 <IndustryStandard/Virtio095.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/UefiBootManagerLib.h>
|
|
#include <Library/BootLogoLib.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 <Library/QemuFwCfgS3Lib.h>
|
|
#include <Library/QemuBootOrderLib.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 <Protocol/LoadedImage.h>
|
|
|
|
#include <Guid/Acpi.h>
|
|
#include <Guid/SmBios.h>
|
|
#include <Guid/HobList.h>
|
|
#include <Guid/GlobalVariable.h>
|
|
#include <Guid/EventGroup.h>
|
|
#include <Guid/DebugAgentGuid.h>
|
|
|
|
#include <OvmfPlatforms.h>
|
|
|
|
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[];
|
|
extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode;
|
|
extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode;
|
|
extern UART_DEVICE_PATH gUartDeviceNode;
|
|
extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
|
|
|
|
#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 gEndEntire \
|
|
{ \
|
|
END_DEVICE_PATH_TYPE, \
|
|
END_ENTIRE_DEVICE_PATH_SUBTYPE, \
|
|
{ \
|
|
END_DEVICE_PATH_LENGTH, \
|
|
0 \
|
|
} \
|
|
}
|
|
|
|
#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 IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
|
|
|
|
typedef struct {
|
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
|
UINTN ConnectType;
|
|
} PLATFORM_CONSOLE_CONNECT_ENTRY;
|
|
|
|
#define CONSOLE_OUT BIT0
|
|
#define CONSOLE_IN BIT1
|
|
#define STD_ERROR BIT2
|
|
extern PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
|
|
extern PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[];
|
|
|
|
//
|
|
// Platform BDS Functions
|
|
//
|
|
|
|
VOID
|
|
PlatformInitializeConsole (
|
|
IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole
|
|
);
|
|
|
|
/**
|
|
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_
|