diff options
-rw-r--r-- | arch/x86/include/asm/traps.h | 3 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 5 | ||||
-rw-r--r-- | arch/x86/xen/enlighten.c | 19 |
3 files changed, 26 insertions, 1 deletions
diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h index 0d5342515b86..c44e5002f2ff 100644 --- a/arch/x86/include/asm/traps.h +++ b/arch/x86/include/asm/traps.h | |||
@@ -13,6 +13,9 @@ asmlinkage void divide_error(void); | |||
13 | asmlinkage void debug(void); | 13 | asmlinkage void debug(void); |
14 | asmlinkage void nmi(void); | 14 | asmlinkage void nmi(void); |
15 | asmlinkage void int3(void); | 15 | asmlinkage void int3(void); |
16 | asmlinkage void xen_debug(void); | ||
17 | asmlinkage void xen_int3(void); | ||
18 | asmlinkage void xen_stack_segment(void); | ||
16 | asmlinkage void overflow(void); | 19 | asmlinkage void overflow(void); |
17 | asmlinkage void bounds(void); | 20 | asmlinkage void bounds(void); |
18 | asmlinkage void invalid_op(void); | 21 | asmlinkage void invalid_op(void); |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 38946c6e8433..bb01ce080b80 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -1379,6 +1379,11 @@ END(xen_failsafe_callback) | |||
1379 | paranoidzeroentry_ist debug do_debug DEBUG_STACK | 1379 | paranoidzeroentry_ist debug do_debug DEBUG_STACK |
1380 | paranoidzeroentry_ist int3 do_int3 DEBUG_STACK | 1380 | paranoidzeroentry_ist int3 do_int3 DEBUG_STACK |
1381 | paranoiderrorentry stack_segment do_stack_segment | 1381 | paranoiderrorentry stack_segment do_stack_segment |
1382 | #ifdef CONFIG_XEN | ||
1383 | zeroentry xen_debug do_debug | ||
1384 | zeroentry xen_int3 do_int3 | ||
1385 | errorentry xen_stack_segment do_stack_segment | ||
1386 | #endif | ||
1382 | errorentry general_protection do_general_protection | 1387 | errorentry general_protection do_general_protection |
1383 | errorentry page_fault do_page_fault | 1388 | errorentry page_fault do_page_fault |
1384 | #ifdef CONFIG_X86_MCE | 1389 | #ifdef CONFIG_X86_MCE |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 12a3159333bc..7566e13c0cac 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
21 | #include <linux/start_kernel.h> | 21 | #include <linux/start_kernel.h> |
22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
23 | #include <linux/kprobes.h> | ||
23 | #include <linux/bootmem.h> | 24 | #include <linux/bootmem.h> |
24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
25 | #include <linux/mm.h> | 26 | #include <linux/mm.h> |
@@ -44,6 +45,7 @@ | |||
44 | #include <asm/processor.h> | 45 | #include <asm/processor.h> |
45 | #include <asm/proto.h> | 46 | #include <asm/proto.h> |
46 | #include <asm/msr-index.h> | 47 | #include <asm/msr-index.h> |
48 | #include <asm/traps.h> | ||
47 | #include <asm/setup.h> | 49 | #include <asm/setup.h> |
48 | #include <asm/desc.h> | 50 | #include <asm/desc.h> |
49 | #include <asm/pgtable.h> | 51 | #include <asm/pgtable.h> |
@@ -428,11 +430,26 @@ static void xen_write_ldt_entry(struct desc_struct *dt, int entrynum, | |||
428 | static int cvt_gate_to_trap(int vector, const gate_desc *val, | 430 | static int cvt_gate_to_trap(int vector, const gate_desc *val, |
429 | struct trap_info *info) | 431 | struct trap_info *info) |
430 | { | 432 | { |
433 | unsigned long addr; | ||
434 | |||
431 | if (val->type != GATE_TRAP && val->type != GATE_INTERRUPT) | 435 | if (val->type != GATE_TRAP && val->type != GATE_INTERRUPT) |
432 | return 0; | 436 | return 0; |
433 | 437 | ||
434 | info->vector = vector; | 438 | info->vector = vector; |
435 | info->address = gate_offset(*val); | 439 | |
440 | addr = gate_offset(*val); | ||
441 | #ifdef CONFIG_X86_64 | ||
442 | if (addr == (unsigned long)debug) | ||
443 | addr = (unsigned long)xen_debug; | ||
444 | else if (addr == (unsigned long)int3) | ||
445 | addr = (unsigned long)xen_int3; | ||
446 | else if (addr == (unsigned long)stack_segment) | ||
447 | addr = (unsigned long)xen_stack_segment; | ||
448 | else | ||
449 | WARN_ON(val->ist != 0); | ||
450 | #endif /* CONFIG_X86_64 */ | ||
451 | info->address = addr; | ||
452 | |||
436 | info->cs = gate_segment(*val); | 453 | info->cs = gate_segment(*val); |
437 | info->flags = val->dpl; | 454 | info->flags = val->dpl; |
438 | /* interrupt gates clear IF */ | 455 | /* interrupt gates clear IF */ |