extable_32.c 747 B

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