diff options
author | Vic Yang <victoryang@chromium.org> | 2013-07-23 06:52:18 +0800 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-07-23 16:06:22 -0700 |
commit | 74abf3697109b2719d0dbc4e60667740de872fb3 (patch) | |
tree | c711bf33700f82793833930c8dc73ec8de0ee272 /chip/host/system.c | |
parent | 64e38af781a42a346f59ef27c352f4818bfa1516 (diff) | |
download | chrome-ec-74abf3697109b2719d0dbc4e60667740de872fb3.tar.gz |
Test sysjump tag in kb_8042 test
This checks that keyboard state is preserved across system jump.
BUG=chrome-os-partner:19236
TEST=Pass the test
BRANCH=None
Change-Id: I53c5bb68246fd117b351d89c3907daf028bc4ef3
Signed-off-by: Vic Yang <victoryang@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/62908
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'chip/host/system.c')
-rw-r--r-- | chip/host/system.c | 104 |
1 files changed, 103 insertions, 1 deletions
diff --git a/chip/host/system.c b/chip/host/system.c index dc824f58b7..e1bd2cc898 100644 --- a/chip/host/system.c +++ b/chip/host/system.c @@ -7,13 +7,86 @@ #include <stdlib.h> +#include "common.h" #include "host_test.h" #include "system.h" +#include "panic.h" #include "persistence.h" +#include "util.h" #define SHARED_MEM_SIZE 512 /* bytes */ char __shared_mem_buf[SHARED_MEM_SIZE]; +#define RAM_DATA_SIZE (sizeof(struct panic_data) + 512) /* bytes */ +static char __ram_data[RAM_DATA_SIZE]; + +static enum system_image_copy_t __running_copy; + +static void ramdata_set_persistent(void) +{ + FILE *f = get_persistent_storage("ramdata", "wb"); + int sz; + + ASSERT(f != NULL); + + sz = fwrite(__ram_data, sizeof(__ram_data), 1, f); + ASSERT(sz == 1); + + release_persistent_storage(f); +} + +static void ramdata_get_persistent(void) +{ + FILE *f = get_persistent_storage("ramdata", "rb"); + + if (f == NULL) { + fprintf(stderr, + "No RAM data found. Initializing to 0x00.\n"); + memset(__ram_data, 0, sizeof(__ram_data)); + return; + } + + fread(__ram_data, sizeof(__ram_data), 1, f); + + release_persistent_storage(f); + + /* + * Assumes RAM data doesn't preserve across reboot except for sysjump. + * Clear persistent data once it's read. + */ + remove_persistent_storage("ramdata"); +} + +static void set_image_copy(uint32_t copy) +{ + FILE *f = get_persistent_storage("image_copy", "wb"); + + ASSERT(f != NULL); + ASSERT(fwrite(©, sizeof(copy), 1, f) == 1); + + release_persistent_storage(f); +} + +static uint32_t get_image_copy(void) +{ + FILE *f = get_persistent_storage("image_copy", "rb"); + uint32_t ret; + + if (f == NULL) + return SYSTEM_IMAGE_RO; + fread(&ret, sizeof(ret), 1, f); + release_persistent_storage(f); + remove_persistent_storage("image_copy"); + + return ret; +} + +test_mockable struct panic_data *panic_get_data(void) +{ + return (struct panic_data *) + (__ram_data + RAM_DATA_SIZE - sizeof(struct panic_data)); +} + test_mockable void system_reset(int flags) { exit(EXIT_CODE_RESET | flags); @@ -64,6 +137,11 @@ int system_set_vbnvcontext(const uint8_t *block) return EC_ERROR_UNIMPLEMENTED; } +enum system_image_copy_t system_get_image_copy(void) +{ + return __running_copy; +} + int system_set_scratchpad(uint32_t value) { FILE *f = get_persistent_storage("scratchpad", "w"); @@ -97,7 +175,31 @@ uintptr_t system_usable_ram_end(void) return (uintptr_t)(__shared_mem_buf + SHARED_MEM_SIZE); } +static void __jump_resetvec(void) +{ + ramdata_set_persistent(); + exit(EXIT_CODE_RESET); +} + +static void __ro_jump_resetvec(void) +{ + set_image_copy(SYSTEM_IMAGE_RO); + __jump_resetvec(); +} + +static void __rw_jump_resetvec(void) +{ + set_image_copy(SYSTEM_IMAGE_RW); + __jump_resetvec(); +} + void system_pre_init(void) { - /* Nothing */ + ramdata_get_persistent(); + __running_copy = get_image_copy(); + + *(uintptr_t *)(__host_flash + CONFIG_FW_RO_OFF + 4) = + (uintptr_t)__ro_jump_resetvec; + *(uintptr_t *)(__host_flash + CONFIG_FW_RW_OFF + 4) = + (uintptr_t)__rw_jump_resetvec; } |