mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Hon Ching(Vicky) Lo" <honclo@linux.vnet.ibm.com>
To: tpmdd-devel@lists.sourceforge.net
Cc: Peter Huewe <PeterHuewe@gmx.de>,
	Ashley Lai <ashley@ashleylai.com>,
	Mimi Zohar <zohar@linux.vnet.ibm.com>,
	Vicky Lo <honclo2014@gmail.com>,
	linux-kernel@vger.kernel.org,
	"Hon Ching(Vicky) Lo" <honclo@linux.vnet.ibm.com>,
	Joy Latten <jmlatten@linux.vnet.ibm.com>
Subject: [PATCH 3/3] vTPM: support little endian guests
Date: Tue,  5 May 2015 20:51:26 -0400	[thread overview]
Message-ID: <1430873486-25868-4-git-send-email-honclo@linux.vnet.ibm.com> (raw)
In-Reply-To: <1430873486-25868-1-git-send-email-honclo@linux.vnet.ibm.com>

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 <honclo@linux.vnet.ibm.com>
Signed-off-by: Joy Latten <jmlatten@linux.vnet.ibm.com>
---
 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);
 
-- 
1.7.1


  parent reply	other threads:[~2015-05-06  0:53 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-06  0:51 [PATCH 0/3] additional little endian support Hon Ching(Vicky) Lo
2015-05-06  0:51 ` [PATCH 1/3] vTPM: fixed the limit checking Hon Ching(Vicky) Lo
2015-05-11 13:02   ` [tpmdd-devel] " Stefan Berger
2015-05-12 21:19     ` Joy M. Latten
2015-05-06  0:51 ` [PATCH 2/3] TPM: remove unnecessary little endian conversion Hon Ching(Vicky) Lo
2015-05-06  0:51 ` Hon Ching(Vicky) Lo [this message]
2015-05-08 22:31   ` [PATCH 3/3] vTPM: support little endian guests Ashley Lai
2015-05-08 23:10     ` Hon Ching (Vicky) Lo
2015-05-11 22:07     ` Joy M. Latten
2015-05-19 21:08   ` Ashley Lai
2015-05-19 21:18     ` Ashley Lai
2015-05-20 21:23     ` Hon Ching (Vicky) Lo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1430873486-25868-4-git-send-email-honclo@linux.vnet.ibm.com \
    --to=honclo@linux.vnet.ibm.com \
    --cc=PeterHuewe@gmx.de \
    --cc=ashley@ashleylai.com \
    --cc=honclo2014@gmail.com \
    --cc=jmlatten@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tpmdd-devel@lists.sourceforge.net \
    --cc=zohar@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome