>From the objdump output, it looks like the exception table is in order at link time, but the DBE table is definitely out of order. What seems to be throwing it off is the dummy call to get_dbe() in traps.c. After sprinkling a few more calls to get_dbe() around the kernel and seeing what happens during link, it looks like any call to get_dbe() inside an __init section (or probably any explicitly located section) will throw off the ordering of the table. I'd say just change the binary search to a linear one, or reorder the table at __init time if O(log n) is that important. If there were 600 entries in the table, sure, but I don't really see the benefit of the additional code to deal with only a handful, as in most cases. > The kernel relies on several tables being correctly ordered by the > linker, including the initialization vectors, so it is a fair bet that > the linker is correctly appended these tables as the kernel is built. > What is more likely is that one of the exception table entries was > created out of order. Please send the following output to me, not the > list. > > objdump -h vmlinux > objdump -s -j __ex_table vmlinux > nm -a vmlinux >
Index: arch/mips/kernel/traps.c =================================================================== RCS file: /cvs/linux/arch/mips/kernel/traps.c,v retrieving revision 1.107 diff -u -r1.107 traps.c --- arch/mips/kernel/traps.c 2002/02/26 23:29:05 1.107 +++ arch/mips/kernel/traps.c 2002/04/18 06:36:06 @@ -360,17 +360,12 @@ unsigned long value) { const struct exception_table_entry *mid; - long diff; - while (first < last) { - mid = (last - first) / 2 + first; - diff = mid->insn - value; - if (diff < 0) - first = mid + 1; - else - last = mid; + for (mid = first; mid <= last; mid++) { + if (mid->insn == value) + return mid->nextinsn; } - return (first == last && first->insn == value) ? first->nextinsn : 0; + return 0; } extern spinlock_t modlist_lock;