|
@@ -20,6 +20,7 @@
|
|
#include <linux/delay.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/start_kernel.h>
|
|
#include <linux/start_kernel.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/sched.h>
|
|
|
|
+#include <linux/kprobes.h>
|
|
#include <linux/bootmem.h>
|
|
#include <linux/bootmem.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/mm.h>
|
|
@@ -44,6 +45,7 @@
|
|
#include <asm/processor.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/proto.h>
|
|
#include <asm/proto.h>
|
|
#include <asm/msr-index.h>
|
|
#include <asm/msr-index.h>
|
|
|
|
+#include <asm/traps.h>
|
|
#include <asm/setup.h>
|
|
#include <asm/setup.h>
|
|
#include <asm/desc.h>
|
|
#include <asm/desc.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/pgtable.h>
|
|
@@ -428,11 +430,26 @@ static void xen_write_ldt_entry(struct desc_struct *dt, int entrynum,
|
|
static int cvt_gate_to_trap(int vector, const gate_desc *val,
|
|
static int cvt_gate_to_trap(int vector, const gate_desc *val,
|
|
struct trap_info *info)
|
|
struct trap_info *info)
|
|
{
|
|
{
|
|
|
|
+ unsigned long addr;
|
|
|
|
+
|
|
if (val->type != GATE_TRAP && val->type != GATE_INTERRUPT)
|
|
if (val->type != GATE_TRAP && val->type != GATE_INTERRUPT)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
info->vector = vector;
|
|
info->vector = vector;
|
|
- info->address = gate_offset(*val);
|
|
|
|
|
|
+
|
|
|
|
+ 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
|
|
|
|
+ WARN_ON(val->ist != 0);
|
|
|
|
+#endif /* CONFIG_X86_64 */
|
|
|
|
+ info->address = addr;
|
|
|
|
+
|
|
info->cs = gate_segment(*val);
|
|
info->cs = gate_segment(*val);
|
|
info->flags = val->dpl;
|
|
info->flags = val->dpl;
|
|
/* interrupt gates clear IF */
|
|
/* interrupt gates clear IF */
|