x86/entry: Introduce local_db_{save,restore}()
In order to allow other exceptions than #DB to disable breakpoints, provide common helpers. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lkml.kernel.org/r/20200529213321.012060983@infradead.org
This commit is contained in:
committed by
Thomas Gleixner
parent
fdef24dfcc
commit
e1de11d4d1
@@ -113,6 +113,36 @@ static inline void debug_stack_usage_inc(void) { }
|
|||||||
static inline void debug_stack_usage_dec(void) { }
|
static inline void debug_stack_usage_dec(void) { }
|
||||||
#endif /* X86_64 */
|
#endif /* X86_64 */
|
||||||
|
|
||||||
|
static __always_inline unsigned long local_db_save(void)
|
||||||
|
{
|
||||||
|
unsigned long dr7;
|
||||||
|
|
||||||
|
get_debugreg(dr7, 7);
|
||||||
|
dr7 &= ~0x400; /* architecturally set bit */
|
||||||
|
if (dr7)
|
||||||
|
set_debugreg(0, 7);
|
||||||
|
/*
|
||||||
|
* Ensure the compiler doesn't lower the above statements into
|
||||||
|
* the critical section; disabling breakpoints late would not
|
||||||
|
* be good.
|
||||||
|
*/
|
||||||
|
barrier();
|
||||||
|
|
||||||
|
return dr7;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __always_inline void local_db_restore(unsigned long dr7)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Ensure the compiler doesn't raise this statement into
|
||||||
|
* the critical section; enabling breakpoints early would
|
||||||
|
* not be good.
|
||||||
|
*/
|
||||||
|
barrier();
|
||||||
|
if (dr7)
|
||||||
|
set_debugreg(dr7, 7);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_SUP_AMD
|
#ifdef CONFIG_CPU_SUP_AMD
|
||||||
extern void set_dr_addr_mask(unsigned long mask, int dr);
|
extern void set_dr_addr_mask(unsigned long mask, int dr);
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -727,15 +727,7 @@ static __always_inline void debug_enter(unsigned long *dr6, unsigned long *dr7)
|
|||||||
* Entry text is excluded for HW_BP_X and cpu_entry_area, which
|
* Entry text is excluded for HW_BP_X and cpu_entry_area, which
|
||||||
* includes the entry stack is excluded for everything.
|
* includes the entry stack is excluded for everything.
|
||||||
*/
|
*/
|
||||||
get_debugreg(*dr7, 7);
|
*dr7 = local_db_save();
|
||||||
set_debugreg(0, 7);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Ensure the compiler doesn't lower the above statements into
|
|
||||||
* the critical section; disabling breakpoints late would not
|
|
||||||
* be good.
|
|
||||||
*/
|
|
||||||
barrier();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Intel SDM says:
|
* The Intel SDM says:
|
||||||
@@ -756,13 +748,7 @@ static __always_inline void debug_enter(unsigned long *dr6, unsigned long *dr7)
|
|||||||
|
|
||||||
static __always_inline void debug_exit(unsigned long dr7)
|
static __always_inline void debug_exit(unsigned long dr7)
|
||||||
{
|
{
|
||||||
/*
|
local_db_restore(dr7);
|
||||||
* Ensure the compiler doesn't raise this statement into
|
|
||||||
* the critical section; enabling breakpoints early would
|
|
||||||
* not be good.
|
|
||||||
*/
|
|
||||||
barrier();
|
|
||||||
set_debugreg(dr7, 7);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user