Patrick Rudolph has uploaded a new patch set (#3). ( https://review.coreboot.org/c/coreboot/+/85855?usp=email )
Change subject: commonlib/include/commonlib: Add barrier in write_at_ble8() ......................................................................
commonlib/include/commonlib: Add barrier in write_at_ble8()
With the introduction of the stack canary breakpoint QEMU uncovered a different bug within coreboot. Currently the compiler optimizes over aggressively inline functions and memory stores.
That also affects write_at_ble8(), which is supposed to store a single byte at time. The compiler however optimizes multiple byte stores into a single wider (and possibly unaligned) store operation.
This can be seen in the emited assembly code of write_le16(), as used to install the EBDA: 401348a: 66 c7 04 25 13 04 00 movw $0x400,0x413 4013491: 00 00 04
Make sure that the compiler does not optimize multiple calls to write_at_ble8() by adding a memory barrier.
The emitted assembly code of the same function changes to: 401394c: c6 04 25 13 04 00 00 movb $0x0,0x413 4013953: 00 4013954: c6 04 25 14 04 00 00 movb $0x4,0x414 401395b: 04
Fixes a strange bug in QEMU where it triggers the DEBUG breakpoint handler on unaligned 16-bit stores in the first 4KiB of memory. Aligned stores and store outside of the first 4KiB do not dispatch the DEBUG breakpoint handler.
Change-Id: Ibbc661235a38c7f7540b656a67f067c3e51105d1 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M src/commonlib/include/commonlib/endian.h 1 file changed, 5 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/55/85855/3