static int cvt_gate_to_trap(int vector, const gate_desc *val, struct trap_info *info) { unsigned long addr; if (val->type != GATE_TRAP && val->type != GATE_INTERRUPT) return 0; info->vector = vector; addr = gate_offset(*val); #ifdef CONFIG_X86_64 /* * Look for known traps using IST, and substitute them * appropriately. The debugger ones are the only ones we care * about. Xen will handle faults like double_fault, * so we should never see them. Warn if * there's an unexpected IST-using fault handler. */ if (addr == (unsigned long)debug) addr = (unsigned long)xen_debug; else if (addr == (unsigned long)int3) addr = (unsigned long)xen_int3; else if (addr == (unsigned long)stack_segment) addr = (unsigned long)xen_stack_segment; else if (addr == (unsigned long)double_fault || addr == (unsigned long)nmi) { /* Don't need to handle these */ return 0; #ifdef CONFIG_X86_MCE } else if (addr == (unsigned long)machine_check) { /* * when xen hypervisor inject vMCE to guest, * use native mce handler to handle it */ ; #endif } else { /* Some other trap using IST? */ if (WARN_ON(val->ist != 0)) return 0; } #endif /* CONFIG_X86_64 */ info->address = addr; info->cs = gate_segment(*val); info->flags = val->dpl; /* interrupt gates clear IF */ if (val->type == GATE_INTERRUPT) info->flags |= 1 << 2; return 1; }
static int cvt_gate_to_trap(int vector, const gate_desc *val, struct trap_info *info) { unsigned long addr; if (val->type != GATE_TRAP && val->type != GATE_INTERRUPT) return 0; info->vector = vector; addr = gate_offset(*val); #ifdef CONFIG_X86_64 /* */ if (addr == (unsigned long)debug) addr = (unsigned long)xen_debug; else if (addr == (unsigned long)int3) addr = (unsigned long)xen_int3; else if (addr == (unsigned long)stack_segment) addr = (unsigned long)xen_stack_segment; else if (addr == (unsigned long)double_fault || addr == (unsigned long)nmi) { /* */ return 0; #ifdef CONFIG_X86_MCE } else if (addr == (unsigned long)machine_check) { return 0; #endif } else { /* */ if (WARN_ON(val->ist != 0)) return 0; } #endif /* */ info->address = addr; info->cs = gate_segment(*val); info->flags = val->dpl; /* */ if (val->type == GATE_INTERRUPT) info->flags |= 1 << 2; return 1; }
static int cvt_gate_to_trap(int vector, const gate_desc *val, struct trap_info *info) { if (val->type != GATE_TRAP && val->type != GATE_INTERRUPT) return 0; info->vector = vector; info->address = gate_offset(*val); info->cs = gate_segment(*val); info->flags = val->dpl; /* interrupt gates clear IF */ if (val->type == GATE_INTERRUPT) info->flags |= 1 << 2; return 1; }