[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:
Vincent Hanquez 2005-06-23 00:08:46 -07:00 committed by Linus Torvalds
parent 717b594a41
commit e9129e56e9
3 changed files with 11 additions and 3 deletions

View File

@ -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);

View File

@ -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:

View File

@ -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;