Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/mm/extable.c
10817 views
1
#include <linux/module.h>
2
#include <linux/spinlock.h>
3
#include <asm/uaccess.h>
4
5
6
int 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
39