Re: Debian kernel regression, was Re: Modernizing a Macintosh LC III
On Thu, 21 Nov 2013, Geert Uytterhoeven wrote:
> Unable to handle kernel NULL pointer dereference at virtual address (null)
> Oops: 00000000
> PC: [<0013ad28>] __pmz_startup+0x32/0x2a0
[snip]
> Call Trace: [<002c5d3e>] pmz_console_setup+0x64/0xe4
> [<00009600>] atari_keyboard_interrupt+0x164/0x2dc
> [<000499f4>] register_console+0x104/0x2a6
> [<000fc4a8>] strlen+0x0/0x14
> [<00048b96>] printk+0x0/0x26
> [<002c5cd4>] pmz_console_init+0x10/0x16
[snip]
>
> drivers/tty/serial/pmac_zilog.c needs some MACH_IS_MAC() tests.
>
The platform devices pmz_ports[X].pdev aren't supposed to be used unless
config_mac() first initializes them (when MACH_IS_MAC). Unfortunately the
null pointer test in pmz_console_setup() never succeeds because
pmz_probe() always sets those pointers, so make sure they remain null when
the platform device isn't valid.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
I haven't even compiled this. Geert, can you please build and test?
Index: linux-3.12/drivers/tty/serial/pmac_zilog.c
===================================================================
--- linux-3.12.orig/drivers/tty/serial/pmac_zilog.c 2013-11-04 10:41:51.000000000 +1100
+++ linux-3.12/drivers/tty/serial/pmac_zilog.c 2013-11-22 10:07:06.000000000 +1100
@@ -1748,8 +1748,10 @@ static int __init pmz_probe(void)
pmz_ports[0].flags = PMACZILOG_FLAG_IS_CHANNEL_A;
pmz_ports[0].pdev = &scc_a_pdev;
err = pmz_init_port(&pmz_ports[0]);
- if (err)
+ if (err) {
+ pmz_ports[0].pdev = NULL;
return err;
+ }
pmz_ports_count++;
pmz_ports[0].mate = &pmz_ports[1];
@@ -1758,8 +1760,10 @@ static int __init pmz_probe(void)
pmz_ports[1].flags = 0;
pmz_ports[1].pdev = &scc_b_pdev;
err = pmz_init_port(&pmz_ports[1]);
- if (err)
+ if (err) {
+ pmz_ports[1].pdev = NULL;
return err;
+ }
pmz_ports_count++;
return 0;
Reply to: