Some code paths in drivers/serial/serial.c load head and tail values of receive and transmit circular buffers with interrupts enabled, making it possible that the interrupt handler changes the value. As noted in the code, this is safe as long as the load itself is atomic. That is not true for 8bit architectures which fetch the 16-bit values using two load instructions. If interrupt handler runs between those two instructions and changes the value, the read returns corrupted data. This patch introduces CONFIG_ARCH_LDST_16BIT_NOT_ATOMIC configuration option which is automatically selected for AVR architecture. Based on this option, head and tail values are reduced to 8-bit length so the read remains atomic. Patch was tested by building on rv-virt:nsh - disassembly of functions from serial.c showed no difference which is correct as Risc-V does not need to protect reads of these values. There should be no impact for architectures that do not set the new configuration option. It was also tested by by custom echo application running on AVR128DA28. Signed-off-by: Kerogit <kr.git@kerogit.eu> |
||
|---|---|---|
| .. | ||
| include | ||
| src | ||
| Kconfig | ||