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>
		
			
				
	
	
		
			214 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Defined the platform specific device path which will be used by
 | 
						|
  platform Bbd to perform the platform policy connect.
 | 
						|
 | 
						|
  Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "BdsPlatform.h"
 | 
						|
#include <Guid/QemuRamfb.h>
 | 
						|
#include <Guid/SerialPortLibVendor.h>
 | 
						|
 | 
						|
//
 | 
						|
// Vendor UART Device Path structure
 | 
						|
//
 | 
						|
#pragma pack (1)
 | 
						|
typedef struct {
 | 
						|
  VENDOR_DEVICE_PATH        VendorHardware;
 | 
						|
  UART_DEVICE_PATH          Uart;
 | 
						|
  VENDOR_DEVICE_PATH        TerminalType;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  End;
 | 
						|
} VENDOR_UART_DEVICE_PATH;
 | 
						|
#pragma pack ()
 | 
						|
 | 
						|
//
 | 
						|
// USB Keyboard Device Path structure
 | 
						|
//
 | 
						|
#pragma pack (1)
 | 
						|
typedef struct {
 | 
						|
  USB_CLASS_DEVICE_PATH    Keyboard;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL End;
 | 
						|
} USB_KEYBOARD_DEVICE_PATH;
 | 
						|
#pragma pack ()
 | 
						|
 | 
						|
//
 | 
						|
// QemuRamfb Device Path structure
 | 
						|
//
 | 
						|
#pragma pack (1)
 | 
						|
typedef struct {
 | 
						|
  VENDOR_DEVICE_PATH        Vendor;
 | 
						|
  ACPI_ADR_DEVICE_PATH      AcpiAdr;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  End;
 | 
						|
} VENDOR_RAMFB_DEVICE_PATH;
 | 
						|
#pragma pack ()
 | 
						|
 | 
						|
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
 | 
						|
//
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// Debug Agent UART Device Path
 | 
						|
//
 | 
						|
VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
 | 
						|
  {
 | 
						|
    {
 | 
						|
      HARDWARE_DEVICE_PATH,
 | 
						|
      HW_VENDOR_DP,
 | 
						|
      {
 | 
						|
        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
 | 
						|
        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
 | 
						|
      }
 | 
						|
    },
 | 
						|
    EFI_DEBUG_AGENT_GUID,
 | 
						|
  },
 | 
						|
  {
 | 
						|
    {
 | 
						|
      MESSAGING_DEVICE_PATH,
 | 
						|
      MSG_UART_DP,
 | 
						|
      {
 | 
						|
        (UINT8) (sizeof (UART_DEVICE_PATH)),
 | 
						|
        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
 | 
						|
      }
 | 
						|
    },
 | 
						|
    0,  // Reserved
 | 
						|
    0,  // BaudRate - Default
 | 
						|
    0,  // DataBits - Default
 | 
						|
    0,  // Parity   - Default
 | 
						|
    0,  // StopBits - Default
 | 
						|
  },
 | 
						|
  gPcAnsiTerminal,
 | 
						|
  gEndEntire
 | 
						|
};
 | 
						|
 | 
						|
STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
 | 
						|
  {
 | 
						|
    {
 | 
						|
      MESSAGING_DEVICE_PATH,
 | 
						|
      MSG_USB_CLASS_DP,
 | 
						|
      {
 | 
						|
        (UINT8)sizeof (USB_CLASS_DEVICE_PATH),
 | 
						|
        (UINT8)(sizeof (USB_CLASS_DEVICE_PATH) >> 8)
 | 
						|
      }
 | 
						|
    },
 | 
						|
    0xFFFF, // VendorId: any
 | 
						|
    0xFFFF, // ProductId: any
 | 
						|
    3,      // DeviceClass: HID
 | 
						|
    1,      // DeviceSubClass: boot
 | 
						|
    1       // DeviceProtocol: keyboard
 | 
						|
  },
 | 
						|
  gEndEntire
 | 
						|
};
 | 
						|
 | 
						|
STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
 | 
						|
  {
 | 
						|
    {
 | 
						|
      HARDWARE_DEVICE_PATH,
 | 
						|
      HW_VENDOR_DP,
 | 
						|
      {
 | 
						|
        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
 | 
						|
        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
 | 
						|
      }
 | 
						|
    },
 | 
						|
    QEMU_RAMFB_GUID,
 | 
						|
  },
 | 
						|
  {
 | 
						|
    {
 | 
						|
      ACPI_DEVICE_PATH,
 | 
						|
      ACPI_ADR_DP,
 | 
						|
      {
 | 
						|
        (UINT8) (sizeof (ACPI_ADR_DEVICE_PATH)),
 | 
						|
        (UINT8) ((sizeof (ACPI_ADR_DEVICE_PATH)) >> 8)
 | 
						|
      }
 | 
						|
    },
 | 
						|
    ACPI_DISPLAY_ADR (
 | 
						|
      1,                                       // DeviceIdScheme
 | 
						|
      0,                                       // HeadId
 | 
						|
      0,                                       // NonVgaOutput
 | 
						|
      1,                                       // BiosCanDetect
 | 
						|
      0,                                       // VendorInfo
 | 
						|
      ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL,  // Type
 | 
						|
      0,                                       // Port
 | 
						|
      0                                        // Index
 | 
						|
      ),
 | 
						|
  },
 | 
						|
  gEndEntire
 | 
						|
};
 | 
						|
 | 
						|
STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
 | 
						|
  {
 | 
						|
    {
 | 
						|
      HARDWARE_DEVICE_PATH,
 | 
						|
      HW_VENDOR_DP,
 | 
						|
      {
 | 
						|
        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
 | 
						|
        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
 | 
						|
      }
 | 
						|
    },
 | 
						|
    EDKII_SERIAL_PORT_LIB_VENDOR_GUID
 | 
						|
  },
 | 
						|
  {
 | 
						|
    {
 | 
						|
      MESSAGING_DEVICE_PATH,
 | 
						|
      MSG_UART_DP,
 | 
						|
      {
 | 
						|
        (UINT8) (sizeof (UART_DEVICE_PATH)),
 | 
						|
        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
 | 
						|
      }
 | 
						|
    },
 | 
						|
    0,
 | 
						|
    FixedPcdGet64 (PcdUartDefaultBaudRate),
 | 
						|
    FixedPcdGet8 (PcdUartDefaultDataBits),
 | 
						|
    FixedPcdGet8 (PcdUartDefaultParity),
 | 
						|
    FixedPcdGet8 (PcdUartDefaultStopBits),
 | 
						|
  },
 | 
						|
  gPcAnsiTerminal,
 | 
						|
  gEndEntire
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// Predefined platform default console device path
 | 
						|
//
 | 
						|
PLATFORM_CONSOLE_CONNECT_ENTRY   gPlatformConsole[] = {
 | 
						|
  {
 | 
						|
    (EFI_DEVICE_PATH_PROTOCOL *) &gDebugAgentUartDevicePath,
 | 
						|
    (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
 | 
						|
  },
 | 
						|
  {
 | 
						|
    (EFI_DEVICE_PATH_PROTOCOL *)&gUsbKeyboardDevicePath,
 | 
						|
    CONSOLE_IN
 | 
						|
  },
 | 
						|
  {
 | 
						|
    (EFI_DEVICE_PATH_PROTOCOL *)&gQemuRamfbDevicePath,
 | 
						|
    CONSOLE_OUT
 | 
						|
  },
 | 
						|
  {
 | 
						|
    NULL,
 | 
						|
    0
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
PLATFORM_CONSOLE_CONNECT_ENTRY   gXenPlatformConsole[] = {
 | 
						|
  {
 | 
						|
    (EFI_DEVICE_PATH_PROTOCOL *)&gXenConsoleDevicePath,
 | 
						|
    (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
 | 
						|
  },
 | 
						|
  {
 | 
						|
    NULL,
 | 
						|
    0
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// Predefined platform connect sequence
 | 
						|
//
 | 
						|
EFI_DEVICE_PATH_PROTOCOL    *gPlatformConnectSequence[] = { NULL };
 | 
						|
 |