Skip to content

Commit 3925f4a

Browse files
hyeoncheolrostedt
authored andcommitted
tracing/probes: Add fetch{,_size} member into deref fetch method
The deref fetch methods access a memory region but it assumes that it's a kernel memory since uprobes does not support them. Add ->fetch and ->fetch_size member in order to provide a proper access methods for supporting uprobes. Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Acked-by: Oleg Nesterov <oleg@redhat.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: zhangwei(Jovi) <jovi.zhangwei@huawei.com> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Signed-off-by: Hyeoncheol Lee <cheol.lee@lge.com> [namhyung@kernel.org: Split original patch into pieces as requested] Signed-off-by: Namhyung Kim <namhyung@kernel.org>
1 parent 1301a44 commit 3925f4a

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

kernel/trace/trace_probe.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ __kprobes void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
184184
struct deref_fetch_param {
185185
struct fetch_param orig;
186186
long offset;
187+
fetch_func_t fetch;
188+
fetch_func_t fetch_size;
187189
};
188190

189191
#define DEFINE_FETCH_deref(type) \
@@ -195,13 +197,26 @@ __kprobes void FETCH_FUNC_NAME(deref, type)(struct pt_regs *regs, \
195197
call_fetch(&dprm->orig, regs, &addr); \
196198
if (addr) { \
197199
addr += dprm->offset; \
198-
fetch_memory_##type(regs, (void *)addr, dest); \
200+
dprm->fetch(regs, (void *)addr, dest); \
199201
} else \
200202
*(type *)dest = 0; \
201203
}
202204
DEFINE_BASIC_FETCH_FUNCS(deref)
203205
DEFINE_FETCH_deref(string)
204-
DEFINE_FETCH_deref(string_size)
206+
207+
__kprobes void FETCH_FUNC_NAME(deref, string_size)(struct pt_regs *regs,
208+
void *data, void *dest)
209+
{
210+
struct deref_fetch_param *dprm = data;
211+
unsigned long addr;
212+
213+
call_fetch(&dprm->orig, regs, &addr);
214+
if (addr && dprm->fetch_size) {
215+
addr += dprm->offset;
216+
dprm->fetch_size(regs, (void *)addr, dest);
217+
} else
218+
*(string_size *)dest = 0;
219+
}
205220

206221
static __kprobes void update_deref_fetch_param(struct deref_fetch_param *data)
207222
{
@@ -477,6 +492,9 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t,
477492
return -ENOMEM;
478493

479494
dprm->offset = offset;
495+
dprm->fetch = t->fetch[FETCH_MTD_memory];
496+
dprm->fetch_size = get_fetch_size_function(t,
497+
dprm->fetch, ftbl);
480498
ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
481499
is_kprobe);
482500
if (ret)

0 commit comments

Comments
 (0)