summaryrefslogtreecommitdiffstats
path: root/common/efi-devicepath.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/efi-devicepath.c')
-rw-r--r--common/efi-devicepath.c1195
1 files changed, 0 insertions, 1195 deletions
diff --git a/common/efi-devicepath.c b/common/efi-devicepath.c
deleted file mode 100644
index 3db2cea061..0000000000
--- a/common/efi-devicepath.c
+++ /dev/null
@@ -1,1195 +0,0 @@
-#include <common.h>
-#include <efi.h>
-#include <malloc.h>
-#include <string.h>
-#include <wchar.h>
-
-struct string {
- char *str;
- int len;
-};
-
-char *cprintf(struct string *str, const char *fmt, ...)
- __attribute__ ((format(__printf__, 2, 3)));
-
-char *cprintf(struct string *str, const char *fmt, ...)
-{
- va_list args;
- int len;
-
- va_start(args, fmt);
- if (str->str)
- len = vsprintf(str->str + str->len, fmt, args);
- else
- len = vsnprintf(NULL, 0, fmt, args);
- va_end(args);
-
- str->len += len;
-
- return NULL;
-}
-
-#define MIN_ALIGNMENT_SIZE 8 /* FIXME: X86_64 specific */
-#define ALIGN_SIZE(a) ((a % MIN_ALIGNMENT_SIZE) ? MIN_ALIGNMENT_SIZE - (a % MIN_ALIGNMENT_SIZE) : 0)
-
-#define EFI_DP_TYPE_MASK 0x7f
-#define EFI_DP_TYPE_UNPACKED 0x80
-
-#define END_DEVICE_PATH_TYPE 0x7f
-
-#define END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff
-#define END_INSTANCE_DEVICE_PATH_SUBTYPE 0x01
-#define END_DEVICE_PATH_LENGTH (sizeof(struct efi_device_path))
-
-#define DP_IS_END_TYPE(a)
-#define DP_IS_END_SUBTYPE(a) ( ((a)->sub_type == END_ENTIRE_DEVICE_PATH_SUBTYPE )
-
-#define device_path_type(a) ( ((a)->type) & EFI_DP_TYPE_MASK )
-#define next_device_path_node(a) ( (struct efi_device_path *) ( ((u8 *) (a)) + (a)->length))
-#define is_device_path_end_type(a) ( device_path_type(a) == END_DEVICE_PATH_TYPE )
-#define is_device_path_end_sub_type(a) ( (a)->sub_type == END_ENTIRE_DEVICE_PATH_SUBTYPE )
-#define is_device_path_end(a) ( is_device_path_end_type(a) && is_device_path_end_sub_type(a) )
-#define is_device_path_unpacked(a) ( (a)->type & EFI_DP_TYPE_UNPACKED )
-
-#define set_device_path_end_node(a) { \
- (a)->type = END_DEVICE_PATH_TYPE; \
- (a)->sub_type = END_ENTIRE_DEVICE_PATH_SUBTYPE; \
- (a)->length = sizeof(struct efi_device_path); \
- }
-
-/*
- * Hardware Device Path (UEFI 2.4 specification, version 2.4 § 9.3.2.)
- */
-
-#define HARDWARE_DEVICE_PATH 0x01
-
-#define HW_PCI_DP 0x01
-struct pci_device_path {
- struct efi_device_path header;
- u8 Function;
- u8 Device;
-};
-
-#define HW_PCCARD_DP 0x02
-struct pccard_device_path {
- struct efi_device_path header;
- u8 function_number;
-};
-
-#define HW_MEMMAP_DP 0x03
-struct memmap_device_path {
- struct efi_device_path header;
- u32 memory_type;
- efi_physical_addr_t starting_address;
- efi_physical_addr_t ending_address;
-};
-
-#define HW_VENDOR_DP 0x04
-struct vendor_device_path {
- struct efi_device_path header;
- efi_guid_t Guid;
-};
-
-struct unknown_device_vendor_device_path {
- struct vendor_device_path device_path;
- u8 legacy_drive_letter;
-};
-
-#define HW_CONTROLLER_DP 0x05
-struct controller_device_path {
- struct efi_device_path header;
- u32 Controller;
-};
-
-/*
- * ACPI Device Path (UEFI 2.4 specification, version 2.4 § 9.3.3 and 9.3.4.)
- */
-#define ACPI_DEVICE_PATH 0x02
-
-#define ACPI_DP 0x01
-struct acpi_hid_device_path {
- struct efi_device_path header;
- u32 HID;
- u32 UID;
-};
-
-#define EXPANDED_ACPI_DP 0x02
-struct expanded_acpi_hid_device_path {
- struct efi_device_path header;
- u32 HID;
- u32 UID;
- u32 CID;
- u8 hid_str[1];
-};
-
-#define ACPI_ADR_DP 3
-struct acpi_adr_device_path {
- struct efi_device_path header;
- u32 ADR;
-};
-
-/*
- * EISA ID Macro
- * EISA ID Definition 32-bits
- * bits[15:0] - three character compressed ASCII EISA ID.
- * bits[31:16] - binary number
- * Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z'
- */
-#define PNP_EISA_ID_CONST 0x41d0
-#define EISA_ID(_Name, _Num) ((u32) ((_Name) | (_Num) << 16))
-#define EISA_PNP_ID(_PNPId) (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
-
-#define PNP_EISA_ID_MASK 0xffff
-#define EISA_ID_TO_NUM(_Id) ((_Id) >> 16)
-
-/*
- * Messaging Device Path (UEFI 2.4 specification, version 2.4 § 9.3.5.)
- */
-#define MESSAGING_DEVICE_PATH 0x03
-
-#define MSG_ATAPI_DP 0x01
-struct atapi_device_path {
- struct efi_device_path header;
- u8 primary_secondary;
- u8 slave_master;
- u16 Lun;
-};
-
-#define MSG_SCSI_DP 0x02
-struct scsi_device_path {
- struct efi_device_path header;
- u16 Pun;
- u16 Lun;
-};
-
-#define MSG_FIBRECHANNEL_DP 0x03
-struct fibrechannel_device_path {
- struct efi_device_path header;
- u32 Reserved;
- u64 WWN;
- u64 Lun;
-};
-
-/**
- * Fibre Channel Ex sub_type.
- * UEFI 2.0 specification version 2.4 § 9.3.5.6.
- */
-#define MSG_FIBRECHANNELEX_DP 21
-struct fibrechannelex_device_path {
- struct efi_device_path header;
- u32 Reserved;
- u8 WWN[8]; /* World Wide Name */
- u8 Lun[8]; /* Logical unit, T-10 SCSI Architecture Model 4 specification */
-};
-
-#define MSG_1394_DP 0x04
-struct f1394_device_path {
- struct efi_device_path header;
- u32 Reserved;
- u64 Guid;
-};
-
-#define MSG_USB_DP 0x05
-struct usb_device_path {
- struct efi_device_path header;
- u8 Port;
- u8 Endpoint;
-};
-
-/**
- * SATA Device Path sub_type.
- * UEFI 2.0 specification version 2.4 § 9.3.5.6.
- */
-#define MSG_SATA_DP 18
-struct sata_device_path {
- struct efi_device_path header;
- u16 HBAPort_number;
- u16 port_multiplier_port_number;
- u16 Lun; /* Logical Unit Number */
-};
-
-/**
- * USB WWID Device Path sub_type.
- * UEFI 2.0 specification version 2.4 § 9.3.5.7.
- */
-#define MSG_USB_WWID_DP 16
-struct usb_wwid_device_path {
- struct efi_device_path header;
- u16 interface_number;
- u16 vendor_id;
- u16 product_id;
- s16 serial_number[1]; /* UTF-16 characters of the USB serial number */
-};
-
-/**
- * Device Logical Unit sub_type.
- * UEFI 2.0 specification version 2.4 § 9.3.5.8.
- */
-#define MSG_DEVICE_LOGICAL_UNIT_DP 17
-struct device_logical_unit_device_path {
- struct efi_device_path header;
- u8 Lun; /* Logical Unit Number */
-};
-
-#define MSG_USB_CLASS_DP 0x0_f
-struct usb_class_device_path {
- struct efi_device_path header;
- u16 vendor_id;
- u16 product_id;
- u8 device_class;
- u8 device_subclass;
- u8 device_protocol;
-};
-
-#define MSG_I2_o_DP 0x06
-struct i2_o_device_path {
- struct efi_device_path header;
- u32 Tid;
-};
-
-#define MSG_MAC_ADDR_DP 0x0b
-struct mac_addr_device_path {
- struct efi_device_path header;
- efi_mac_address mac_address;
- u8 if_type;
-};
-
-#define MSG_IPv4_DP 0x0c
-struct ipv4_device_path {
- struct efi_device_path header;
- efi_ipv4_address local_ip_address;
- efi_ipv4_address remote_ip_address;
- u16 local_port;
- u16 remote_port;
- u16 Protocol;
- bool static_ip_address;
- /* new from UEFI version 2, code must check length field in header */
- efi_ipv4_address gateway_ip_address;
- efi_ipv4_address subnet_mask;
-};
-
-#define MSG_IPv6_DP 0x0d
-struct ipv6_device_path {
- struct efi_device_path header;
- efi_ipv6_address local_ip_address;
- efi_ipv6_address remote_ip_address;
- u16 local_port;
- u16 remote_port;
- u16 Protocol;
- bool IPAddress_origin;
- /* new from UEFI version 2, code must check length field in header */
- u8 prefix_length;
- efi_ipv6_address gateway_ip_address;
-};
-
-/**
- * Device Logical Unit sub_type.
- * UEFI 2.0 specification version 2.4 § 9.3.5.8.
- */
-#define MSG_VLAN_DP 20
-struct vlan_device_path {
- struct efi_device_path header;
- u16 vlan_id;
-};
-
-#define MSG_INFINIBAND_DP 0x09
-struct infiniband_device_path {
- struct efi_device_path header;
- u32 resource_flags;
- efi_guid_t port_gid;
- u64 service_id;
- u64 target_port_id;
- u64 device_id;
-};
-
-#define MSG_UART_DP 0x0e
-struct uart_device_path {
- struct efi_device_path header;
- u32 Reserved;
- u64 baud_rate;
- u8 data_bits;
- u8 Parity;
- u8 stop_bits;
-};
-
-#define MSG_VENDOR_DP 0x0a
-/* Use VENDOR_DEVICE_PATH struct */
-
-#define DEVICE_PATH_MESSAGING_PC_ANSI \
- { 0xe0c14753, 0xf9be, 0x11d2, {0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
-
-#define DEVICE_PATH_MESSAGING_VT_100 \
- { 0xdfa66065, 0xb419, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
-
-#define DEVICE_PATH_MESSAGING_VT_100_PLUS \
- { 0x7baec70b , 0x57e0 , 0x4c76 , { 0x8e , 0x87 , 0x2f , 0x9e , 0x28 , 0x08 , 0x83 , 0x43 } }
-
-#define DEVICE_PATH_MESSAGING_VT_UTF8 \
- { 0xad15a0d6 , 0x8bec , 0x4acf , { 0xa0 , 0x73 , 0xd0 , 0x1d , 0xe7 , 0x7e , 0x2d , 0x88 } }
-
-#define EFI_PC_ANSI_GUID \
- { 0xe0c14753 , 0xf9be , 0x11d2 , 0x9a , 0x0c , 0x00 , 0x90 , 0x27 , 0x3f , 0xc1 , 0x4d }
-
-#define EFI_VT_100_GUID \
- { 0xdfa66065 , 0xb419 , 0x11d3 , 0x9a , 0x2d , 0x00 , 0x90 , 0x27 , 0x3f , 0xc1 , 0x4d }
-
-#define EFI_VT_100_PLUS_GUID \
- { 0x7baec70b , 0x57e0 , 0x4c76 , 0x8e , 0x87 , 0x2f , 0x9e , 0x28 , 0x08 , 0x83 , 0x43 }
-
-#define EFI_VT_UTF8_GUID \
- { 0xad15a0d6 , 0x8bec , 0x4acf , 0xa0 , 0x73 , 0xd0 , 0x1d , 0xe7 , 0x7e , 0x2d , 0x88 }
-
-/*
- * Media Device Path (UEFI 2.4 specification, version 2.4 § 9.3.6.)
- */
-#define MEDIA_DEVICE_PATH 0x04
-
-#define MEDIA_HARDDRIVE_DP 0x01
-struct harddrive_device_path {
- struct efi_device_path header;
- u32 partition_number;
- u64 partition_start;
- u64 partition_size;
- u8 signature[16];
- u8 mbr_type;
- u8 signature_type;
-};
-
-#define MBR_TYPE_PCAT 0x01
-#define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02
-
-#define SIGNATURE_TYPE_MBR 0x01
-#define SIGNATURE_TYPE_GUID 0x02
-
-#define MEDIA_CDROM_DP 0x02
-struct cdrom_device_path {
- struct efi_device_path header;
- u32 boot_entry;
- u64 partition_start;
- u64 partition_size;
-};
-
-#define MEDIA_VENDOR_DP 0x03
-/* Use VENDOR_DEVICE_PATH struct */
-
-#define MEDIA_FILEPATH_DP 0x04
-struct filepath_device_path {
- struct efi_device_path header;
- s16 path_name[1];
-};
-
-#define SIZE_OF_FILEPATH_DEVICE_PATH offsetof(FILEPATH_DEVICE_PATH,path_name)
-
-#define MEDIA_PROTOCOL_DP 0x05
-struct media_protocol_device_path {
- struct efi_device_path header;
- efi_guid_t Protocol;
-};
-
-/**
- * PIWG Firmware File sub_type.
- * UEFI 2.0 specification version 2.4 § 9.3.6.6.
- */
-#define MEDIA_PIWG_FW_FILE_DP 6
-struct media_fw_vol_filepath_device_path {
- struct efi_device_path header;
- efi_guid_t fv_file_name;
-};
-
-/**
- * PIWG Firmware Volume Device Path sub_type.
- * UEFI 2.0 specification version 2.4 § 9.3.6.7.
- */
-#define MEDIA_PIWG_FW_VOL_DP 7
-struct media_fw_vol_device_path {
- struct efi_device_path header;
- efi_guid_t fv_name;
-};
-
-/**
- * Media relative offset range device path.
- * UEFI 2.0 specification version 2.4 § 9.3.6.8.
- */
-#define MEDIA_RELATIVE_OFFSET_RANGE_DP 8
-struct media_relative_offset_range_device_path {
- struct efi_device_path header;
- u32 Reserved;
- u64 starting_offset;
- u64 ending_offset;
-};
-
-/*
- * BIOS Boot Specification Device Path (UEFI 2.4 specification, version 2.4 § 9.3.7.)
- */
-#define BBS_DEVICE_PATH 0x05
-
-#define BBS_BBS_DP 0x01
-struct bbs_bbs_device_path {
- struct efi_device_path header;
- u16 device_type;
- u16 status_flag;
- s8 String[1];
-};
-
-/* device_type definitions - from BBS specification */
-#define BBS_TYPE_FLOPPY 0x01
-#define BBS_TYPE_HARDDRIVE 0x02
-#define BBS_TYPE_CDROM 0x03
-#define BBS_TYPE_PCMCIA 0x04
-#define BBS_TYPE_USB 0x05
-#define BBS_TYPE_EMBEDDED_NETWORK 0x06
-#define BBS_TYPE_DEV 0x80
-#define BBS_TYPE_UNKNOWN 0x_fF
-
-struct efi_device_path end_device_path = {
- .type = END_DEVICE_PATH_TYPE,
- .sub_type = END_ENTIRE_DEVICE_PATH_SUBTYPE,
- .length = END_DEVICE_PATH_LENGTH,
-};
-
-struct efi_device_path end_instance_device_path = {
- .type = END_DEVICE_PATH_TYPE,
- .sub_type = END_INSTANCE_DEVICE_PATH_SUBTYPE,
- .length = END_DEVICE_PATH_LENGTH,
-};
-
-struct efi_device_path *
-device_path_from_handle(efi_handle_t Handle)
-{
- efi_status_t Status;
- struct efi_device_path *device_path;
-
- Status = BS->handle_protocol(Handle, &efi_device_path_protocol_guid,
- (void *) &device_path);
- if (EFI_ERROR(Status))
- device_path = NULL;
-
- return device_path;
-}
-
-static struct efi_device_path *
-unpack_device_path(struct efi_device_path *dev_path)
-{
- struct efi_device_path *Src, *Dest, *new_path;
- unsigned long Size;
-
- /* Walk device path and round sizes to valid boundries */
-
- Src = dev_path;
- Size = 0;
- for (;;) {
- Size += Src->length;
- Size += ALIGN_SIZE(Size);
-
- if (is_device_path_end(Src)) {
- break;
- }
-
- Src = next_device_path_node(Src);
- }
-
- new_path = xzalloc(Size);
-
- Src = dev_path;
- Dest = new_path;
- for (;;) {
- Size = Src->length;
- memcpy(Dest, Src, Size);
- Size += ALIGN_SIZE(Size);
- Dest->length = Size;
- Dest->type |= EFI_DP_TYPE_UNPACKED;
- Dest =
- (struct efi_device_path *) (((u8 *) Dest) + Size);
-
- if (is_device_path_end(Src))
- break;
-
- Src = next_device_path_node(Src);
- }
-
- return new_path;
-}
-
-static void
-dev_path_pci(struct string *str, void *dev_path)
-{
- struct pci_device_path *Pci;
-
- Pci = dev_path;
- cprintf(str, "Pci(0x%x,0x%x)", Pci->Device, Pci->Function);
-}
-
-static void
-dev_path_pccard(struct string *str, void *dev_path)
-{
- struct pccard_device_path *Pccard;
-
- Pccard = dev_path;
- cprintf(str, "Pccard(0x%x)", Pccard->function_number);
-}
-
-static void
-dev_path_mem_map(struct string *str, void *dev_path)
-{
- struct memmap_device_path *mem_map;
-
- mem_map = dev_path;
- cprintf(str, "mem_map(%d,0x%llx,0x%llx)",
- mem_map->memory_type,
- mem_map->starting_address, mem_map->ending_address);
-}
-
-static void
-dev_path_controller(struct string *str, void *dev_path)
-{
- struct controller_device_path *Controller;
-
- Controller = dev_path;
- cprintf(str, "Ctrl(%d)", Controller->Controller);
-}
-
-static void
-dev_path_vendor(struct string *str, void *dev_path)
-{
- struct vendor_device_path *Vendor;
- char *type;
- struct unknown_device_vendor_device_path *unknown_dev_path;
-
- Vendor = dev_path;
- switch (device_path_type(&Vendor->header)) {
- case HARDWARE_DEVICE_PATH:
- type = "Hw";
- break;
- case MESSAGING_DEVICE_PATH:
- type = "Msg";
- break;
- case MEDIA_DEVICE_PATH:
- type = "Media";
- break;
- default:
- type = "?";
- break;
- }
-
- cprintf(str, "Ven%s(%pU", type, &Vendor->Guid);
- if (efi_guidcmp(Vendor->Guid, efi_unknown_device_guid) == 0) {
- /* GUID used by EFI to enumerate an EDD 1.1 device */
- unknown_dev_path =
- (struct unknown_device_vendor_device_path *) Vendor;
- cprintf(str, ":%02x)", unknown_dev_path->legacy_drive_letter);
- } else {
- cprintf(str, ")");
- }
-}
-
-/*
- type: 2 (ACPI Device Path) sub_type: 1 (ACPI Device Path)
- */
-static void
-dev_path_acpi(struct string *str, void *dev_path)
-{
- struct acpi_hid_device_path *Acpi;
-
- Acpi = dev_path;
- if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
- switch (EISA_ID_TO_NUM(Acpi->HID)) {
- case 0x301:
- cprintf(str, "Keyboard(%d)", Acpi->UID);
- break;
-
- case 0x401:
- cprintf(str, "parallel_port(%d)", Acpi->UID);
- break;
- case 0x501:
- cprintf(str, "Serial(%d)", Acpi->UID);
- break;
- case 0x604:
- cprintf(str, "Floppy(%d)", Acpi->UID);
- break;
- case 0xa03:
- cprintf(str, "pci_root(%d)", Acpi->UID);
- break;
- case 0xa08:
- cprintf(str, "pcie_root(%d)", Acpi->UID);
- break;
- default:
- cprintf(str, "Acpi(PNP%04x",
- EISA_ID_TO_NUM(Acpi->HID));
- if (Acpi->UID)
- cprintf(str, ",%d", Acpi->UID);
- cprintf(str, ")");
- break;
- }
- } else {
- cprintf(str, "Acpi(0x%X", Acpi->HID);
- if (Acpi->UID)
- cprintf(str, ",%d", Acpi->UID);
- cprintf(str, ")");
- }
-}
-
-static void
-dev_path_atapi(struct string *str, void *dev_path)
-{
- struct atapi_device_path *Atapi;
-
- Atapi = dev_path;
- cprintf(str, "Ata(%s,%s)",
- Atapi->primary_secondary ? "Secondary" : "Primary",
- Atapi->slave_master ? "Slave" : "Master");
-}
-
-static void
-dev_path_scsi(struct string *str, void *dev_path)
-{
- struct scsi_device_path *Scsi;
-
- Scsi = dev_path;
- cprintf(str, "Scsi(%d,%d)", Scsi->Pun, Scsi->Lun);
-}
-
-static void
-dev_path_fibre(struct string *str, void *dev_path)
-{
- struct fibrechannel_device_path *Fibre;
-
- Fibre = dev_path;
- cprintf(str, "Fibre%s(0x%016llx,0x%016llx)",
- device_path_type(&Fibre->header) ==
- MSG_FIBRECHANNEL_DP ? "" : "Ex", Fibre->WWN, Fibre->Lun);
-}
-
-static void
-dev_path1394(struct string *str, void *dev_path)
-{
- struct f1394_device_path *F1394;
-
- F1394 = dev_path;
- cprintf(str, "1394(%pU)", &F1394->Guid);
-}
-
-static void
-dev_path_usb(struct string *str, void *dev_path)
-{
- struct usb_device_path *Usb;
-
- Usb = dev_path;
- cprintf(str, "Usb(0x%x,0x%x)", Usb->Port, Usb->Endpoint);
-}
-
-static void
-dev_path_i2_o(struct string *str, void *dev_path)
-{
- struct i2_o_device_path *i2_o;
-
- i2_o = dev_path;
- cprintf(str, "i2_o(0x%X)", i2_o->Tid);
-}
-
-static void
-dev_path_mac_addr(struct string *str, void *dev_path)
-{
- struct mac_addr_device_path *MAC;
- unsigned long hw_address_size;
- unsigned long Index;
-
- MAC = dev_path;
-
- /* hw_address_size = sizeof(EFI_MAC_ADDRESS); */
- hw_address_size = MAC->header.length;
- hw_address_size -= sizeof (MAC->header);
- hw_address_size -= sizeof (MAC->if_type);
- if (MAC->if_type == 0x01 || MAC->if_type == 0x00)
- hw_address_size = 6;
-
- cprintf(str, "Mac(");
-
- for (Index = 0; Index < hw_address_size; Index++)
- cprintf(str, "%02x", MAC->mac_address.Addr[Index]);
-
- if (MAC->if_type != 0)
- cprintf(str, ",%d", MAC->if_type);
-
- cprintf(str, ")");
-}
-
-static void
-cat_print_iPv4(struct string *str, efi_ipv4_address * address)
-{
- cprintf(str, "%d.%d.%d.%d", address->Addr[0], address->Addr[1],
- address->Addr[2], address->Addr[3]);
-}
-
-static bool
-is_not_null_iPv4(efi_ipv4_address * address)
-{
- u8 val;
-
- val = address->Addr[0] | address->Addr[1];
- val |= address->Addr[2] | address->Addr[3];
-
- return val != 0;
-}
-
-static void
-cat_print_network_protocol(struct string *str, u16 Proto)
-{
- if (Proto == 6)
- cprintf(str, "TCP");
- else if (Proto == 17)
- cprintf(str, "UDP");
- else
- cprintf(str, "%d", Proto);
-}
-
-static void
-dev_path_iPv4(struct string *str, void *dev_path)
-{
- struct ipv4_device_path *ip;
- bool show;
-
- ip = dev_path;
- cprintf(str, "IPv4(");
- cat_print_iPv4(str, &ip->remote_ip_address);
- cprintf(str, ",");
- cat_print_network_protocol(str, ip->Protocol);
- cprintf(str, ",%s", ip->static_ip_address ? "Static" : "DHCP");
- show = is_not_null_iPv4(&ip->local_ip_address);
- if (!show
- && ip->header.length ==
- sizeof (struct ipv4_device_path)) {
- /* only version 2 includes gateway and netmask */
- show |= is_not_null_iPv4(&ip->gateway_ip_address);
- show |= is_not_null_iPv4(&ip->subnet_mask);
- }
- if (show) {
- cprintf(str, ",");
- cat_print_iPv4(str, &ip->local_ip_address);
- if (ip->header.length ==
- sizeof (struct ipv4_device_path)) {
- /* only version 2 includes gateway and netmask */
- show = is_not_null_iPv4(&ip->gateway_ip_address);
- show |= is_not_null_iPv4(&ip->subnet_mask);
- if (show) {
- cprintf(str, ",");
- cat_print_iPv4(str, &ip->gateway_ip_address);
- if (is_not_null_iPv4(&ip->subnet_mask)) {
- cprintf(str, ",");
- cat_print_iPv4(str, &ip->subnet_mask);
- }
- }
- }
- }
- cprintf(str, ")");
-}
-
-#define cat_print_iPv6_ADD( x , y ) ( ( (u16) ( x ) ) << 8 | ( y ) )
-static void
-cat_print_ipv6(struct string *str, efi_ipv6_address * address)
-{
- cprintf(str, "%x:%x:%x:%x:%x:%x:%x:%x",
- cat_print_iPv6_ADD(address->Addr[0], address->Addr[1]),
- cat_print_iPv6_ADD(address->Addr[2], address->Addr[3]),
- cat_print_iPv6_ADD(address->Addr[4], address->Addr[5]),
- cat_print_iPv6_ADD(address->Addr[6], address->Addr[7]),
- cat_print_iPv6_ADD(address->Addr[8], address->Addr[9]),
- cat_print_iPv6_ADD(address->Addr[10], address->Addr[11]),
- cat_print_iPv6_ADD(address->Addr[12], address->Addr[13]),
- cat_print_iPv6_ADD(address->Addr[14], address->Addr[15]));
-}
-
-static void
-dev_path_iPv6(struct string *str, void *dev_path)
-{
- struct ipv6_device_path *ip;
-
- ip = dev_path;
- cprintf(str, "IPv6(");
- cat_print_ipv6(str, &ip->remote_ip_address);
- cprintf(str, ",");
- cat_print_network_protocol(str, ip->Protocol);
- cprintf(str, ",%s,", ip->IPAddress_origin ?
- (ip->IPAddress_origin == 1 ? "stateless_auto_configure" :
- "stateful_auto_configure") : "Static");
- cat_print_ipv6(str, &ip->local_ip_address);
- if (ip->header.length ==
- sizeof (struct ipv6_device_path)) {
- cprintf(str, ",");
- cat_print_ipv6(str, &ip->gateway_ip_address);
- cprintf(str, ",");
- cprintf(str, "%d", ip->prefix_length);
- }
- cprintf(str, ")");
-}
-
-static void
-dev_path_infini_band(struct string *str, void *dev_path)
-{
- struct infiniband_device_path *infini_band;
-
- infini_band = dev_path;
- cprintf(str, "Infiniband(0x%x,%pU,0x%llx,0x%llx,0x%llx)",
- infini_band->resource_flags, &infini_band->port_gid,
- infini_band->service_id, infini_band->target_port_id,
- infini_band->device_id);
-}
-
-static void
-dev_path_uart(struct string *str, void *dev_path)
-{
- struct uart_device_path *Uart;
- s8 Parity;
-
- Uart = dev_path;
- switch (Uart->Parity) {
- case 0:
- Parity = 'D';
- break;
- case 1:
- Parity = 'N';
- break;
- case 2:
- Parity = 'E';
- break;
- case 3:
- Parity = 'O';
- break;
- case 4:
- Parity = 'M';
- break;
- case 5:
- Parity = 'S';
- break;
- default:
- Parity = 'x';
- break;
- }
-
- if (Uart->baud_rate == 0)
- cprintf(str, "Uart(DEFAULT %c", Parity);
- else
- cprintf(str, "Uart(%lld %c", Uart->baud_rate, Parity);
-
- if (Uart->data_bits == 0)
- cprintf(str, "D");
- else
- cprintf(str, "%d", Uart->data_bits);
-
- switch (Uart->stop_bits) {
- case 0:
- cprintf(str, "D)");
- break;
- case 1:
- cprintf(str, "1)");
- break;
- case 2:
- cprintf(str, "1.5)");
- break;
- case 3:
- cprintf(str, "2)");
- break;
- default:
- cprintf(str, "x)");
- break;
- }
-}
-
-static void
-dev_path_sata(struct string *str, void *dev_path)
-{
- struct sata_device_path *sata;
-
- sata = dev_path;
- cprintf(str, "Sata(0x%x,0x%x,0x%x)", sata->HBAPort_number,
- sata->port_multiplier_port_number, sata->Lun);
-}
-
-static void
-dev_path_hard_drive(struct string *str, void *dev_path)
-{
- struct harddrive_device_path *hd;
-
- hd = dev_path;
- switch (hd->signature_type) {
- case SIGNATURE_TYPE_MBR:
- cprintf(str, "HD(Part%d,Sig%08x)",
- hd->partition_number, *((u32 *) (&(hd->signature[0])))
- );
- break;
- case SIGNATURE_TYPE_GUID:
- cprintf(str, "HD(Part%d,Sig%pU)",
- hd->partition_number,
- (efi_guid_t *) & (hd->signature[0])
- );
- break;
- default:
- cprintf(str, "HD(Part%d,mbr_type=%02x,sig_type=%02x)",
- hd->partition_number, hd->mbr_type, hd->signature_type);
- break;
- }
-}
-
-static void
-dev_path_cdrom(struct string *str, void *dev_path)
-{
- struct cdrom_device_path *cd;
-
- cd = dev_path;
- cprintf(str, "CDROM(0x%x)", cd->boot_entry);
-}
-
-static void
-dev_path_file_path(struct string *str, void *dev_path)
-{
- struct filepath_device_path *Fp;
- char *dst;
-
- Fp = dev_path;
-
- dst = strdup_wchar_to_char(Fp->path_name);
-
- cprintf(str, "%s", dst);
-
- free(dst);
-}
-
-static void
-dev_path_media_protocol(struct string *str, void *dev_path)
-{
- struct media_protocol_device_path *media_prot;
-
- media_prot = dev_path;
- cprintf(str, "%pU", &media_prot->Protocol);
-}
-
-static void
-dev_path_bss_bss(struct string *str, void *dev_path)
-{
- struct bbs_bbs_device_path *Bss;
- char *type;
-
- Bss = dev_path;
- switch (Bss->device_type) {
- case BBS_TYPE_FLOPPY:
- type = "Floppy";
- break;
- case BBS_TYPE_HARDDRIVE:
- type = "Harddrive";
- break;
- case BBS_TYPE_CDROM:
- type = "CDROM";
- break;
- case BBS_TYPE_PCMCIA:
- type = "PCMCIA";
- break;
- case BBS_TYPE_USB:
- type = "Usb";
- break;
- case BBS_TYPE_EMBEDDED_NETWORK:
- type = "Net";
- break;
- default:
- type = "?";
- break;
- }
-
- cprintf(str, "Bss-%s(%s)", type, Bss->String);
-}
-
-static void
-dev_path_end_instance(struct string *str, void *dev_path)
-{
- cprintf(str, ",");
-}
-
-/**
- * Print unknown device node.
- * UEFI 2.4 § 9.6.1.6 table 89.
- */
-
-static void
-dev_path_node_unknown(struct string *str, void *dev_path)
-{
- struct efi_device_path *Path;
- u8 *value;
- int length, index;
- Path = dev_path;
- value = dev_path;
- value += 4;
- switch (Path->type) {
- case HARDWARE_DEVICE_PATH:{
- /* Unknown Hardware Device Path */
- cprintf(str, "hardware_path(%d", Path->sub_type);
- break;
- }
- case ACPI_DEVICE_PATH:{/* Unknown ACPI Device Path */
- cprintf(str, "acpi_path(%d", Path->sub_type);
- break;
- }
- case MESSAGING_DEVICE_PATH:{
- /* Unknown Messaging Device Path */
- cprintf(str, "Msg(%d", Path->sub_type);
- break;
- }
- case MEDIA_DEVICE_PATH:{
- /* Unknown Media Device Path */
- cprintf(str, "media_path(%d", Path->sub_type);
- break;
- }
- case BBS_DEVICE_PATH:{ /* Unknown BIOS Boot Specification Device Path */
- cprintf(str, "bbs_path(%d", Path->sub_type);
- break;
- }
- default:{ /* Unknown Device Path */
- cprintf(str, "Path(%d,%d", Path->type, Path->sub_type);
- break;
- }
- }
- length = Path->length;
- for (index = 0; index < length; index++) {
- if (index == 0)
- cprintf(str, ",0x");
- cprintf(str, "%02x", *value);
- value++;
- }
- cprintf(str, ")");
-}
-
-/*
- * Table to convert "type" and "sub_type" to a "convert to text" function/
- * Entries hold "type" and "sub_type" for know values.
- * Special "sub_type" 0 is used as default for known type with unknown subtype.
- */
-struct {
- u8 type;
- u8 sub_type;
- void (*Function) (struct string *, void *);
-} dev_path_table[] = {
- {
- HARDWARE_DEVICE_PATH, HW_PCI_DP, dev_path_pci}, {
- HARDWARE_DEVICE_PATH, HW_PCCARD_DP, dev_path_pccard}, {
- HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, dev_path_mem_map}, {
- HARDWARE_DEVICE_PATH, HW_VENDOR_DP, dev_path_vendor}, {
- HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, dev_path_controller}, {
- ACPI_DEVICE_PATH, ACPI_DP, dev_path_acpi}, {
- MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, dev_path_atapi}, {
- MESSAGING_DEVICE_PATH, MSG_SCSI_DP, dev_path_scsi}, {
- MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, dev_path_fibre}, {
- MESSAGING_DEVICE_PATH, MSG_1394_DP, dev_path1394}, {
- MESSAGING_DEVICE_PATH, MSG_USB_DP, dev_path_usb}, {
- MESSAGING_DEVICE_PATH, MSG_I2_o_DP, dev_path_i2_o}, {
- MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, dev_path_mac_addr}, {
- MESSAGING_DEVICE_PATH, MSG_IPv4_DP, dev_path_iPv4}, {
- MESSAGING_DEVICE_PATH, MSG_IPv6_DP, dev_path_iPv6}, {
- MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, dev_path_infini_band}, {
- MESSAGING_DEVICE_PATH, MSG_UART_DP, dev_path_uart}, {
- MESSAGING_DEVICE_PATH, MSG_SATA_DP, dev_path_sata}, {
- MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, dev_path_vendor}, {
- MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, dev_path_hard_drive}, {
- MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, dev_path_cdrom}, {
- MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, dev_path_vendor}, {
- MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, dev_path_file_path}, {
- MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, dev_path_media_protocol}, {
- BBS_DEVICE_PATH, BBS_BBS_DP, dev_path_bss_bss}, {
- END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE,
- dev_path_end_instance}, {
- 0, 0, NULL}
-};
-
-static int __device_path_to_str(struct string *str, struct efi_device_path *dev_path)
-{
- struct efi_device_path *dev_path_node;
- void (*dump_node) (struct string *, void *);
- int i;
-
- dev_path = unpack_device_path(dev_path);
-
- dev_path_node = dev_path;
- while (!is_device_path_end(dev_path_node)) {
- dump_node = NULL;
- for (i = 0; dev_path_table[i].Function; i += 1) {
-
- if (device_path_type(dev_path_node) ==
- dev_path_table[i].type
- && dev_path_node->sub_type ==
- dev_path_table[i].sub_type) {
- dump_node = dev_path_table[i].Function;
- break;
- }
- }
-
- if (!dump_node)
- dump_node = dev_path_node_unknown;
-
- if (str->len && dump_node != dev_path_end_instance)
- cprintf(str, "/");
-
- dump_node(str, dev_path_node);
-
- dev_path_node = next_device_path_node(dev_path_node);
- }
-
- return 0;
-}
-
-char *device_path_to_str(struct efi_device_path *dev_path)
-{
- struct string str = {};
-
- __device_path_to_str(&str, dev_path);
-
- str.str = malloc(str.len + 1);
- if (!str.str)
- return NULL;
-
- str.len = 0;
-
- __device_path_to_str(&str, dev_path);
-
- return str.str;
-}
-
-u8 device_path_to_type(struct efi_device_path *dev_path)
-{
- struct efi_device_path *dev_path_next;
-
- dev_path = unpack_device_path(dev_path);
- dev_path_next = next_device_path_node(dev_path);
-
- while (!is_device_path_end(dev_path_next)) {
- dev_path = dev_path_next;
- dev_path_next = next_device_path_node(dev_path);
- }
-
- return device_path_type(dev_path);
-}
-
-char *device_path_to_partuuid(struct efi_device_path *dev_path)
-{
- struct efi_device_path *dev_path_node;
- struct harddrive_device_path *hd;
- char *str = NULL;;
-
- dev_path = unpack_device_path(dev_path);
-
- for (dev_path_node = dev_path; !is_device_path_end(dev_path_node);
- dev_path_node = next_device_path_node(dev_path_node)) {
-
- if (device_path_type(dev_path_node) != MEDIA_DEVICE_PATH)
- continue;
-
- if (dev_path_node->sub_type != MEDIA_HARDDRIVE_DP)
- continue;
-
- hd = (struct harddrive_device_path *)dev_path_node;
-
- if (hd->signature_type != SIGNATURE_TYPE_GUID)
- continue;
-
- str = xasprintf("%pUl", (efi_guid_t *)&(hd->signature[0]));
- break;
- }
-
- return str;
-}
-