LoongArch: ptrace: Add function argument access API
Add regs_get_argument() which returns N th argument of the function call, This enables ftrace kprobe events to access kernel function arguments via $argN syntax for later use. E.g.: echo 'p bio_add_page arg1=$arg1' > kprobe_events bash: echo: write error: Invalid argument Signed-off-by: Qing Zhang <zhangqing@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
parent
1a69f7a161
commit
356bd6f236
@ -98,6 +98,7 @@ config LOONGARCH
|
||||
select HAVE_EXIT_THREAD
|
||||
select HAVE_FAST_GUP
|
||||
select HAVE_FTRACE_MCOUNT_RECORD
|
||||
select HAVE_FUNCTION_ARG_ACCESS_API
|
||||
select HAVE_FUNCTION_GRAPH_TRACER
|
||||
select HAVE_FUNCTION_TRACER
|
||||
select HAVE_GENERIC_VDSO
|
||||
|
@ -109,6 +109,40 @@ static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsi
|
||||
|
||||
struct task_struct;
|
||||
|
||||
/**
|
||||
* regs_get_kernel_argument() - get Nth function argument in kernel
|
||||
* @regs: pt_regs of that context
|
||||
* @n: function argument number (start from 0)
|
||||
*
|
||||
* regs_get_argument() returns @n th argument of the function call.
|
||||
* Note that this chooses most probably assignment, in some case
|
||||
* it can be incorrect.
|
||||
* This is expected to be called from kprobes or ftrace with regs
|
||||
* where the top of stack is the return address.
|
||||
*/
|
||||
static inline unsigned long regs_get_kernel_argument(struct pt_regs *regs,
|
||||
unsigned int n)
|
||||
{
|
||||
#define NR_REG_ARGUMENTS 8
|
||||
static const unsigned int args[] = {
|
||||
offsetof(struct pt_regs, regs[4]),
|
||||
offsetof(struct pt_regs, regs[5]),
|
||||
offsetof(struct pt_regs, regs[6]),
|
||||
offsetof(struct pt_regs, regs[7]),
|
||||
offsetof(struct pt_regs, regs[8]),
|
||||
offsetof(struct pt_regs, regs[9]),
|
||||
offsetof(struct pt_regs, regs[10]),
|
||||
offsetof(struct pt_regs, regs[11]),
|
||||
};
|
||||
|
||||
if (n < NR_REG_ARGUMENTS)
|
||||
return regs_get_register(regs, args[n]);
|
||||
else {
|
||||
n -= NR_REG_ARGUMENTS;
|
||||
return regs_get_kernel_stack_nth(regs, n);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Does the process account for user or for system time?
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user