@ -49,6 +49,7 @@ static void mdscr_write(u32 mdscr)
asm volatile ( " msr mdscr_el1, %0 " : : " r " ( mdscr ) ) ;
local_dbg_restore ( flags ) ;
}
NOKPROBE_SYMBOL ( mdscr_write ) ;
static u32 mdscr_read ( void )
{
@ -56,6 +57,7 @@ static u32 mdscr_read(void)
asm volatile ( " mrs %0, mdscr_el1 " : " =r " ( mdscr ) ) ;
return mdscr ;
}
NOKPROBE_SYMBOL ( mdscr_read ) ;
/*
* Allow root to disable self - hosted debug from userspace .
@ -104,6 +106,7 @@ void enable_debug_monitors(enum dbg_active_el el)
mdscr_write ( mdscr ) ;
}
}
NOKPROBE_SYMBOL ( enable_debug_monitors ) ;
void disable_debug_monitors ( enum dbg_active_el el )
{
@ -124,6 +127,7 @@ void disable_debug_monitors(enum dbg_active_el el)
mdscr_write ( mdscr ) ;
}
}
NOKPROBE_SYMBOL ( disable_debug_monitors ) ;
/*
* OS lock clearing .
@ -174,6 +178,7 @@ static void set_regs_spsr_ss(struct pt_regs *regs)
spsr | = DBG_SPSR_SS ;
regs - > pstate = spsr ;
}
NOKPROBE_SYMBOL ( set_regs_spsr_ss ) ;
static void clear_regs_spsr_ss ( struct pt_regs * regs )
{
@ -183,6 +188,7 @@ static void clear_regs_spsr_ss(struct pt_regs *regs)
spsr & = ~ DBG_SPSR_SS ;
regs - > pstate = spsr ;
}
NOKPROBE_SYMBOL ( clear_regs_spsr_ss ) ;
/* EL1 Single Step Handler hooks */
static LIST_HEAD ( step_hook ) ;
@ -226,6 +232,7 @@ static int call_step_hook(struct pt_regs *regs, unsigned int esr)
return retval ;
}
NOKPROBE_SYMBOL ( call_step_hook ) ;
static void send_user_sigtrap ( int si_code )
{
@ -284,6 +291,7 @@ static int single_step_handler(unsigned long addr, unsigned int esr,
return 0 ;
}
NOKPROBE_SYMBOL ( single_step_handler ) ;
/*
* Breakpoint handler is re - entrant as another breakpoint can
@ -321,6 +329,7 @@ static int call_break_hook(struct pt_regs *regs, unsigned int esr)
return fn ? fn ( regs , esr ) : DBG_HOOK_ERROR ;
}
NOKPROBE_SYMBOL ( call_break_hook ) ;
static int brk_handler ( unsigned long addr , unsigned int esr ,
struct pt_regs * regs )
@ -341,6 +350,7 @@ static int brk_handler(unsigned long addr, unsigned int esr,
return 0 ;
}
NOKPROBE_SYMBOL ( brk_handler ) ;
int aarch32_break_handler ( struct pt_regs * regs )
{
@ -377,6 +387,7 @@ int aarch32_break_handler(struct pt_regs *regs)
send_user_sigtrap ( TRAP_BRKPT ) ;
return 0 ;
}
NOKPROBE_SYMBOL ( aarch32_break_handler ) ;
static int __init debug_traps_init ( void )
{
@ -398,6 +409,7 @@ void user_rewind_single_step(struct task_struct *task)
if ( test_ti_thread_flag ( task_thread_info ( task ) , TIF_SINGLESTEP ) )
set_regs_spsr_ss ( task_pt_regs ( task ) ) ;
}
NOKPROBE_SYMBOL ( user_rewind_single_step ) ;
void user_fastforward_single_step ( struct task_struct * task )
{
@ -413,6 +425,7 @@ void kernel_enable_single_step(struct pt_regs *regs)
mdscr_write ( mdscr_read ( ) | DBG_MDSCR_SS ) ;
enable_debug_monitors ( DBG_ACTIVE_EL1 ) ;
}
NOKPROBE_SYMBOL ( kernel_enable_single_step ) ;
void kernel_disable_single_step ( void )
{
@ -420,12 +433,14 @@ void kernel_disable_single_step(void)
mdscr_write ( mdscr_read ( ) & ~ DBG_MDSCR_SS ) ;
disable_debug_monitors ( DBG_ACTIVE_EL1 ) ;
}
NOKPROBE_SYMBOL ( kernel_disable_single_step ) ;
int kernel_active_single_step ( void )
{
WARN_ON ( ! irqs_disabled ( ) ) ;
return mdscr_read ( ) & DBG_MDSCR_SS ;
}
NOKPROBE_SYMBOL ( kernel_active_single_step ) ;
/* ptrace API */
void user_enable_single_step ( struct task_struct * task )
@ -433,8 +448,10 @@ void user_enable_single_step(struct task_struct *task)
set_ti_thread_flag ( task_thread_info ( task ) , TIF_SINGLESTEP ) ;
set_regs_spsr_ss ( task_pt_regs ( task ) ) ;
}
NOKPROBE_SYMBOL ( user_enable_single_step ) ;
void user_disable_single_step ( struct task_struct * task )
{
clear_ti_thread_flag ( task_thread_info ( task ) , TIF_SINGLESTEP ) ;
}
NOKPROBE_SYMBOL ( user_disable_single_step ) ;