Skip to contentSkip to conversation

2.5.19 OOPS in pcmcia setup code

DISCUSSION Alessandro Suardi 2 participants 3 messages May 30, 2002 – Jun 1, 2002

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

decoded oops follows, 100% reproducable.

Dell Latitude CPxJ750GT, PIII-750, Xircom RBEM56G100-TX,
kernel compiled with GCC 3.1. NB, 2.5.18 compiled with GCC 3.1 works fine.

I tried recompiling with RH7.3 GCC but I still get an oops
on boot - I can't decode it since it scrolls maybe a dozen screenfuls before stopping, so here's the GCC 3.1 one:

ksymoops 2.4.4 on i686 2.5.18. Options used

      -v /usr/src/linux-2.5.19/vmlinux (specified)
      -K (specified)
      -L (specified)
      -o /lib/modules/2.5.19 (specified)
      -m /boot/System.map-2.5.19 (specified)

No modules in ksyms, skipping objects

CPU:    0
EIP:    0010:[<c02cd3db>]

Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010296
eax: cff57720 ebx: c13b69ec ecx: c13b6800 edx: c0207846
esi: c02f6794 edi: c13b6800 ebp: c13b6800 esp: cff5bb18
ds: 0018 es: 0018 ss: 0018

Stack: 0000000b 00000003 0000000b c13b6800 00026572 00038001 115dffff 00000000
        00000000 00000000 00000000 cff57720 00000000 00000000 00000000 00000002
        00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Call Trace: [<c02043c7>] [<c020430f>] [<c0204286>] [<c0205ad7>] [<c0204c9a>]
             [<c0120290>] [<c011d7e2>] [<c011d7c5>] [<c0207f50>] [<c0105000>] [<c011d6c7>]
             [<c0105000>] [<c0105081>] [<c0105000>] [<c01057de>] [<c0105060>]
Code: 62 6f 72 61 74 6f 72 79 00 54 72 69 54 65 63 68 00 54 65 78
Quoted 1 line
Quoted 1 line

EIP; c02cd3db <timer_bug_msg+227db/2b9a0> <=====

Trace; c02043c7 <unreset_socket+a7/140>
Trace; c020430f <reset_socket+4f/60>
Trace; c0204286 <setup_socket+b6/f0>
Trace; c0205ad7 <pcmcia_register_client+277/2a0>
Trace; c0204c9a <pcmcia_bind_device+8a/f0>
Trace; c0120290 <process_timeout+0/10>
Trace; c011d7e2 <register_proc_table+b2/130>
Trace; c011d7c5 <register_proc_table+95/130>
Trace; c0207f50 <ds_event+0/90>
Trace; c0105000 <_stext+0/0>
Trace; c011d6c7 <register_sysctl_table+67/90>
Trace; c0105000 <_stext+0/0>
Trace; c0105081 <init+21/190>
Trace; c0105000 <_stext+0/0>
Trace; c01057de <kernel_thread+2e/40>
Trace; c0105060 <init+0/190>
Code; c02cd3db <timer_bug_msg+227db/2b9a0>
00000000 <_EIP>:
Code; c02cd3db <timer_bug_msg+227db/2b9a0> <=====

    0:   62 6f 72                  bound  %ebp,0x72(%edi)   <=====
Code;  c02cd3de <timer_bug_msg+227de/2b9a0>
    3:   61                        popa
Code;  c02cd3df <timer_bug_msg+227df/2b9a0>
    4:   74 6f                     je     75 <_EIP+0x75> c02cd450 <timer_bug_msg+22850/2b9a0>
Code;  c02cd3e1 <timer_bug_msg+227e1/2b9a0>
    6:   72 79                     jb     81 <_EIP+0x81> c02cd45c <timer_bug_msg+2285c/2b9a0>
Code;  c02cd3e3 <timer_bug_msg+227e3/2b9a0>
    8:   00 54 72 69               add    %dl,0x69(%edx,%esi,2)
Code;  c02cd3e7 <timer_bug_msg+227e7/2b9a0>
    c:   54                        push   %esp
Code;  c02cd3e8 <timer_bug_msg+227e8/2b9a0>
    d:   65 63 68 00               arpl   %bp,%gs:0x0(%eax)

