[PATCH] xen: x86_64: Add macro for debugreg
Add 2 macros to set and get debugreg on x86_64. This is useful for Xen because it will need only to redefine each macro to a hypervisor call. Signed-off-by: Vincent Hanquez <vincent.hanquez@cl.cam.ac.uk> Cc: Ian Pratt <m+Ian.Pratt@cl.cam.ac.uk> Cc: Andi Kleen <ak@muc.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
717b594a41
commit
e9129e56e9
|
@ -439,7 +439,7 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
|
||||||
* inside the kernel.
|
* inside the kernel.
|
||||||
*/
|
*/
|
||||||
if (current->thread.debugreg7)
|
if (current->thread.debugreg7)
|
||||||
asm volatile("movq %0,%%db7" : : "r" (current->thread.debugreg7));
|
set_debugreg(current->thread.debugreg7, 7);
|
||||||
|
|
||||||
/* Whee! Actually deliver the signal. */
|
/* Whee! Actually deliver the signal. */
|
||||||
return handle_signal(signr, &info, &ka, oldset, regs);
|
return handle_signal(signr, &info, &ka, oldset, regs);
|
||||||
|
|
|
@ -669,7 +669,7 @@ asmlinkage void do_debug(struct pt_regs * regs, unsigned long error_code)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
asm("movq %%db6,%0" : "=r" (condition));
|
get_debugreg(condition, 6);
|
||||||
|
|
||||||
if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
|
if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
|
||||||
SIGTRAP) == NOTIFY_STOP)
|
SIGTRAP) == NOTIFY_STOP)
|
||||||
|
@ -721,7 +721,7 @@ asmlinkage void do_debug(struct pt_regs * regs, unsigned long error_code)
|
||||||
info.si_addr = (void __user *)regs->rip;
|
info.si_addr = (void __user *)regs->rip;
|
||||||
force_sig_info(SIGTRAP, &info, tsk);
|
force_sig_info(SIGTRAP, &info, tsk);
|
||||||
clear_dr7:
|
clear_dr7:
|
||||||
asm volatile("movq %0,%%db7"::"r"(0UL));
|
set_debugreg(0UL, 7);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
clear_TF_reenable:
|
clear_TF_reenable:
|
||||||
|
|
|
@ -280,6 +280,14 @@ struct thread_struct {
|
||||||
set_fs(USER_DS); \
|
set_fs(USER_DS); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
#define get_debugreg(var, register) \
|
||||||
|
__asm__("movq %%db" #register ", %0" \
|
||||||
|
:"=r" (var))
|
||||||
|
#define set_debugreg(value, register) \
|
||||||
|
__asm__("movq %0,%%db" #register \
|
||||||
|
: /* no output */ \
|
||||||
|
:"r" (value))
|
||||||
|
|
||||||
struct task_struct;
|
struct task_struct;
|
||||||
struct mm_struct;
|
struct mm_struct;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue