115 lines · c
1// SPDX-License-Identifier: GPL-2.02/* 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 8struct value_t {9 long long a[32];10};11 12struct {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 19SEC("socket")20__description("bpf_jit_convergence je <-> jmp")21__success __retval(0)22__arch_x86_6423__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 114char _license[] SEC("license") = "GPL";115