<p>Rizwan Qureshi has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/26836">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cbfstool: Update FIT entries in the second bootblock<br><br>Once a second bootblock has been added using topswap (-j)<br>option, Update the entries in second FIT using -j option with<br>update-fit command.<br>Additionally add a -q option which allows to insert the address of<br>a FMAP region (which should hold a microcode) as the last entry in<br>the second FIT.<br><br>BUG=None<br>BRANCH=None<br>TEST= Create ROM images with -j options and update FIT using -q option.<br>example:<br>./build/util/cbfstool/cbfstool coreboot.tmp create \<br> -M build/fmap.fmap -r COREBOOT,FW_MAIN_A,FW_MAIN_B,RW_LEGACY<br>build/util/cbfstool/cbfstool coreboot.tmp add \<br> -f build/cbfs/fallback/bootblock.bin -n bootblock -t \<br>        bootblock -b -49152 -j 0x10000<br>build/util/cbfstool/cbfstool coreboot.tmp add-master-header -j 0x10000<br>build/util/cbfstool/cbfstool coreboot.tmp add -f build/cpu_microcode_blob.bin \<br>       -n cpu_microcode_blob.bin -t microcode -r COREBOOT -a 16<br>build/util/cbfstool/cbfstool coreboot.tmp. update-fit \<br>     -n cpu_microcode_blob.bin -x 4 -j 0x10000 -q FW_MAIN_A<br><br>Also try the failure scenarion by providing invalid topswap size.<br><br>Change-Id: I9a417031c279038903cdf1761a791f2da0fe8644<br>Signed-off-by: Rizwan Qureshi <rizwan.qureshi@intel.com><br>---<br>M util/cbfstool/cbfstool.c<br>M util/cbfstool/fit.c<br>M util/cbfstool/fit.h<br>3 files changed, 97 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/36/26836/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c</span><br><span>index 30873d4..a2ce4b6 100644</span><br><span>--- a/util/cbfstool/cbfstool.c</span><br><span>+++ b/util/cbfstool/cbfstool.c</span><br><span>@@ -58,6 +58,7 @@</span><br><span>     const char *source_region;</span><br><span>   const char *bootblock;</span><br><span>       const char *ignore_section;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *ucode_region;</span><br><span>    uint64_t u64val;</span><br><span>     uint32_t type;</span><br><span>       uint32_t baseaddress;</span><br><span>@@ -1204,6 +1205,51 @@</span><br><span>       return buffer_write_file(param.image_region, param.filename);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int update_secondary_fit(struct cbfs_image *image)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!is_valid_topswap())</span><br><span style="color: hsl(120, 100%, 40%);">+              return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   int32_t num_entries = param.fit_empty_entries;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* If a forced entry is provided add one extra row */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (param.ucode_region)</span><br><span style="color: hsl(120, 100%, 40%);">+               num_entries++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      struct buffer bootblock2;</span><br><span style="color: hsl(120, 100%, 40%);">+     buffer_splice(&bootblock2, param.image_region, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         param.image_region->size - param.topswap_size);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (fit_update_table(&bootblock2, image, param.name,</span><br><span style="color: hsl(120, 100%, 40%);">+                              num_entries,</span><br><span style="color: hsl(120, 100%, 40%);">+                          convert_to_from_top_aligned)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ERROR("Couldn't update FIT in second bootblock\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return 1;</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%);">+   /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Now insert the provided region address at the</span><br><span style="color: hsl(120, 100%, 40%);">+       * available empty row.</span><br><span style="color: hsl(120, 100%, 40%);">+        */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (param.ucode_region) {</span><br><span style="color: hsl(120, 100%, 40%);">+             uint32_t addr;</span><br><span style="color: hsl(120, 100%, 40%);">+                struct buffer ucode;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                if (partitioned_file_read_region(&ucode,</span><br><span style="color: hsl(120, 100%, 40%);">+                          param.image_file, param.ucode_region))</span><br><span style="color: hsl(120, 100%, 40%);">+                        addr = -convert_to_from_top_aligned(&ucode, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (fit_insert_entry(&bootblock2, num_entries, addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                              convert_to_from_top_aligned)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       ERROR("Couldn't insert into second FIT\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                     return 1;</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%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int cbfs_update_fit(void)</span><br><span> {</span><br><span>      if (!param.name) {</span><br><span>@@ -1229,6 +1275,11 @@</span><br><span>  if (fit_update_table(&bootblock, &image, param.name,</span><br><span>                         param.fit_empty_entries, convert_to_from_top_aligned))</span><br><span>               return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Update second bootblock */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (param.topswap_size) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (update_secondary_fit(&image))</span><br><span style="color: hsl(120, 100%, 40%);">+                 return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        // The region to be written depends on the type of image, so we write it</span><br><span>     // here rather than having main() write the CBFS region back as usual.</span><br><span>@@ -1317,7 +1368,7 @@</span><br><span>       {"print", "H:r:vkh?", cbfs_print, true, false},</span><br><span>  {"read", "r:f:vh?", cbfs_read, true, false},</span><br><span>     {"remove", "H:r:n:vh?", cbfs_remove, true, true},</span><br><span style="color: hsl(0, 100%, 40%);">-   {"update-fit", "H:r:n:x:vh?", cbfs_update_fit, true, true},</span><br><span style="color: hsl(120, 100%, 40%);">+       {"update-fit", "H:r:n:x:vh?j:q:", cbfs_update_fit, true, true},</span><br><span>  {"write", "r:f:i:Fudvh?", cbfs_write, true, true},</span><br><span>       {"expand", "r:h?", cbfs_expand, true, true},</span><br><span>     {"truncate", "r:h?", cbfs_truncate, true, true},</span><br><span>@@ -1351,6 +1402,7 @@</span><br><span>         {"offset",        required_argument, 0, 'o' },</span><br><span>     {"padding",       required_argument, 0, 'p' },</span><br><span>     {"page-size",     required_argument, 0, 'P' },</span><br><span style="color: hsl(120, 100%, 40%);">+      {"ucode-region",  required_argument, 0, 'q' },</span><br><span>     {"size",          required_argument, 0, 's' },</span><br><span>     {"top-aligned",   required_argument, 0, 'T' },</span><br><span>     {"type",          required_argument, 0, 't' },</span><br><span>@@ -1480,6 +1532,7 @@</span><br><span>                     "Expand CBFS to span entire region\n"</span><br><span>           " update-fit [-r image,regions] -n MICROCODE_BLOB_NAME \\\n"</span><br><span>       "        -x EMTPY_FIT_ENTRIES                                 "</span><br><span style="color: hsl(120, 100%, 40%);">+             "        [-j topswap-size [-q ucode-region]] (Intel CPUs only)"</span><br><span>                       "Updates the FIT table with microcode entries\n"</span><br><span>        "\n"</span><br><span>       "OFFSETs:\n"</span><br><span>@@ -1733,6 +1786,9 @@</span><br><span>                          param.topswap_size =</span><br><span>                                                 strtol(optarg, NULL, 0);</span><br><span>                             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case 'q':</span><br><span style="color: hsl(120, 100%, 40%);">+                             param.ucode_region = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                          break;</span><br><span>                       case 'v':</span><br><span>                            verbose++;</span><br><span>                           break;</span><br><span>diff --git a/util/cbfstool/fit.c b/util/cbfstool/fit.c</span><br><span>index e3e6c32..b2e9d30 100644</span><br><span>--- a/util/cbfstool/fit.c</span><br><span>+++ b/util/cbfstool/fit.c</span><br><span>@@ -145,7 +145,7 @@</span><br><span> </span><br><span>    /* Assume that the FIT table only contains the header */</span><br><span>     if (fit_entry_size_bytes(&table->header) != sizeof(struct fit_entry))</span><br><span style="color: hsl(0, 100%, 40%);">-            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          WARN("FIT contains header already\n");</span><br><span> </span><br><span>         return table;</span><br><span> }</span><br><span>@@ -252,6 +252,43 @@</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int fit_insert_entry(struct buffer *bootblock, int empty_entries,</span><br><span style="color: hsl(120, 100%, 40%);">+                 uint32_t addr, fit_offset_converter_t offset_fn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct fit_table *fit;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, inserted = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        fit = locate_fit_table(offset_fn, bootblock);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!fit) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ERROR("FIT not found.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          return 1;</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%);">+   for (i = 0; i < empty_entries; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct fit_entry *entry = &fit->entries[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (entry->address == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 entry->address = addr;</span><br><span style="color: hsl(120, 100%, 40%);">+                     entry->size_reserved = 0x0000; /* doesn't matter */</span><br><span style="color: hsl(120, 100%, 40%);">+                    entry->type_checksum_valid = FIT_TYPE_MICROCODE;</span><br><span style="color: hsl(120, 100%, 40%);">+                   entry->checksum = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                       fit_entry_add_size(&fit->header,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       sizeof(struct fit_entry));</span><br><span style="color: hsl(120, 100%, 40%);">+                    inserted = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!inserted) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ERROR("No Empty entries found!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return 1;</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%);">+   update_fit_checksum(fit);</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int fit_update_table(struct buffer *bootblock, struct cbfs_image *image,</span><br><span>                const char *microcode_blob_name, int empty_entries,</span><br><span>                  fit_offset_converter_t offset_fn)</span><br><span>diff --git a/util/cbfstool/fit.h b/util/cbfstool/fit.h</span><br><span>index 5f1b80b..d425590 100644</span><br><span>--- a/util/cbfstool/fit.h</span><br><span>+++ b/util/cbfstool/fit.h</span><br><span>@@ -31,4 +31,6 @@</span><br><span> int fit_update_table(struct buffer *bootblock, struct cbfs_image *image,</span><br><span>                   const char *microcode_blob_name, int empty_entries,</span><br><span>                  fit_offset_converter_t offset_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+int fit_insert_entry(struct buffer *bootblock, int empty_entries,</span><br><span style="color: hsl(120, 100%, 40%);">+                    uint32_t addr, fit_offset_converter_t offset_fn);</span><br><span> #endif</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/26836">change 26836</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/26836"/><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: I9a417031c279038903cdf1761a791f2da0fe8644 </div>
<div style="display:none"> Gerrit-Change-Number: 26836 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Rizwan Qureshi <rizwan.qureshi@intel.com> </div>