// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ #include <linux/bpf.h> #include <bpf/bpf_helpers.h> #include <bpf/bpf_core_read.h> struct task_struct___bad { int pid; int fake_field; void *fake_field_subprog; } __attribute__((preserve_access_index)); SEC("?raw_tp/sys_enter") int bad_relo(const void *ctx) { static struct task_struct___bad *t; return bpf_core_field_size(t->fake_field); } static __noinline int bad_subprog(void) { static struct task_struct___bad *t; /* ugliness below is a field offset relocation */ return (void *)&t->fake_field_subprog - (void *)t; } SEC("?raw_tp/sys_enter") int bad_relo_subprog(const void *ctx) { static struct task_struct___bad *t; return bad_subprog() + bpf_core_field_size(t->pid); } struct { __uint(type, BPF_MAP_TYPE_ARRAY); __uint(max_entries, 1); __type(key, int); __type(value, int); } existing_map SEC(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY); __uint(max_entries, 1); __type(key, int); __type(value, int); } missing_map SEC(".maps"); SEC("?raw_tp/sys_enter") int use_missing_map(const void *ctx) { int zero = 0, *value; value = bpf_map_lookup_elem(&existing_map, &zero); value = bpf_map_lookup_elem(&missing_map, &zero); return value != NULL; } extern int bpf_nonexistent_kfunc(void) __ksym __weak; SEC("?raw_tp/sys_enter") int use_missing_kfunc(const void *ctx) { bpf_nonexistent_kfunc(); return 0; } char _license[] SEC("license") = "GPL";