From patchwork Wed May 6 00:51:26 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hon Ching (Vicky) Lo" X-Patchwork-Id: 6344911 Return-Path: X-Original-To: patchwork-tpmdd-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 38602BEEE1 for ; Wed, 6 May 2015 00:53:19 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 21B4020220 for ; Wed, 6 May 2015 00:53:18 +0000 (UTC) Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A22CD2021B for ; Wed, 6 May 2015 00:53:16 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=sfs-ml-4.v29.ch3.sourceforge.com) by sfs-ml-4.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1YpnaO-000567-2p; Wed, 06 May 2015 00:53:16 +0000 Received: from sog-mx-3.v43.ch3.sourceforge.com ([172.29.43.193] helo=mx.sourceforge.net) by sfs-ml-4.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1YpnaN-000561-OG for tpmdd-devel@lists.sourceforge.net; Wed, 06 May 2015 00:53:15 +0000 X-ACL-Warn: Received: from e23smtp01.au.ibm.com ([202.81.31.143]) by sog-mx-3.v43.ch3.sourceforge.com with esmtps (TLSv1:AES256-SHA:256) (Exim 4.76) id 1YpnaM-0006MF-FE for tpmdd-devel@lists.sourceforge.net; Wed, 06 May 2015 00:53:15 +0000 Received: from /spool/local by e23smtp01.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 6 May 2015 10:53:06 +1000 Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp01.au.ibm.com (202.81.31.207) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 6 May 2015 10:53:04 +1000 Received: from d23relay10.au.ibm.com (d23relay10.au.ibm.com [9.190.26.77]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 801822CE8054 for ; Wed, 6 May 2015 10:53:03 +1000 (EST) Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay10.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t460qtLW47972358 for ; Wed, 6 May 2015 10:53:03 +1000 Received: from d23av03.au.ibm.com (localhost [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t460qUjH018290 for ; Wed, 6 May 2015 10:52:30 +1000 Received: from vtpm2014.ibm.com (sig-9-76-129-116.ibm.com [9.76.129.116]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t460qJak017392; Wed, 6 May 2015 10:52:28 +1000 From: "Hon Ching(Vicky) Lo" To: tpmdd-devel@lists.sourceforge.net Date: Tue, 5 May 2015 20:51:26 -0400 Message-Id: <1430873486-25868-4-git-send-email-honclo@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1430873486-25868-1-git-send-email-honclo@linux.vnet.ibm.com> References: <1430873486-25868-1-git-send-email-honclo@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15050600-1618-0000-0000-00000209EBF5 X-Spam-Score: -0.0 (/) X-Headers-End: 1YpnaM-0006MF-FE Cc: Joy Latten , Ashley Lai , linux-kernel@vger.kernel.org, "Hon Ching\(Vicky\) Lo" , Peter Huewe Subject: [tpmdd-devel] [PATCH 3/3] vTPM: support little endian guests X-BeenThere: tpmdd-devel@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: Tpm Device Driver maintainance List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: tpmdd-devel-bounces@lists.sourceforge.net X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, HK_RANDOM_ENVFROM, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The event log in ppc64 arch is always in big endian format. PowerPC supports both little endian and big endian guests. This patch converts the event log entries to guest format. We defined a macro to convert to guest format. In addition, tpm_binary_bios_measurements_show() is modified to parse the event and print each field individually. Signed-off-by: Hon Ching(Vicky) Lo Signed-off-by: Joy Latten --- drivers/char/tpm/tpm_eventlog.c | 92 +++++++++++++++++++++++++++++++-------- 1 files changed, 73 insertions(+), 19 deletions(-) diff --git a/drivers/char/tpm/tpm_eventlog.c b/drivers/char/tpm/tpm_eventlog.c index e77d8c1..1b62c52 100644 --- a/drivers/char/tpm/tpm_eventlog.c +++ b/drivers/char/tpm/tpm_eventlog.c @@ -28,6 +28,11 @@ #include "tpm.h" #include "tpm_eventlog.h" +#ifdef CONFIG_PPC64 +#define convert_to_host_format(x) be32_to_cpu(x) +#else +#define convert_to_host_format(x) x +#endif static const char* tcpa_event_type_strings[] = { "PREBOOT", @@ -82,9 +87,11 @@ static void *tpm_bios_measurements_start(struct seq_file *m, loff_t *pos) event = addr; if ((addr + sizeof(struct tcpa_event)) < limit) { - if (event->event_type == 0 && event->event_size == 0) + if ((convert_to_host_format(event->event_type) == 0) && + (convert_to_host_format(event->event_size) == 0)) return NULL; - addr += sizeof(struct tcpa_event) + event->event_size; + addr += (sizeof(struct tcpa_event) + + convert_to_host_format(event->event_size)); } } @@ -94,8 +101,11 @@ static void *tpm_bios_measurements_start(struct seq_file *m, loff_t *pos) event = addr; - if ((event->event_type == 0 && event->event_size == 0) || - ((addr + sizeof(struct tcpa_event) + event->event_size) >= limit)) + if (((convert_to_host_format(event->event_type) == 0) && + (convert_to_host_format(event->event_size) == 0)) + || + ((addr + sizeof(struct tcpa_event) + + convert_to_host_format(event->event_size)) >= limit)) return NULL; return addr; @@ -108,7 +118,8 @@ static void *tpm_bios_measurements_next(struct seq_file *m, void *v, struct tpm_bios_log *log = m->private; void *limit = log->bios_event_log_end; - v += sizeof(struct tcpa_event) + event->event_size; + v += (sizeof(struct tcpa_event) + + convert_to_host_format(event->event_size)); /* now check if current entry is valid */ if ((v + sizeof(struct tcpa_event)) >= limit) @@ -116,8 +127,11 @@ static void *tpm_bios_measurements_next(struct seq_file *m, void *v, event = v; - if ((event->event_type == 0 && event->event_size == 0) || - ((v + sizeof(struct tcpa_event) + event->event_size) > limit)) + if (((convert_to_host_format(event->event_type) == 0) && + (convert_to_host_format(event->event_size) == 0)) + || + ((v + sizeof(struct tcpa_event) + + convert_to_host_format(event->event_size)) > limit)) return NULL; (*pos)++; @@ -137,7 +151,7 @@ static int get_event_name(char *dest, struct tcpa_event *event, int i, n_len = 0, d_len = 0; struct tcpa_pc_event *pc_event; - switch(event->event_type) { + switch(convert_to_host_format(event->event_type)) { case PREBOOT: case POST_CODE: case UNUSED: @@ -153,14 +167,17 @@ static int get_event_name(char *dest, struct tcpa_event *event, case NONHOST_CODE: case NONHOST_CONFIG: case NONHOST_INFO: - name = tcpa_event_type_strings[event->event_type]; + name = + tcpa_event_type_strings[convert_to_host_format + (event->event_type)]; n_len = strlen(name); break; case SEPARATOR: case ACTION: - if (MAX_TEXT_EVENT > event->event_size) { + if (MAX_TEXT_EVENT > + convert_to_host_format(event->event_size)) { name = event_entry; - n_len = event->event_size; + n_len = convert_to_host_format(event->event_size); } break; case EVENT_TAG: @@ -168,7 +185,7 @@ static int get_event_name(char *dest, struct tcpa_event *event, /* ToDo Row data -> Base64 */ - switch (pc_event->event_id) { + switch(convert_to_host_format(pc_event->event_id)) { case SMBIOS: case BIS_CERT: case CMOS: @@ -176,7 +193,9 @@ static int get_event_name(char *dest, struct tcpa_event *event, case OPTION_ROM_EXEC: case OPTION_ROM_CONFIG: case S_CRTM_VERSION: - name = tcpa_pc_event_id_strings[pc_event->event_id]; + name = + tcpa_pc_event_id_strings[convert_to_host_format + (pc_event->event_id)]; n_len = strlen(name); break; /* hash data */ @@ -185,7 +204,9 @@ static int get_event_name(char *dest, struct tcpa_event *event, case OPTION_ROM_MICROCODE: case S_CRTM_CONTENTS: case POST_CONTENTS: - name = tcpa_pc_event_id_strings[pc_event->event_id]; + name = + tcpa_pc_event_id_strings[convert_to_host_format + (pc_event->event_id)]; n_len = strlen(name); for (i = 0; i < 20; i++) d_len += sprintf(&data[2*i], "%02x", @@ -208,11 +229,43 @@ static int tpm_binary_bios_measurements_show(struct seq_file *m, void *v) struct tcpa_event *event = v; char *data = v; int i; - - for (i = 0; i < sizeof(struct tcpa_event) + event->event_size; i++) + u32 x; + char tmp[4]; + + /* PCR */ + x = convert_to_host_format(event->pcr_index); + memcpy(tmp, &x, 4); + for (i = 0; i < 4; i++) + seq_putc(m, tmp[i]); + data += 4; + + /* Event Type */ + x = convert_to_host_format(event->event_type); + memcpy(tmp, &x, 4); + for (i = 0; i < 4; i++) + seq_putc(m, tmp[i]); + data += 4; + + /* HASH */ + for (i = 0; i < 20; i++) seq_putc(m, data[i]); + data += 20; + + /* Size */ + x = convert_to_host_format(event->event_size); + memcpy(tmp, &x, 4); + for (i = 0; i < 4; i++) + seq_putc(m, tmp[i]); + data += 4; + + /* Data */ + if (convert_to_host_format(event->event_size)) { + for (i = 0; i < convert_to_host_format(event->event_size); i++) + seq_putc(m, data[i]); + } return 0; + } static int tpm_bios_measurements_release(struct inode *inode, @@ -235,7 +288,7 @@ static int tpm_ascii_bios_measurements_show(struct seq_file *m, void *v) char *eventname; struct tcpa_event *event = v; unsigned char *event_entry = - (unsigned char *) (v + sizeof(struct tcpa_event)); + (unsigned char *)(v + sizeof(struct tcpa_event)); eventname = kmalloc(MAX_TEXT_EVENT, GFP_KERNEL); if (!eventname) { @@ -244,13 +297,14 @@ static int tpm_ascii_bios_measurements_show(struct seq_file *m, void *v) return -EFAULT; } - seq_printf(m, "%2d ", event->pcr_index); + /* 1st: PCR */ + seq_printf(m, "%2d ", convert_to_host_format(event->pcr_index)); /* 2nd: SHA1 */ seq_printf(m, "%20phN", event->pcr_value); /* 3rd: event type identifier */ - seq_printf(m, " %02x", event->event_type); + seq_printf(m, " %02x", convert_to_host_format(event->event_type)); len += get_event_name(eventname, event, event_entry);