summaryrefslogtreecommitdiff
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
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>
-rw-r--r--common/system.c3
-rw-r--r--common/usb_pd_policy.c2
-rw-r--r--common/version.c43
-rw-r--r--include/system.h8
-rw-r--r--include/version.h7
5 files changed, 43 insertions, 20 deletions
diff --git a/common/system.c b/common/system.c
index c7918b96f6..9efb931baa 100644
--- a/common/system.c
+++ b/common/system.c
@@ -668,8 +668,7 @@ uint32_t flash_get_rw_offset(enum system_image_copy_t copy)
return CONFIG_EC_PROTECTED_STORAGE_OFF + CONFIG_RO_STORAGE_OFF;
}
-static const struct image_data *system_get_image_data(
- enum system_image_copy_t copy)
+const struct image_data *system_get_image_data(enum system_image_copy_t copy)
{
static struct image_data data;
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index b36e29dbcf..74291e1e23 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -1053,7 +1053,7 @@ void pd_get_info(uint32_t *info_data)
defined(CONFIG_USB_PD_HW_DEV_ID_BOARD_MINOR)
info_data[5] = VDO_INFO(CONFIG_USB_PD_HW_DEV_ID_BOARD_MAJOR,
CONFIG_USB_PD_HW_DEV_ID_BOARD_MINOR,
- ver_get_numcommits(),
+ ver_get_num_commits(system_get_image_copy()),
(system_get_image_copy() != SYSTEM_IMAGE_RO));
#else
info_data[5] = 0;
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;
}
diff --git a/include/system.h b/include/system.h
index b215dadbf4..a5579e5cfe 100644
--- a/include/system.h
+++ b/include/system.h
@@ -200,6 +200,14 @@ int system_run_image_copy(enum system_image_copy_t copy);
int32_t system_get_rollback_version(enum system_image_copy_t copy);
/**
+ * Get the image data of an image
+ *
+ * @param copy Image copy to get the version of.
+ * @return Image data
+ */
+const struct image_data *system_get_image_data(enum system_image_copy_t copy);
+
+/**
* Get the version string for an image
*
* @param copy Image copy to get version from, or SYSTEM_IMAGE_UNKNOWN
diff --git a/include/version.h b/include/version.h
index d11ac7d9d9..71e215c8e2 100644
--- a/include/version.h
+++ b/include/version.h
@@ -9,6 +9,7 @@
#define __CROS_EC_VERSION_H
#include "common.h"
+#include "system.h"
#define CROS_EC_IMAGE_DATA_COOKIE1 0xce778899
#define CROS_EC_IMAGE_DATA_COOKIE2 0xceaabbdd
@@ -27,7 +28,9 @@ extern const char __image_data_offset[];
extern const void *__image_size;
/**
- * Get the number of commits field from version string.
+ * Get the number of commits of an image
+ *
+ * @return Number of commits in integer or 0 on error
*/
-uint32_t ver_get_numcommits(void);
+int ver_get_num_commits(enum system_image_copy_t copy);
#endif /* __CROS_EC_VERSION_H */