summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/system_common.c35
-rw-r--r--common/vboot_hash.c3
-rw-r--r--include/system.h13
3 files changed, 44 insertions, 7 deletions
diff --git a/common/system_common.c b/common/system_common.c
index 22e42272c2..2fd978d6cd 100644
--- a/common/system_common.c
+++ b/common/system_common.c
@@ -31,7 +31,6 @@ struct jump_tag {
uint8_t data_version;
};
-
/*
* Data passed between the current image and the next one when jumping between
* images.
@@ -230,6 +229,32 @@ enum system_image_copy_t system_get_image_copy(void)
return SYSTEM_IMAGE_UNKNOWN;
}
+int system_get_image_used(enum system_image_copy_t copy)
+{
+ const uint8_t *image;
+ int size = 0;
+
+ if (copy == SYSTEM_IMAGE_RO) {
+ image = (const uint8_t *)CONFIG_SECTION_RO_OFF;
+ size = CONFIG_SECTION_RO_SIZE;
+ } else if (copy == SYSTEM_IMAGE_RW) {
+ image = (const uint8_t *)CONFIG_SECTION_RW_OFF;
+ size = CONFIG_SECTION_RW_SIZE;
+ }
+
+ if (size <= 0)
+ return 0;
+
+ /* If the last byte isn't 0xff, the image is completely full */
+ if (image[size - 1] != 0xff)
+ return size;
+
+ /* Scan backwards looking for 0xea byte */
+ for (size--; size > 0 && image[size] != 0xea; size--)
+ ;
+
+ return size;
+}
/* Returns true if the given range is overlapped with the active image.
*
@@ -606,11 +631,11 @@ DECLARE_CONSOLE_COMMAND(hibernate, command_hibernate,
static int command_version(int argc, char **argv)
{
- ccprintf("Chip: %s %s %s\n", system_get_chip_vendor(),
+ ccprintf("Chip: %s %s %s\n", system_get_chip_vendor(),
system_get_chip_name(), system_get_chip_revision());
- ccprintf("Board: %d\n", system_get_board_version());
- ccprintf("RO: %s\n", system_get_version(SYSTEM_IMAGE_RO));
- ccprintf("RW: %s\n", system_get_version(SYSTEM_IMAGE_RW));
+ ccprintf("Board: %d\n", system_get_board_version());
+ ccprintf("RO: %s\n", system_get_version(SYSTEM_IMAGE_RO));
+ ccprintf("RW: %s\n", system_get_version(SYSTEM_IMAGE_RW));
ccprintf("Build: %s\n", system_get_build_info());
return EC_SUCCESS;
}
diff --git a/common/vboot_hash.c b/common/vboot_hash.c
index c8afce6efe..49e3e4797b 100644
--- a/common/vboot_hash.c
+++ b/common/vboot_hash.c
@@ -114,7 +114,8 @@ static void vboot_hash_init(void)
} else {
/* Start computing the hash of firmware A */
vboot_hash_start(CONFIG_FW_RW_OFF - CONFIG_FLASH_BASE,
- CONFIG_FW_RW_SIZE, NULL, 0);
+ system_get_image_used(SYSTEM_IMAGE_RW),
+ NULL, 0);
}
}
diff --git a/include/system.h b/include/system.h
index 4bcde16aae..d1975c9fed 100644
--- a/include/system.h
+++ b/include/system.h
@@ -104,12 +104,23 @@ const uint8_t *system_get_jump_tag(uint16_t tag, int *version, int *size);
/* Return the address just past the last usable byte in RAM. */
int system_usable_ram_end(void);
-/* Returns true if the given range is overlapped with the active image. */
+/* Return true if the given range is overlapped with the active image. */
int system_unsafe_to_overwrite(uint32_t offset, uint32_t size);
/* Return a text description of the image copy which is currently running. */
const char *system_get_image_copy_string(void);
+/**
+ * Return the number of bytes used in the specified image.
+ *
+ * This is the actual size of code+data in the image, as opposed to the
+ * amount of space reserved in flash for that image.
+ *
+ * @return actual image size in bytes, 0 if the image contains no content or
+ * error.
+ */
+int system_get_image_used(enum system_image_copy_t copy);
+
/* Jump to the specified image copy. */
int system_run_image_copy(enum system_image_copy_t copy);