Code; c02cd3ec <timer_bug_msg+227ec/2b9a0>
11: 54 push %esp
Code; c02cd3ed <timer_bug_msg+227ed/2b9a0>
12: 65 gs
Code; c02cd3ee <timer_bug_msg+227ee/2b9a0>
13: 78 00 js 15 <_EIP+0x15> c02cd3f0 <timer_bug_msg+227f0/2b9a0>

--alessandro

"the hands that build / can also pull down
even the hands of love"
(U2, "Exit")

#1 lore raw
Quoted 9 lines · Alessandro Suardi

decoded oops follows, 100% reproducable.

Dell Latitude CPxJ750GT, PIII-750, Xircom RBEM56G100-TX,
kernel compiled with GCC 3.1. NB, 2.5.18 compiled with GCC 3.1 works fine.

I tried recompiling with RH7.3 GCC but I still get an oops
on boot - I can't decode it since it scrolls maybe a dozen screenfuls before stopping, so here's the GCC 3.1 one:

My laptop also oopses on boot, but this patch makes things work again:

pci/hotplug.c renamed from pci/hotplug.c.old +1 -1
@@ -61,7 +61,7 @@
 	struct list_head *ln;
 
 	for(ln=pci_bus_type.drivers.next; ln != &pci_bus_type.drivers; ln=ln->next) {
-		struct pci_driver *drv = list_entry(ln, struct pci_driver, node);
+		struct pci_driver *drv = list_entry(ln, struct pci_driver, driver.bus_list);
 		if (drv->remove && pci_announce_device(drv, dev))
 			break;
 	}
Signature · 2 lines
Peter Osterlund - [email protected]
http://w1.894.telia.com/~u89404340
#2 lore raw
In reply to Alessandro Suardi
Quoted 1 line · Peter Osterlund

My laptop also oopses on boot, but this patch makes things work again:

I get an oops also in pci_unregister_driver, which happens because driver_list in the device structure is never initialized. I'm now running with this patch which seems to work:

drivers/base/driver.c +1 -0
diff -u -r linux.orig/drivers/base/driver.c linux/drivers/base/driver.c
@@ -37,6 +37,7 @@
 	write_lock(&drv->bus->lock);
 	list_add(&drv->bus_list,&drv->bus->drivers);
 	write_unlock(&drv->bus->lock);
+	INIT_LIST_HEAD(&drv->devices);
 	driver_make_dir(drv);
 	put_driver(drv);
 	return 0;
drivers/pci/hotplug.c +1 -1
diff -u -r linux.orig/drivers/pci/hotplug.c linux/drivers/pci/hotplug.c
@@ -61,7 +61,7 @@
 	struct list_head *ln;
 
 	for(ln=pci_bus_type.drivers.next; ln != &pci_bus_type.drivers; ln=ln->next) {
-		struct pci_driver *drv = list_entry(ln, struct pci_driver, node);
+		struct pci_driver *drv = list_entry(ln, struct pci_driver, driver.bus_list);
 		if (drv->remove && pci_announce_device(drv, dev))
 			break;
 	}
drivers/pci/pci-driver.c +2 -0
diff -u -r linux.orig/drivers/pci/pci-driver.c linux/drivers/pci/pci-driver.c
@@ -52,6 +52,7 @@
 	dev_probe_lock();
 	if (drv->probe(dev, id) >= 0) {
 		dev->driver = drv;
+		list_add_tail(&dev->dev.driver_list, &drv->driver.devices);
 		ret = 1;
 	}
 	dev_probe_unlock();
@@ -169,6 +170,7 @@
 		pci_dev->driver = NULL;
 		dev->driver = NULL;
 		list_del_init(&dev->driver_list);
+		node = drv->driver.devices.next;
 	}
 	put_driver(&drv->driver);
 }
include/linux/device.h +1 -1
diff -u -r linux.orig/include/linux/device.h linux/include/linux/device.h
@@ -125,7 +125,7 @@
 	struct list_head g_list;        /* node in depth-first order list */
 	struct list_head node;		/* node in sibling list */
 	struct list_head bus_list;	/* node in bus's list */
-	struct list_head driver_list;
+	struct list_head driver_list;	/* node in device_driver's list */
 	struct list_head children;
 	struct device 	* parent;
 
Signature · 2 lines
Peter Osterlund - [email protected]
http://w1.894.telia.com/~u89404340