walnux/drivers/serial
Kerogit a3f8b55143 drivers/serial/serial: prevent race conditions on 8-bit architectures
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>
2025-06-19 10:01:24 -03:00
..
CMakeLists.txt cmake(bugfix):add missing driver/serial CMake build source 2024-11-13 02:36:18 +08:00
Kconfig drivers/serial/serial: prevent race conditions on 8-bit architectures 2025-06-19 10:01:24 -03:00
Kconfig-16550 drivers/serial: Add 16550_DLF_SIZE option for DesignWare UART. 2024-10-10 02:38:12 +08:00
Kconfig-cmsdk drivers/serial:support arm cmsdk drivers 2024-04-26 18:42:35 -03:00
Kconfig-lpuart Add initial support for NXP S32K3 MCU family 2022-07-25 23:47:05 +08:00
Kconfig-pci drivers/serial: simplify 16550_PCI_UARTx_CLOCK config 2025-01-03 08:52:43 +08:00
Kconfig-pl011 drivers/serial/uart_pl011.c : add the interface about clock and reset control for reducing power consumption. 2024-06-03 21:18:44 +08:00
Kconfig-sci We have ported NuttX on Renesas RX65N Micro-controller. This port includes following interfaces 2019-10-11 23:36:57 +08:00
Kconfig-uart drivers/serial/Kconfig: Split serial Rx/Tx DMA. 2019-12-03 07:06:30 -06:00
Kconfig-usart drivers/serial/serial: prevent race conditions on 8-bit architectures 2025-06-19 10:01:24 -03:00
Make.defs drivers: migrate to SPDX identifier 2024-11-06 18:02:25 +08:00
ptmx.c ptmx: When alloc minor, skip the start addr if it has been used 2025-03-04 09:14:25 +01:00
pty.c arch_atomic: only support atomic_xx and atomic64_xx function 2024-12-04 14:03:14 +01:00
pty.h drivers: migrate to SPDX identifier 2024-11-06 18:02:25 +08:00
serial.c drivers/serial/serial: prevent race conditions on 8-bit architectures 2025-06-19 10:01:24 -03:00
serial_cmsdk.c style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
serial_dma.c drivers: migrate to SPDX identifier 2024-11-06 18:02:25 +08:00
serial_gdbstub.c style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
serial_io.c drivers: migrate to SPDX identifier 2024-11-06 18:02:25 +08:00
uart_16550.c style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
uart_bth4.c drivers: migrate to SPDX identifier 2024-11-06 18:02:25 +08:00
uart_bth5.c drivers: migrate to SPDX identifier 2024-11-06 18:02:25 +08:00
uart_hostfs.c drivers: migrate to SPDX identifier 2024-11-06 18:02:25 +08:00
uart_pci_16550.c style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
uart_pl011.c fix a deadlock 2024-12-25 04:22:49 -03:00
uart_ram.c serial/uart_ram: update lower buffer offset if previous send completes 2025-01-23 18:14:48 +08:00
uart_rpmsg.c drivers/serial/uart_rpmsg: simplify initialization process of uart_rpmsg 2025-04-02 20:56:01 +08:00