From patchwork Fri Dec 20 10:07:57 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Hu X-Patchwork-Id: 303976 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 103962C012B for ; Fri, 20 Dec 2013 21:08:09 +1100 (EST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1Vtx03-0001C6-W4; Fri, 20 Dec 2013 10:08:07 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1Vtwzx-0001Bs-MK for fwts-devel@lists.ubuntu.com; Fri, 20 Dec 2013 10:08:01 +0000 Received: from [175.41.48.77] (helo=canonical.com) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1Vtwzw-0005w2-Tg; Fri, 20 Dec 2013 10:08:01 +0000 From: Ivan Hu To: fwts-devel@lists.ubuntu.com Subject: [PATCH][Resend 2] uefi: uefidump: extend the Messaging Device Path type Vedor subtype-10 (LP: #1262095) Date: Fri, 20 Dec 2013 18:07:57 +0800 Message-Id: <1387534077-31798-1-git-send-email-ivan.hu@canonical.com> X-Mailer: git-send-email 1.7.9.5 X-BeenThere: fwts-devel@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Firmware Test Suite Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: fwts-devel-bounces@lists.ubuntu.com Sender: fwts-devel-bounces@lists.ubuntu.com 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 Acked-by: Colin Ian King Acked-by: Alex Hung --- 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: