aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64/kernel/debug-monitors.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm64/kernel/debug-monitors.c')
-rw-r--r--arch/arm64/kernel/debug-monitors.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c
index 395de61108d8..2fbc1b99e8fb 100644
--- a/arch/arm64/kernel/debug-monitors.c
+++ b/arch/arm64/kernel/debug-monitors.c
@@ -49,6 +49,7 @@ static void mdscr_write(u32 mdscr)
49 asm volatile("msr mdscr_el1, %0" :: "r" (mdscr)); 49 asm volatile("msr mdscr_el1, %0" :: "r" (mdscr));
50 local_dbg_restore(flags); 50 local_dbg_restore(flags);
51} 51}
52NOKPROBE_SYMBOL(mdscr_write);
52 53
53static u32 mdscr_read(void) 54static u32 mdscr_read(void)
54{ 55{
@@ -56,6 +57,7 @@ static u32 mdscr_read(void)
56 asm volatile("mrs %0, mdscr_el1" : "=r" (mdscr)); 57 asm volatile("mrs %0, mdscr_el1" : "=r" (mdscr));
57 return mdscr; 58 return mdscr;
58} 59}
60NOKPROBE_SYMBOL(mdscr_read);
59 61
60/* 62/*
61 * Allow root to disable self-hosted debug from userspace. 63 * Allow root to disable self-hosted debug from userspace.
@@ -104,6 +106,7 @@ void enable_debug_monitors(enum dbg_active_el el)
104 mdscr_write(mdscr); 106 mdscr_write(mdscr);
105 } 107 }
106} 108}
109NOKPROBE_SYMBOL(enable_debug_monitors);
107 110
108void disable_debug_monitors(enum dbg_active_el el) 111void disable_debug_monitors(enum dbg_active_el el)
109{ 112{
@@ -124,6 +127,7 @@ void disable_debug_monitors(enum dbg_active_el el)
124 mdscr_write(mdscr); 127 mdscr_write(mdscr);
125 } 128 }
126} 129}
130NOKPROBE_SYMBOL(disable_debug_monitors);
127 131
128/* 132/*
129 * OS lock clearing. 133 * OS lock clearing.
@@ -174,6 +178,7 @@ static void set_regs_spsr_ss(struct pt_regs *regs)
174 spsr |= DBG_SPSR_SS; 178 spsr |= DBG_SPSR_SS;
175 regs->pstate = spsr; 179 regs->pstate = spsr;
176} 180}
181NOKPROBE_SYMBOL(set_regs_spsr_ss);
177 182
178static void clear_regs_spsr_ss(struct pt_regs *regs) 183static void clear_regs_spsr_ss(struct pt_regs *regs)
179{ 184{
@@ -183,6 +188,7 @@ static void clear_regs_spsr_ss(struct pt_regs *regs)
183 spsr &= ~DBG_SPSR_SS; 188 spsr &= ~DBG_SPSR_SS;
184 regs->pstate = spsr; 189 regs->pstate = spsr;
185} 190}
191NOKPROBE_SYMBOL(clear_regs_spsr_ss);
186 192
187/* EL1 Single Step Handler hooks */ 193/* EL1 Single Step Handler hooks */
188static LIST_HEAD(step_hook); 194static LIST_HEAD(step_hook);
@@ -226,6 +232,7 @@ static int call_step_hook(struct pt_regs *regs, unsigned int esr)
226 232
227 return retval; 233 return retval;
228} 234}
235NOKPROBE_SYMBOL(call_step_hook);
229 236
230static void send_user_sigtrap(int si_code) 237static void send_user_sigtrap(int si_code)
231{ 238{
@@ -284,6 +291,7 @@ static int single_step_handler(unsigned long addr, unsigned int esr,
284 291
285 return 0; 292 return 0;
286} 293}
294NOKPROBE_SYMBOL(single_step_handler);
287 295
288/* 296/*
289 * Breakpoint handler is re-entrant as another breakpoint can 297 * 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)
321 329
322 return fn ? fn(regs, esr) : DBG_HOOK_ERROR; 330 return fn ? fn(regs, esr) : DBG_HOOK_ERROR;
323} 331}
332NOKPROBE_SYMBOL(call_break_hook);
324 333
325static int brk_handler(unsigned long addr, unsigned int esr, 334static int brk_handler(unsigned long addr, unsigned int esr,
326 struct pt_regs *regs) 335 struct pt_regs *regs)
@@ -341,6 +350,7 @@ static int brk_handler(unsigned long addr, unsigned int esr,
341 350
342 return 0; 351 return 0;
343} 352}
353NOKPROBE_SYMBOL(brk_handler);
344 354
345int aarch32_break_handler(struct pt_regs *regs) 355int aarch32_break_handler(struct pt_regs *regs)
346{ 356{
@@ -377,6 +387,7 @@ int aarch32_break_handler(struct pt_regs *regs)
377 send_user_sigtrap(TRAP_BRKPT); 387 send_user_sigtrap(TRAP_BRKPT);
378 return 0; 388 return 0;
379} 389}
390NOKPROBE_SYMBOL(aarch32_break_handler);
380 391
381static int __init debug_traps_init(void) 392static int __init debug_traps_init(void)
382{ 393{
@@ -398,6 +409,7 @@ void user_rewind_single_step(struct task_struct *task)
398 if (test_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP)) 409 if (test_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP))
399 set_regs_spsr_ss(task_pt_regs(task)); 410 set_regs_spsr_ss(task_pt_regs(task));
400} 411}
412NOKPROBE_SYMBOL(user_rewind_single_step);
401 413
402void user_fastforward_single_step(struct task_struct *task) 414void user_fastforward_single_step(struct task_struct *task)
403{ 415{
@@ -413,6 +425,7 @@ void kernel_enable_single_step(struct pt_regs *regs)
413 mdscr_write(mdscr_read() | DBG_MDSCR_SS); 425 mdscr_write(mdscr_read() | DBG_MDSCR_SS);
414 enable_debug_monitors(DBG_ACTIVE_EL1); 426 enable_debug_monitors(DBG_ACTIVE_EL1);
415} 427}
428NOKPROBE_SYMBOL(kernel_enable_single_step);
416 429
417void kernel_disable_single_step(void) 430void kernel_disable_single_step(void)
418{ 431{
@@ -420,12 +433,14 @@ void kernel_disable_single_step(void)
420 mdscr_write(mdscr_read() & ~DBG_MDSCR_SS); 433 mdscr_write(mdscr_read() & ~DBG_MDSCR_SS);
421 disable_debug_monitors(DBG_ACTIVE_EL1); 434 disable_debug_monitors(DBG_ACTIVE_EL1);
422} 435}
436NOKPROBE_SYMBOL(kernel_disable_single_step);
423 437
424int kernel_active_single_step(void) 438int kernel_active_single_step(void)
425{ 439{
426 WARN_ON(!irqs_disabled()); 440 WARN_ON(!irqs_disabled());
427 return mdscr_read() & DBG_MDSCR_SS; 441 return mdscr_read() & DBG_MDSCR_SS;
428} 442}
443NOKPROBE_SYMBOL(kernel_active_single_step);
429 444
430/* ptrace API */ 445/* ptrace API */
431void user_enable_single_step(struct task_struct *task) 446void user_enable_single_step(struct task_struct *task)
@@ -433,8 +448,10 @@ void user_enable_single_step(struct task_struct *task)
433 set_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP); 448 set_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP);
434 set_regs_spsr_ss(task_pt_regs(task)); 449 set_regs_spsr_ss(task_pt_regs(task));
435} 450}
451NOKPROBE_SYMBOL(user_enable_single_step);
436 452
437void user_disable_single_step(struct task_struct *task) 453void user_disable_single_step(struct task_struct *task)
438{ 454{
439 clear_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP); 455 clear_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP);
440} 456}
457NOKPROBE_SYMBOL(user_disable_single_step);