Hi Jiri,

kernel test robot noticed the following build errors:

[auto build test ERROR on bpf-next/master]

url:    
https://github.com/intel-lab-lkp/linux/commits/Jiri-Olsa/ftrace-Add-ftrace_hash_count-function/20260220-181324
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
patch link:    
https://lore.kernel.org/r/20260220100649.628307-5-jolsa%40kernel.org
patch subject: [PATCH bpf-next 04/17] bpf: Add struct bpf_tramp_node object
config: riscv-randconfig-001-20260221 
(https://download.01.org/0day-ci/archive/20260221/[email protected]/config)
compiler: riscv64-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20260221/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: 
https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

   arch/riscv/net/bpf_jit_comp64.c: In function 'invoke_bpf_prog':
>> arch/riscv/net/bpf_jit_comp64.c:944:7: error: 'struct bpf_tramp_link' has no 
>> member named 'cookie'
     if (l->cookie)
          ^~
   arch/riscv/net/bpf_jit_comp64.c:945:65: error: 'struct bpf_tramp_link' has 
no member named 'cookie'
      emit_store_stack_imm64(RV_REG_T1, -run_ctx_off + cookie_off, l->cookie, 
ctx);
                                                                    ^~
   arch/riscv/net/bpf_jit_comp64.c: At top level:
   arch/riscv/net/bpf_jit_comp64.c:999:30: warning: 'struct bpf_tramp_links' 
declared inside parameter list will not be visible outside of this definition 
or declaration
    static int invoke_bpf(struct bpf_tramp_links *tl, int args_off, int 
retval_off,
                                 ^~~~~~~~~~~~~~~
   arch/riscv/net/bpf_jit_comp64.c: In function 'invoke_bpf':
>> arch/riscv/net/bpf_jit_comp64.c:1005:20: error: dereferencing pointer to 
>> incomplete type 'struct bpf_tramp_links'
     for (i = 0; i < tl->nr_links; i++) {
                       ^~
   arch/riscv/net/bpf_jit_comp64.c: At top level:
   arch/riscv/net/bpf_jit_comp64.c:1024:14: warning: 'struct bpf_tramp_links' 
declared inside parameter list will not be visible outside of this definition 
or declaration
          struct bpf_tramp_links *tlinks,
                 ^~~~~~~~~~~~~~~
   arch/riscv/net/bpf_jit_comp64.c: In function '__arch_prepare_bpf_trampoline':
>> arch/riscv/net/bpf_jit_comp64.c:1033:42: error: invalid use of undefined 
>> type 'struct bpf_tramp_links'
     struct bpf_tramp_links *fentry = &tlinks[BPF_TRAMP_FENTRY];
                                             ^
   arch/riscv/net/bpf_jit_comp64.c:1033:42: error: dereferencing pointer to 
incomplete type 'struct bpf_tramp_links'
   arch/riscv/net/bpf_jit_comp64.c:1034:41: error: invalid use of undefined 
type 'struct bpf_tramp_links'
     struct bpf_tramp_links *fexit = &tlinks[BPF_TRAMP_FEXIT];
                                            ^
   arch/riscv/net/bpf_jit_comp64.c:1035:44: error: invalid use of undefined 
type 'struct bpf_tramp_links'
     struct bpf_tramp_links *fmod_ret = &tlinks[BPF_TRAMP_MODIFY_RETURN];
                                               ^
   arch/riscv/net/bpf_jit_comp64.c:1118:39: error: passing argument 1 of 
'bpf_fsession_cookie_cnt' from incompatible pointer type 
[-Werror=incompatible-pointer-types]
     cookie_cnt = bpf_fsession_cookie_cnt(tlinks);
                                          ^~~~~~
   In file included from arch/riscv/net/bpf_jit_comp64.c:9:
   include/linux/bpf.h:2207:67: note: expected 'struct bpf_tramp_nodes *' but 
argument is of type 'struct bpf_tramp_links *'
    static inline int bpf_fsession_cookie_cnt(struct bpf_tramp_nodes *nodes)
                                              ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
   arch/riscv/net/bpf_jit_comp64.c:1175:23: error: passing argument 1 of 
'bpf_fsession_cnt' from incompatible pointer type 
[-Werror=incompatible-pointer-types]
     if (bpf_fsession_cnt(tlinks)) {
                          ^~~~~~
   In file included from arch/riscv/net/bpf_jit_comp64.c:9:
   include/linux/bpf.h:2189:60: note: expected 'struct bpf_tramp_nodes *' but 
argument is of type 'struct bpf_tramp_links *'
    static inline int bpf_fsession_cnt(struct bpf_tramp_nodes *nodes)
                                       ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
   arch/riscv/net/bpf_jit_comp64.c:1191:20: error: passing argument 1 of 
'invoke_bpf' from incompatible pointer type [-Werror=incompatible-pointer-types]
      ret = invoke_bpf(fentry, args_off, retval_off, run_ctx_off, func_meta_off,
                       ^~~~~~
   arch/riscv/net/bpf_jit_comp64.c:999:47: note: expected 'struct 
bpf_tramp_links *' but argument is of type 'struct bpf_tramp_links *'
    static int invoke_bpf(struct bpf_tramp_links *tl, int args_off, int 
retval_off,
                          ~~~~~~~~~~~~~~~~~~~~~~~~^~
   arch/riscv/net/bpf_jit_comp64.c:1198:16: warning: assignment to 'int *' from 
'int' makes pointer from integer without a cast [-Wint-conversion]
      branches_off = kcalloc(fmod_ret->nr_links, sizeof(int), GFP_KERNEL);
                   ^
   arch/riscv/net/bpf_jit_comp64.c:1241:23: error: passing argument 1 of 
'bpf_fsession_cnt' from incompatible pointer type 
[-Werror=incompatible-pointer-types]
     if (bpf_fsession_cnt(tlinks))
                          ^~~~~~
   In file included from arch/riscv/net/bpf_jit_comp64.c:9:
   include/linux/bpf.h:2189:60: note: expected 'struct bpf_tramp_nodes *' but 
argument is of type 'struct bpf_tramp_links *'
    static inline int bpf_fsession_cnt(struct bpf_tramp_nodes *nodes)
                                       ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
   arch/riscv/net/bpf_jit_comp64.c:1245:20: error: passing argument 1 of 
'invoke_bpf' from incompatible pointer type [-Werror=incompatible-pointer-types]
      ret = invoke_bpf(fexit, args_off, retval_off, run_ctx_off, func_meta_off,
                       ^~~~~
   arch/riscv/net/bpf_jit_comp64.c:999:47: note: expected 'struct 
bpf_tramp_links *' but argument is of type 'struct bpf_tramp_links *'
    static int invoke_bpf(struct bpf_tramp_links *tl, int args_off, int 
retval_off,
                          ~~~~~~~~~~~~~~~~~~~~~~~~^~
   arch/riscv/net/bpf_jit_comp64.c: At top level:
   arch/riscv/net/bpf_jit_comp64.c:1308:16: warning: 'struct bpf_tramp_links' 
declared inside parameter list will not be visible outside of this definition 
or declaration
            struct bpf_tramp_links *tlinks, void *func_addr)
                   ^~~~~~~~~~~~~~~
   arch/riscv/net/bpf_jit_comp64.c:1307:5: error: conflicting types for 
'arch_bpf_trampoline_size'
    int arch_bpf_trampoline_size(const struct btf_func_model *m, u32 flags,
        ^~~~~~~~~~~~~~~~~~~~~~~~
   In file included from arch/riscv/net/bpf_jit_comp64.c:9:
   include/linux/bpf.h:1271:5: note: previous declaration of 
'arch_bpf_trampoline_size' was here
    int arch_bpf_trampoline_size(const struct btf_func_model *m, u32 flags,
        ^~~~~~~~~~~~~~~~~~~~~~~~
   arch/riscv/net/bpf_jit_comp64.c: In function 'arch_bpf_trampoline_size':
   arch/riscv/net/bpf_jit_comp64.c:1317:46: error: passing argument 3 of 
'__arch_prepare_bpf_trampoline' from incompatible pointer type 
[-Werror=incompatible-pointer-types]
     ret = __arch_prepare_bpf_trampoline(&im, m, tlinks, func_addr, flags, 
&ctx);
                                                 ^~~~~~
   arch/riscv/net/bpf_jit_comp64.c:1024:31: note: expected 'struct 
bpf_tramp_links *' but argument is of type 'struct bpf_tramp_links *'
          struct bpf_tramp_links *tlinks,
          ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
   arch/riscv/net/bpf_jit_comp64.c: At top level:
   arch/riscv/net/bpf_jit_comp64.c:1334:23: warning: 'struct bpf_tramp_links' 
declared inside parameter list will not be visible outside of this definition 
or declaration
        u32 flags, struct bpf_tramp_links *tlinks,
                          ^~~~~~~~~~~~~~~
   arch/riscv/net/bpf_jit_comp64.c:1332:5: error: conflicting types for 
'arch_prepare_bpf_trampoline'
    int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *ro_image,
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   In file included from arch/riscv/net/bpf_jit_comp64.c:9:
   include/linux/bpf.h:1264:5: note: previous declaration of 
'arch_prepare_bpf_trampoline' was here
    int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, 
void *image_end,
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/riscv/net/bpf_jit_comp64.c: In function 'arch_prepare_bpf_trampoline':
   arch/riscv/net/bpf_jit_comp64.c:1349:45: error: passing argument 3 of 
'__arch_prepare_bpf_trampoline' from incompatible pointer type 
[-Werror=incompatible-pointer-types]
     ret = __arch_prepare_bpf_trampoline(im, m, tlinks, func_addr, flags, &ctx);
                                                ^~~~~~
   arch/riscv/net/bpf_jit_comp64.c:1024:31: note: expected 'struct 
bpf_tramp_links *' but argument is of type 'struct bpf_tramp_links *'
          struct bpf_tramp_links *tlinks,
          ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
   cc1: some warnings being treated as errors


vim +944 arch/riscv/net/bpf_jit_comp64.c

93fd420d71beed5 Menglong Dong  2026-02-08   936  
49b5e77ae3e214a Pu Lehui       2023-02-15   937  static int 
invoke_bpf_prog(struct bpf_tramp_link *l, int args_off, int retval_off,
49b5e77ae3e214a Pu Lehui       2023-02-15   938                            int 
run_ctx_off, bool save_ret, struct rv_jit_context *ctx)
49b5e77ae3e214a Pu Lehui       2023-02-15   939  {
49b5e77ae3e214a Pu Lehui       2023-02-15   940         int ret, branch_off;
49b5e77ae3e214a Pu Lehui       2023-02-15   941         struct bpf_prog *p = 
l->link.prog;
49b5e77ae3e214a Pu Lehui       2023-02-15   942         int cookie_off = 
offsetof(struct bpf_tramp_run_ctx, bpf_cookie);
49b5e77ae3e214a Pu Lehui       2023-02-15   943  
93fd420d71beed5 Menglong Dong  2026-02-08  @944         if (l->cookie)
93fd420d71beed5 Menglong Dong  2026-02-08   945                 
emit_store_stack_imm64(RV_REG_T1, -run_ctx_off + cookie_off, l->cookie, ctx);
93fd420d71beed5 Menglong Dong  2026-02-08   946         else
49b5e77ae3e214a Pu Lehui       2023-02-15   947                 
emit_sd(RV_REG_FP, -run_ctx_off + cookie_off, RV_REG_ZERO, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   948  
49b5e77ae3e214a Pu Lehui       2023-02-15   949         /* arg1: prog */
49b5e77ae3e214a Pu Lehui       2023-02-15   950         emit_imm(RV_REG_A0, 
(const s64)p, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   951         /* arg2: &run_ctx */
49b5e77ae3e214a Pu Lehui       2023-02-15   952         emit_addi(RV_REG_A1, 
RV_REG_FP, -run_ctx_off, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   953         ret = emit_call((const 
u64)bpf_trampoline_enter(p), true, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   954         if (ret)
49b5e77ae3e214a Pu Lehui       2023-02-15   955                 return ret;
49b5e77ae3e214a Pu Lehui       2023-02-15   956  
10541b374aa05c8 Xu Kuohai      2024-04-16   957         /* store prog start 
time */
10541b374aa05c8 Xu Kuohai      2024-04-16   958         emit_mv(RV_REG_S1, 
RV_REG_A0, ctx);
10541b374aa05c8 Xu Kuohai      2024-04-16   959  
49b5e77ae3e214a Pu Lehui       2023-02-15   960         /* if 
(__bpf_prog_enter(prog) == 0)
49b5e77ae3e214a Pu Lehui       2023-02-15   961          *      goto 
skip_exec_of_prog;
49b5e77ae3e214a Pu Lehui       2023-02-15   962          */
49b5e77ae3e214a Pu Lehui       2023-02-15   963         branch_off = 
ctx->ninsns;
49b5e77ae3e214a Pu Lehui       2023-02-15   964         /* nop reserved for 
conditional jump */
49b5e77ae3e214a Pu Lehui       2023-02-15   965         emit(rv_nop(), ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   966  
49b5e77ae3e214a Pu Lehui       2023-02-15   967         /* arg1: &args_off */
49b5e77ae3e214a Pu Lehui       2023-02-15   968         emit_addi(RV_REG_A0, 
RV_REG_FP, -args_off, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   969         if (!p->jited)
49b5e77ae3e214a Pu Lehui       2023-02-15   970                 /* arg2: 
progs[i]->insnsi for interpreter */
49b5e77ae3e214a Pu Lehui       2023-02-15   971                 
emit_imm(RV_REG_A1, (const s64)p->insnsi, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   972         ret = emit_call((const 
u64)p->bpf_func, true, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   973         if (ret)
49b5e77ae3e214a Pu Lehui       2023-02-15   974                 return ret;
49b5e77ae3e214a Pu Lehui       2023-02-15   975  
7112cd26e606c7b Björn Töpel    2023-10-04   976         if (save_ret) {
7112cd26e606c7b Björn Töpel    2023-10-04   977                 
emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
7112cd26e606c7b Björn Töpel    2023-10-04   978                 
emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx);
7112cd26e606c7b Björn Töpel    2023-10-04   979         }
49b5e77ae3e214a Pu Lehui       2023-02-15   980  
49b5e77ae3e214a Pu Lehui       2023-02-15   981         /* update branch with 
beqz */
49b5e77ae3e214a Pu Lehui       2023-02-15   982         if (ctx->insns) {
49b5e77ae3e214a Pu Lehui       2023-02-15   983                 int offset = 
ninsns_rvoff(ctx->ninsns - branch_off);
49b5e77ae3e214a Pu Lehui       2023-02-15   984                 u32 insn = 
rv_beq(RV_REG_A0, RV_REG_ZERO, offset >> 1);
49b5e77ae3e214a Pu Lehui       2023-02-15   985                 *(u32 
*)(ctx->insns + branch_off) = insn;
49b5e77ae3e214a Pu Lehui       2023-02-15   986         }
49b5e77ae3e214a Pu Lehui       2023-02-15   987  
49b5e77ae3e214a Pu Lehui       2023-02-15   988         /* arg1: prog */
49b5e77ae3e214a Pu Lehui       2023-02-15   989         emit_imm(RV_REG_A0, 
(const s64)p, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   990         /* arg2: prog start 
time */
49b5e77ae3e214a Pu Lehui       2023-02-15   991         emit_mv(RV_REG_A1, 
RV_REG_S1, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   992         /* arg3: &run_ctx */
49b5e77ae3e214a Pu Lehui       2023-02-15   993         emit_addi(RV_REG_A2, 
RV_REG_FP, -run_ctx_off, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   994         ret = emit_call((const 
u64)bpf_trampoline_exit(p), true, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15   995  
49b5e77ae3e214a Pu Lehui       2023-02-15   996         return ret;
49b5e77ae3e214a Pu Lehui       2023-02-15   997  }
49b5e77ae3e214a Pu Lehui       2023-02-15   998  
35b3515be0ecb9d Menglong Dong  2026-02-08   999  static int invoke_bpf(struct 
bpf_tramp_links *tl, int args_off, int retval_off,
35b3515be0ecb9d Menglong Dong  2026-02-08  1000                       int 
run_ctx_off, int func_meta_off, bool save_ret, u64 func_meta,
35b3515be0ecb9d Menglong Dong  2026-02-08  1001                       int 
cookie_off, struct rv_jit_context *ctx)
35b3515be0ecb9d Menglong Dong  2026-02-08  1002  {
35b3515be0ecb9d Menglong Dong  2026-02-08  1003         int i, cur_cookie = 
(cookie_off - args_off) / 8;
35b3515be0ecb9d Menglong Dong  2026-02-08  1004  
35b3515be0ecb9d Menglong Dong  2026-02-08 @1005         for (i = 0; i < 
tl->nr_links; i++) {
35b3515be0ecb9d Menglong Dong  2026-02-08  1006                 int err;
35b3515be0ecb9d Menglong Dong  2026-02-08  1007  
35b3515be0ecb9d Menglong Dong  2026-02-08  1008                 if 
(bpf_prog_calls_session_cookie(tl->links[i])) {
35b3515be0ecb9d Menglong Dong  2026-02-08  1009                         u64 
meta = func_meta | ((u64)cur_cookie << BPF_TRAMP_COOKIE_INDEX_SHIFT);
35b3515be0ecb9d Menglong Dong  2026-02-08  1010  
35b3515be0ecb9d Menglong Dong  2026-02-08  1011                         
emit_store_stack_imm64(RV_REG_T1, -func_meta_off, meta, ctx);
35b3515be0ecb9d Menglong Dong  2026-02-08  1012                         
cur_cookie--;
35b3515be0ecb9d Menglong Dong  2026-02-08  1013                 }
35b3515be0ecb9d Menglong Dong  2026-02-08  1014                 err = 
invoke_bpf_prog(tl->links[i], args_off, retval_off, run_ctx_off,
35b3515be0ecb9d Menglong Dong  2026-02-08  1015                                 
      save_ret, ctx);
35b3515be0ecb9d Menglong Dong  2026-02-08  1016                 if (err)
35b3515be0ecb9d Menglong Dong  2026-02-08  1017                         return 
err;
35b3515be0ecb9d Menglong Dong  2026-02-08  1018         }
35b3515be0ecb9d Menglong Dong  2026-02-08  1019         return 0;
35b3515be0ecb9d Menglong Dong  2026-02-08  1020  }
35b3515be0ecb9d Menglong Dong  2026-02-08  1021  
49b5e77ae3e214a Pu Lehui       2023-02-15  1022  static int 
__arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
49b5e77ae3e214a Pu Lehui       2023-02-15  1023                                 
         const struct btf_func_model *m,
49b5e77ae3e214a Pu Lehui       2023-02-15  1024                                 
         struct bpf_tramp_links *tlinks,
49b5e77ae3e214a Pu Lehui       2023-02-15  1025                                 
         void *func_addr, u32 flags,
49b5e77ae3e214a Pu Lehui       2023-02-15  1026                                 
         struct rv_jit_context *ctx)
49b5e77ae3e214a Pu Lehui       2023-02-15  1027  {
49b5e77ae3e214a Pu Lehui       2023-02-15  1028         int i, ret, offset;
49b5e77ae3e214a Pu Lehui       2023-02-15  1029         int *branches_off = 
NULL;
6801b0aef79db47 Pu Lehui       2024-07-02  1030         int stack_size = 0, 
nr_arg_slots = 0;
35b3515be0ecb9d Menglong Dong  2026-02-08  1031         int retval_off, 
args_off, func_meta_off, ip_off, run_ctx_off, sreg_off, stk_arg_off;
35b3515be0ecb9d Menglong Dong  2026-02-08  1032         int cookie_off, 
cookie_cnt;
49b5e77ae3e214a Pu Lehui       2023-02-15 @1033         struct bpf_tramp_links 
*fentry = &tlinks[BPF_TRAMP_FENTRY];
49b5e77ae3e214a Pu Lehui       2023-02-15  1034         struct bpf_tramp_links 
*fexit = &tlinks[BPF_TRAMP_FEXIT];
49b5e77ae3e214a Pu Lehui       2023-02-15  1035         struct bpf_tramp_links 
*fmod_ret = &tlinks[BPF_TRAMP_MODIFY_RETURN];
1732ebc4a26181c Pu Lehui       2024-01-23  1036         bool is_struct_ops = 
flags & BPF_TRAMP_F_INDIRECT;
49b5e77ae3e214a Pu Lehui       2023-02-15  1037         void *orig_call = 
func_addr;
49b5e77ae3e214a Pu Lehui       2023-02-15  1038         bool save_ret;
35b3515be0ecb9d Menglong Dong  2026-02-08  1039         u64 func_meta;
49b5e77ae3e214a Pu Lehui       2023-02-15  1040         u32 insn;
49b5e77ae3e214a Pu Lehui       2023-02-15  1041  
25ad10658dc1068 Pu Lehui       2023-07-21  1042         /* Two types of 
generated trampoline stack layout:
25ad10658dc1068 Pu Lehui       2023-07-21  1043          *
25ad10658dc1068 Pu Lehui       2023-07-21  1044          * 1. trampoline called 
from function entry
25ad10658dc1068 Pu Lehui       2023-07-21  1045          * 
--------------------------------------
25ad10658dc1068 Pu Lehui       2023-07-21  1046          * FP + 8           [ 
RA to parent func ] return address to parent
25ad10658dc1068 Pu Lehui       2023-07-21  1047          *                      
                  function
25ad10658dc1068 Pu Lehui       2023-07-21  1048          * FP + 0           [ 
FP of parent func ] frame pointer of parent
25ad10658dc1068 Pu Lehui       2023-07-21  1049          *                      
                  function
25ad10658dc1068 Pu Lehui       2023-07-21  1050          * FP - 8           [ 
T0 to traced func ] return address of traced
25ad10658dc1068 Pu Lehui       2023-07-21  1051          *                      
                  function
25ad10658dc1068 Pu Lehui       2023-07-21  1052          * FP - 16          [ 
FP of traced func ] frame pointer of traced
25ad10658dc1068 Pu Lehui       2023-07-21  1053          *                      
                  function
25ad10658dc1068 Pu Lehui       2023-07-21  1054          * 
--------------------------------------
49b5e77ae3e214a Pu Lehui       2023-02-15  1055          *
25ad10658dc1068 Pu Lehui       2023-07-21  1056          * 2. trampoline called 
directly
25ad10658dc1068 Pu Lehui       2023-07-21  1057          * 
--------------------------------------
25ad10658dc1068 Pu Lehui       2023-07-21  1058          * FP - 8           [ 
RA to caller func ] return address to caller
49b5e77ae3e214a Pu Lehui       2023-02-15  1059          *                      
                  function
25ad10658dc1068 Pu Lehui       2023-07-21  1060          * FP - 16          [ 
FP of caller func ] frame pointer of caller
49b5e77ae3e214a Pu Lehui       2023-02-15  1061          *                      
                  function
25ad10658dc1068 Pu Lehui       2023-07-21  1062          * 
--------------------------------------
49b5e77ae3e214a Pu Lehui       2023-02-15  1063          *
49b5e77ae3e214a Pu Lehui       2023-02-15  1064          * FP - retval_off  [ 
return value      ] BPF_TRAMP_F_CALL_ORIG or
49b5e77ae3e214a Pu Lehui       2023-02-15  1065          *                      
                  BPF_TRAMP_F_RET_FENTRY_RET
49b5e77ae3e214a Pu Lehui       2023-02-15  1066          *                  [ 
argN              ]
49b5e77ae3e214a Pu Lehui       2023-02-15  1067          *                  [ 
...               ]
49b5e77ae3e214a Pu Lehui       2023-02-15  1068          * FP - args_off    [ 
arg1              ]
49b5e77ae3e214a Pu Lehui       2023-02-15  1069          *
35b3515be0ecb9d Menglong Dong  2026-02-08  1070          * FP - func_meta_off [ 
regs count, etc ]
49b5e77ae3e214a Pu Lehui       2023-02-15  1071          *
49b5e77ae3e214a Pu Lehui       2023-02-15  1072          * FP - ip_off      [ 
traced func       ] BPF_TRAMP_F_IP_ARG
49b5e77ae3e214a Pu Lehui       2023-02-15  1073          *
35b3515be0ecb9d Menglong Dong  2026-02-08  1074          *                  [ 
stack cookie N    ]
35b3515be0ecb9d Menglong Dong  2026-02-08  1075          *                  [ 
...               ]
35b3515be0ecb9d Menglong Dong  2026-02-08  1076          * FP - cookie_off  [ 
stack cookie 1    ]
35b3515be0ecb9d Menglong Dong  2026-02-08  1077          *
49b5e77ae3e214a Pu Lehui       2023-02-15  1078          * FP - run_ctx_off [ 
bpf_tramp_run_ctx ]
49b5e77ae3e214a Pu Lehui       2023-02-15  1079          *
49b5e77ae3e214a Pu Lehui       2023-02-15  1080          * FP - sreg_off    [ 
callee saved reg  ]
49b5e77ae3e214a Pu Lehui       2023-02-15  1081          *
49b5e77ae3e214a Pu Lehui       2023-02-15  1082          *                  [ 
pads              ] pads for 16 bytes alignment
6801b0aef79db47 Pu Lehui       2024-07-02  1083          *
6801b0aef79db47 Pu Lehui       2024-07-02  1084          *                  [ 
stack_argN        ]
6801b0aef79db47 Pu Lehui       2024-07-02  1085          *                  [ 
...               ]
6801b0aef79db47 Pu Lehui       2024-07-02  1086          * FP - stk_arg_off [ 
stack_arg1        ] BPF_TRAMP_F_CALL_ORIG
49b5e77ae3e214a Pu Lehui       2023-02-15  1087          */
49b5e77ae3e214a Pu Lehui       2023-02-15  1088  
49b5e77ae3e214a Pu Lehui       2023-02-15  1089         if (flags & 
(BPF_TRAMP_F_ORIG_STACK | BPF_TRAMP_F_SHARE_IPMODIFY))
49b5e77ae3e214a Pu Lehui       2023-02-15  1090                 return 
-ENOTSUPP;
49b5e77ae3e214a Pu Lehui       2023-02-15  1091  
6801b0aef79db47 Pu Lehui       2024-07-02  1092         if (m->nr_args > 
MAX_BPF_FUNC_ARGS)
49b5e77ae3e214a Pu Lehui       2023-02-15  1093                 return 
-ENOTSUPP;
49b5e77ae3e214a Pu Lehui       2023-02-15  1094  
6801b0aef79db47 Pu Lehui       2024-07-02  1095         for (i = 0; i < 
m->nr_args; i++)
6801b0aef79db47 Pu Lehui       2024-07-02  1096                 nr_arg_slots += 
round_up(m->arg_size[i], 8) / 8;
6801b0aef79db47 Pu Lehui       2024-07-02  1097  
25ad10658dc1068 Pu Lehui       2023-07-21  1098         /* room of trampoline 
frame to store return address and frame pointer */
25ad10658dc1068 Pu Lehui       2023-07-21  1099         stack_size += 16;
49b5e77ae3e214a Pu Lehui       2023-02-15  1100  
49b5e77ae3e214a Pu Lehui       2023-02-15  1101         save_ret = flags & 
(BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_RET_FENTRY_RET);
d0bf7cd5df18466 Chenghao Duan  2025-09-22  1102         if (save_ret)
7112cd26e606c7b Björn Töpel    2023-10-04  1103                 stack_size += 
16; /* Save both A5 (BPF R0) and A0 */
49b5e77ae3e214a Pu Lehui       2023-02-15  1104         retval_off = stack_size;
49b5e77ae3e214a Pu Lehui       2023-02-15  1105  
6801b0aef79db47 Pu Lehui       2024-07-02  1106         stack_size += 
nr_arg_slots * 8;
49b5e77ae3e214a Pu Lehui       2023-02-15  1107         args_off = stack_size;
49b5e77ae3e214a Pu Lehui       2023-02-15  1108  
35b3515be0ecb9d Menglong Dong  2026-02-08  1109         /* function metadata, 
such as regs count */
49b5e77ae3e214a Pu Lehui       2023-02-15  1110         stack_size += 8;
35b3515be0ecb9d Menglong Dong  2026-02-08  1111         func_meta_off = 
stack_size;
49b5e77ae3e214a Pu Lehui       2023-02-15  1112  
49b5e77ae3e214a Pu Lehui       2023-02-15  1113         if (flags & 
BPF_TRAMP_F_IP_ARG) {
49b5e77ae3e214a Pu Lehui       2023-02-15  1114                 stack_size += 8;
49b5e77ae3e214a Pu Lehui       2023-02-15  1115                 ip_off = 
stack_size;
49b5e77ae3e214a Pu Lehui       2023-02-15  1116         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1117  
35b3515be0ecb9d Menglong Dong  2026-02-08  1118         cookie_cnt = 
bpf_fsession_cookie_cnt(tlinks);
35b3515be0ecb9d Menglong Dong  2026-02-08  1119         /* room for session 
cookies */
35b3515be0ecb9d Menglong Dong  2026-02-08  1120         stack_size += 
cookie_cnt * 8;
35b3515be0ecb9d Menglong Dong  2026-02-08  1121         cookie_off = stack_size;
35b3515be0ecb9d Menglong Dong  2026-02-08  1122  
49b5e77ae3e214a Pu Lehui       2023-02-15  1123         stack_size += 
round_up(sizeof(struct bpf_tramp_run_ctx), 8);
49b5e77ae3e214a Pu Lehui       2023-02-15  1124         run_ctx_off = 
stack_size;
49b5e77ae3e214a Pu Lehui       2023-02-15  1125  
49b5e77ae3e214a Pu Lehui       2023-02-15  1126         stack_size += 8;
49b5e77ae3e214a Pu Lehui       2023-02-15  1127         sreg_off = stack_size;
49b5e77ae3e214a Pu Lehui       2023-02-15  1128  
a5912c37faf723c Puranjay Mohan 2024-07-08  1129         if ((flags & 
BPF_TRAMP_F_CALL_ORIG) && (nr_arg_slots - RV_MAX_REG_ARGS > 0))
6801b0aef79db47 Pu Lehui       2024-07-02  1130                 stack_size += 
(nr_arg_slots - RV_MAX_REG_ARGS) * 8;
6801b0aef79db47 Pu Lehui       2024-07-02  1131  
e944fc8152744a4 Xiao Wang      2024-05-23  1132         stack_size = 
round_up(stack_size, STACK_ALIGN);
49b5e77ae3e214a Pu Lehui       2023-02-15  1133  
6801b0aef79db47 Pu Lehui       2024-07-02  1134         /* room for args on 
stack must be at the top of stack */
6801b0aef79db47 Pu Lehui       2024-07-02  1135         stk_arg_off = 
stack_size;
6801b0aef79db47 Pu Lehui       2024-07-02  1136  
1732ebc4a26181c Pu Lehui       2024-01-23  1137         if (!is_struct_ops) {
25ad10658dc1068 Pu Lehui       2023-07-21  1138                 /* For the 
trampoline called from function entry,
25ad10658dc1068 Pu Lehui       2023-07-21  1139                  * the frame of 
traced function and the frame of
25ad10658dc1068 Pu Lehui       2023-07-21  1140                  * trampoline 
need to be considered.
25ad10658dc1068 Pu Lehui       2023-07-21  1141                  */
25ad10658dc1068 Pu Lehui       2023-07-21  1142                 
emit_addi(RV_REG_SP, RV_REG_SP, -16, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1143                 
emit_sd(RV_REG_SP, 8, RV_REG_RA, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1144                 
emit_sd(RV_REG_SP, 0, RV_REG_FP, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1145                 
emit_addi(RV_REG_FP, RV_REG_SP, 16, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1146  
25ad10658dc1068 Pu Lehui       2023-07-21  1147                 
emit_addi(RV_REG_SP, RV_REG_SP, -stack_size, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1148                 
emit_sd(RV_REG_SP, stack_size - 8, RV_REG_T0, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1149                 
emit_sd(RV_REG_SP, stack_size - 16, RV_REG_FP, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1150                 
emit_addi(RV_REG_FP, RV_REG_SP, stack_size, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1151         } else {
e63985ecd22681c Puranjay Mohan 2024-03-03  1152                 /* emit kcfi 
hash */
e63985ecd22681c Puranjay Mohan 2024-03-03  1153                 
emit_kcfi(cfi_get_func_hash(func_addr), ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1154                 /* For the 
trampoline called directly, just handle
25ad10658dc1068 Pu Lehui       2023-07-21  1155                  * the frame of 
trampoline.
25ad10658dc1068 Pu Lehui       2023-07-21  1156                  */
25ad10658dc1068 Pu Lehui       2023-07-21  1157                 
emit_addi(RV_REG_SP, RV_REG_SP, -stack_size, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1158                 
emit_sd(RV_REG_SP, stack_size - 8, RV_REG_RA, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1159                 
emit_sd(RV_REG_SP, stack_size - 16, RV_REG_FP, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1160                 
emit_addi(RV_REG_FP, RV_REG_SP, stack_size, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1161         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1162  
49b5e77ae3e214a Pu Lehui       2023-02-15  1163         /* callee saved 
register S1 to pass start time */
49b5e77ae3e214a Pu Lehui       2023-02-15  1164         emit_sd(RV_REG_FP, 
-sreg_off, RV_REG_S1, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1165  
49b5e77ae3e214a Pu Lehui       2023-02-15  1166         /* store ip address of 
the traced function */
93fd420d71beed5 Menglong Dong  2026-02-08  1167         if (flags & 
BPF_TRAMP_F_IP_ARG)
93fd420d71beed5 Menglong Dong  2026-02-08  1168                 
emit_store_stack_imm64(RV_REG_T1, -ip_off, (u64)func_addr, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1169  
35b3515be0ecb9d Menglong Dong  2026-02-08  1170         func_meta = 
nr_arg_slots;
35b3515be0ecb9d Menglong Dong  2026-02-08  1171         
emit_store_stack_imm64(RV_REG_T1, -func_meta_off, func_meta, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1172  
6801b0aef79db47 Pu Lehui       2024-07-02  1173         
store_args(nr_arg_slots, args_off, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1174  
35b3515be0ecb9d Menglong Dong  2026-02-08  1175         if 
(bpf_fsession_cnt(tlinks)) {
35b3515be0ecb9d Menglong Dong  2026-02-08  1176                 /* clear all 
session cookies' value */
35b3515be0ecb9d Menglong Dong  2026-02-08  1177                 for (i = 0; i < 
cookie_cnt; i++)
35b3515be0ecb9d Menglong Dong  2026-02-08  1178                         
emit_sd(RV_REG_FP, -cookie_off + 8 * i, RV_REG_ZERO, ctx);
35b3515be0ecb9d Menglong Dong  2026-02-08  1179                 /* clear return 
value to make sure fentry always get 0 */
35b3515be0ecb9d Menglong Dong  2026-02-08  1180                 
emit_sd(RV_REG_FP, -retval_off, RV_REG_ZERO, ctx);
35b3515be0ecb9d Menglong Dong  2026-02-08  1181         }
35b3515be0ecb9d Menglong Dong  2026-02-08  1182  
49b5e77ae3e214a Pu Lehui       2023-02-15  1183         if (flags & 
BPF_TRAMP_F_CALL_ORIG) {
9f1e16fb1fc9826 Pu Lehui       2024-06-22  1184                 
emit_imm(RV_REG_A0, ctx->insns ? (const s64)im : RV_MAX_COUNT_IMM, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1185                 ret = 
emit_call((const u64)__bpf_tramp_enter, true, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1186                 if (ret)
49b5e77ae3e214a Pu Lehui       2023-02-15  1187                         return 
ret;
49b5e77ae3e214a Pu Lehui       2023-02-15  1188         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1189  
35b3515be0ecb9d Menglong Dong  2026-02-08  1190         if (fentry->nr_links) {
35b3515be0ecb9d Menglong Dong  2026-02-08  1191                 ret = 
invoke_bpf(fentry, args_off, retval_off, run_ctx_off, func_meta_off,
35b3515be0ecb9d Menglong Dong  2026-02-08  1192                                 
 flags & BPF_TRAMP_F_RET_FENTRY_RET, func_meta, cookie_off, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1193                 if (ret)
49b5e77ae3e214a Pu Lehui       2023-02-15  1194                         return 
ret;
49b5e77ae3e214a Pu Lehui       2023-02-15  1195         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1196  
49b5e77ae3e214a Pu Lehui       2023-02-15  1197         if (fmod_ret->nr_links) 
{
49b5e77ae3e214a Pu Lehui       2023-02-15  1198                 branches_off = 
kcalloc(fmod_ret->nr_links, sizeof(int), GFP_KERNEL);
49b5e77ae3e214a Pu Lehui       2023-02-15  1199                 if 
(!branches_off)
49b5e77ae3e214a Pu Lehui       2023-02-15  1200                         return 
-ENOMEM;
49b5e77ae3e214a Pu Lehui       2023-02-15  1201  
49b5e77ae3e214a Pu Lehui       2023-02-15  1202                 /* cleanup to 
avoid garbage return value confusion */
49b5e77ae3e214a Pu Lehui       2023-02-15  1203                 
emit_sd(RV_REG_FP, -retval_off, RV_REG_ZERO, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1204                 for (i = 0; i < 
fmod_ret->nr_links; i++) {
49b5e77ae3e214a Pu Lehui       2023-02-15  1205                         ret = 
invoke_bpf_prog(fmod_ret->links[i], args_off, retval_off,
49b5e77ae3e214a Pu Lehui       2023-02-15  1206                                 
              run_ctx_off, true, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1207                         if (ret)
49b5e77ae3e214a Pu Lehui       2023-02-15  1208                                 
goto out;
49b5e77ae3e214a Pu Lehui       2023-02-15  1209                         
emit_ld(RV_REG_T1, -retval_off, RV_REG_FP, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1210                         
branches_off[i] = ctx->ninsns;
49b5e77ae3e214a Pu Lehui       2023-02-15  1211                         /* nop 
reserved for conditional jump */
49b5e77ae3e214a Pu Lehui       2023-02-15  1212                         
emit(rv_nop(), ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1213                 }
49b5e77ae3e214a Pu Lehui       2023-02-15  1214         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1215  
49b5e77ae3e214a Pu Lehui       2023-02-15  1216         if (flags & 
BPF_TRAMP_F_CALL_ORIG) {
8f3e00af8e52c0d Menglong Dong  2025-12-19  1217                 /* skip to 
actual body of traced function */
8f3e00af8e52c0d Menglong Dong  2025-12-19  1218                 orig_call += 
RV_FENTRY_NINSNS * 4;
6801b0aef79db47 Pu Lehui       2024-07-02  1219                 
restore_args(min_t(int, nr_arg_slots, RV_MAX_REG_ARGS), args_off, ctx);
6801b0aef79db47 Pu Lehui       2024-07-02  1220                 
restore_stack_args(nr_arg_slots - RV_MAX_REG_ARGS, args_off, stk_arg_off, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1221                 ret = 
emit_call((const u64)orig_call, true, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1222                 if (ret)
49b5e77ae3e214a Pu Lehui       2023-02-15  1223                         goto 
out;
49b5e77ae3e214a Pu Lehui       2023-02-15  1224                 
emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
7112cd26e606c7b Björn Töpel    2023-10-04  1225                 
emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx);
2382a405c581ae8 Pu Lehui       2024-06-22  1226                 
im->ip_after_call = ctx->ro_insns + ctx->ninsns;
49b5e77ae3e214a Pu Lehui       2023-02-15  1227                 /* 2 nops 
reserved for auipc+jalr pair */
49b5e77ae3e214a Pu Lehui       2023-02-15  1228                 emit(rv_nop(), 
ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1229                 emit(rv_nop(), 
ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1230         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1231  
49b5e77ae3e214a Pu Lehui       2023-02-15  1232         /* update branches 
saved in invoke_bpf_mod_ret with bnez */
49b5e77ae3e214a Pu Lehui       2023-02-15  1233         for (i = 0; ctx->insns 
&& i < fmod_ret->nr_links; i++) {
49b5e77ae3e214a Pu Lehui       2023-02-15  1234                 offset = 
ninsns_rvoff(ctx->ninsns - branches_off[i]);
49b5e77ae3e214a Pu Lehui       2023-02-15  1235                 insn = 
rv_bne(RV_REG_T1, RV_REG_ZERO, offset >> 1);
49b5e77ae3e214a Pu Lehui       2023-02-15  1236                 *(u32 
*)(ctx->insns + branches_off[i]) = insn;
49b5e77ae3e214a Pu Lehui       2023-02-15  1237         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1238  
35b3515be0ecb9d Menglong Dong  2026-02-08  1239         /* set "is_return" flag 
for fsession */
35b3515be0ecb9d Menglong Dong  2026-02-08  1240         func_meta |= (1ULL << 
BPF_TRAMP_IS_RETURN_SHIFT);
35b3515be0ecb9d Menglong Dong  2026-02-08  1241         if 
(bpf_fsession_cnt(tlinks))
35b3515be0ecb9d Menglong Dong  2026-02-08  1242                 
emit_store_stack_imm64(RV_REG_T1, -func_meta_off, func_meta, ctx);
35b3515be0ecb9d Menglong Dong  2026-02-08  1243  
35b3515be0ecb9d Menglong Dong  2026-02-08  1244         if (fexit->nr_links) {
35b3515be0ecb9d Menglong Dong  2026-02-08  1245                 ret = 
invoke_bpf(fexit, args_off, retval_off, run_ctx_off, func_meta_off,
35b3515be0ecb9d Menglong Dong  2026-02-08  1246                                 
 false, func_meta, cookie_off, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1247                 if (ret)
49b5e77ae3e214a Pu Lehui       2023-02-15  1248                         goto 
out;
49b5e77ae3e214a Pu Lehui       2023-02-15  1249         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1250  
49b5e77ae3e214a Pu Lehui       2023-02-15  1251         if (flags & 
BPF_TRAMP_F_CALL_ORIG) {
2382a405c581ae8 Pu Lehui       2024-06-22  1252                 im->ip_epilogue 
= ctx->ro_insns + ctx->ninsns;
9f1e16fb1fc9826 Pu Lehui       2024-06-22  1253                 
emit_imm(RV_REG_A0, ctx->insns ? (const s64)im : RV_MAX_COUNT_IMM, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1254                 ret = 
emit_call((const u64)__bpf_tramp_exit, true, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1255                 if (ret)
49b5e77ae3e214a Pu Lehui       2023-02-15  1256                         goto 
out;
49b5e77ae3e214a Pu Lehui       2023-02-15  1257         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1258  
49b5e77ae3e214a Pu Lehui       2023-02-15  1259         if (flags & 
BPF_TRAMP_F_RESTORE_REGS)
6801b0aef79db47 Pu Lehui       2024-07-02  1260                 
restore_args(min_t(int, nr_arg_slots, RV_MAX_REG_ARGS), args_off, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1261  
7112cd26e606c7b Björn Töpel    2023-10-04  1262         if (save_ret) {
7112cd26e606c7b Björn Töpel    2023-10-04  1263                 
emit_ld(regmap[BPF_REG_0], -(retval_off - 8), RV_REG_FP, ctx);
fd2e08128944a76 Hengqi Chen    2025-09-08  1264                 if 
(is_struct_ops) {
fd2e08128944a76 Hengqi Chen    2025-09-08  1265                         ret = 
sign_extend(RV_REG_A0, regmap[BPF_REG_0], m->ret_size,
fd2e08128944a76 Hengqi Chen    2025-09-08  1266                                 
          m->ret_flags & BTF_FMODEL_SIGNED_ARG, ctx);
fd2e08128944a76 Hengqi Chen    2025-09-08  1267                         if (ret)
fd2e08128944a76 Hengqi Chen    2025-09-08  1268                                 
goto out;
fd2e08128944a76 Hengqi Chen    2025-09-08  1269                 } else {
fd2e08128944a76 Hengqi Chen    2025-09-08  1270                         
emit_ld(RV_REG_A0, -retval_off, RV_REG_FP, ctx);
fd2e08128944a76 Hengqi Chen    2025-09-08  1271                 }
7112cd26e606c7b Björn Töpel    2023-10-04  1272         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1273  
49b5e77ae3e214a Pu Lehui       2023-02-15  1274         emit_ld(RV_REG_S1, 
-sreg_off, RV_REG_FP, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1275  
1732ebc4a26181c Pu Lehui       2024-01-23  1276         if (!is_struct_ops) {
25ad10658dc1068 Pu Lehui       2023-07-21  1277                 /* trampoline 
called from function entry */
25ad10658dc1068 Pu Lehui       2023-07-21  1278                 
emit_ld(RV_REG_T0, stack_size - 8, RV_REG_SP, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1279                 
emit_ld(RV_REG_FP, stack_size - 16, RV_REG_SP, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1280                 
emit_addi(RV_REG_SP, RV_REG_SP, stack_size, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1281  
25ad10658dc1068 Pu Lehui       2023-07-21  1282                 
emit_ld(RV_REG_RA, 8, RV_REG_SP, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1283                 
emit_ld(RV_REG_FP, 0, RV_REG_SP, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1284                 
emit_addi(RV_REG_SP, RV_REG_SP, 16, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1285  
49b5e77ae3e214a Pu Lehui       2023-02-15  1286                 if (flags & 
BPF_TRAMP_F_SKIP_FRAME)
25ad10658dc1068 Pu Lehui       2023-07-21  1287                         /* 
return to parent function */
25ad10658dc1068 Pu Lehui       2023-07-21  1288                         
emit_jalr(RV_REG_ZERO, RV_REG_RA, 0, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1289                 else
25ad10658dc1068 Pu Lehui       2023-07-21  1290                         /* 
return to traced function */
25ad10658dc1068 Pu Lehui       2023-07-21  1291                         
emit_jalr(RV_REG_ZERO, RV_REG_T0, 0, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1292         } else {
25ad10658dc1068 Pu Lehui       2023-07-21  1293                 /* trampoline 
called directly */
25ad10658dc1068 Pu Lehui       2023-07-21  1294                 
emit_ld(RV_REG_RA, stack_size - 8, RV_REG_SP, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1295                 
emit_ld(RV_REG_FP, stack_size - 16, RV_REG_SP, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1296                 
emit_addi(RV_REG_SP, RV_REG_SP, stack_size, ctx);
49b5e77ae3e214a Pu Lehui       2023-02-15  1297  
49b5e77ae3e214a Pu Lehui       2023-02-15  1298                 
emit_jalr(RV_REG_ZERO, RV_REG_RA, 0, ctx);
25ad10658dc1068 Pu Lehui       2023-07-21  1299         }
49b5e77ae3e214a Pu Lehui       2023-02-15  1300  
49b5e77ae3e214a Pu Lehui       2023-02-15  1301         ret = ctx->ninsns;
49b5e77ae3e214a Pu Lehui       2023-02-15  1302  out:
49b5e77ae3e214a Pu Lehui       2023-02-15  1303         kfree(branches_off);
49b5e77ae3e214a Pu Lehui       2023-02-15  1304         return ret;
49b5e77ae3e214a Pu Lehui       2023-02-15  1305  }
49b5e77ae3e214a Pu Lehui       2023-02-15  1306  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Reply via email to