diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2018-12-13 14:55:27 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-09-21 03:46:19 +0000 |
commit | 91d4fec4606e2145d522274c786d46d12721cf9a (patch) | |
tree | f9ebc2a7adcf50f7d50209b183319be4a5d599a6 /common/version.c | |
parent | 0c1c11be2d9a590110d8d339a774b3ad8aedf96f (diff) | |
download | chrome-ec-91d4fec4606e2145d522274c786d46d12721cf9a.tar.gz |
version: Make ver_get_num_commits work for on-flash images
EFS needs to check whether a RW version on flash is equal to or newer
for rollback protection before jumping to a RW copy.
Currently, ver_get_numcommits works only for the running image. This
makes it work for images on flash as well.
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
BUG=chromium:998135
BRANCH=none
TEST=Boot Nami. Verify version numbers are read from RAM and flash.
Change-Id: I94475e40f89dc4c3173d83cb1d9d4ad38d6fab79
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1450816
Reviewed-by: Jett Rink <jettrink@chromium.org>
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Commit-Queue: Daisuke Nojiri <dnojiri@chromium.org>
Tested-by: Daisuke Nojiri <dnojiri@chromium.org>
Diffstat (limited to 'common/version.c')
-rw-r--r-- | common/version.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/common/version.c b/common/version.c index 962f4621e8..13a200b1b5 100644 --- a/common/version.c +++ b/common/version.c @@ -9,6 +9,8 @@ #include "common.h" #include "compile_time_macros.h" #include "ec_version.h" +#include "stddef.h" +#include "system.h" #include "version.h" BUILD_ASSERT(CONFIG_ROLLBACK_VERSION >= 0); @@ -28,19 +30,15 @@ const struct image_data __keep current_image_data const char build_info[] __keep __attribute__((section(".rodata.buildinfo"))) = VERSION " " DATE " " BUILDER; -uint32_t ver_get_numcommits(void) +static int get_num_commits(const struct image_data *data) { - int i; int numperiods = 0; - uint32_t ret = 0; - - /* - * Version string is formatted like: - * name_major.branch.numcommits-hash[dirty] - * we want to return the numcommits as an int. - */ - for (i = 0; i < 32; i++) { - if (current_image_data.version[i] == '.') { + int ret = 0; + size_t i; + + /* Version string format is name_major.branch.commits-hash[dirty] */ + for (i = 0; i < sizeof(data->version); i++) { + if (data->version[i] == '.') { numperiods++; if (numperiods == 2) break; @@ -48,12 +46,27 @@ uint32_t ver_get_numcommits(void) } i++; - for (; i < 32; i++) { - if (current_image_data.version[i] == '-') + for (; i < sizeof(data->version); i++) { + int d; + if (data->version[i] == '-') break; ret *= 10; - ret += current_image_data.version[i] - '0'; + d = data->version[i] - '0'; + if (d < 0 || d > 9) + return 0; + ret += d; } - return (i == 32 ? 0 : ret); + return (i == sizeof(data->version) ? 0 : ret); + +} + +int ver_get_num_commits(enum system_image_copy_t copy) +{ + const struct image_data *data; + if (IS_ENABLED(CONFIG_COMMON_RUNTIME)) + data = system_get_image_data(copy); + else + data = ¤t_image_data; + return data ? get_num_commits(data) : 0; } |