x86, extable: Disable presorted exception table for now
[linux-2.6-block.git] / arch / x86 / mm / extable.c
CommitLineData
6d48583b
HH
1#include <linux/module.h>
2#include <linux/spinlock.h>
3#include <asm/uaccess.h>
4
5
6int fixup_exception(struct pt_regs *regs)
7{
8 const struct exception_table_entry *fixup;
9
10#ifdef CONFIG_PNPBIOS
11 if (unlikely(SEGMENT_IS_PNP_CODE(regs->cs))) {
12 extern u32 pnp_bios_fault_eip, pnp_bios_fault_esp;
13 extern u32 pnp_bios_is_utter_crap;
14 pnp_bios_is_utter_crap = 1;
15 printk(KERN_CRIT "PNPBIOS fault.. attempting recovery.\n");
16 __asm__ volatile(
17 "movl %0, %%esp\n\t"
18 "jmp *%1\n\t"
19 : : "g" (pnp_bios_fault_esp), "g" (pnp_bios_fault_eip));
20 panic("do_trap: can't hit this");
21 }
22#endif
23
24 fixup = search_exception_tables(regs->ip);
25 if (fixup) {
fe40c0af
HS
26 /* If fixup is less than 16, it means uaccess error */
27 if (fixup->fixup < 16) {
4fc34901 28 current_thread_info()->uaccess_err = 1;
fe40c0af
HS
29 regs->ip += fixup->fixup;
30 return 1;
31 }
6d48583b
HH
32 regs->ip = fixup->fixup;
33 return 1;
34 }
35
36 return 0;
37}
6a1ea279
PA
38
39/* Restricted version used during very early boot */
40int __init early_fixup_exception(unsigned long *ip)
41{
42 const struct exception_table_entry *fixup;
43
44 fixup = search_exception_tables(*ip);
45 if (fixup) {
46 if (fixup->fixup < 16)
47 return 0; /* Not supported during early boot */
48
49 *ip = fixup->fixup;
50 return 1;
51 }
52
53 return 0;
54}