This is used to package up the grub bootloader into a firmware volume where it can be executed as a shell like the UEFI Shell. Grub itself is built as a minimal entity into a Fv and then added as a boot option. By default the UEFI shell isn't built but for debugging purposes it can be enabled and will then be presented as a boot option (This should never be allowed for secure boot in an external data centre but may be useful for local debugging). Finally all other boot options except grub and possibly the shell are stripped and the boot timeout forced to 0 so the system will not enter a setup menu and will only boot to grub. This is done by copying the Library/PlatformBootManagerLib into Library/PlatformBootManagerLibGrub and then customizing it. Boot failure is fatal to try to prevent secret theft. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3077 Signed-off-by: James Bottomley <jejb@linux.ibm.com> Message-Id: <20201130202819.3910-4-jejb@linux.ibm.com> Acked-by: Ard Biesheuvel <ard.biesheuvel@arm.com> [lersek@redhat.com: replace local variable initialization with assignment] Reviewed-by: Laszlo Ersek <lersek@redhat.com> [lersek@redhat.com: squash 'OvmfPkg: add "gGrubFileGuid=Grub" to GuidCheck.IgnoreDuplicates', reviewed stand-alone by Phil (msgid <e6eae551-8563-ccfb-5547-7a97da6d46e5@redhat.com>) and Ard (msgid <10aeda37-def6-d9a4-6e02-4c66c1492f57@arm.com>)]
215 lines
5.0 KiB
C
215 lines
5.0 KiB
C
/** @file
|
|
Defined the platform specific device path which will be used by
|
|
platform Bbd to perform the platform policy connect.
|
|
|
|
Copyright (C) 2020 James Bottomley, IBM Corporation.
|
|
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 };
|
|
|