diff options
author | Che-Liang Chiou <clchiou@chromium.org> | 2011-07-20 12:54:02 +0800 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2011-08-29 10:59:05 -0700 |
commit | 02ed9d353315871f3d7a4a1cd91fafac50dafea6 (patch) | |
tree | 8b24522d0b86d4c40787ef7a48ab5b4f7eaa9084 /lib | |
parent | 1f824792fd983636f5626f4b24b9aa1e5485fe3a (diff) |
CHROMIUM: use a fixed binary layout of crossystem data
The twostop design is envolved that crossysmem data is now not
reinitialized again in readwrite main firmware, and relied on bootstub
passing the blob around.
Thus, the blob should have a fixed binary layout so that future
readwrite main firmware can reliably parse the blob contents. Currently
the readwrite main firmware just check the sanity of the blob.
BUG=chromium-os:17876
TEST=crossystem blob passes the sanity check by readwrite main firmware
Change-Id: I2981c10234c20d34e1405b5ab127bdc90faa2e3d
Reviewed-on: http://gerrit.chromium.org/gerrit/4373
Tested-by: Che-Liang Chiou <clchiou@chromium.org>
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/chromeos/crossystem_data.c | 57 |
1 files changed, 41 insertions, 16 deletions
diff --git a/lib/chromeos/crossystem_data.c b/lib/chromeos/crossystem_data.c index 455005d2644..60bcf6636f8 100644 --- a/lib/chromeos/crossystem_data.c +++ b/lib/chromeos/crossystem_data.c @@ -16,8 +16,10 @@ #include <chromeos/crossystem_data.h> #include <linux/string.h> -/* This is used to keep u-boot and kernel in sync */ -#define SHARED_MEM_VERSION 1 +#define CROSSYSTEM_DATA_SIGNATURE "CHROMEOS" + +/* This is used to keep bootstub and readwite main firmware in sync */ +#define CROSSYSTEM_DATA_VERSION 1 #define PREFIX "crossystem_data: " @@ -27,7 +29,7 @@ enum { CHSW_WRITE_PROTECT_DISABLED = 0x200 }; -int crossystem_data_init(crossystem_data_t *cdata, char *frid, +int crossystem_data_init(crossystem_data_t *cdata, uint8_t *frid, uint32_t fmap_data, void *gbb_data, void *nvcxt_raw, cros_gpio_t *wpsw, cros_gpio_t *recsw, cros_gpio_t *devsw) { @@ -39,8 +41,9 @@ int crossystem_data_init(crossystem_data_t *cdata, char *frid, cdata->total_size = sizeof(*cdata); - strcpy(cdata->signature, "CHROMEOS"); - cdata->version = SHARED_MEM_VERSION; + memcpy(cdata->signature, CROSSYSTEM_DATA_SIGNATURE, + sizeof(CROSSYSTEM_DATA_SIGNATURE)); + cdata->version = CROSSYSTEM_DATA_VERSION; if (recsw->value) cdata->chsw |= CHSW_RECOVERY_BUTTON_PRESSED; @@ -49,8 +52,8 @@ int crossystem_data_init(crossystem_data_t *cdata, char *frid, if (!wpsw->value) cdata->chsw |= CHSW_WRITE_PROTECT_DISABLED; - strncpy(cdata->frid, frid, ID_LEN); - strncpy(cdata->hwid, gbb_data + gbbh->hwid_offset, gbbh->hwid_size); + memcpy(cdata->frid, frid, ID_LEN); + memcpy(cdata->hwid, gbb_data + gbbh->hwid_offset, gbbh->hwid_size); /* boot reason; always 0 */ cdata->binf[0] = 0; @@ -83,9 +86,33 @@ int crossystem_data_init(crossystem_data_t *cdata, char *frid, return 0; } -int crossystem_data_set_fwid(crossystem_data_t *cdata, char *fwid) +int crossystem_data_check_integrity(crossystem_data_t *cdata) +{ + if (cdata->total_size != sizeof(*cdata)) { + VBDEBUG(PREFIX "blob size mismatch: %08x != %08x\n", + cdata->total_size, sizeof(*cdata)); + return 1; + } + + if (memcmp(cdata->signature, CROSSYSTEM_DATA_SIGNATURE, + sizeof(CROSSYSTEM_DATA_SIGNATURE))) { + VBDEBUG(PREFIX "invalid signature: \"%s\"\n", cdata->signature); + return 1; + } + + if (cdata->version != CROSSYSTEM_DATA_VERSION) { + VBDEBUG(PREFIX "version mismatch: %08x != %08x\n", + cdata->version, CROSSYSTEM_DATA_VERSION); + return 1; + } + + /* Okay, the crossystem data blob passes the sanity check */ + return 0; +} + +int crossystem_data_set_fwid(crossystem_data_t *cdata, uint8_t *fwid) { - strncpy(cdata->fwid, fwid, ID_LEN); + memcpy(cdata->fwid, fwid, ID_LEN); return 0; } @@ -161,8 +188,6 @@ int crossystem_data_embed_into_fdt(crossystem_data_t *cdata, void *fdt, fdt_setprop_cell(fdt, nodeoffset, name, cdata->f) #define set_array_prop(name, f) \ fdt_setprop(fdt, nodeoffset, name, cdata->f, sizeof(cdata->f)) -#define set_string_prop(name, f) \ - fdt_setprop_string(fdt, nodeoffset, name, cdata->f) #define set_conststring_prop(name, str) \ fdt_setprop_string(fdt, nodeoffset, name, str) #define set_bool_prop(name, f) \ @@ -170,7 +195,7 @@ int crossystem_data_embed_into_fdt(crossystem_data_t *cdata, void *fdt, err = 0; err |= set_scalar_prop("total-size", total_size); - err |= set_string_prop("signature", signature); + err |= set_array_prop("signature", signature); err |= set_scalar_prop("version", version); err |= set_scalar_prop("nonvolatile-context-lba", nvcxt_lba); err |= set_scalar_prop("nonvolatile-context-offset", vbnv[0]); @@ -220,15 +245,15 @@ int crossystem_data_embed_into_fdt(crossystem_data_t *cdata, void *fdt, } err |= set_scalar_prop("recovery-reason", binf[4]); - err |= set_string_prop("hardware-id", hwid); - err |= set_string_prop("firmware-version", fwid); - err |= set_string_prop("readonly-firmware-version", frid); + err |= set_array_prop("hardware-id", hwid); + err |= set_array_prop("firmware-version", fwid); + err |= set_array_prop("readonly-firmware-version", frid); err |= set_scalar_prop("fmap-offset", fmap_base); err |= set_array_prop("vboot-shared-data", vbshared_data); #undef set_scalar_prop #undef set_array_prop -#undef set_string_prop +#undef set_conststring_prop #undef set_bool_prop if (err) |