• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/x86/mm/
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) {
26		/* If fixup is less than 16, it means uaccess error */
27		if (fixup->fixup < 16) {
28			current_thread_info()->uaccess_err = -EFAULT;
29			regs->ip += fixup->fixup;
30			return 1;
31		}
32		regs->ip = fixup->fixup;
33		return 1;
34	}
35
36	return 0;
37}
38