linux/drivers/tty
Peter Collingbourne 4cc3e2ed67 serial: Lock console when calling into driver before registration
[ Upstream commit 801410b26a ]

During the handoff from earlycon to the real console driver, we have
two separate drivers operating on the same device concurrently. In the
case of the 8250 driver these concurrent accesses cause problems due
to the driver's use of banked registers, controlled by LCR.DLAB. It is
possible for the setup(), config_port(), pm() and set_mctrl() callbacks
to set DLAB, which can cause the earlycon code that intends to access
TX to instead access DLL, leading to missed output and corruption on
the serial line due to unintended modifications to the baud rate.

In particular, for setup() we have:

univ8250_console_setup()
-> serial8250_console_setup()
-> uart_set_options()
-> serial8250_set_termios()
-> serial8250_do_set_termios()
-> serial8250_do_set_divisor()

For config_port() we have:

serial8250_config_port()
-> autoconfig()

For pm() we have:

serial8250_pm()
-> serial8250_do_pm()
-> serial8250_set_sleep()

For set_mctrl() we have (for some devices):

serial8250_set_mctrl()
-> omap8250_set_mctrl()
-> __omap8250_set_mctrl()

To avoid such problems, let's make it so that the console is locked
during pre-registration calls to these callbacks, which will prevent
the earlycon driver from running concurrently.

Remove the partial solution to this problem in the 8250 driver
that locked the console only during autoconfig_irq(), as this would
result in a deadlock with the new approach. The console continues
to be locked during autoconfig_irq() because it can only be called
through uart_configure_port().

Although this patch introduces more locking than strictly necessary
(and in particular it also locks during the call to rs485_config()
which is not affected by this issue as far as I can tell), it follows
the principle that it is the responsibility of the generic console
code to manage the earlycon handoff by ensuring that earlycon and real
console driver code cannot run concurrently, and not the individual
drivers.

Signed-off-by: Peter Collingbourne <pcc@google.com>
Reviewed-by: John Ogness <john.ogness@linutronix.de>
Link: https://linux-review.googlesource.com/id/I7cf8124dcebf8618e6b2ee543fa5b25532de55d8
Fixes: 1da177e4c3 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20240304214350.501253-1-pcc@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2024-04-03 15:28:26 +02:00
..
hvc hvc/xen: fix event channel handling for secondary consoles 2023-11-28 17:19:57 +00:00
ipwireless tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
serdev tty: make counts in tty_port_client_operations hooks size_t 2023-08-11 21:12:44 +02:00
serial serial: Lock console when calling into driver before registration 2024-04-03 15:28:26 +02:00
vt tty: vt: fix 20 vs 0x20 typo in EScsiignore 2024-03-26 18:20:04 -04:00
amiserial.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
ehv_bytechan.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
goldfish.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
Kconfig Merge commit b320441c04 ("Merge tag 'tty-6.5-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty") into tty-next 2023-08-20 14:29:37 +02:00
Makefile tty: add rpmsg driver 2021-10-21 12:35:35 +02:00
mips_ejtag_fdc.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
moxa.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
mxser.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
n_gsm.c tty: n_gsm: fix race condition in status line change on dead connections 2023-11-08 11:56:22 +01:00
n_hdlc.c tty: ldops: unify to u8 2023-08-11 21:12:47 +02:00
n_null.c tty: ldops: unify to u8 2023-08-11 21:12:47 +02:00
n_tty.c tty: n_tty: deduplicate copy code in n_tty_receive_buf_real_raw() 2023-08-27 11:46:52 +02:00
nozomi.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
pty.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
rpmsg_tty.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
synclink_gt.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
sysrq.c tty/sysrq: replace smp_processor_id() with get_cpu() 2023-11-28 17:19:57 +00:00
tty.h tty: audit: unify to u8 2023-08-11 21:12:46 +02:00
tty_audit.c tty: audit: unify to u8 2023-08-11 21:12:46 +02:00
tty_baudrate.c tty: Fix comment style in tty_termios_input_baud_rate() 2022-08-30 14:22:34 +02:00
tty_buffer.c tty: tty_buffer: invert conditions in __tty_buffer_request_room() 2023-08-22 14:58:16 +02:00
tty_io.c usb: cdc-acm: return correct error code on unsupported break 2024-01-25 15:35:53 -08:00
tty_ioctl.c tty: allow TIOCSLCKTRMIOS with CAP_CHECKPOINT_RESTORE 2024-02-05 20:14:32 +00:00
tty_jobctrl.c tty: tty_jobctrl: fix pid memleak in disassociate_ctty() 2023-11-20 11:59:25 +01:00
tty_ldisc.c tty: tty_ldisc: Remove the ret variable 2023-03-09 17:11:18 +01:00
tty_ldsem.c tty/ldsem: Fix syntax errors in comments 2021-12-21 09:15:49 +01:00
tty_mutex.c tty: remove TTY_MAGIC 2022-09-22 16:12:34 +02:00
tty_port.c tty: use u8 for flags 2023-08-11 21:12:45 +02:00
ttynull.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
vcc.c tty: vcc: Add check for kstrdup() in vcc_probe() 2023-11-28 17:19:45 +00:00