diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
-rw-r--r-- | kernel/trace/trace_output.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 306fef84c50..ef8fd661b21 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -53,6 +53,25 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...) return len; } +int trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary) +{ + int len = (PAGE_SIZE - 1) - s->len; + int ret; + + if (!len) + return 0; + + ret = bstr_printf(s->buffer + s->len, len, fmt, binary); + + /* If we can't write it all, don't bother writing anything */ + if (ret >= len) + return 0; + + s->len += ret; + + return len; +} + /** * trace_seq_puts - trace sequence printing of simple string * @s: trace sequence descriptor @@ -814,18 +833,22 @@ static struct trace_event trace_user_stack_event = { }; /* TRACE_PRINT */ -static enum print_line_t trace_print_print(struct trace_iterator *iter, - int flags) +static enum print_line_t +trace_print_print(struct trace_iterator *iter, int flags) { - struct print_entry *field; + struct trace_entry *entry = iter->ent; struct trace_seq *s = &iter->seq; + struct print_entry *field; - trace_assign_type(field, iter->ent); + trace_assign_type(field, entry); if (!seq_print_ip_sym(s, field->ip, flags)) goto partial; - if (!trace_seq_printf(s, ": %s", field->buf)) + if (!trace_seq_puts(s, ": ")) + goto partial; + + if (!trace_seq_bprintf(s, field->fmt, field->buf)) goto partial; return TRACE_TYPE_HANDLED; @@ -834,13 +857,18 @@ static enum print_line_t trace_print_print(struct trace_iterator *iter, return TRACE_TYPE_PARTIAL_LINE; } + static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) { struct print_entry *field; + struct trace_seq *s = &iter->seq; trace_assign_type(field, iter->ent); - if (!trace_seq_printf(&iter->seq, "# %lx %s", field->ip, field->buf)) + if (!trace_seq_printf(s, ": %lx : ", field->ip)) + goto partial; + + if (!trace_seq_bprintf(s, field->fmt, field->buf)) goto partial; return TRACE_TYPE_HANDLED; @@ -849,6 +877,7 @@ static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) return TRACE_TYPE_PARTIAL_LINE; } + static struct trace_event trace_print_event = { .type = TRACE_PRINT, .trace = trace_print_print, |