Re: [PATCH v2 3/4] tpm: Move shared eventlog functions to common.c

2018-04-19 Thread Jarkko Sakkinen
On Thu, Apr 12, 2018 at 12:13:49PM +0200, Thiebaud Weksteen wrote:
> Functions and structures specific to TPM1 are renamed from tpm* to tpm1*.
> 
> Signed-off-by: Thiebaud Weksteen 
> Suggested-by: Jarkko Sakkinen 

Reviewed-by: Jarkko Sakkinen 
Tested-by: Jarkko Sakkinen 

/Jarkko


Re: [PATCH v2 3/4] tpm: Move shared eventlog functions to common.c

2018-04-19 Thread Jarkko Sakkinen
On Thu, Apr 12, 2018 at 12:13:49PM +0200, Thiebaud Weksteen wrote:
> Functions and structures specific to TPM1 are renamed from tpm* to tpm1*.
> 
> Signed-off-by: Thiebaud Weksteen 
> Suggested-by: Jarkko Sakkinen 

Reviewed-by: Jarkko Sakkinen 
Tested-by: Jarkko Sakkinen 

/Jarkko


[PATCH v2 3/4] tpm: Move shared eventlog functions to common.c

2018-04-12 Thread Thiebaud Weksteen
Functions and structures specific to TPM1 are renamed from tpm* to tpm1*.

Signed-off-by: Thiebaud Weksteen 
Suggested-by: Jarkko Sakkinen 
---
 drivers/char/tpm/Makefile  |   4 +-
 drivers/char/tpm/eventlog/common.c | 195 
 drivers/char/tpm/eventlog/tpm1.c   | 197 +++--
 drivers/char/tpm/tpm.h |   2 +
 4 files changed, 214 insertions(+), 184 deletions(-)
 create mode 100644 drivers/char/tpm/eventlog/common.c

diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
index 5dcf5bd35a3d..4e9c33ca1f8f 100644
--- a/drivers/char/tpm/Makefile
+++ b/drivers/char/tpm/Makefile
@@ -4,8 +4,8 @@
 #
 obj-$(CONFIG_TCG_TPM) += tpm.o
 tpm-y := tpm-interface.o tpm-dev.o tpm-sysfs.o tpm-chip.o tpm2-cmd.o \
-tpm-dev-common.o tpmrm-dev.o eventlog/tpm1.o eventlog/tpm2.o \
- tpm2-space.o
+tpm-dev-common.o tpmrm-dev.o eventlog/common.o eventlog/tpm1.o \
+eventlog/tpm2.o tpm2-space.o
 tpm-$(CONFIG_ACPI) += tpm_ppi.o eventlog/acpi.o
 tpm-$(CONFIG_EFI) += eventlog/efi.o
 tpm-$(CONFIG_OF) += eventlog/of.o
