diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2017-01-12 09:40:10 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-01-30 16:48:40 -0800 |
commit | 7cbb815732d7434f5985d3b50a869aa71ba5c507 (patch) | |
tree | 5c8714c956b96cbe3c6793d31b338e68afbacc79 /common | |
parent | 927e01da02ab68c304d95508df5ba0b50f8bb960 (diff) | |
download | chrome-ec-7cbb815732d7434f5985d3b50a869aa71ba5c507.tar.gz |
version: Store image size data in version struct
Store our image size (known at build time) in our version struct (now
renamed to image_data). This will allow us to more efficiently determine
the size of an image in a follow-up CL.
Note that compatibility is broken for old ROs that do not include this
CL.
BUG=chromium:577915
TEST=Verify on kevin + lars + lars_pd that stored image size matches
output of system_get_image_used() for both RO and RW images.
BRANCH=None
Change-Id: I49ea5fc27a7f11f66daba485a87d0dfe7d0c770f
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/427408
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/fmap.c | 14 | ||||
-rw-r--r-- | common/system.c | 16 | ||||
-rw-r--r-- | common/usb_pd_policy.c | 2 | ||||
-rw-r--r-- | common/version.c | 18 |
4 files changed, 26 insertions, 24 deletions
diff --git a/common/fmap.c b/common/fmap.c index 6f84c37b63..9ddd670fd4 100644 --- a/common/fmap.c +++ b/common/fmap.c @@ -109,9 +109,9 @@ const struct _ec_fmap { .area_name = "RO_FRID", .area_offset = CONFIG_EC_PROTECTED_STORAGE_OFF - FMAP_REGION_START + CONFIG_RO_STORAGE_OFF + - RELATIVE_RO((uint32_t)__version_struct_offset) + - offsetof(struct version_struct, version), - .area_size = sizeof(version_data.version), + RELATIVE_RO((uint32_t)__image_data_offset) + + offsetof(struct image_data, version), + .area_size = sizeof(current_image_data.version), .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO, }, @@ -151,15 +151,15 @@ const struct _ec_fmap { * RW firmware version ID. Must be NULL terminated * ASCII, and padded with \0. * TODO: Get the relative offset of - * __version_struct_offset within our RW image to + * __image_data_offset within our RW image to * accommodate image asymmetry. */ .area_name = "RW_FWID", .area_offset = CONFIG_EC_WRITABLE_STORAGE_OFF - FMAP_REGION_START + CONFIG_RW_STORAGE_OFF + - RELATIVE_RO((uint32_t)__version_struct_offset) + - offsetof(struct version_struct, version), - .area_size = sizeof(version_data.version), + RELATIVE_RO((uint32_t)__image_data_offset) + + offsetof(struct image_data, version), + .area_size = sizeof(current_image_data.version), .area_flags = FMAP_AREA_STATIC, }, } diff --git a/common/system.c b/common/system.c index ddabe3aa3c..28d846c0c5 100644 --- a/common/system.c +++ b/common/system.c @@ -616,14 +616,14 @@ int system_run_image_copy(enum system_image_copy_t copy) __attribute__((weak)) /* Weird chips may need their own implementations */ const char *system_get_version(enum system_image_copy_t copy) { - static struct version_struct v; + static struct image_data data; uintptr_t addr; enum system_image_copy_t active_copy = system_get_image_copy(); /* Handle version of current image */ if (copy == active_copy || copy == SYSTEM_IMAGE_UNKNOWN) - return &version_data.version[0]; + return ¤t_image_data.version[0]; if (active_copy == SYSTEM_IMAGE_UNKNOWN) return ""; @@ -632,7 +632,7 @@ const char *system_get_version(enum system_image_copy_t copy) * The version string is always located after the reset vectors, so * it's the same offset as in the current image. Find that offset. */ - addr = ((uintptr_t)&version_data - + addr = ((uintptr_t)¤t_image_data - get_program_memory_addr(active_copy)); /* @@ -646,19 +646,19 @@ const char *system_get_version(enum system_image_copy_t copy) #ifdef CONFIG_MAPPED_STORAGE addr += CONFIG_MAPPED_STORAGE_BASE; flash_lock_mapped_storage(1); - memcpy(&v, (const void *)addr, sizeof(v)); + memcpy(&data, (const void *)addr, sizeof(data)); flash_lock_mapped_storage(0); #else /* Read the version struct from flash into a buffer. */ - if (flash_read(addr, sizeof(v), (char *)&v)) + if (flash_read(addr, sizeof(data), (char *)&data)) return ""; #endif /* Make sure the version struct cookies match before returning the * version string. */ - if (v.cookie1 == version_data.cookie1 && - v.cookie2 == version_data.cookie2) - return v.version; + if (data.cookie1 == current_image_data.cookie1 && + data.cookie2 == current_image_data.cookie2) + return data.version; return ""; } diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index 97e7718bf6..5e5ce71547 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -959,7 +959,7 @@ int pd_custom_flash_vdm(int port, int cnt, uint32_t *payload) switch (PD_VDO_CMD(payload[0])) { case VDO_CMD_VERSION: - memcpy(payload + 1, &version_data.version, 24); + memcpy(payload + 1, ¤t_image_data.version, 24); rsize = 7; break; case VDO_CMD_REBOOT: diff --git a/common/version.c b/common/version.c index 3757c9d5b4..ff8207bf2c 100644 --- a/common/version.c +++ b/common/version.c @@ -10,11 +10,14 @@ #include "ec_version.h" #include "version.h" -const struct version_struct __keep version_data +const struct image_data __keep current_image_data __attribute__((section(".rodata.ver"))) = { - CROS_EC_VERSION_COOKIE1, - CROS_EC_VERSION32, - CROS_EC_VERSION_COOKIE2 + .cookie1 = CROS_EC_IMAGE_DATA_COOKIE1, + .version = CROS_EC_VERSION32, +#ifndef TEST_BUILD + .size = (const uintptr_t)&__image_size, +#endif + .cookie2 = CROS_EC_IMAGE_DATA_COOKIE2, }; const char build_info[] __keep __attribute__((section(".rodata.buildinfo"))) = @@ -32,7 +35,7 @@ uint32_t ver_get_numcommits(void) * we want to return the numcommits as an int. */ for (i = 0; i < 32; i++) { - if (version_data.version[i] == '.') { + if (current_image_data.version[i] == '.') { numperiods++; if (numperiods == 2) break; @@ -41,12 +44,11 @@ uint32_t ver_get_numcommits(void) i++; for (; i < 32; i++) { - if (version_data.version[i] == '-') + if (current_image_data.version[i] == '-') break; ret *= 10; - ret += version_data.version[i] - '0'; + ret += current_image_data.version[i] - '0'; } return (i == 32 ? 0 : ret); } - |