Comma separated list of fields to print. Options are:
         comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff,
         srcline, period, iregs, brstack, brstacksym, flags, bpf-output,
-        callindent. Field list can be prepended with the type, trace, sw or hw,
+        callindent, insn, insnlen. Field list can be prepended with the type, trace, sw or hw,
         to indicate to which event type the field list applies.
         e.g., -F sw:comm,tid,time,ip,sym  and -F trace:time,cpu,trace
 
        Instruction Trace decoding. For calls and returns, it will display the
        name of the symbol indented with spaces to reflect the stack depth.
 
+       When doing instruction trace decoding insn and insnlen give the
+       instruction bytes and the instruction length of the current
+       instruction.
+
        Finally, a user may not set fields to none for all event types.
        i.e., -F "" is not allowed.
 
 
        PERF_OUTPUT_WEIGHT          = 1U << 18,
        PERF_OUTPUT_BPF_OUTPUT      = 1U << 19,
        PERF_OUTPUT_CALLINDENT      = 1U << 20,
+       PERF_OUTPUT_INSN            = 1U << 21,
+       PERF_OUTPUT_INSNLEN         = 1U << 22,
 };
 
 struct output_option {
        {.str = "weight",   .field = PERF_OUTPUT_WEIGHT},
        {.str = "bpf-output",   .field = PERF_OUTPUT_BPF_OUTPUT},
        {.str = "callindent", .field = PERF_OUTPUT_CALLINDENT},
+       {.str = "insn", .field = PERF_OUTPUT_INSN},
+       {.str = "insnlen", .field = PERF_OUTPUT_INSNLEN},
 };
 
 /* default set to maintain compatibility with current format */
                printf("%*s", spacing - len, "");
 }
 
+static void print_insn(struct perf_sample *sample,
+                      struct perf_event_attr *attr)
+{
+       if (PRINT_FIELD(INSNLEN))
+               printf(" ilen: %d", sample->insn_len);
+       if (PRINT_FIELD(INSN)) {
+               int i;
+
+               printf(" insn:");
+               for (i = 0; i < sample->insn_len; i++)
+                       printf(" %02x", (unsigned char)sample->insn[i]);
+       }
+}
+
 static void print_sample_bts(struct perf_sample *sample,
                             struct perf_evsel *evsel,
                             struct thread *thread,
        if (print_srcline_last)
                map__fprintf_srcline(al->map, al->addr, "\n  ", stdout);
 
+       print_insn(sample, attr);
+
        printf("\n");
 }
 
 
        if (perf_evsel__is_bpf_output(evsel) && PRINT_FIELD(BPF_OUTPUT))
                print_sample_bpf_output(sample);
-
+       print_insn(sample, attr);
        printf("\n");
 }
 
                     "Valid types: hw,sw,trace,raw. "
                     "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
                     "addr,symoff,period,iregs,brstack,brstacksym,flags,"
-                    "bpf-output,callindent", parse_output_fields),
+                    "bpf-output,callindent,insn,insnlen", parse_output_fields),
        OPT_BOOLEAN('a', "all-cpus", &system_wide,
                    "system-wide collection from all CPUs"),
        OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",