Commit 5e3ca0ec authored by Ingo Molnar's avatar Ingo Molnar Committed by Thomas Gleixner

ftrace: introduce the "hex" output method

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 2e0f5761
...@@ -103,7 +103,8 @@ enum trace_iterator_flags { ...@@ -103,7 +103,8 @@ enum trace_iterator_flags {
TRACE_ITER_SYM_ADDR = 0x04, TRACE_ITER_SYM_ADDR = 0x04,
TRACE_ITER_VERBOSE = 0x08, TRACE_ITER_VERBOSE = 0x08,
TRACE_ITER_RAW = 0x10, TRACE_ITER_RAW = 0x10,
TRACE_ITER_BIN = 0x20, TRACE_ITER_HEX = 0x20,
TRACE_ITER_BIN = 0x40,
}; };
#define TRACE_ITER_SYM_MASK \ #define TRACE_ITER_SYM_MASK \
...@@ -116,6 +117,7 @@ static const char *trace_options[] = { ...@@ -116,6 +117,7 @@ static const char *trace_options[] = {
"sym-addr", "sym-addr",
"verbose", "verbose",
"raw", "raw",
"hex",
"bin", "bin",
NULL NULL
}; };
...@@ -238,6 +240,47 @@ trace_seq_putmem(struct trace_seq *s, void *mem, size_t len) ...@@ -238,6 +240,47 @@ trace_seq_putmem(struct trace_seq *s, void *mem, size_t len)
return len; return len;
} }
#define HEX_CHARS 17
static notrace int
trace_seq_putmem_hex(struct trace_seq *s, void *mem, size_t len)
{
unsigned char hex[HEX_CHARS];
unsigned char *data;
unsigned char byte;
int i, j;
BUG_ON(len >= HEX_CHARS);
data = mem;
#ifdef __BIG_ENDIAN
for (i = 0, j = 0; i < len; i++) {
#else
for (i = len-1, j = 0; i >= 0; i--) {
#endif
byte = data[i];
hex[j] = byte & 0x0f;
if (hex[j] >= 10)
hex[j] += 'a' - 10;
else
hex[j] += '0';
j++;
hex[j] = byte >> 4;
if (hex[j] >= 10)
hex[j] += 'a' - 10;
else
hex[j] += '0';
j++;
}
hex[j] = ' ';
j++;
return trace_seq_putmem(s, hex, j);
}
static notrace void static notrace void
trace_seq_reset(struct trace_seq *s) trace_seq_reset(struct trace_seq *s)
{ {
...@@ -1274,6 +1317,51 @@ do { \ ...@@ -1274,6 +1317,51 @@ do { \
return 0; \ return 0; \
} while (0) } while (0)
#define SEQ_PUT_HEX_FIELD_RET(s, x) \
do { \
if (!trace_seq_putmem_hex(s, &(x), sizeof(x))) \
return 0; \
} while (0)
static notrace int print_hex_fmt(struct trace_iterator *iter)
{
struct trace_seq *s = &iter->seq;
unsigned char newline = '\n';
struct trace_entry *entry;
int S;
entry = iter->ent;
SEQ_PUT_HEX_FIELD_RET(s, entry->pid);
SEQ_PUT_HEX_FIELD_RET(s, iter->cpu);
SEQ_PUT_HEX_FIELD_RET(s, entry->t);
switch (entry->type) {
case TRACE_FN:
SEQ_PUT_HEX_FIELD_RET(s, entry->fn.ip);
SEQ_PUT_HEX_FIELD_RET(s, entry->fn.parent_ip);
break;
case TRACE_CTX:
S = entry->ctx.prev_state < sizeof(state_to_char) ?
state_to_char[entry->ctx.prev_state] : 'X';
SEQ_PUT_HEX_FIELD_RET(s, entry->ctx.prev_pid);
SEQ_PUT_HEX_FIELD_RET(s, entry->ctx.prev_prio);
SEQ_PUT_HEX_FIELD_RET(s, S);
SEQ_PUT_HEX_FIELD_RET(s, entry->ctx.next_pid);
SEQ_PUT_HEX_FIELD_RET(s, entry->ctx.next_prio);
SEQ_PUT_HEX_FIELD_RET(s, entry->fn.parent_ip);
break;
case TRACE_SPECIAL:
SEQ_PUT_HEX_FIELD_RET(s, entry->special.arg1);
SEQ_PUT_HEX_FIELD_RET(s, entry->special.arg2);
SEQ_PUT_HEX_FIELD_RET(s, entry->special.arg3);
break;
}
SEQ_PUT_FIELD_RET(s, newline);
return 1;
}
static notrace int print_bin_fmt(struct trace_iterator *iter) static notrace int print_bin_fmt(struct trace_iterator *iter)
{ {
struct trace_seq *s = &iter->seq; struct trace_seq *s = &iter->seq;
...@@ -1327,6 +1415,9 @@ static int print_trace_line(struct trace_iterator *iter) ...@@ -1327,6 +1415,9 @@ static int print_trace_line(struct trace_iterator *iter)
if (trace_flags & TRACE_ITER_BIN) if (trace_flags & TRACE_ITER_BIN)
return print_bin_fmt(iter); return print_bin_fmt(iter);
if (trace_flags & TRACE_ITER_HEX)
return print_hex_fmt(iter);
if (trace_flags & TRACE_ITER_RAW) if (trace_flags & TRACE_ITER_RAW)
return print_raw_fmt(iter); return print_raw_fmt(iter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment