1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ 3 4 #include <linux/bpf.h> 5 #include <bpf/bpf_helpers.h> 6 #include "bpf_misc.h" 7 8 struct value_t { 9 long long a[32]; 10 }; 11 12 struct { 13 __uint(type, BPF_MAP_TYPE_HASH); 14 __uint(max_entries, 1); 15 __type(key, long long); 16 __type(value, struct value_t); 17 } map_hash SEC(".maps"); 18 19 SEC("socket") 20 __description("bpf_jit_convergence je <-> jmp") 21 __success __retval(0) 22 __arch_x86_64 23 __jited(" pushq %rbp") 24 __naked void btf_jit_convergence_je_jmp(void) 25 { 26 asm volatile ( 27 "call %[bpf_get_prandom_u32];" 28 "if r0 == 0 goto l20_%=;" 29 "if r0 == 1 goto l21_%=;" 30 "if r0 == 2 goto l22_%=;" 31 "if r0 == 3 goto l23_%=;" 32 "if r0 == 4 goto l24_%=;" 33 "call %[bpf_get_prandom_u32];" 34 "call %[bpf_get_prandom_u32];" 35 "l20_%=:" 36 "l21_%=:" 37 "l22_%=:" 38 "l23_%=:" 39 "l24_%=:" 40 "r1 = 0;" 41 "*(u64 *)(r10 - 8) = r1;" 42 "r2 = r10;" 43 "r2 += -8;" 44 "r1 = %[map_hash] ll;" 45 "call %[bpf_map_lookup_elem];" 46 "if r0 == 0 goto l1_%=;" 47 "r6 = r0;" 48 "call %[bpf_get_prandom_u32];" 49 "r7 = r0;" 50 "r5 = r6;" 51 "if r0 != 0x0 goto l12_%=;" 52 "call %[bpf_get_prandom_u32];" 53 "r1 = r0;" 54 "r2 = r6;" 55 "if r1 == 0x0 goto l0_%=;" 56 "l9_%=:" 57 "r2 = *(u64 *)(r6 + 0x0);" 58 "r2 += 0x1;" 59 "*(u64 *)(r6 + 0x0) = r2;" 60 "goto l1_%=;" 61 "l12_%=:" 62 "r1 = r7;" 63 "r1 += 0x98;" 64 "r2 = r5;" 65 "r2 += 0x90;" 66 "r2 = *(u32 *)(r2 + 0x0);" 67 "r3 = r7;" 68 "r3 &= 0x1;" 69 "r2 *= 0xa8;" 70 "if r3 == 0x0 goto l2_%=;" 71 "r1 += r2;" 72 "r1 -= r7;" 73 "r1 += 0x8;" 74 "if r1 <= 0xb20 goto l3_%=;" 75 "r1 = 0x0;" 76 "goto l4_%=;" 77 "l3_%=:" 78 "r1 += r7;" 79 "l4_%=:" 80 "if r1 == 0x0 goto l8_%=;" 81 "goto l9_%=;" 82 "l2_%=:" 83 "r1 += r2;" 84 "r1 -= r7;" 85 "r1 += 0x10;" 86 "if r1 <= 0xb20 goto l6_%=;" 87 "r1 = 0x0;" 88 "goto l7_%=;" 89 "l6_%=:" 90 "r1 += r7;" 91 "l7_%=:" 92 "if r1 == 0x0 goto l8_%=;" 93 "goto l9_%=;" 94 "l0_%=:" 95 "r1 = 0x3;" 96 "*(u64 *)(r10 - 0x10) = r1;" 97 "r2 = r1;" 98 "goto l1_%=;" 99 "l8_%=:" 100 "r1 = r5;" 101 "r1 += 0x4;" 102 "r1 = *(u32 *)(r1 + 0x0);" 103 "*(u64 *)(r10 - 0x8) = r1;" 104 "l1_%=:" 105 "r0 = 0;" 106 "exit;" 107 : 108 : __imm(bpf_get_prandom_u32), 109 __imm(bpf_map_lookup_elem), 110 __imm_addr(map_hash) 111 : __clobber_all); 112 } 113 114 char _license[] SEC("license") = "GPL"; 115