Loading...
Note: File does not exist in v6.8.
1// SPDX-License-Identifier: GPL-2.0
2/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
3
4#include <vmlinux.h>
5#include <bpf/bpf_tracing.h>
6#include "bpf_misc.h"
7#include "../bpf_testmod/bpf_testmod.h"
8#include "../bpf_testmod/bpf_testmod_kfunc.h"
9
10char _license[] SEC("license") = "GPL";
11
12__success
13/* save __u64 *ctx to stack */
14__xlated("0: *(u64 *)(r10 -8) = r1")
15/* main prog */
16__xlated("1: r1 = *(u64 *)(r1 +0)")
17__xlated("2: r2 = *(u64 *)(r1 +0)")
18__xlated("3: r3 = 0")
19__xlated("4: r4 = 1")
20__xlated("5: if r2 == 0x0 goto pc+10")
21__xlated("6: r0 = 0")
22__xlated("7: *(u64 *)(r1 +0) = r3")
23/* epilogue */
24__xlated("8: r1 = *(u64 *)(r10 -8)")
25__xlated("9: r1 = *(u64 *)(r1 +0)")
26__xlated("10: r6 = *(u64 *)(r1 +0)")
27__xlated("11: r6 += 10000")
28__xlated("12: *(u64 *)(r1 +0) = r6")
29__xlated("13: r0 = r6")
30__xlated("14: r0 *= 2")
31__xlated("15: exit")
32/* 2nd part of the main prog after the first exit */
33__xlated("16: *(u64 *)(r1 +0) = r4")
34__xlated("17: r0 = 1")
35/* Clear the r1 to ensure it does not have
36 * off-by-1 error and ensure it jumps back to the
37 * beginning of epilogue which initializes
38 * the r1 with the ctx ptr.
39 */
40__xlated("18: r1 = 0")
41__xlated("19: gotol pc-12")
42SEC("struct_ops/test_epilogue_exit")
43__naked int test_epilogue_exit(void)
44{
45 asm volatile (
46 "r1 = *(u64 *)(r1 +0);"
47 "r2 = *(u64 *)(r1 +0);"
48 "r3 = 0;"
49 "r4 = 1;"
50 "if r2 == 0 goto +3;"
51 "r0 = 0;"
52 "*(u64 *)(r1 + 0) = r3;"
53 "exit;"
54 "*(u64 *)(r1 + 0) = r4;"
55 "r0 = 1;"
56 "r1 = 0;"
57 "exit;"
58 ::: __clobber_all);
59}
60
61SEC(".struct_ops.link")
62struct bpf_testmod_st_ops epilogue_exit = {
63 .test_epilogue = (void *)test_epilogue_exit,
64};
65
66SEC("syscall")
67__retval(20000)
68int syscall_epilogue_exit0(void *ctx)
69{
70 struct st_ops_args args = { .a = 1 };
71
72 return bpf_kfunc_st_ops_test_epilogue(&args);
73}
74
75SEC("syscall")
76__retval(20002)
77int syscall_epilogue_exit1(void *ctx)
78{
79 struct st_ops_args args = {};
80
81 return bpf_kfunc_st_ops_test_epilogue(&args);
82}