1/*
2 * linux/arch/i386/mm/extable.c
3 */
4
5#include <linux/module.h>
6#include <linux/spinlock.h>
7#include <asm/uaccess.h>
8
9int fixup_exception(struct pt_regs *regs)
10{
11	const struct exception_table_entry *fixup;
12
13#ifdef CONFIG_PNPBIOS
14	if (unlikely(SEGMENT_IS_PNP_CODE(regs->xcs)))
15	{
16		extern u32 pnp_bios_fault_eip, pnp_bios_fault_esp;
17		extern u32 pnp_bios_is_utter_crap;
18		pnp_bios_is_utter_crap = 1;
19		printk(KERN_CRIT "PNPBIOS fault.. attempting recovery.\n");
20		__asm__ volatile(
21			"movl %0, %%esp\n\t"
22			"jmp *%1\n\t"
23			: : "g" (pnp_bios_fault_esp), "g" (pnp_bios_fault_eip));
24		panic("do_trap: can't hit this");
25	}
26#endif
27
28	fixup = search_exception_tables(regs->eip);
29	if (fixup) {
30		regs->eip = fixup->fixup;
31		return 1;
32	}
33
34	return 0;
35}
36