126 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */3 4#include "vmlinux.h"5#include <bpf/bpf_helpers.h>6#include <bpf/bpf_tracing.h>7 8#if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \9 (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64) || \10 defined(__TARGET_ARCH_s390) || defined(__TARGET_ARCH_loongarch)) && \11 __clang_major__ >= 1812const volatile int skip = 0;13#else14const volatile int skip = 1;15#endif16 17volatile const short val1 = -1;18volatile const int val2 = -1;19short val3 = -1;20int val4 = -1;21int done1, done2, ret1, ret2;22 23SEC("?raw_tp/sys_enter")24int rdonly_map_prog(const void *ctx)25{26 if (done1)27 return 0;28 29 done1 = 1;30 /* val1/val2 readonly map */31 if (val1 == val2)32 ret1 = 1;33 return 0;34 35}36 37SEC("?raw_tp/sys_enter")38int map_val_prog(const void *ctx)39{40 if (done2)41 return 0;42 43 done2 = 1;44 /* val1/val2 regular read/write map */45 if (val3 == val4)46 ret2 = 1;47 return 0;48 49}50 51struct bpf_testmod_struct_arg_1 {52 int a;53};54 55long long int_member;56 57SEC("?fentry/bpf_testmod_test_arg_ptr_to_struct")58int BPF_PROG2(test_ptr_struct_arg, struct bpf_testmod_struct_arg_1 *, p)59{60 /* probed memory access */61 int_member = p->a;62 return 0;63}64 65long long set_optlen, set_retval;66 67SEC("?cgroup/getsockopt")68int _getsockopt(volatile struct bpf_sockopt *ctx)69{70 int old_optlen, old_retval;71 72 old_optlen = ctx->optlen;73 old_retval = ctx->retval;74 75 ctx->optlen = -1;76 ctx->retval = -1;77 78 /* sign extension for ctx member */79 set_optlen = ctx->optlen;80 set_retval = ctx->retval;81 82 ctx->optlen = old_optlen;83 ctx->retval = old_retval;84 85 return 0;86}87 88long long set_mark;89 90SEC("?tc")91int _tc(volatile struct __sk_buff *skb)92{93 long long tmp_mark;94 int old_mark;95 96 old_mark = skb->mark;97 98 skb->mark = 0xf6fe;99 100 /* narrowed sign extension for ctx member */101#if __clang_major__ >= 18102 /* force narrow one-byte signed load. Otherwise, compiler may103 * generate a 32-bit unsigned load followed by an s8 movsx.104 */105 asm volatile ("r1 = *(s8 *)(%[ctx] + %[off_mark])\n\t"106 "%[tmp_mark] = r1"107 : [tmp_mark]"=r"(tmp_mark)108 : [ctx]"r"(skb),109 [off_mark]"i"(offsetof(struct __sk_buff, mark)110#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__111 + sizeof(skb->mark) - 1112#endif113 )114 : "r1");115#else116 tmp_mark = (char)skb->mark;117#endif118 set_mark = tmp_mark;119 120 skb->mark = old_mark;121 122 return 0;123}124 125char _license[] SEC("license") = "GPL";126