|
@@ -2178,6 +2178,37 @@ out_dump:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void bpf_output__printer(enum binary_printer_ops op,
|
|
|
+ unsigned int val, void *extra)
|
|
|
+{
|
|
|
+ FILE *output = extra;
|
|
|
+ unsigned char ch = (unsigned char)val;
|
|
|
+
|
|
|
+ switch (op) {
|
|
|
+ case BINARY_PRINT_CHAR_DATA:
|
|
|
+ fprintf(output, "%c", isprint(ch) ? ch : '.');
|
|
|
+ break;
|
|
|
+ case BINARY_PRINT_DATA_BEGIN:
|
|
|
+ case BINARY_PRINT_LINE_BEGIN:
|
|
|
+ case BINARY_PRINT_ADDR:
|
|
|
+ case BINARY_PRINT_NUM_DATA:
|
|
|
+ case BINARY_PRINT_NUM_PAD:
|
|
|
+ case BINARY_PRINT_SEP:
|
|
|
+ case BINARY_PRINT_CHAR_PAD:
|
|
|
+ case BINARY_PRINT_LINE_END:
|
|
|
+ case BINARY_PRINT_DATA_END:
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void bpf_output__fprintf(struct trace *trace,
|
|
|
+ struct perf_sample *sample)
|
|
|
+{
|
|
|
+ print_binary(sample->raw_data, sample->raw_size, 8,
|
|
|
+ bpf_output__printer, trace->output);
|
|
|
+}
|
|
|
+
|
|
|
static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel,
|
|
|
union perf_event *event __maybe_unused,
|
|
|
struct perf_sample *sample)
|
|
@@ -2190,7 +2221,9 @@ static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel,
|
|
|
|
|
|
fprintf(trace->output, "%s:", evsel->name);
|
|
|
|
|
|
- if (evsel->tp_format) {
|
|
|
+ if (perf_evsel__is_bpf_output(evsel)) {
|
|
|
+ bpf_output__fprintf(trace, sample);
|
|
|
+ } else if (evsel->tp_format) {
|
|
|
event_format__fprintf(evsel->tp_format, sample->cpu,
|
|
|
sample->raw_data, sample->raw_size,
|
|
|
trace->output);
|