Refactored eventlog.c file into tpm_eventlog.c and tpm_eventlog_init.c

Breakdown is:

* tpm_eventlog_init.c : Moved eventlog initialization methods like
to setup securityfs, to open and release seqfile from tpm_eventlog.c
to this file. This is to keep the logic of initialization for TPM1.2
and TPM2.0 in common file.

* tpm_eventlog.c : This file now has only methods specific to parsing
and iterate TPM1.2 entry log formats. It can understand only TPM1.2
and is called by methods in tpm_eventlog_init if identified TPM device
is TPM1.2.

Changelog v2:

        * Using of_node property of device rather than direct reading
        the device node.
        * Cleaned up the code to have generic open() for ascii and bios
        measurements
        * Removed dyncamic allocation for bios_dir and having dentry array
        directly into tpm-chip.
        * Using dev_dbg instead of pr_err in tpm_of.c
        * readlog(...) now accepts struct tpm_chip * as parameter.


Signed-off-by: Nayna Jain <na...@linux.vnet.ibm.com>
---
 drivers/char/tpm/Makefile            |   4 +-
 drivers/char/tpm/tpm-chip.c          |   6 +-
 drivers/char/tpm/tpm.h               |   2 +-
 drivers/char/tpm/tpm_acpi.c          |   2 +-
 drivers/char/tpm/tpm_eventlog.c      | 156 +----------------------------------
 drivers/char/tpm/tpm_eventlog.h      |  16 ++--
 drivers/char/tpm/tpm_eventlog_init.c | 155 ++++++++++++++++++++++++++++++++++
 drivers/char/tpm/tpm_of.c            |  22 +++--
 8 files changed, 189 insertions(+), 174 deletions(-)
 create mode 100644 drivers/char/tpm/tpm_eventlog_init.c

diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
index a385fb8..9136762 100644
--- a/drivers/char/tpm/Makefile
+++ b/drivers/char/tpm/Makefile
@@ -6,10 +6,10 @@ tpm-y := tpm-interface.o tpm-dev.o tpm-sysfs.o tpm-chip.o 
tpm2-cmd.o
 tpm-$(CONFIG_ACPI) += tpm_ppi.o
 
 ifdef CONFIG_ACPI
-       tpm-y += tpm_eventlog.o tpm_acpi.o
+       tpm-y += tpm_eventlog_init.o tpm_eventlog.o tpm_acpi.o
 else
 ifdef CONFIG_TCG_IBMVTPM
-       tpm-y += tpm_eventlog.o tpm_of.o
+       tpm-y += tpm_eventlog_init.o tpm_eventlog.o tpm_of.o
 endif
 endif
 obj-$(CONFIG_TCG_TIS_CORE) += tpm_tis_core.o
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index e595013..7f6cdab 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -171,6 +171,8 @@ struct tpm_chip *tpm_chip_alloc(struct device *dev,
        chip->dev.release = tpm_dev_release;
        chip->dev.parent = dev;
        chip->dev.groups = chip->groups;
+       if (dev->of_node)
+               chip->dev.of_node = dev->of_node;
 
        if (chip->dev_num == 0)
                chip->dev.devt = MKDEV(MISC_MAJOR, TPM_MINOR);
@@ -283,7 +285,7 @@ static int tpm1_chip_register(struct tpm_chip *chip)
 
        tpm_sysfs_add_device(chip);
 
-       chip->bios_dir = tpm_bios_log_setup(dev_name(&chip->dev));
+       tpm_bios_log_setup(chip);
 
        return 0;
 }
@@ -294,7 +296,7 @@ static void tpm1_chip_unregister(struct tpm_chip *chip)
                return;
 
        if (chip->bios_dir)
