[funini.com] -> [kei@sodan] -> Kernel Reading

root/arch/x86/mm/extable.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. fixup_exception
  2. search_extable

#include <linux/module.h>
#include <linux/spinlock.h>
#include <asm/uaccess.h>


int fixup_exception(struct pt_regs *regs)
{
        const struct exception_table_entry *fixup;

#ifdef CONFIG_PNPBIOS
        if (unlikely(SEGMENT_IS_PNP_CODE(regs->cs))) {
                extern u32 pnp_bios_fault_eip, pnp_bios_fault_esp;
                extern u32 pnp_bios_is_utter_crap;
                pnp_bios_is_utter_crap = 1;
                printk(KERN_CRIT "PNPBIOS fault.. attempting recovery.\n");
                __asm__ volatile(
                        "movl %0, %%esp\n\t"
                        "jmp *%1\n\t"
                        : : "g" (pnp_bios_fault_esp), "g" (pnp_bios_fault_eip));
                panic("do_trap: can't hit this");
        }
#endif

        fixup = search_exception_tables(regs->ip);
        if (fixup) {
                regs->ip = fixup->fixup;
                return 1;
        }

        return 0;
}

#ifdef CONFIG_X86_64
/*
 * Need to defined our own search_extable on X86_64 to work around
 * a B stepping K8 bug.
 */
const struct exception_table_entry *
search_extable(const struct exception_table_entry *first,
               const struct exception_table_entry *last,
               unsigned long value)
{
        /* B stepping K8 bug */
        if ((value >> 32) == 0)
                value |= 0xffffffffUL << 32;

        while (first <= last) {
                const struct exception_table_entry *mid;
                long diff;

                mid = (last - first) / 2 + first;
                diff = mid->insn - value;
                if (diff == 0)
                        return mid;
                else if (diff < 0)
                        first = mid+1;
                else
                        last = mid-1;
        }
        return NULL;
}
#endif

/* [<][>][^][v][top][bottom][index][help] */

[funini.com] -> [kei@sodan] -> Kernel Reading