summaryrefslogtreecommitdiff
path: root/common/version.c
diff options
context:
space:
mode:
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;
}