diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2017-03-06 14:56:05 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-03-16 00:11:41 -0700 |
commit | 879b7bc8f13e42123ac2e767d8934f86676ab9b2 (patch) | |
tree | 36f130edb985a47cb8a3b94a4debcf27aadc4dac | |
parent | e025e17b3341cd20cebe721ce2d70d2d69d2d5ce (diff) | |
download | chrome-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.c | 44 |
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; } |