summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/system.c85
-rw-r--r--core/cortex-m/ec.lds.S8
-rw-r--r--core/cortex-m0/ec.lds.S8
-rw-r--r--core/nds32/ec.lds.S12
4 files changed, 24 insertions, 89 deletions
diff --git a/common/system.c b/common/system.c
index 28d846c0c5..5386075979 100644
--- a/common/system.c
+++ b/common/system.c
@@ -126,7 +126,7 @@ uintptr_t get_program_memory_addr(enum system_image_copy_t copy)
/**
* Return the size of the image copy, or 0 if error.
*/
-static uint32_t get_size(enum system_image_copy_t copy)
+static uint32_t __attribute__((unused)) get_size(enum system_image_copy_t copy)
{
/* Ensure we return aligned sizes. */
BUILD_ASSERT(CONFIG_RO_SIZE % SPI_FLASH_MAX_WRITE_SIZE == 0);
@@ -364,59 +364,6 @@ test_mockable enum system_image_copy_t system_get_image_copy(void)
#endif
}
-/*
- * TODO(crbug.com/577915): Store image used size at build time and simply
- * read it back.
- */
-int system_get_image_used(enum system_image_copy_t copy)
-{
-#ifdef CONFIG_EXTERNAL_STORAGE
- static uint8_t buf[SPI_FLASH_MAX_WRITE_SIZE];
-#endif
- int image_offset;
- const uint8_t *image;
- int size;
- size = get_size(copy);
- if (size <= 0)
- return 0;
-
- /*
- * Scan backwards looking for 0xea byte, which is by definition the
- * last byte of the image. See ec.lds.S for how this is inserted at
- * the end of the image.
- */
- image_offset = (copy == SYSTEM_IMAGE_RW) ?
- CONFIG_EC_WRITABLE_STORAGE_OFF + CONFIG_RW_STORAGE_OFF :
- CONFIG_EC_PROTECTED_STORAGE_OFF + CONFIG_RO_STORAGE_OFF;
-#ifdef CONFIG_EXTERNAL_STORAGE
- image = buf;
-
- do {
- if (image == buf) {
- /* No valid image found? */
- if (size < SPI_FLASH_MAX_WRITE_SIZE)
- return 0;
-
- flash_read(image_offset + size -
- SPI_FLASH_MAX_WRITE_SIZE,
- SPI_FLASH_MAX_WRITE_SIZE, buf);
- image = buf + SPI_FLASH_MAX_WRITE_SIZE;
- }
-
- image--, size--;
-
- } while (*image != 0xea);
-#else
- image = (const uint8_t *)(image_offset + CONFIG_MAPPED_STORAGE_BASE);
- flash_lock_mapped_storage(1);
- for (size--; size > 0 && image[size] != 0xea; size--)
- ;
- flash_lock_mapped_storage(0);
-#endif
-
- return size ? size + 1 : 0; /* 0xea byte IS part of the image */
-}
-
test_mockable int system_unsafe_to_overwrite(uint32_t offset, uint32_t size)
{
uint32_t r_offset;
@@ -613,8 +560,8 @@ int system_run_image_copy(enum system_image_copy_t copy)
return EC_ERROR_UNKNOWN;
}
-__attribute__((weak)) /* Weird chips may need their own implementations */
-const char *system_get_version(enum system_image_copy_t copy)
+static const struct image_data *system_get_image_data(
+ enum system_image_copy_t copy)
{
static struct image_data data;
@@ -623,10 +570,9 @@ const char *system_get_version(enum system_image_copy_t copy)
/* Handle version of current image */
if (copy == active_copy || copy == SYSTEM_IMAGE_UNKNOWN)
- return &current_image_data.version[0];
-
+ return &current_image_data;
if (active_copy == SYSTEM_IMAGE_UNKNOWN)
- return "";
+ return NULL;
/*
* The version string is always located after the reset vectors, so
@@ -651,16 +597,31 @@ const char *system_get_version(enum system_image_copy_t copy)
#else
/* Read the version struct from flash into a buffer. */
if (flash_read(addr, sizeof(data), (char *)&data))
- return "";
+ return NULL;
#endif
/* Make sure the version struct cookies match before returning the
* version string. */
if (data.cookie1 == current_image_data.cookie1 &&
data.cookie2 == current_image_data.cookie2)
- return data.version;
+ return &data;
+
+ return NULL;
+}
+
+__attribute__((weak)) /* Weird chips may need their own implementations */
+const char *system_get_version(enum system_image_copy_t copy)
+{
+ const struct image_data *data = system_get_image_data(copy);
+
+ return data ? data->version : "";
+}
+
+int system_get_image_used(enum system_image_copy_t copy)
+{
+ const struct image_data *data = system_get_image_data(copy);
- return "";
+ return data ? MAX((int)data->size, 0) : 0;
}
int system_get_board_version(void)
diff --git a/core/cortex-m/ec.lds.S b/core/cortex-m/ec.lds.S
index 803845c5a6..0c570a0b14 100644
--- a/core/cortex-m/ec.lds.S
+++ b/core/cortex-m/ec.lds.S
@@ -329,14 +329,6 @@ SECTIONS
* can expand to use all the remaining RAM. */
__shared_mem_buf = .;
- /* Tag at end of firmware image so that we can find the image size.
- * This may be overwritten by the shared memory buffer; that's ok
- * because we only use it to find the image size in flash. */
- . = ALIGN(4);
- BYTE(0x45);
- BYTE(0x4e);
- BYTE(0x44);
- BYTE(0xea);
/* NOTHING MAY GO AFTER THIS! */
} > IRAM
diff --git a/core/cortex-m0/ec.lds.S b/core/cortex-m0/ec.lds.S
index ee65cb31ce..495395a572 100644
--- a/core/cortex-m0/ec.lds.S
+++ b/core/cortex-m0/ec.lds.S
@@ -217,14 +217,6 @@ SECTIONS
* can expand to use all the remaining RAM. */
__shared_mem_buf = .;
- /* Tag at end of firmware image so that we can find the image size.
- * This may be overwritten by the shared memory buffer; that's ok
- * because we only use it to find the image size in flash. */
- . = ALIGN(4);
- BYTE(0x45);
- BYTE(0x4e);
- BYTE(0x44);
- BYTE(0xea);
/* NOTHING MAY GO AFTER THIS! */
} > IRAM
diff --git a/core/nds32/ec.lds.S b/core/nds32/ec.lds.S
index 978f652815..735d4e5c8b 100644
--- a/core/nds32/ec.lds.S
+++ b/core/nds32/ec.lds.S
@@ -218,17 +218,7 @@ SECTIONS
} > IRAM
- .flash.tag : {
- /* Tag at end of firmware image so that we can find the image size.
- * This may be overwritten by the shared memory buffer; that's ok
- * because we only use it to find the image size in flash. */
- . = ALIGN(4);
- BYTE(0x45);
- BYTE(0x4e);
- BYTE(0x44);
- BYTE(0xea);
- /* NOTHING MAY GO IN FLASH AFTER THIS! */
- } >FLASH
+ /* TODO: Add __image_size. */
#ifdef CONFIG_LPC
.h2ram (NOLOAD) : {