summaryrefslogtreecommitdiff
path: root/common/version.c
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2018-12-13 14:55:27 -0800
committerCommit Bot <commit-bot@chromium.org>2019-09-21 03:46:19 +0000
commit91d4fec4606e2145d522274c786d46d12721cf9a (patch)
treef9ebc2a7adcf50f7d50209b183319be4a5d599a6 /common/version.c
parent0c1c11be2d9a590110d8d339a774b3ad8aedf96f (diff)
downloadchrome-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.c43
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 = &current_image_data;
+ return data ? get_num_commits(data) : 0;
}