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 | |
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>
-rw-r--r-- | common/system.c | 3 | ||||
-rw-r--r-- | common/usb_pd_policy.c | 2 | ||||
-rw-r--r-- | common/version.c | 43 | ||||
-rw-r--r-- | include/system.h | 8 | ||||
-rw-r--r-- | include/version.h | 7 |
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 = ¤t_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 */ |