|
@@ -856,10 +856,12 @@ static struct syscall_fmt *syscall_fmt__find(const char *name)
|
|
|
/*
|
|
|
* is_exit: is this "exit" or "exit_group"?
|
|
|
* is_open: is this "open" or "openat"? To associate the fd returned in sys_exit with the pathname in sys_enter.
|
|
|
+ * args_size: sum of the sizes of the syscall arguments, anything after that is augmented stuff: pathname for openat, etc.
|
|
|
*/
|
|
|
struct syscall {
|
|
|
struct event_format *tp_format;
|
|
|
int nr_args;
|
|
|
+ int args_size;
|
|
|
bool is_exit;
|
|
|
bool is_open;
|
|
|
struct format_field *args;
|
|
@@ -1258,10 +1260,12 @@ static int syscall__alloc_arg_fmts(struct syscall *sc, int nr_args)
|
|
|
|
|
|
static int syscall__set_arg_fmts(struct syscall *sc)
|
|
|
{
|
|
|
- struct format_field *field;
|
|
|
+ struct format_field *field, *last_field = NULL;
|
|
|
int idx = 0, len;
|
|
|
|
|
|
for (field = sc->args; field; field = field->next, ++idx) {
|
|
|
+ last_field = field;
|
|
|
+
|
|
|
if (sc->fmt && sc->fmt->arg[idx].scnprintf)
|
|
|
continue;
|
|
|
|
|
@@ -1292,6 +1296,9 @@ static int syscall__set_arg_fmts(struct syscall *sc)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (last_field)
|
|
|
+ sc->args_size = last_field->offset + last_field->size;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1472,14 +1479,18 @@ static size_t syscall__scnprintf_val(struct syscall *sc, char *bf, size_t size,
|
|
|
}
|
|
|
|
|
|
static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
|
|
|
- unsigned char *args, struct trace *trace,
|
|
|
- struct thread *thread)
|
|
|
+ unsigned char *args, void *augmented_args, int augmented_args_size,
|
|
|
+ struct trace *trace, struct thread *thread)
|
|
|
{
|
|
|
size_t printed = 0;
|
|
|
unsigned long val;
|
|
|
u8 bit = 1;
|
|
|
struct syscall_arg arg = {
|
|
|
.args = args,
|
|
|
+ .augmented = {
|
|
|
+ .size = augmented_args_size,
|
|
|
+ .args = augmented_args,
|
|
|
+ },
|
|
|
.idx = 0,
|
|
|
.mask = 0,
|
|
|
.trace = trace,
|
|
@@ -1692,7 +1703,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
|
|
|
printed += scnprintf(msg + printed, trace__entry_str_size - printed, "%s(", sc->name);
|
|
|
|
|
|
printed += syscall__scnprintf_args(sc, msg + printed, trace__entry_str_size - printed,
|
|
|
- args, trace, thread);
|
|
|
+ args, NULL, 0, trace, thread);
|
|
|
|
|
|
if (sc->is_exit) {
|
|
|
if (!(trace->duration_filter || trace->summary_only || trace->failure_only || trace->min_stack)) {
|
|
@@ -1723,7 +1734,8 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct perf_evsel *evse
|
|
|
int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1;
|
|
|
struct syscall *sc = trace__syscall_info(trace, evsel, id);
|
|
|
char msg[1024];
|
|
|
- void *args;
|
|
|
+ void *args, *augmented_args = NULL;
|
|
|
+ int augmented_args_size;
|
|
|
|
|
|
if (sc == NULL)
|
|
|
return -1;
|
|
@@ -1738,7 +1750,11 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct perf_evsel *evse
|
|
|
goto out_put;
|
|
|
|
|
|
args = perf_evsel__sc_tp_ptr(evsel, args, sample);
|
|
|
- syscall__scnprintf_args(sc, msg, sizeof(msg), args, trace, thread);
|
|
|
+ augmented_args_size = sample->raw_size - sc->args_size;
|
|
|
+ if (augmented_args_size > 0)
|
|
|
+ augmented_args = sample->raw_data + sc->args_size;
|
|
|
+
|
|
|
+ syscall__scnprintf_args(sc, msg, sizeof(msg), args, augmented_args, augmented_args_size, trace, thread);
|
|
|
fprintf(trace->output, "%s", msg);
|
|
|
err = 0;
|
|
|
out_put:
|