summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2017-03-06 14:56:05 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-03-16 00:11:41 -0700
commit879b7bc8f13e42123ac2e767d8934f86676ab9b2 (patch)
tree36f130edb985a47cb8a3b94a4debcf27aadc4dac
parente025e17b3341cd20cebe721ce2d70d2d69d2d5ce (diff)
downloadchrome-ec-879b7bc8f13e42123ac2e767d8934f86676ab9b2.tar.gz
chip/g: Add support for deprecated RO version_struct
Master chip/g FW still needs to support deprecated RO, so re-add support for the old version_struct. This CL can be reverted once we no longer need to support deprecated RO on master. BUG=chromium:698881,chromium:698882 TEST=Flash old FW (f51fdf2) to RW_B slot and updated FW to RW_A. Verify cr50 boots into RW_A, and "version" on the console prints RW_B version, not "Error". BRANCH=None Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Change-Id: I3c255afcd12da5694ca128960de8d2abe41686dc Reviewed-on: https://chromium-review.googlesource.com/450860 Commit-Ready: Shawn N <shawnn@chromium.org> Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
-rw-r--r--chip/g/system.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/chip/g/system.c b/chip/g/system.c
index 0e33bcef00..1dbf3882a4 100644
--- a/chip/g/system.c
+++ b/chip/g/system.c
@@ -259,6 +259,19 @@ enum system_image_copy_t system_get_ro_image_copy(void)
}
/*
+ * TODO(crbug.com/698882): Remove support for version_struct_deprecated once
+ * we no longer care about supporting legacy RO.
+ */
+struct version_struct_deprecated {
+ uint32_t cookie1;
+ char version[32];
+ uint32_t cookie2;
+};
+
+#define CROS_EC_IMAGE_DATA_COOKIE1_DEPRECATED 0xce112233
+#define CROS_EC_IMAGE_DATA_COOKIE2_DEPRECATED 0xce445566
+
+/*
* The RW images contain version strings. The RO images don't, so we'll make
* some here.
*/
@@ -268,6 +281,9 @@ static char vers_str[MAX_RO_VER_LEN];
const char *system_get_version(enum system_image_copy_t copy)
{
const struct image_data *data;
+ const struct version_struct_deprecated *data_deprecated;
+ const char *version;
+
const struct SignedHeader *h;
enum system_image_copy_t this_copy;
uintptr_t vaddr, delta;
@@ -314,21 +330,35 @@ const char *system_get_version(enum system_image_copy_t copy)
if (vaddr == INVALID_ADDR)
break;
h = (const struct SignedHeader *)vaddr;
+ /* Corrupted header's magic is set to zero. */
+ if (!h->magic)
+ break;
+
vaddr += delta;
data = (const struct image_data *)vaddr;
+ data_deprecated = (const struct version_struct_deprecated *)
+ vaddr;
/*
* Make sure the version struct cookies match before returning
* the version string.
*/
if (data->cookie1 == current_image_data.cookie1 &&
- data->cookie2 == current_image_data.cookie2 &&
- h->magic) { /* Corrupted header's magic is set to zero. */
- snprintf(vers_str, sizeof(vers_str), "%d.%d.%d/%s",
- h->epoch_, h->major_, h->minor_,
- data->version);
- return vers_str;
- }
+ data->cookie2 == current_image_data.cookie2)
+ version = data->version;
+ /* Check for old / deprecated structure. */
+ else if (data_deprecated->cookie1 ==
+ CROS_EC_IMAGE_DATA_COOKIE1_DEPRECATED &&
+ data_deprecated->cookie2 ==
+ CROS_EC_IMAGE_DATA_COOKIE2_DEPRECATED)
+ version = data_deprecated->version;
+ else
+ break;
+
+ snprintf(vers_str, sizeof(vers_str), "%d.%d.%d/%s",
+ h->epoch_, h->major_, h->minor_, version);
+ return vers_str;
+
default:
break;
}