From d9afaba9b4043a9d953b0d4c4e846520b04a0597 Mon Sep 17 00:00:00 2001 From: Vincent Palatin Date: Wed, 22 Mar 2017 15:30:59 +0100 Subject: [PATCH] flash: ensure proper pstate alignment The pstate structure is written using the low-level flash_physical_write() function. As a consequence, it is supposed to meet the CONFIG_FLASH_WRITE_SIZE alignment constraint. Add a build-time assertion to avoid silent failures. Slightly decrease the maximum size of the serial number string, so the structure has a natural 32-byte alignment which is compatible with a large number of platforms (including STM32L4 which requires 64-bit alignment). Of course, this change is not fully backward-compatible. Signed-off-by: Vincent Palatin BRANCH=none BUG=chromium:571477 b:35648258 TEST=on STM32L442, build and run 'flashrom --wp-enable' without failure. Change-Id: Ia8f82790a61a6c7d2cf9bfeb95bfdaf7b8c52d11 Reviewed-on: https://chromium-review.googlesource.com/458201 Commit-Ready: Vincent Palatin Tested-by: Vincent Palatin Reviewed-by: Randall Spangler Reviewed-by: Nick Sanders --- common/flash.c | 6 +++++- include/usb_descriptor.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/common/flash.c b/common/flash.c index 020dbd727e..d070e5f6b3 100644 --- a/common/flash.c +++ b/common/flash.c @@ -38,7 +38,7 @@ /* NOTE: It's not expected that RO and RW will support * differing PSTATE versions. */ #define PERSIST_STATE_VERSION 3 /* Expected persist_state.version */ -#define SERIALNO_MAX 30 +#define SERIALNO_MAX 28 /* Flags for persist_state.flags */ /* Protect persist state and RO firmware at boot */ @@ -53,6 +53,10 @@ struct persist_state { uint8_t reserved; /* Reserved; set 0 */ uint8_t serialno[SERIALNO_MAX]; /* Serial number. */ }; +/* written with flash_physical_write, need to respect alignment constraints */ +#ifndef CHIP_FAMILY_STM32L /* STM32L1xx is somewhat lying to us */ +BUILD_ASSERT(sizeof(struct persist_state) % CONFIG_FLASH_WRITE_SIZE == 0); +#endif #else /* !CONFIG_FLASH_PSTATE_BANK */ diff --git a/include/usb_descriptor.h b/include/usb_descriptor.h index 3c5352e452..1343e0d777 100644 --- a/include/usb_descriptor.h +++ b/include/usb_descriptor.h @@ -258,7 +258,7 @@ struct usb_setup_packet { #ifdef CONFIG_USB_SERIALNO /* String Descriptor for USB, for editable strings. */ -#define USB_STRING_LEN 30 +#define USB_STRING_LEN 28 struct usb_string_desc { uint8_t _len; uint8_t _type;