Serial patch problem

Richard B. Johnson (root@analogic.com)
Tue, 10 Dec 1996 11:08:13 -0500 (EST)


I have Theo Ts'o tty patches installed. I get this upon startup when
setserial is executed from /etc/rc.d/rc.serial:

Dec 10 09:15:07 chaos kernel: divide error: 0000
Dec 10 09:15:07 chaos kernel: CPU: 0
Dec 10 09:15:07 chaos kernel: EIP: 0010:[<c019f931>]
Dec 10 09:15:07 chaos kernel: EFLAGS: 00010082
Dec 10 09:15:07 chaos kernel: eax: fffffffe ebx: fffffffe ecx: 00000000 edx: ffffffff
Dec 10 09:15:07 chaos kernel: esi: c0012ce4 edi: 00000723 ebp: 00000000 esp: c0ea2efc
Dec 10 09:15:07 chaos kernel: ds: 0018 es: 0018 ss: 0018
Dec 10 09:15:07 chaos kernel: Process setserial (pid: 28, process nr: 9, stackpage=c0ea2000)
Dec 10 09:15:07 chaos kernel: Stack: c0dc7000 00000086 c0ea2f28 c0dc7000 000003e8 c01a911f c0dc7000 00000000
Dec 10 09:15:07 chaos kernel: c0012ce4 c0f802fc c01fdbec c0ed0018 c0dc7934 c019f7e4 c0dc7000 00000000
Dec 10 09:15:07 chaos kernel: c0dc7000 00000002 c0fe5b80 00000000 00000001 00000246 c01a1c27 c0dc7000
Dec 10 09:15:07 chaos kernel: Call Trace: [<c01a911f>] [<c019f7e4>] [<c01a1c27>] [<c01a201e>] [<c012207c>] [<c01220ec>] [<c0122140>]
Dec 10 09:15:07 chaos kernel: [<c010a786>]
Dec 10 09:15:07 chaos kernel: Code: f7 7e 10 89 c3 b9 05 00 00 00 31 d2 f7 f1 89 c3 85 db 75 05

If I execute:

# setserial -bg /dev/cua*

The task will hang, i.e., wait forever. If I hit ^C, the following
exception occurs:

Dec 10 09:46:21 chaos kernel: Unable to handle kernel NULL pointer dereference at virtual address 00000004
Dec 10 09:46:21 chaos kernel: current->tss.cr3 = 00396000, |r3 = 00396000
Dec 10 09:46:21 chaos kernel: *pde = 00000000
Dec 10 09:46:21 chaos kernel: Oops: 0000
Dec 10 09:46:21 chaos kernel: CPU: 0
Dec 10 09:46:21 chaos kernel: EIP: 0010:[<c01a913c>]
Dec 10 09:46:21 chaos kernel: EFLAGS: 00010017
Dec 10 09:46:21 chaos kernel: eax: 00000000 ebx: c0ce2eec ecx: c0ea2f28 edx: 00000000
Dec 10 09:46:21 chaos kernel: esi: 00000002 edi: c0ce2eec ebp: c0dc7000 esp: c0ce2ee0
Dec 10 09:46:21 chaos kernel: ds: 0018 es: 0018 ss: 0018
Dec 10 09:46:21 chaos kernel: Process setserial (pid: 156, process nr: 28, stackpage=c0ce2000)
Dec 10 09:46:21 chaos kernel: Stack: c0012ce4 c0f802fc c01fdbec c08f5810 c0ea2f28 c019f7e4 c0dc7000 00000000
Dec 10 09:46:21 chaos kernel: c0dc7000 00000002 c0b973c0 00000000 00000001 00000246 c01a1c27 c0dc7000
Dec 10 09:46:21 chaos kernel: c0b973c0 fffffe00 00000000 c0b973c0 c0dd80f8 00000000 00000000 00000002
Dec 10 09:46:21 chaos kernel: Call Trace: [<c019f7e4>] [<c01a1c27>] [<c01a1f6b>] [<c012393a>] [<c0121ef7>] [<c012200f>] [<c010a786>]
Dec 10 09:46:21 chaos kernel: Code: 8b 42 04 39 d8 74 05 89 c2 eb f5 90 89 4a 04 56 9d 5b 5e 5f
Dec 10 09:46:21 chaos kernel: Unable to handle kernel NULL pointer dereference at virtual address 0000000e
Dec 10 09:46:21 chaos kernel: current->tss.cr3 = 00101000, |r3 = 00101000
Dec 10 09:46:21 chaos kernel: *pde = 00000000
Dec 10 09:46:21 chaos kernel: Oops: 0000
Dec 10 09:46:21 chaos kernel: CPU: 0
Dec 10 09:46:21 chaos kernel: EIP: 0010:[<c01220a7>]
Dec 10 09:46:21 chaos kernel: EFLAGS: 00010002
Dec 10 09:46:21 chaos kernel: eax: 00000000 ebx: 00000001 ecx: c0b97d40 edx: 00000000
Dec 10 09:46:21 chaos kernel: esi: 00000000 edi: 00000001 ebp: c0900810 esp: c0ce2e28
Dec 10 09:46:21 chaos kernel: ds: 0018 es: 0018 ss: 0018
Dec 10 09:46:21 chaos kernel: Process setserial (pid: 156, process nr: 28, stackpage=c0ce2000)
Dec 10 09:46:21 chaos kernel: Stack: 00000001 00000003 00000001 c0116116 00000000 0000002b 00000014 c0ce3000
Dec 10 09:46:21 chaos kernel: c0ce2eac c010acac 0000000b c01dabce 00000000 00000004 c0ce2eac c08f5810
Dec 10 09:46:21 chaos kernel: 0000005f c2000000 c1800000 c01d0018 c0110512 c01db695 c0ce2eac 00000000
Dec 10 09:46:21 chaos kernel: Call Trace: [<c0116116>] [<c010acac>] [<c2000000>] [<c1800000>] [<c01d0018>] [<c0110512>] [<c010a8ae>]
Dec 10 09:46:21 chaos kernel: [<c01a913c>] [<c019f7e4>] [<c01a1c27>] [<c01a1f6b>] [<c012393a>] [<c0121ef7>] [<c012200f>] [<c010a786>]
Dec 10 09:46:21 chaos kernel: Code: 66 83 7e 0e 00 75 16 68 70 d6 1d c0 e8 3c 0c ff ff 31 c0 83

I have the source for setserial and I have re-compiled it. It makes no
difference. When I back out the patches, everything works okay.

The hang occurs when function get_serial() tries to open a serial port
that does not exist on my machine, i.e.:

fd = open("/dev/cua2", O_RDWR|O_NONBLOCK);

This should return -1. Unfortunately it does not return except as a result
of a signal. At that time, it generates these other exceptions.