-               tpm_bios_log_teardown(chip->bios_dir);
+               tpm_bios_log_teardown(chip);
 }
 
 static void tpm_del_legacy_sysfs(struct tpm_chip *chip)
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index 6e002c4..cfa408f 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -171,7 +171,7 @@ struct tpm_chip {
        unsigned long duration[3]; /* jiffies */
        bool duration_adjusted;
 
-       struct dentry **bios_dir;
+       struct dentry *bios_dir[3];
 
        const struct attribute_group *groups[3];
        unsigned int groups_cnt;
diff --git a/drivers/char/tpm/tpm_acpi.c b/drivers/char/tpm/tpm_acpi.c
index 565a947..c2a122a 100644
--- a/drivers/char/tpm/tpm_acpi.c
+++ b/drivers/char/tpm/tpm_acpi.c
@@ -45,7 +45,7 @@ struct acpi_tcpa {
 };
 
 /* read binary bios log */
-int read_log(struct tpm_bios_log *log)
+int read_log(struct tpm_bios_log *log, struct tpm_chip *chip)
 {
        struct acpi_tcpa *buff;
        acpi_status status;
diff --git a/drivers/char/tpm/tpm_eventlog.c b/drivers/char/tpm/tpm_eventlog.c
index e722886..b8f22ec 100644
--- a/drivers/char/tpm/tpm_eventlog.c
+++ b/drivers/char/tpm/tpm_eventlog.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005, 2012 IBM Corporation
+ * Copyright (C) 2005, 2012, 2016 IBM Corporation
  *
  * Authors:
  *     Kent Yoder <k...@linux.vnet.ibm.com>
@@ -11,6 +11,7 @@
  * Maintained by: <tpmdd-devel@lists.sourceforge.net>
  *
  * Access to the eventlog created by a system's firmware / BIOS
+ * specific to TPM 1.2.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -257,20 +258,6 @@ static int tpm_binary_bios_measurements_show(struct 
seq_file *m, void *v)
 
 }
 
-static int tpm_bios_measurements_release(struct inode *inode,
-                                        struct file *file)
-{
-       struct seq_file *seq = file->private_data;
-       struct tpm_bios_log *log = seq->private;
-
-       if (log) {
-               kfree(log->bios_event_log);
-               kfree(log);
-       }
-
-       return seq_release(inode, file);
-}
-
 static int tpm_ascii_bios_measurements_show(struct seq_file *m, void *v)
 {
        int len = 0;
@@ -304,151 +291,16 @@ static int tpm_ascii_bios_measurements_show(struct 
seq_file *m, void *v)
        return 0;
 }
 
-static const struct seq_operations tpm_ascii_b_measurments_seqops = {
+const struct seq_operations tpm_ascii_b_measurments_seqops = {
        .start = tpm_bios_measurements_start,
        .next = tpm_bios_measurements_next,
        .stop = tpm_bios_measurements_stop,
        .show = tpm_ascii_bios_measurements_show,
 };
 
-static const struct seq_operations tpm_binary_b_measurments_seqops = {
+const struct seq_operations tpm_binary_b_measurments_seqops = {
        .start = tpm_bios_measurements_start,
        .next = tpm_bios_measurements_next,
        .stop = tpm_bios_measurements_stop,
        .show = tpm_binary_bios_measurements_show,
 };
-
-static int tpm_ascii_bios_measurements_open(struct inode *inode,
-                                           struct file *file)
-{
-       int err;
-       struct tpm_bios_log *log;
-       struct seq_file *seq;
-
-       log = kzalloc(sizeof(struct tpm_bios_log), GFP_KERNEL);
-       if (!log)
-               return -ENOMEM;
-
-       if ((err = read_log(log)))
-               goto out_free;
-
-       /* now register seq file */
-       err = seq_open(file, &tpm_ascii_b_measurments_seqops);
-       if (!err) {
-               seq = file->private_data;
-               seq->private = log;
-       } else {
-               goto out_free;
-       }
-
-out:
-       return err;
-out_free:
-       kfree(log->bios_event_log);
-       kfree(log);
-       goto out;
-}
-
-static const struct file_operations tpm_ascii_bios_measurements_ops = {
-       .open = tpm_ascii_bios_measurements_open,
-       .read = seq_read,
-       .llseek = seq_lseek,
-       .release = tpm_bios_measurements_release,
-};
-
-static int tpm_binary_bios_measurements_open(struct inode *inode,
-                                            struct file *file)
-{
-       int err;
-       struct tpm_bios_log *log;
-       struct seq_file *seq;
-
-       log = kzalloc(sizeof(struct tpm_bios_log), GFP_KERNEL);
-       if (!log)
-               return -ENOMEM;
-
-       if ((err = read_log(log)))
-               goto out_free;
-
-       /* now register seq file */
-       err = seq_open(file, &tpm_binary_b_measurments_seqops);
-       if (!err) {
-               seq = file->private_data;
-               seq->private = log;
-       } else {
-               goto out_free;
-       }
-
-out:
-       return err;
-out_free:
-       kfree(log->bios_event_log);
-       kfree(log);
-       goto out;
-}
-
-static const struct file_operations tpm_binary_bios_measurements_ops = {
-       .open = tpm_binary_bios_measurements_open,
-       .read = seq_read,
-       .llseek = seq_lseek,
-       .release = tpm_bios_measurements_release,
-};
-
-static int is_bad(void *p)
-{
-       if (!p)
-               return 1;
-       if (IS_ERR(p) && (PTR_ERR(p) != -ENODEV))
-               return 1;
-       return 0;
-}
-
-struct dentry **tpm_bios_log_setup(const char *name)
-{
-       struct dentry **ret = NULL, *tpm_dir, *bin_file, *ascii_file;
-
-       tpm_dir = securityfs_create_dir(name, NULL);
-       if (is_bad(tpm_dir))
-               goto out;
-
-       bin_file =
-           securityfs_create_file("binary_bios_measurements",
-                                  S_IRUSR | S_IRGRP, tpm_dir, NULL,
-                                  &tpm_binary_bios_measurements_ops);
-       if (is_bad(bin_file))
-               goto out_tpm;
-
-       ascii_file =
-           securityfs_create_file("ascii_bios_measurements",
-                                  S_IRUSR | S_IRGRP, tpm_dir, NULL,
-                                  &tpm_ascii_bios_measurements_ops);
-       if (is_bad(ascii_file))
-               goto out_bin;
-
-       ret = kmalloc(3 * sizeof(struct dentry *), GFP_KERNEL);
-       if (!ret)
-               goto out_ascii;
-
-       ret[0] = ascii_file;
-       ret[1] = bin_file;
-       ret[2] = tpm_dir;
-
-       return ret;
-
-out_ascii:
-       securityfs_remove(ascii_file);
-out_bin:
-       securityfs_remove(bin_file);
-out_tpm:
-       securityfs_remove(tpm_dir);
-out:
-       return NULL;
-}
-
-void tpm_bios_log_teardown(struct dentry **lst)
-{
-       int i;
-
-       for (i = 0; i < 3; i++)
-               securityfs_remove(lst[i]);
-}
diff --git a/drivers/char/tpm/tpm_eventlog.h b/drivers/char/tpm/tpm_eventlog.h
index 8de62b0..b888c77 100644
--- a/drivers/char/tpm/tpm_eventlog.h
+++ b/drivers/char/tpm/tpm_eventlog.h
@@ -1,4 +1,3 @@
-
 #ifndef __TPM_EVENTLOG_H__
 #define __TPM_EVENTLOG_H__
 
@@ -12,6 +11,9 @@
 #define do_endian_conversion(x) x
 #endif
 
+extern const struct seq_operations tpm_ascii_b_measurments_seqops;
+extern const struct seq_operations tpm_binary_b_measurments_seqops;
+
 enum bios_platform_class {
        BIOS_CLIENT = 0x00,
        BIOS_SERVER = 0x01,
@@ -73,18 +75,18 @@ enum tcpa_pc_event_ids {
        HOST_TABLE_OF_DEVICES,
 };
 
-int read_log(struct tpm_bios_log *log);
+int read_log(struct tpm_bios_log *log, struct tpm_chip *chip);
 
 #if defined(CONFIG_TCG_IBMVTPM) || defined(CONFIG_TCG_IBMVTPM_MODULE) || \
        defined(CONFIG_ACPI)
-extern struct dentry **tpm_bios_log_setup(const char *);
-extern void tpm_bios_log_teardown(struct dentry **);
+extern void tpm_bios_log_setup(struct tpm_chip *chip);
+extern void tpm_bios_log_teardown(struct tpm_chip *chip);
 #else
-static inline struct dentry **tpm_bios_log_setup(const char *name)
+static inline void tpm_bios_log_setup(struct tpm_chip *chip)
 {
-       return NULL;
+       return;
 }
-static inline void tpm_bios_log_teardown(struct dentry **dir)
+static inline void tpm_bios_log_teardown(struct tpm_chip *chip)
 {
 }
 #endif
diff --git a/drivers/char/tpm/tpm_eventlog_init.c 
b/drivers/char/tpm/tpm_eventlog_init.c
new file mode 100644
index 0000000..dd5dbc4
--- /dev/null
+++ b/drivers/char/tpm/tpm_eventlog_init.c
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2005, 2012, 2016 IBM Corporation
+ *
+ * Authors:
+ *     Kent Yoder <k...@linux.vnet.ibm.com>
+ *     Seiji Munetoh <mune...@jp.ibm.com>
+ *     Stefan Berger <stef...@us.ibm.com>
+ *     Reiner Sailer <sai...@watson.ibm.com>
+ *     Kylene Hall <kjh...@us.ibm.com>
+ *     Nayna Jain <na...@linux.vnet.ibm.com>
+ *
+ * Maintained by: <tpmdd-devel@lists.sourceforge.net>
+ *
+ * TPM 1.2 and TPM 2.0 common initialization methods to
+ * access the eventlog 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 <linux/seq_file.h>
+#include <linux/fs.h>
+#include <linux/security.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+
+#include "tpm.h"
+#include "tpm_eventlog.h"
+
+
+static int tpm_bios_measurements_release(struct inode *inode,
+                                        struct file *file)
+{
+       struct seq_file *seq = file->private_data;
+       struct tpm_bios_log *log = seq->private;
+
+       if (log) {
+               kfree(log->bios_event_log);
+               kfree(log);
+       }
+
+       return seq_release(inode, file);
+}
+
+static int tpm_bios_measurements_open(struct inode *inode,
+                                           struct file *file)
+{
+       int err;
+       struct tpm_bios_log *log;
+       struct seq_file *seq;
+       struct tpm_chip *chip;
+       const struct seq_operations *seqops = (struct seq_operations
+       *)inode->i_private;
+
+       log = kzalloc(sizeof(struct tpm_bios_log), GFP_KERNEL);
+       if (!log)
+               return -ENOMEM;
+
+       chip = (struct tpm_chip
+       *)file->f_path.dentry->d_parent->d_inode->i_private;
+
+       err = read_log(log, chip);
+       if (err)
+               goto out_free;
+
+       /* now register seq file */
+       err = seq_open(file, seqops);
+       if (!err) {
+               seq = file->private_data;
+               seq->private = log;
+       } else {
+               goto out_free;
+       }
+
+out:
+       return err;
+out_free:
+       kfree(log->bios_event_log);
+       kfree(log);
+       goto out;
+}
+
+static const struct file_operations tpm_bios_measurements_ops = {
+       .open = tpm_bios_measurements_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = tpm_bios_measurements_release,
+};
+
+static int is_bad(void *p)
+{
+       if (!p)
+               return 1;
+       if (IS_ERR(p) && (PTR_ERR(p) != -ENODEV))
+               return 1;
+       return 0;
+}
+
+void tpm_bios_log_setup(struct tpm_chip *chip)
+{
+       struct dentry *tpm_dir, *bin_file, *ascii_file;
+       const char *name = dev_name(&chip->dev);
+       int i;
+
+       for (i = 0; i < 3; i++)
+               chip->bios_dir[i] = NULL;
+
+       tpm_dir = securityfs_create_dir(name, NULL);
+       if (is_bad(tpm_dir))
+               goto out;
+
+       tpm_dir->d_inode->i_private = chip;
+
+       bin_file =
+           securityfs_create_file("binary_bios_measurements",
+                                  S_IRUSR | S_IRGRP, tpm_dir,
+                                  (void *)&tpm_binary_b_measurments_seqops,
+                                  &tpm_bios_measurements_ops);
+       if (is_bad(bin_file))
+               goto out_tpm;
+
+       ascii_file =
+           securityfs_create_file("ascii_bios_measurements",
+                                  S_IRUSR | S_IRGRP, tpm_dir,
+                                  (void *)&tpm_ascii_b_measurments_seqops,
+                                  &tpm_bios_measurements_ops);
+       if (is_bad(ascii_file))
+               goto out_bin;
+
+       chip->bios_dir[0] = ascii_file;
+       chip->bios_dir[1] = bin_file;
+       chip->bios_dir[2] = tpm_dir;
+
+       return;
+
+out_bin:
+       securityfs_remove(bin_file);
+out_tpm:
+       securityfs_remove(tpm_dir);
+out:
+       return;
+}
+
+void tpm_bios_log_teardown(struct tpm_chip *chip)
+{
+       int i;
+
+       for (i = 0; i < 3; i++) {
+               if (chip->bios_dir[i])
+                       securityfs_remove(chip->bios_dir[i]);
+       }
+}
diff --git a/drivers/char/tpm/tpm_of.c b/drivers/char/tpm/tpm_of.c
index 570f30c..30a9905 100644
--- a/drivers/char/tpm/tpm_of.c
+++ b/drivers/char/tpm/tpm_of.c
@@ -1,7 +1,8 @@
 /*
- * Copyright 2012 IBM Corporation
+ * Copyright 2012, 2016 IBM Corporation
  *
  * Author: Ashley Lai <ashleyd...@gmail.com>
+ *         Nayna Jain <na...@linux.vnet.ibm.com>
  *
  * Maintained by: <tpmdd-devel@lists.sourceforge.net>
  *
@@ -20,7 +21,7 @@
 #include "tpm.h"
 #include "tpm_eventlog.h"
 
-int read_log(struct tpm_bios_log *log)
+int read_log(struct tpm_bios_log *log, struct tpm_chip *chip)
 {
        struct device_node *np;
        const u32 *sizep;
@@ -31,32 +32,35 @@ int read_log(struct tpm_bios_log *log)
                return -EFAULT;
        }
 
-       np = of_find_node_by_name(NULL, "vtpm");
+       if (chip->dev.of_node)
+               np = chip->dev.of_node;
        if (!np) {
-               pr_err("%s: ERROR - IBMVTPM not supported\n", __func__);
+               dev_dbg(&chip->dev, "%s: ERROR - IBMVTPM not supported\n",
+               __func__);
                return -ENODEV;
        }
 
        sizep = of_get_property(np, "linux,sml-size", NULL);
        if (sizep == NULL) {
-               pr_err("%s: ERROR - SML size not found\n", __func__);
+               dev_dbg(&chip->dev, "%s: ERROR - SML size not found\n",
+               __func__);
                goto cleanup_eio;
        }
        if (*sizep == 0) {
-               pr_err("%s: ERROR - event log area empty\n", __func__);
+               dev_dbg(&chip->dev, "%s: ERROR - event log area empty\n",
+               __func__);
                goto cleanup_eio;
        }
 
        basep = of_get_property(np, "linux,sml-base", NULL);
        if (basep == NULL) {
-               pr_err("%s: ERROR - SML not found\n", __func__);
+               dev_dbg(&chip->dev, "%s: ERROR - SML not found\n",
+               __func__);
                goto cleanup_eio;
        }
 
        log->bios_event_log = kmalloc(*sizep, GFP_KERNEL);
        if (!log->bios_event_log) {
-               pr_err("%s: ERROR - Not enough memory for BIOS measurements\n",
-                      __func__);
                of_node_put(np);
                return -ENOMEM;
        }
-- 
2.5.0


------------------------------------------------------------------------------
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are 
consuming the most bandwidth. Provides multi-vendor support for NetFlow, 
J-Flow, sFlow and other flows. Make informed decisions using capacity 
planning reports. http://sdm.link/zohodev2dev
_______________________________________________
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel

Reply via email to