From: Bjorn Helgaas uart_set_options() can dereference a null pointer. This happens if you specify a console that hasn't previously been setup by early_serial_setup(). For example, on ia64, the HCDP typically tells us about line 0, so we calls early_serial_setup() for it. If the user specifies "console=ttyS3", we machine-check when trying to follow the uninitialized port->ops pointer. It's not entirely clear to me whether we should return 0 or -ENODEV or something. The advantage of returning zero is that if the user specifies "console=ttyS0" and we just lack the HCDP, the console doesn't work as early as usual, but it does start working after the serial driver detects the port (though the baud/parity/etc from the command line are lost). Returning -ENODEV seems to prevent it from ever working. 25-akpm/drivers/serial/serial_core.c | 3 +++ 1 files changed, 3 insertions(+) diff -puN drivers/serial/serial_core.c~early-serial-registration-fix drivers/serial/serial_core.c --- 25/drivers/serial/serial_core.c~early-serial-registration-fix Wed Oct 29 12:15:20 2003 +++ 25-akpm/drivers/serial/serial_core.c Wed Oct 29 12:15:20 2003 @@ -1862,6 +1862,9 @@ uart_set_options(struct uart_port *port, if (flow == 'r') termios.c_cflag |= CRTSCTS; + if (!port->ops) + return 0; /* "console=" on ia64 */ + port->ops->set_termios(port, &termios, NULL); co->cflag = termios.c_cflag; _