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