Commit e1de11d4 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Thomas Gleixner

x86/entry: Introduce local_db_{save,restore}()

In order to allow other exceptions than #DB to disable breakpoints,
provide common helpers.
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/20200529213321.012060983@infradead.org

parent fdef24df
...@@ -113,6 +113,36 @@ static inline void debug_stack_usage_inc(void) { } ...@@ -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) ...@@ -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) ...@@ -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);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment