<p>Philipp Deppenwiese has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/26244">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">util/cbmem: Add CBMEM TCPA log support<br><br>* Read and print the TCPA ACPI log.<br><br>Change-Id: Ie2253d86cfc675d45b0a728794cc784215401f4a<br>Signed-off-by: Philipp Deppenwiese <zaolin@das-labor.org><br>---<br>M src/commonlib/include/commonlib/coreboot_tables.h<br>M src/lib/coreboot_table.c<br>M util/cbmem/cbmem.c<br>3 files changed, 71 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/44/26244/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/commonlib/include/commonlib/coreboot_tables.h b/src/commonlib/include/commonlib/coreboot_tables.h</span><br><span>index f411ff2..c350cda 100644</span><br><span>--- a/src/commonlib/include/commonlib/coreboot_tables.h</span><br><span>+++ b/src/commonlib/include/commonlib/coreboot_tables.h</span><br><span>@@ -310,6 +310,7 @@</span><br><span> #define LB_TAG_CBMEM_CONSOLE        0x0017</span><br><span> #define LB_TAG_MRC_CACHE      0x0018</span><br><span> #define LB_TAG_ACPI_GNVS      0x0024</span><br><span style="color: hsl(120, 100%, 40%);">+#define LB_TAG_TCPA_LOG   0x0034</span><br><span> #define LB_TAG_WIFI_CALIBRATION     0x0027</span><br><span> #define LB_TAG_VPD            0x002c</span><br><span> struct lb_cbmem_ref {</span><br><span>diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c</span><br><span>index d03b771..43af395 100644</span><br><span>--- a/src/lib/coreboot_table.c</span><br><span>+++ b/src/lib/coreboot_table.c</span><br><span>@@ -342,7 +342,8 @@</span><br><span>           {CBMEM_ID_CONSOLE, LB_TAG_CBMEM_CONSOLE},</span><br><span>            {CBMEM_ID_ACPI_GNVS, LB_TAG_ACPI_GNVS},</span><br><span>              {CBMEM_ID_VPD, LB_TAG_VPD},</span><br><span style="color: hsl(0, 100%, 40%);">-             {CBMEM_ID_WIFI_CALIBRATION, LB_TAG_WIFI_CALIBRATION}</span><br><span style="color: hsl(120, 100%, 40%);">+          {CBMEM_ID_WIFI_CALIBRATION, LB_TAG_WIFI_CALIBRATION},</span><br><span style="color: hsl(120, 100%, 40%);">+         {CBMEM_ID_TCPA_LOG, LB_TAG_TCPA_LOG}</span><br><span>         };</span><br><span>   int i;</span><br><span> </span><br><span>diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c</span><br><span>index eae5da3..f91bb6f 100644</span><br><span>--- a/util/cbmem/cbmem.c</span><br><span>+++ b/util/cbmem/cbmem.c</span><br><span>@@ -34,6 +34,7 @@</span><br><span> #include <regex.h></span><br><span> #include <commonlib/cbmem_id.h></span><br><span> #include <commonlib/timestamp_serialized.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <commonlib/tcpa_log_serialized.h></span><br><span> #include <commonlib/coreboot_tables.h></span><br><span> </span><br><span> #ifdef __OpenBSD__</span><br><span>@@ -264,6 +265,7 @@</span><br><span> </span><br><span> static struct lb_cbmem_ref timestamps;</span><br><span> static struct lb_cbmem_ref console;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct lb_cbmem_ref tcpa_log;</span><br><span> static struct lb_memory_range cbmem;</span><br><span> </span><br><span> /* This is a work-around for a nasty problem introduced by initially having</span><br><span>@@ -308,7 +310,7 @@</span><br><span> static int parse_cbtable_entries(const struct mapping *table_mapping)</span><br><span> {</span><br><span>    size_t i;</span><br><span style="color: hsl(0, 100%, 40%);">-       const struct lb_record* lbr_p;</span><br><span style="color: hsl(120, 100%, 40%);">+        const struct lb_record *lbr_p;</span><br><span>       size_t table_size = mapping_size(table_mapping);</span><br><span>     const void *lbtable = mapping_virt(table_mapping);</span><br><span>   int forwarding_table_found = 0;</span><br><span>@@ -323,12 +325,19 @@</span><br><span>                      continue;</span><br><span>            case LB_TAG_TIMESTAMPS: {</span><br><span>                    debug("    Found timestamp table.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                        timestamps = parse_cbmem_ref((struct lb_cbmem_ref *) lbr_p);</span><br><span style="color: hsl(120, 100%, 40%);">+                  timestamps =</span><br><span style="color: hsl(120, 100%, 40%);">+                      parse_cbmem_ref((struct lb_cbmem_ref *)lbr_p);</span><br><span>                   continue;</span><br><span>            }</span><br><span>            case LB_TAG_CBMEM_CONSOLE: {</span><br><span>                         debug("    Found cbmem console.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                  console = parse_cbmem_ref((struct lb_cbmem_ref *) lbr_p);</span><br><span style="color: hsl(120, 100%, 40%);">+                     console = parse_cbmem_ref((struct lb_cbmem_ref *)lbr_p);</span><br><span style="color: hsl(120, 100%, 40%);">+                      continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             case LB_TAG_TCPA_LOG: {</span><br><span style="color: hsl(120, 100%, 40%);">+                       debug("    Found tcpa log table.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                       tcpa_log =</span><br><span style="color: hsl(120, 100%, 40%);">+                        parse_cbmem_ref((struct lb_cbmem_ref *)lbr_p);</span><br><span>                   continue;</span><br><span>            }</span><br><span>            case LB_TAG_FORWARD: {</span><br><span>@@ -338,7 +347,7 @@</span><br><span>                          * search at the new address.</span><br><span>                         */</span><br><span>                  struct lb_forward lbf_p =</span><br><span style="color: hsl(0, 100%, 40%);">-                               *(const struct lb_forward *) lbr_p;</span><br><span style="color: hsl(120, 100%, 40%);">+                       *(const struct lb_forward *)lbr_p;</span><br><span>                       debug("    Found forwarding entry.\n");</span><br><span>                    ret = parse_cbtable(lbf_p.forward, 0);</span><br><span> </span><br><span>@@ -651,6 +660,49 @@</span><br><span>    unmap_memory(&timestamp_mapping);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* dump the tcpa log table */</span><br><span style="color: hsl(120, 100%, 40%);">+static void dump_tcpa_log(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int i, j;</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct tcpa_table *tclt_p;</span><br><span style="color: hsl(120, 100%, 40%);">+      size_t size;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mapping tcpa_mapping;</span><br><span style="color: hsl(120, 100%, 40%);">+  char log_string[TCPA_LOG_STRING_LENGTH];</span><br><span style="color: hsl(120, 100%, 40%);">+      char hash[TCPA_FORMAT_HASH_LENGTH];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (tcpa_log.tag != LB_TAG_TCPA_LOG) {</span><br><span style="color: hsl(120, 100%, 40%);">+                fprintf(stderr, "No tcpa log found in coreboot table.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   size = sizeof(*tclt_p);</span><br><span style="color: hsl(120, 100%, 40%);">+       tclt_p = map_memory(&tcpa_mapping, tcpa_log.cbmem_addr, size);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!tclt_p)</span><br><span style="color: hsl(120, 100%, 40%);">+          die("Unable to map tcpa log header\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   size += tclt_p->num_entries * sizeof(tclt_p->entries[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     unmap_memory(&tcpa_mapping);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    tclt_p = map_memory(&tcpa_mapping, tcpa_log.cbmem_addr, size);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!tclt_p)</span><br><span style="color: hsl(120, 100%, 40%);">+          die("Unable to map full tcpa log table\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < tclt_p->num_entries; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct tcpa_entry *tce = &tclt_p->entries[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          memset(log_string, 0, TCPA_LOG_STRING_LENGTH);</span><br><span style="color: hsl(120, 100%, 40%);">+                for (j = 0; j < tce->digest_length; j++)</span><br><span style="color: hsl(120, 100%, 40%);">+                        sprintf((char *)&(hash[j * 2]), "%02x", tce->digest[j]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           snprintf(log_string, TCPA_LOG_STRING_LENGTH, "%u %s 00 [%s]\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      tce->pcr, hash, tce->name);</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("%s", log_string);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   unmap_memory(&tcpa_mapping);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct cbmem_console {</span><br><span>      u32 size;</span><br><span>    u32 cursor;</span><br><span>@@ -1028,7 +1080,7 @@</span><br><span> </span><br><span> static void print_usage(const char *name, int exit_code)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("usage: %s [-cCltTxVvh?]\n", name);</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("usage: %s [-cCltTLxVvh?]\n", name);</span><br><span>        printf("\n"</span><br><span>             "   -c | --console:                   print cbmem console\n"</span><br><span>       "   -1 | --oneboot:                   print cbmem console for last boot only\n"</span><br><span>@@ -1038,6 +1090,7 @@</span><br><span>            "   -r | --rawdump ID:                print rawdump of specific ID (in hex) of cbtable\n"</span><br><span>          "   -t | --timestamps:                print timestamp information\n"</span><br><span>       "   -T | --parseable-timestamps:      print parseable timestamps\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "   -L | --tcpa-log                   print TCPA log\n"</span><br><span>            "   -V | --verbose:                   verbose (debugging) output\n"</span><br><span>        "   -v | --version:                   print the version\n"</span><br><span>         "   -h | --help:                      print this help\n"</span><br><span>@@ -1169,6 +1222,7 @@</span><br><span>      int print_hexdump = 0;</span><br><span>       int print_rawdump = 0;</span><br><span>       int print_timestamps = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int print_tcpa_log = 0;</span><br><span>      int machine_readable_timestamps = 0;</span><br><span>         int one_boot_only = 0;</span><br><span>       unsigned int rawdump_id = 0;</span><br><span>@@ -1181,6 +1235,7 @@</span><br><span>                 {"list", 0, 0, 'l'},</span><br><span>               {"timestamps", 0, 0, 't'},</span><br><span>                 {"parseable-timestamps", 0, 0, 'T'},</span><br><span style="color: hsl(120, 100%, 40%);">+                {"tcpa-log", 0, 0, 'L'},</span><br><span>           {"hexdump", 0, 0, 'x'},</span><br><span>            {"rawdump", required_argument, 0, 'r'},</span><br><span>            {"verbose", 0, 0, 'V'},</span><br><span>@@ -1188,7 +1243,7 @@</span><br><span>            {"help", 0, 0, 'h'},</span><br><span>               {0, 0, 0, 0}</span><br><span>         };</span><br><span style="color: hsl(0, 100%, 40%);">-      while ((opt = getopt_long(argc, argv, "c1CltTxVvh?r:",</span><br><span style="color: hsl(120, 100%, 40%);">+      while ((opt = getopt_long(argc, argv, "c1CltTLxVvh?r:",</span><br><span>                              long_options, &option_index)) != EOF) {</span><br><span>                switch (opt) {</span><br><span>               case 'c':</span><br><span>@@ -1226,6 +1281,10 @@</span><br><span>                   machine_readable_timestamps = 1;</span><br><span>                     print_defaults = 0;</span><br><span>                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'L':</span><br><span style="color: hsl(120, 100%, 40%);">+                     print_tcpa_log = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                   print_defaults = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span>               case 'V':</span><br><span>                    verbose = 1;</span><br><span>                         break;</span><br><span>@@ -1334,6 +1393,9 @@</span><br><span>       if (print_defaults || print_timestamps)</span><br><span>              dump_timestamps(machine_readable_timestamps);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     if (print_defaults || print_tcpa_log)</span><br><span style="color: hsl(120, 100%, 40%);">+         dump_tcpa_log();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   unmap_memory(&lbtable_mapping);</span><br><span> </span><br><span>      close(mem_fd);</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/26244">change 26244</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/26244"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ie2253d86cfc675d45b0a728794cc784215401f4a </div>
<div style="display:none"> Gerrit-Change-Number: 26244 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>