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