[PATCH][Resend 2] uefi: uefidump: extend the Messaging Device Path type Vedor subtype-10 (LP: #1262095)

Ivan Hu ivan.hu at canonical.com
Fri Dec 20 10:07:57 UTC 2013


Extend the Vendor subtype 10 support on messaging device path follow the UEFI spec2.4.

1. PC-ANSI, VT-100, VT-100+, and VT-UTF8 support, sec, 9.3.5.17
2. UART Flow Control Messaging Path support, sec. 9.3.5.18
3. Serial Attached SCSI (SAS) Device Path support, sec. 9.3.5.19

Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
---
 src/lib/include/fwts_uefi.h  |   28 ++++++++++++++++++++++
 src/uefi/uefidump/uefidump.c |   54 +++++++++++++++++++++++++++++++++++-------
 2 files changed, 74 insertions(+), 8 deletions(-)

diff --git a/src/lib/include/fwts_uefi.h b/src/lib/include/fwts_uefi.h
index dd9bbb0..cec2722 100644
--- a/src/lib/include/fwts_uefi.h
+++ b/src/lib/include/fwts_uefi.h
@@ -131,6 +131,24 @@ enum {
 #define EFI_CERT_X509_SHA512_GUID \
 { 0x446dbf63, 0x2502, 0x4cda, { 0xbc, 0xfa, 0x24, 0x65, 0xd2, 0xb0, 0xfe, 0x9d }}
 
+#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 }}
+
+#define EFI_UART_DEVICE_PATH_GUID \
+{ 0x37499a9d, 0x542f, 0x4c89, { 0xa0, 0x26, 0x35, 0xda, 0x14, 0x20, 0x94, 0xe4 }}
+
+#define EFI_SAS_DEVICE_PATH_GUID \
+{ 0xd487ddb4, 0x008b, 0x11d9, { 0xaf, 0xdc, 0x00, 0x10, 0x83, 0xff, 0xca, 0x4d }}
+
 #if 0
 typedef struct {
 	char *description;
@@ -382,6 +400,16 @@ typedef struct {
 
 typedef struct {
 	fwts_uefi_dev_path dev_path;
+	fwts_uefi_guid guid;
+	uint32_t reserved;
+	uint64_t sas_addr;
+	uint64_t lun;
+	uint16_t dev_topology_info;
+	uint16_t rtp;
+} __attribute__((packed)) fwts_uefi_sas_messaging_dev_path;
+
+typedef struct {
+	fwts_uefi_dev_path dev_path;
 	uint32_t reserved;
 	uint64_t wwn;
 	uint64_t lun;
diff --git a/src/uefi/uefidump/uefidump.c b/src/uefi/uefidump/uefidump.c
index 8beb179..84c8ad2 100644
--- a/src/uefi/uefidump/uefidump.c
+++ b/src/uefi/uefidump/uefidump.c
@@ -326,14 +326,52 @@ static char *uefidump_build_dev_path(char *path, fwts_uefi_dev_path *dev_path, c
 			break;
 		case FWTS_UEFI_VENDOR_MESSAGING_DEVICE_PATH_SUBTYPE:
 			if (dev_path_len >= sizeof(fwts_uefi_vendor_messaging_dev_path)) {
-				fwts_uefi_vendor_messaging_dev_path *v = (fwts_uefi_vendor_messaging_dev_path*)dev_path;
-				path = uefidump_vprintf(path, "\\VENDOR("
-					"%08" PRIx32 "-%04" PRIx16 "-%04" PRIx16 "-"
-					"%02" PRIx8 "-%02" PRIx8 "-"
-					"%02" PRIx8 "-%02" PRIx8 "-%02" PRIx8 "-%02" PRIx8 "-%02" PRIx8 "-%02" PRIx8 ")",
-					v->guid.info1, v->guid.info2, v->guid.info3,
-					v->guid.info4[0], v->guid.info4[1], v->guid.info4[2], v->guid.info4[3],
-					v->guid.info4[4], v->guid.info4[5], v->guid.info4[6], v->guid.info4[7]);
+				fwts_uefi_vendor_messaging_dev_path *v = (fwts_uefi_vendor_messaging_dev_path *)dev_path;
+				size_t i;
+				static const fwts_uefi_guid guid[] = {
+					EFI_PC_ANSI_GUID,
+					EFI_VT_100_GUID,
+					EFI_VT_100_PLUS_GUID,
+					EFI_VT_UTF8_GUID,
+					EFI_UART_DEVICE_PATH_GUID,
+					EFI_SAS_DEVICE_PATH_GUID
+				};
+				static const char *str[] = {
+					"PC-ANSI",
+					"VT-100",
+					"VT-100+",
+					"VT-UTF8",
+					"UARTFLOWCTRL",
+					"SAS",
+					"UnknownGUID"
+				};
+				for (i = 0; i < sizeof(guid)/sizeof(guid[0]); i++)
+					if (memcmp(&v->guid, &guid[i], sizeof(fwts_uefi_guid)) == 0)
+						break;
+				path = uefidump_vprintf(path, "\\VENDOR(%s", str[i]);
+				if (i == 4) {
+					uint32_t flow_control_map = v->vendor_defined_data[0]
+							+ (((uint32_t)v->vendor_defined_data[1]) << 8)
+							+ (((uint32_t)v->vendor_defined_data[2]) << 16)
+							+ (((uint32_t)v->vendor_defined_data[3] << 24));
+					path = uefidump_vprintf(path, ",0x%" PRIx32, flow_control_map);
+				}			
+				if (i == 5 && dev_path_len >= sizeof(fwts_uefi_sas_messaging_dev_path)) {
+					fwts_uefi_sas_messaging_dev_path *s = (fwts_uefi_sas_messaging_dev_path *)dev_path;
+					path = uefidump_vprintf(path, ",0x%" PRIx64
+						",0x%" PRIx64 ",0x%" PRIx16 ",0x%" PRIx16 ,
+						s->sas_addr, s->lun, s->dev_topology_info, s->rtp);
+				}
+				if (i == 6)
+					path = uefidump_vprintf(path, " %08" PRIx32 
+						"-%04" PRIx16 "-%04" PRIx16 "-%02" PRIx8
+						"-%02" PRIx8 "-%02" PRIx8 "-%02" PRIx8 
+						"-%02" PRIx8 "-%02" PRIx8 "-%02" PRIx8 "-%02" PRIx8 ,
+						v->guid.info1, v->guid.info2, v->guid.info3,
+						v->guid.info4[0], v->guid.info4[1], v->guid.info4[2], v->guid.info4[3],
+						v->guid.info4[4], v->guid.info4[5], v->guid.info4[6], v->guid.info4[7]);
+
+				path = uefidump_vprintf(path, ")");
 			}
 			break;
 		case FWTS_UEFI_FIBRE_CHANNEL_EX_DEVICE_PATH_SUBTYPE:
-- 
1.7.9.5




More information about the fwts-devel mailing list