diff --git a/drivers/char/tpm/eventlog/common.c 
b/drivers/char/tpm/eventlog/common.c
new file mode 100644
index ..54934b5a1566
--- /dev/null
+++ b/drivers/char/tpm/eventlog/common.c
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2005, 2012 IBM Corporation
+ *
+ * Authors:
+ * Kent Yoder 
+ * Seiji Munetoh 
+ * Stefan Berger 
+ * Reiner Sailer 
+ * Kylene Hall 
+ * Nayna Jain 
+ *
+ * Access to the event log created by a system's firmware / BIOS
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../tpm.h"
+
+
+static int tpm_bios_measurements_open(struct inode *inode,
+   struct file *file)
+{
+   int err;
+   struct seq_file *seq;
+   struct tpm_chip_seqops *chip_seqops;
+   const struct seq_operations *seqops;
+   struct tpm_chip *chip;
+
+   inode_lock(inode);
+   if (!inode->i_private) {
+   inode_unlock(inode);
+   return -ENODEV;
+   }
+   chip_seqops = (struct tpm_chip_seqops *)inode->i_private;
+   seqops = chip_seqops->seqops;
+   chip = chip_seqops->chip;
+   get_device(>dev);
+   inode_unlock(inode);
+
+   /* now register seq file */
+   err = seq_open(file, seqops);
+   if (!err) {
+   seq = file->private_data;
+   seq->private = chip;
+   }
+
+   return err;
+}
+
+static int tpm_bios_measurements_release(struct inode *inode,
+struct file *file)
+{
+   struct seq_file *seq = (struct seq_file *)file->private_data;
+   struct tpm_chip *chip = (struct tpm_chip *)seq->private;
+
+   put_device(>dev);
+
+   return seq_release(inode, file);
+}
+
+static const struct file_operations tpm_bios_measurements_ops = {
+   .owner = THIS_MODULE,
+   .open = tpm_bios_measurements_open,
+   .read = seq_read,
+   .llseek = seq_lseek,
+   .release = tpm_bios_measurements_release,
+};
+
+static int tpm_read_log(struct tpm_chip *chip)
+{
+   int rc;
+
+   if (chip->log.bios_event_log != NULL) {
+   dev_dbg(>dev,
+   "%s: ERROR - event log already initialized\n",
+   __func__);
+   return -EFAULT;
+   }
+
+   rc = tpm_read_log_acpi(chip);
+   if (rc != -ENODEV)
+   return rc;
+
+   rc = tpm_read_log_efi(chip);
+   if (rc != -ENODEV)
+   return rc;
+
+   return tpm_read_log_of(chip);
+}
+
+/*
+ * tpm_bios_log_setup() - Read the event log from the firmware
+ * @chip: TPM chip to use.
+ *
+ * If an event log is found then the securityfs files are setup to
+ * export it to userspace, otherwise nothing is done.
+ *
+ * Returns -ENODEV if the firmware has no event log or securityfs is not
+ * supported.
+ */
+int tpm_bios_log_setup(struct tpm_chip *chip)
+{
+   const char *name = dev_name(>dev);
+   unsigned int cnt;
+   int log_version;
+   int rc = 0;
+
+   rc = tpm_read_log(chip);
+   if (rc < 0)
+   return rc;
+   log_version = rc;
+
+   cnt = 0;
+   chip->bios_dir[cnt] = securityfs_create_dir(name, NULL);
+   /* NOTE: securityfs_create_dir can return ENODEV if securityfs is
+* compiled out. The caller should ignore the ENODEV return code.
+*/
+   if (IS_ERR(chip->bios_dir[cnt]))
+   goto err;
+   cnt++;

[PATCH v2 3/4] tpm: Move shared eventlog functions to common.c

2018-04-12 Thread Thiebaud Weksteen
Functions and structures specific to TPM1 are renamed from tpm* to tpm1*.

Signed-off-by: Thiebaud Weksteen 
Suggested-by: Jarkko Sakkinen 
---
 drivers/char/tpm/Makefile  |   4 +-
 drivers/char/tpm/eventlog/common.c | 195 
 drivers/char/tpm/eventlog/tpm1.c   | 197 +++--
 drivers/char/tpm/tpm.h |   2 +
 4 files changed, 214 insertions(+), 184 deletions(-)
 create mode 100644 drivers/char/tpm/eventlog/common.c

diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
index 5dcf5bd35a3d..4e9c33ca1f8f 100644
--- a/drivers/char/tpm/Makefile
+++ b/drivers/char/tpm/Makefile
@@ -4,8 +4,8 @@
 #
 obj-$(CONFIG_TCG_TPM) += tpm.o
 tpm-y := tpm-interface.o tpm-dev.o tpm-sysfs.o tpm-chip.o tpm2-cmd.o \
-tpm-dev-common.o tpmrm-dev.o eventlog/tpm1.o eventlog/tpm2.o \
- tpm2-space.o
+tpm-dev-common.o tpmrm-dev.o eventlog/common.o eventlog/tpm1.o \
+eventlog/tpm2.o tpm2-space.o
 tpm-$(CONFIG_ACPI) += tpm_ppi.o eventlog/acpi.o
 tpm-$(CONFIG_EFI) += eventlog/efi.o
 tpm-$(CONFIG_OF) += eventlog/of.o
diff --git a/drivers/char/tpm/eventlog/common.c 
b/drivers/char/tpm/eventlog/common.c
new file mode 100644
index ..54934b5a1566
--- /dev/null
+++ b/drivers/char/tpm/eventlog/common.c
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2005, 2012 IBM Corporation
+ *
+ * Authors:
+ * Kent Yoder 
+ * Seiji Munetoh 
+ * Stefan Berger 
+ * Reiner Sailer 
+ * Kylene Hall 
+ * Nayna Jain 
+ *
+ * Access to the event log created by a system's firmware / BIOS
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../tpm.h"
+
+
+static int tpm_bios_measurements_open(struct inode *inode,
+   struct file *file)
+{
+   int err;
+   struct seq_file *seq;
+   struct tpm_chip_seqops *chip_seqops;
+   const struct seq_operations *seqops;
+   struct tpm_chip *chip;
+
+   inode_lock(inode);
+   if (!inode->i_private) {
+   inode_unlock(inode);
+   return -ENODEV;
+   }
+   chip_seqops = (struct tpm_chip_seqops *)inode->i_private;
+   seqops = chip_seqops->seqops;
+   chip = chip_seqops->chip;
+   get_device(>dev);
+   inode_unlock(inode);
+
+   /* now register seq file */
+   err = seq_open(file, seqops);
+   if (!err) {
+   seq = file->private_data;
+   seq->private = chip;
+   }
+
+   return err;
+}
+
+static int tpm_bios_measurements_release(struct inode *inode,
+struct file *file)
+{
+   struct seq_file *seq = (struct seq_file *)file->private_data;
+   struct tpm_chip *chip = (struct tpm_chip *)seq->private;
+
+   put_device(>dev);
+
+   return seq_release(inode, file);
+}
+
+static const struct file_operations tpm_bios_measurements_ops = {
+   .owner = THIS_MODULE,
+   .open = tpm_bios_measurements_open,
+   .read = seq_read,
+   .llseek = seq_lseek,
+   .release = tpm_bios_measurements_release,
+};
+
+static int tpm_read_log(struct tpm_chip *chip)
+{
+   int rc;
+
+   if (chip->log.bios_event_log != NULL) {
+   dev_dbg(>dev,
+   "%s: ERROR - event log already initialized\n",
+   __func__);
+   return -EFAULT;
+   }
+
+   rc = tpm_read_log_acpi(chip);
+   if (rc != -ENODEV)
+   return rc;
+
+   rc = tpm_read_log_efi(chip);
+   if (rc != -ENODEV)
+   return rc;
+
+   return tpm_read_log_of(chip);
+}
+
+/*
+ * tpm_bios_log_setup() - Read the event log from the firmware
+ * @chip: TPM chip to use.
+ *
+ * If an event log is found then the securityfs files are setup to
+ * export it to userspace, otherwise nothing is done.
+ *
+ * Returns -ENODEV if the firmware has no event log or securityfs is not
+ * supported.
+ */
+int tpm_bios_log_setup(struct tpm_chip *chip)
+{
+   const char *name = dev_name(>dev);
+   unsigned int cnt;
+   int log_version;
+   int rc = 0;
+
+   rc = tpm_read_log(chip);
+   if (rc < 0)
+   return rc;
+   log_version = rc;
+
+   cnt = 0;
+   chip->bios_dir[cnt] = securityfs_create_dir(name, NULL);
+   /* NOTE: securityfs_create_dir can return ENODEV if securityfs is
+* compiled out. The caller should ignore the ENODEV return code.
+*/
+   if (IS_ERR(chip->bios_dir[cnt]))
+   goto err;
+   cnt++;
+
+   chip->bin_log_seqops.chip = chip;
+   if (log_version == EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)
+   chip->bin_log_seqops.seqops =
+