1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Test weak ksyms. |
4 | * |
5 | * Copyright (c) 2021 Google |
6 | */ |
7 | |
8 | #include "vmlinux.h" |
9 | |
10 | #include <bpf/bpf_helpers.h> |
11 | |
12 | int out__existing_typed = -1; |
13 | __u64 out__existing_typeless = -1; |
14 | |
15 | __u64 out__non_existent_typeless = -1; |
16 | __u64 out__non_existent_typed = -1; |
17 | |
18 | /* existing weak symbols */ |
19 | |
20 | /* test existing weak symbols can be resolved. */ |
21 | extern const struct rq runqueues __ksym __weak; /* typed */ |
22 | extern const void bpf_prog_active __ksym __weak; /* typeless */ |
23 | struct task_struct *bpf_task_acquire(struct task_struct *p) __ksym __weak; |
24 | void bpf_testmod_test_mod_kfunc(int i) __ksym __weak; |
25 | |
26 | |
27 | /* non-existent weak symbols. */ |
28 | |
29 | /* typeless symbols, default to zero. */ |
30 | extern const void bpf_link_fops1 __ksym __weak; |
31 | |
32 | /* typed symbols, default to zero. */ |
33 | extern const int bpf_link_fops2 __ksym __weak; |
34 | void invalid_kfunc(void) __ksym __weak; |
35 | |
36 | SEC("raw_tp/sys_enter" ) |
37 | int pass_handler(const void *ctx) |
38 | { |
39 | struct rq *rq; |
40 | |
41 | /* tests existing symbols. */ |
42 | rq = (struct rq *)bpf_per_cpu_ptr(&runqueues, 0); |
43 | if (rq && bpf_ksym_exists(&runqueues)) |
44 | out__existing_typed = rq->cpu; |
45 | out__existing_typeless = (__u64)&bpf_prog_active; |
46 | |
47 | /* tests non-existent symbols. */ |
48 | out__non_existent_typeless = (__u64)&bpf_link_fops1; |
49 | |
50 | /* tests non-existent symbols. */ |
51 | out__non_existent_typed = (__u64)&bpf_link_fops2; |
52 | |
53 | if (&bpf_link_fops2) /* can't happen */ |
54 | out__non_existent_typed = (__u64)bpf_per_cpu_ptr(&bpf_link_fops2, 0); |
55 | |
56 | if (!bpf_ksym_exists(bpf_task_acquire)) |
57 | /* dead code won't be seen by the verifier */ |
58 | bpf_task_acquire(0); |
59 | |
60 | if (!bpf_ksym_exists(bpf_testmod_test_mod_kfunc)) |
61 | /* dead code won't be seen by the verifier */ |
62 | bpf_testmod_test_mod_kfunc(0); |
63 | |
64 | if (bpf_ksym_exists(invalid_kfunc)) |
65 | /* dead code won't be seen by the verifier */ |
66 | invalid_kfunc(); |
67 | |
68 | return 0; |
69 | } |
70 | |
71 | char _license[] SEC("license" ) = "GPL" ; |
72 | |