mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
Merge branch 'for-next/kprobes' into for-next/core
* kprobes: arm64: kprobes: Add KASAN instrumentation around stack accesses arm64: kprobes: Cleanup jprobe_return arm64: kprobes: Fix overflow when saving stack arm64: kprobes: WARN if attempting to step with PSTATE.D=1 kprobes: Add arm64 case in kprobe example module arm64: Add kernel return probes support (kretprobes) arm64: Add trampoline code for kretprobes arm64: kprobes instruction simulation support arm64: Treat all entry code as non-kprobe-able arm64: Blacklist non-kprobe-able symbol arm64: Kprobes with single stepping support arm64: add conditional instruction simulation support arm64: Add more test functions to insn.c arm64: Add HAVE_REGS_AND_STACK_ACCESS_API feature
This commit is contained in:
commit
a95b0644b3
27 changed files with 1781 additions and 10 deletions
|
@ -23,6 +23,7 @@
|
|||
#include <linux/hardirq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
|
@ -48,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)
|
||||
{
|
||||
|
@ -55,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.
|
||||
|
@ -103,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)
|
||||
{
|
||||
|
@ -123,6 +127,7 @@ void disable_debug_monitors(enum dbg_active_el el)
|
|||
mdscr_write(mdscr);
|
||||
}
|
||||
}
|
||||
NOKPROBE_SYMBOL(disable_debug_monitors);
|
||||
|
||||
/*
|
||||
* OS lock clearing.
|
||||
|
@ -167,11 +172,13 @@ static void set_regs_spsr_ss(struct pt_regs *regs)
|
|||
{
|
||||
regs->pstate |= DBG_SPSR_SS;
|
||||
}
|
||||
NOKPROBE_SYMBOL(set_regs_spsr_ss);
|
||||
|
||||
static void clear_regs_spsr_ss(struct pt_regs *regs)
|
||||
{
|
||||
regs->pstate &= ~DBG_SPSR_SS;
|
||||
}
|
||||
NOKPROBE_SYMBOL(clear_regs_spsr_ss);
|
||||
|
||||
/* EL1 Single Step Handler hooks */
|
||||
static LIST_HEAD(step_hook);
|
||||
|
@ -215,6 +222,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)
|
||||
{
|
||||
|
@ -256,6 +264,10 @@ static int single_step_handler(unsigned long addr, unsigned int esr,
|
|||
*/
|
||||
user_rewind_single_step(current);
|
||||
} else {
|
||||
#ifdef CONFIG_KPROBES
|
||||
if (kprobe_single_step_handler(regs, esr) == DBG_HOOK_HANDLED)
|
||||
return 0;
|
||||
#endif
|
||||
if (call_step_hook(regs, esr) == DBG_HOOK_HANDLED)
|
||||
return 0;
|
||||
|
||||
|
@ -269,6 +281,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
|
||||
|
@ -306,19 +319,28 @@ 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)
|
||||
{
|
||||
if (user_mode(regs)) {
|
||||
send_user_sigtrap(TRAP_BRKPT);
|
||||
} else if (call_break_hook(regs, esr) != DBG_HOOK_HANDLED) {
|
||||
pr_warning("Unexpected kernel BRK exception at EL1\n");
|
||||
}
|
||||
#ifdef CONFIG_KPROBES
|
||||
else if ((esr & BRK64_ESR_MASK) == BRK64_ESR_KPROBES) {
|
||||
if (kprobe_breakpoint_handler(regs, esr) != DBG_HOOK_HANDLED)
|
||||
return -EFAULT;
|
||||
}
|
||||
#endif
|
||||
else if (call_break_hook(regs, esr) != DBG_HOOK_HANDLED) {
|
||||
pr_warn("Unexpected kernel BRK exception at EL1\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
NOKPROBE_SYMBOL(brk_handler);
|
||||
|
||||
int aarch32_break_handler(struct pt_regs *regs)
|
||||
{
|
||||
|
@ -355,6 +377,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)
|
||||
{
|
||||
|
@ -376,6 +399,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)
|
||||
{
|
||||
|
@ -391,6 +415,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)
|
||||
{
|
||||
|
@ -398,12 +423,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)
|
||||
|
@ -411,8 +438,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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue