okay, the crash happens if i boot an SMP kernel, and do the following:
cat /dev/ttyS0
[ ... system works at this point, no crash ... ]
Ctrl-C
[ ... system crashes ... ]
note that ttyS0 is not the serial console device - so this is a plain
unconnected serial port.
the oops, written down by hand:
Unable to handle kernel paging request at virtual address ffffff8a
c01aa193
CPU: 1
EIP: 0010:[<c01aa193>] Not tainted
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010292
eax: 00000002 ebx: ffffff70 ecx: 00000000 edx: 000000ff
esi: ffffff70 edi: 00000000 ebp: c02d3ad0 esp: c13e1edc
Call Trace: [<c01ab696>] [<c0114210>] [<c0109d79>] [<c010a07e>]
[<c0113821>]
[<c0105470>] [<c0108347>] [<c01054c0>] [<c0105470>] [<c01054eb>]
[<c010553a>]
[<c011d3ac>] [<c011d1ca>]
Aiee, killing interrupt handler!
Warning (Oops_read): Code line not seen, dumping what data is available
>>EIP; c01aa193 <serial_in+13/80> <=====
Trace; c01ab696 <serial8250_interrupt+66/1a0>
Trace; c0114210 <move+50/90>
Trace; c0109d79 <handle_IRQ_event+69/a0>
Trace; c010a07e <do_IRQ+ee/190>
Trace; c0113821 <smp_apic_timer_interrupt+131/140>
Trace; c0105470 <default_idle+0/50>
Trace; c0108347 <common_interrupt+1f/24>
Trace; c01054c0 <poll_idle+0/40>
Trace; c0105470 <default_idle+0/50>
Trace; c01054eb <poll_idle+2b/40>
Trace; c010553a <cpu_idle+3a/50>
Trace; c011d3ac <release_console_sem+11c/120>
Trace; c011d1ca <printk+18a/200>
ie. the second, idle CPU received a serial interrupt and crashed in it.
the .config used for this is attached. The gdb backtrace:
(gdb) list *0xc01aa193
0xc01aa193 is in serial_in (serial_8250.c:176).
171 { "RSA", 2048, UART_CLEAR_FIFO | UART_USE_FIFO }
172 };
173
174 static _INLINE_ unsigned int serial_in(struct uart_8250_port *up, int offset)
175 {
176 offset <<= up->port.regshift;
177
178 switch (up->port.iotype) {
179 case SERIAL_IO_HUB6:
180 outb(up->port.hub6 - 1 + offset, up->port.iobase);
(gdb)
(gdb) list *0xc01ab696
0xc01ab696 is in serial8250_interrupt (serial_8250.c:947).
942 unsigned int iir;
943
944 up = list_entry(l, struct uart_8250_port, list);
945
946 iir = serial_in(up, UART_IIR);
947 if (!(iir & UART_IIR_NO_INT)) {
948 spin_lock(&up->port.lock);
949 serial8250_handle_port(up, regs);
950 spin_unlock(&up->port.lock);
951
(gdb)
this backtrace looks more credible to me.
Ingo
This archive was generated by hypermail 2b29 : Tue Jul 23 2002 - 22:00:36 EST