<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(×tamp_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>