aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/xen/enlighten.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 7566e13c0ca..e9df942aa14 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -439,14 +439,32 @@ static int cvt_gate_to_trap(int vector, const gate_desc *val,
439 439
440 addr = gate_offset(*val); 440 addr = gate_offset(*val);
441#ifdef CONFIG_X86_64 441#ifdef CONFIG_X86_64
442 /*
443 * Look for known traps using IST, and substitute them
444 * appropriately. The debugger ones are the only ones we care
445 * about. Xen will handle faults like double_fault and
446 * machine_check, so we should never see them. Warn if
447 * there's an unexpected IST-using fault handler.
448 */
442 if (addr == (unsigned long)debug) 449 if (addr == (unsigned long)debug)
443 addr = (unsigned long)xen_debug; 450 addr = (unsigned long)xen_debug;
444 else if (addr == (unsigned long)int3) 451 else if (addr == (unsigned long)int3)
445 addr = (unsigned long)xen_int3; 452 addr = (unsigned long)xen_int3;
446 else if (addr == (unsigned long)stack_segment) 453 else if (addr == (unsigned long)stack_segment)
447 addr = (unsigned long)xen_stack_segment; 454 addr = (unsigned long)xen_stack_segment;
448 else 455 else if (addr == (unsigned long)double_fault ||
449 WARN_ON(val->ist != 0); 456 addr == (unsigned long)nmi) {
457 /* Don't need to handle these */
458 return 0;
459#ifdef CONFIG_X86_MCE
460 } else if (addr == (unsigned long)machine_check) {
461 return 0;
462#endif
463 } else {
464 /* Some other trap using IST? */
465 if (WARN_ON(val->ist != 0))
466 return 0;
467 }
450#endif /* CONFIG_X86_64 */ 468#endif /* CONFIG_X86_64 */
451 info->address = addr; 469 info->address = addr;
452 470