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 <vpalatin@chromium.org>

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 <vpalatin@chromium.org>
Tested-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Nick Sanders <nsanders@chromium.org>
This commit is contained in:
Vincent Palatin
2017-03-22 15:30:59 +01:00
committed by chrome-bot
parent e43ba03ebf
commit d9afaba9b4
2 changed files with 6 additions and 2 deletions

View File

@@ -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 */

View File

@@ -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;