1 /* instructions used to output a skb based software event, produced 2 * from code snippet: 3 * struct TMP { 4 * uint64_t tmp; 5 * } tt; 6 * tt.tmp = 5; 7 * bpf_perf_event_output(skb, &connection_tracking_event_map, 0, 8 * &tt, sizeof(tt)); 9 * return 1; 10 * 11 * the bpf assembly from llvm is: 12 * 0: b7 02 00 00 05 00 00 00 r2 = 5 13 * 1: 7b 2a f8 ff 00 00 00 00 *(u64 *)(r10 - 8) = r2 14 * 2: bf a4 00 00 00 00 00 00 r4 = r10 15 * 3: 07 04 00 00 f8 ff ff ff r4 += -8 16 * 4: 18 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r2 = 0ll 17 * 6: b7 03 00 00 00 00 00 00 r3 = 0 18 * 7: b7 05 00 00 08 00 00 00 r5 = 8 19 * 8: 85 00 00 00 19 00 00 00 call 25 20 * 9: b7 00 00 00 01 00 00 00 r0 = 1 21 * 10: 95 00 00 00 00 00 00 00 exit 22 * 23 * The reason I put the code here instead of fill_helpers is that map fixup 24 * is against the insns, instead of filled prog. 25 */ 26 27 #define __PERF_EVENT_INSNS__ \ 28 BPF_MOV64_IMM(BPF_REG_2, 5), \ 29 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8), \ 30 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), \ 31 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), \ 32 BPF_LD_MAP_FD(BPF_REG_2, 0), \ 33 BPF_MOV64_IMM(BPF_REG_3, 0), \ 34 BPF_MOV64_IMM(BPF_REG_5, 8), \ 35 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, \ 36 BPF_FUNC_perf_event_output), \ 37 BPF_MOV64_IMM(BPF_REG_0, 1), \ 38 BPF_EXIT_INSN(), 39 { 40 "perfevent for sockops", 41 .insns = { __PERF_EVENT_INSNS__ }, 42 .prog_type = BPF_PROG_TYPE_SOCK_OPS, 43 .fixup_map_event_output = { 4 }, 44 .result = ACCEPT, 45 .retval = 1, 46 }, 47 { 48 "perfevent for tc", 49 .insns = { __PERF_EVENT_INSNS__ }, 50 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 51 .fixup_map_event_output = { 4 }, 52 .result = ACCEPT, 53 .retval = 1, 54 }, 55 { 56 "perfevent for lwt out", 57 .insns = { __PERF_EVENT_INSNS__ }, 58 .prog_type = BPF_PROG_TYPE_LWT_OUT, 59 .fixup_map_event_output = { 4 }, 60 .result = ACCEPT, 61 .retval = 1, 62 }, 63 { 64 "perfevent for xdp", 65 .insns = { __PERF_EVENT_INSNS__ }, 66 .prog_type = BPF_PROG_TYPE_XDP, 67 .fixup_map_event_output = { 4 }, 68 .result = ACCEPT, 69 .retval = 1, 70 }, 71 { 72 "perfevent for socket filter", 73 .insns = { __PERF_EVENT_INSNS__ }, 74 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 75 .fixup_map_event_output = { 4 }, 76 .result = ACCEPT, 77 .retval = 1, 78 }, 79 { 80 "perfevent for sk_skb", 81 .insns = { __PERF_EVENT_INSNS__ }, 82 .prog_type = BPF_PROG_TYPE_SK_SKB, 83 .fixup_map_event_output = { 4 }, 84 .result = ACCEPT, 85 .retval = 1, 86 }, 87 { 88 "perfevent for cgroup skb", 89 .insns = { __PERF_EVENT_INSNS__ }, 90 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 91 .fixup_map_event_output = { 4 }, 92 .result = ACCEPT, 93 .retval = 1, 94 }, 95