summaryrefslogtreecommitdiff
path: root/chip/host/system.c
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-07-23 06:52:18 +0800
committerChromeBot <chrome-bot@google.com>2013-07-23 16:06:22 -0700
commit74abf3697109b2719d0dbc4e60667740de872fb3 (patch)
treec711bf33700f82793833930c8dc73ec8de0ee272 /chip/host/system.c
parent64e38af781a42a346f59ef27c352f4818bfa1516 (diff)
downloadchrome-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.c104
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(&copy, 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;
}