From: kernel test robot <lkp@intel.com>
To: Jiri Olsa <jolsa@kernel.org>
Cc: oe-kbuild-all@lists.linux.dev
Subject: [jolsa-perf:bpf/tracing_multi_9 3/12] arch/arm64/net/bpf_jit_comp.c:2311:9: error: no member named 'cookie' in 'struct bpf_tramp_link'
Date: Sat, 31 Jan 2026 07:31:15 +0100 [thread overview]
Message-ID: <202601310745.maOTHc2a-lkp@intel.com> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git bpf/tracing_multi_9
head: 4a1d38e3df06743886a06b547187aec8023ef27d
commit: 79e86aac9eaf3b5bdb4db339fb6082022ef69eb9 [3/12] bpf: Add struct bpf_tramp_node object
config: arm64-allnoconfig-bpf (https://download.01.org/0day-ci/archive/20260131/202601310745.maOTHc2a-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project f43d6834093b19baf79beda8c0337ab020ac5f17)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260131/202601310745.maOTHc2a-lkp@intel.com/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 <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601310745.maOTHc2a-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
>> arch/arm64/net/bpf_jit_comp.c:2311:9: error: no member named 'cookie' in 'struct bpf_tramp_link'
2311 | if (l->cookie == 0) {
| ~ ^
arch/arm64/net/bpf_jit_comp.c:2315:34: error: no member named 'cookie' in 'struct bpf_tramp_link'
2315 | emit_a64_mov_i64(A64_R(10), l->cookie, ctx);
| ~ ^
>> arch/arm64/net/bpf_jit_comp.c:2365:60: warning: declaration of 'struct bpf_tramp_links' will not be visible outside of this function [-Wvisibility]
2365 | static void invoke_bpf_mod_ret(struct jit_ctx *ctx, struct bpf_tramp_links *tl,
| ^
>> arch/arm64/net/bpf_jit_comp.c:2375:20: error: incomplete definition of type 'struct bpf_tramp_links'
2375 | for (i = 0; i < tl->nr_links; i++) {
| ~~^
arch/arm64/net/bpf_jit_comp.c:2365:60: note: forward declaration of 'struct bpf_tramp_links'
2365 | static void invoke_bpf_mod_ret(struct jit_ctx *ctx, struct bpf_tramp_links *tl,
| ^
arch/arm64/net/bpf_jit_comp.c:2376:26: error: incomplete definition of type 'struct bpf_tramp_links'
2376 | invoke_bpf_prog(ctx, tl->links[i], bargs_off, retval_off,
| ~~^
arch/arm64/net/bpf_jit_comp.c:2365:60: note: forward declaration of 'struct bpf_tramp_links'
2365 | static void invoke_bpf_mod_ret(struct jit_ctx *ctx, struct bpf_tramp_links *tl,
| ^
arch/arm64/net/bpf_jit_comp.c:2507:46: warning: declaration of 'struct bpf_tramp_links' will not be visible outside of this function [-Wvisibility]
2507 | static bool is_struct_ops_tramp(const struct bpf_tramp_links *fentry_links)
| ^
>> arch/arm64/net/bpf_jit_comp.c:2509:21: error: incomplete definition of type 'const struct bpf_tramp_links'
2509 | return fentry_links->nr_links == 1 &&
| ~~~~~~~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2507:46: note: forward declaration of 'struct bpf_tramp_links'
2507 | static bool is_struct_ops_tramp(const struct bpf_tramp_links *fentry_links)
| ^
arch/arm64/net/bpf_jit_comp.c:2510:15: error: incomplete definition of type 'const struct bpf_tramp_links'
2510 | fentry_links->links[0]->link.type == BPF_LINK_TYPE_STRUCT_OPS;
| ~~~~~~~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2507:46: note: forward declaration of 'struct bpf_tramp_links'
2507 | static bool is_struct_ops_tramp(const struct bpf_tramp_links *fentry_links)
| ^
arch/arm64/net/bpf_jit_comp.c:2525:17: warning: declaration of 'struct bpf_tramp_links' will not be visible outside of this function [-Wvisibility]
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
>> arch/arm64/net/bpf_jit_comp.c:2541:42: error: subscript of pointer to incomplete type 'struct bpf_tramp_links'
2541 | struct bpf_tramp_links *fentry = &tlinks[BPF_TRAMP_FENTRY];
| ~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
arch/arm64/net/bpf_jit_comp.c:2542:41: error: subscript of pointer to incomplete type 'struct bpf_tramp_links'
2542 | struct bpf_tramp_links *fexit = &tlinks[BPF_TRAMP_FEXIT];
| ~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
arch/arm64/net/bpf_jit_comp.c:2543:44: error: subscript of pointer to incomplete type 'struct bpf_tramp_links'
2543 | struct bpf_tramp_links *fmod_ret = &tlinks[BPF_TRAMP_MODIFY_RETURN];
| ~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
>> arch/arm64/net/bpf_jit_comp.c:2546:43: error: incompatible pointer types passing 'struct bpf_tramp_links *' to parameter of type 'const struct bpf_tramp_links *' [-Wincompatible-pointer-types]
2546 | bool is_struct_ops = is_struct_ops_tramp(fentry);
| ^~~~~~
arch/arm64/net/bpf_jit_comp.c:2507:63: note: passing argument to parameter 'fentry_links' here
2507 | static bool is_struct_ops_tramp(const struct bpf_tramp_links *fentry_links)
| ^
arch/arm64/net/bpf_jit_comp.c:2669:24: error: incomplete definition of type 'struct bpf_tramp_links'
2669 | for (i = 0; i < fentry->nr_links; i++)
| ~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
arch/arm64/net/bpf_jit_comp.c:2670:30: error: incomplete definition of type 'struct bpf_tramp_links'
2670 | invoke_bpf_prog(ctx, fentry->links[i], bargs_off,
| ~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
arch/arm64/net/bpf_jit_comp.c:2674:14: error: incomplete definition of type 'struct bpf_tramp_links'
2674 | if (fmod_ret->nr_links) {
| ~~~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
arch/arm64/net/bpf_jit_comp.c:2675:30: error: incomplete definition of type 'struct bpf_tramp_links'
2675 | branches = kcalloc(fmod_ret->nr_links, sizeof(__le32 *),
| ~~~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
arch/arm64/net/bpf_jit_comp.c:2675:30: error: incomplete definition of type 'struct bpf_tramp_links'
2675 | branches = kcalloc(fmod_ret->nr_links, sizeof(__le32 *),
| ~~~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
arch/arm64/net/bpf_jit_comp.c:2675:30: error: incomplete definition of type 'struct bpf_tramp_links'
2675 | branches = kcalloc(fmod_ret->nr_links, sizeof(__le32 *),
| ~~~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
>> arch/arm64/net/bpf_jit_comp.c:2680:27: error: incompatible pointer types passing 'struct bpf_tramp_links *' to parameter of type 'struct bpf_tramp_links *' [-Wincompatible-pointer-types]
2680 | invoke_bpf_mod_ret(ctx, fmod_ret, bargs_off, retval_off,
| ^~~~~~~~
arch/arm64/net/bpf_jit_comp.c:2365:77: note: passing argument to parameter 'tl' here
2365 | static void invoke_bpf_mod_ret(struct jit_ctx *ctx, struct bpf_tramp_links *tl,
| ^
arch/arm64/net/bpf_jit_comp.c:2699:26: error: incomplete definition of type 'struct bpf_tramp_links'
2699 | for (i = 0; i < fmod_ret->nr_links && ctx->image != NULL; i++) {
| ~~~~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
arch/arm64/net/bpf_jit_comp.c:2704:23: error: incomplete definition of type 'struct bpf_tramp_links'
2704 | for (i = 0; i < fexit->nr_links; i++)
| ~~~~~^
arch/arm64/net/bpf_jit_comp.c:2525:17: note: forward declaration of 'struct bpf_tramp_links'
2525 | struct bpf_tramp_links *tlinks, void *func_addr,
| ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
3 warnings and 20 errors generated.
vim +2311 arch/arm64/net/bpf_jit_comp.c
b2ad54e1533e91 Xu Kuohai 2022-07-11 2297
efc9909fdce00a Xu Kuohai 2022-07-11 2298 static void invoke_bpf_prog(struct jit_ctx *ctx, struct bpf_tramp_link *l,
9014cf56f13d8c Xu Kuohai 2025-05-27 2299 int bargs_off, int retval_off, int run_ctx_off,
efc9909fdce00a Xu Kuohai 2022-07-11 2300 bool save_ret)
efc9909fdce00a Xu Kuohai 2022-07-11 2301 {
aada476655461a Xu Kuohai 2022-08-08 2302 __le32 *branch;
efc9909fdce00a Xu Kuohai 2022-07-11 2303 u64 enter_prog;
efc9909fdce00a Xu Kuohai 2022-07-11 2304 u64 exit_prog;
efc9909fdce00a Xu Kuohai 2022-07-11 2305 struct bpf_prog *p = l->link.prog;
efc9909fdce00a Xu Kuohai 2022-07-11 2306 int cookie_off = offsetof(struct bpf_tramp_run_ctx, bpf_cookie);
efc9909fdce00a Xu Kuohai 2022-07-11 2307
271de525e1d7f5 Martin KaFai Lau 2022-10-25 2308 enter_prog = (u64)bpf_trampoline_enter(p);
271de525e1d7f5 Martin KaFai Lau 2022-10-25 2309 exit_prog = (u64)bpf_trampoline_exit(p);
efc9909fdce00a Xu Kuohai 2022-07-11 2310
efc9909fdce00a Xu Kuohai 2022-07-11 @2311 if (l->cookie == 0) {
efc9909fdce00a Xu Kuohai 2022-07-11 2312 /* if cookie is zero, one instruction is enough to store it */
efc9909fdce00a Xu Kuohai 2022-07-11 2313 emit(A64_STR64I(A64_ZR, A64_SP, run_ctx_off + cookie_off), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2314 } else {
efc9909fdce00a Xu Kuohai 2022-07-11 2315 emit_a64_mov_i64(A64_R(10), l->cookie, ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2316 emit(A64_STR64I(A64_R(10), A64_SP, run_ctx_off + cookie_off),
efc9909fdce00a Xu Kuohai 2022-07-11 2317 ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2318 }
efc9909fdce00a Xu Kuohai 2022-07-11 2319
efc9909fdce00a Xu Kuohai 2022-07-11 2320 /* save p to callee saved register x19 to avoid loading p with mov_i64
efc9909fdce00a Xu Kuohai 2022-07-11 2321 * each time.
efc9909fdce00a Xu Kuohai 2022-07-11 2322 */
efc9909fdce00a Xu Kuohai 2022-07-11 2323 emit_addr_mov_i64(A64_R(19), (const u64)p, ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2324
efc9909fdce00a Xu Kuohai 2022-07-11 2325 /* arg1: prog */
efc9909fdce00a Xu Kuohai 2022-07-11 2326 emit(A64_MOV(1, A64_R(0), A64_R(19)), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2327 /* arg2: &run_ctx */
efc9909fdce00a Xu Kuohai 2022-07-11 2328 emit(A64_ADD_I(1, A64_R(1), A64_SP, run_ctx_off), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2329
efc9909fdce00a Xu Kuohai 2022-07-11 2330 emit_call(enter_prog, ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2331
dc7d7447b56bcc Xu Kuohai 2024-04-16 2332 /* save return value to callee saved register x20 */
dc7d7447b56bcc Xu Kuohai 2024-04-16 2333 emit(A64_MOV(1, A64_R(20), A64_R(0)), ctx);
dc7d7447b56bcc Xu Kuohai 2024-04-16 2334
efc9909fdce00a Xu Kuohai 2022-07-11 2335 /* if (__bpf_prog_enter(prog) == 0)
efc9909fdce00a Xu Kuohai 2022-07-11 2336 * goto skip_exec_of_prog;
efc9909fdce00a Xu Kuohai 2022-07-11 2337 */
efc9909fdce00a Xu Kuohai 2022-07-11 2338 branch = ctx->image + ctx->idx;
efc9909fdce00a Xu Kuohai 2022-07-11 2339 emit(A64_NOP, ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2340
9014cf56f13d8c Xu Kuohai 2025-05-27 2341 emit(A64_ADD_I(1, A64_R(0), A64_SP, bargs_off), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2342 if (!p->jited)
efc9909fdce00a Xu Kuohai 2022-07-11 2343 emit_addr_mov_i64(A64_R(1), (const u64)p->insnsi, ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2344
efc9909fdce00a Xu Kuohai 2022-07-11 2345 emit_call((const u64)p->bpf_func, ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2346
efc9909fdce00a Xu Kuohai 2022-07-11 2347 if (save_ret)
efc9909fdce00a Xu Kuohai 2022-07-11 2348 emit(A64_STR64I(A64_R(0), A64_SP, retval_off), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2349
efc9909fdce00a Xu Kuohai 2022-07-11 2350 if (ctx->image) {
efc9909fdce00a Xu Kuohai 2022-07-11 2351 int offset = &ctx->image[ctx->idx] - branch;
aada476655461a Xu Kuohai 2022-08-08 2352 *branch = cpu_to_le32(A64_CBZ(1, A64_R(0), offset));
efc9909fdce00a Xu Kuohai 2022-07-11 2353 }
efc9909fdce00a Xu Kuohai 2022-07-11 2354
efc9909fdce00a Xu Kuohai 2022-07-11 2355 /* arg1: prog */
efc9909fdce00a Xu Kuohai 2022-07-11 2356 emit(A64_MOV(1, A64_R(0), A64_R(19)), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2357 /* arg2: start time */
efc9909fdce00a Xu Kuohai 2022-07-11 2358 emit(A64_MOV(1, A64_R(1), A64_R(20)), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2359 /* arg3: &run_ctx */
efc9909fdce00a Xu Kuohai 2022-07-11 2360 emit(A64_ADD_I(1, A64_R(2), A64_SP, run_ctx_off), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2361
efc9909fdce00a Xu Kuohai 2022-07-11 2362 emit_call(exit_prog, ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2363 }
efc9909fdce00a Xu Kuohai 2022-07-11 2364
efc9909fdce00a Xu Kuohai 2022-07-11 @2365 static void invoke_bpf_mod_ret(struct jit_ctx *ctx, struct bpf_tramp_links *tl,
9014cf56f13d8c Xu Kuohai 2025-05-27 2366 int bargs_off, int retval_off, int run_ctx_off,
aada476655461a Xu Kuohai 2022-08-08 2367 __le32 **branches)
efc9909fdce00a Xu Kuohai 2022-07-11 2368 {
efc9909fdce00a Xu Kuohai 2022-07-11 2369 int i;
efc9909fdce00a Xu Kuohai 2022-07-11 2370
efc9909fdce00a Xu Kuohai 2022-07-11 2371 /* The first fmod_ret program will receive a garbage return value.
efc9909fdce00a Xu Kuohai 2022-07-11 2372 * Set this to 0 to avoid confusing the program.
efc9909fdce00a Xu Kuohai 2022-07-11 2373 */
efc9909fdce00a Xu Kuohai 2022-07-11 2374 emit(A64_STR64I(A64_ZR, A64_SP, retval_off), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 @2375 for (i = 0; i < tl->nr_links; i++) {
9014cf56f13d8c Xu Kuohai 2025-05-27 2376 invoke_bpf_prog(ctx, tl->links[i], bargs_off, retval_off,
efc9909fdce00a Xu Kuohai 2022-07-11 2377 run_ctx_off, true);
efc9909fdce00a Xu Kuohai 2022-07-11 2378 /* if (*(u64 *)(sp + retval_off) != 0)
efc9909fdce00a Xu Kuohai 2022-07-11 2379 * goto do_fexit;
efc9909fdce00a Xu Kuohai 2022-07-11 2380 */
efc9909fdce00a Xu Kuohai 2022-07-11 2381 emit(A64_LDR64I(A64_R(10), A64_SP, retval_off), ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2382 /* Save the location of branch, and generate a nop.
efc9909fdce00a Xu Kuohai 2022-07-11 2383 * This nop will be replaced with a cbnz later.
efc9909fdce00a Xu Kuohai 2022-07-11 2384 */
efc9909fdce00a Xu Kuohai 2022-07-11 2385 branches[i] = ctx->image + ctx->idx;
efc9909fdce00a Xu Kuohai 2022-07-11 2386 emit(A64_NOP, ctx);
efc9909fdce00a Xu Kuohai 2022-07-11 2387 }
efc9909fdce00a Xu Kuohai 2022-07-11 2388 }
efc9909fdce00a Xu Kuohai 2022-07-11 2389
9014cf56f13d8c Xu Kuohai 2025-05-27 2390 struct arg_aux {
9014cf56f13d8c Xu Kuohai 2025-05-27 2391 /* how many args are passed through registers, the rest of the args are
9014cf56f13d8c Xu Kuohai 2025-05-27 2392 * passed through stack
9014cf56f13d8c Xu Kuohai 2025-05-27 2393 */
9014cf56f13d8c Xu Kuohai 2025-05-27 2394 int args_in_regs;
9014cf56f13d8c Xu Kuohai 2025-05-27 2395 /* how many registers are used to pass arguments */
9014cf56f13d8c Xu Kuohai 2025-05-27 2396 int regs_for_args;
9014cf56f13d8c Xu Kuohai 2025-05-27 2397 /* how much stack is used for additional args passed to bpf program
9014cf56f13d8c Xu Kuohai 2025-05-27 2398 * that did not fit in original function registers
9014cf56f13d8c Xu Kuohai 2025-05-27 2399 */
9014cf56f13d8c Xu Kuohai 2025-05-27 2400 int bstack_for_args;
9014cf56f13d8c Xu Kuohai 2025-05-27 2401 /* home much stack is used for additional args passed to the
9014cf56f13d8c Xu Kuohai 2025-05-27 2402 * original function when called from trampoline (this one needs
9014cf56f13d8c Xu Kuohai 2025-05-27 2403 * arguments to be properly aligned)
9014cf56f13d8c Xu Kuohai 2025-05-27 2404 */
9014cf56f13d8c Xu Kuohai 2025-05-27 2405 int ostack_for_args;
9014cf56f13d8c Xu Kuohai 2025-05-27 2406 };
9014cf56f13d8c Xu Kuohai 2025-05-27 2407
9014cf56f13d8c Xu Kuohai 2025-05-27 2408 static int calc_arg_aux(const struct btf_func_model *m,
9014cf56f13d8c Xu Kuohai 2025-05-27 2409 struct arg_aux *a)
efc9909fdce00a Xu Kuohai 2022-07-11 2410 {
9014cf56f13d8c Xu Kuohai 2025-05-27 2411 int stack_slots, nregs, slots, i;
efc9909fdce00a Xu Kuohai 2022-07-11 2412
9014cf56f13d8c Xu Kuohai 2025-05-27 2413 /* verifier ensures m->nr_args <= MAX_BPF_FUNC_ARGS */
9014cf56f13d8c Xu Kuohai 2025-05-27 2414 for (i = 0, nregs = 0; i < m->nr_args; i++) {
9014cf56f13d8c Xu Kuohai 2025-05-27 2415 slots = (m->arg_size[i] + 7) / 8;
9014cf56f13d8c Xu Kuohai 2025-05-27 2416 if (nregs + slots <= 8) /* passed through register ? */
9014cf56f13d8c Xu Kuohai 2025-05-27 2417 nregs += slots;
9014cf56f13d8c Xu Kuohai 2025-05-27 2418 else
9014cf56f13d8c Xu Kuohai 2025-05-27 2419 break;
efc9909fdce00a Xu Kuohai 2022-07-11 2420 }
9014cf56f13d8c Xu Kuohai 2025-05-27 2421
9014cf56f13d8c Xu Kuohai 2025-05-27 2422 a->args_in_regs = i;
9014cf56f13d8c Xu Kuohai 2025-05-27 2423 a->regs_for_args = nregs;
9014cf56f13d8c Xu Kuohai 2025-05-27 2424 a->ostack_for_args = 0;
9014cf56f13d8c Xu Kuohai 2025-05-27 2425 a->bstack_for_args = 0;
9014cf56f13d8c Xu Kuohai 2025-05-27 2426
9014cf56f13d8c Xu Kuohai 2025-05-27 2427 /* the rest arguments are passed through stack */
9014cf56f13d8c Xu Kuohai 2025-05-27 2428 for (; i < m->nr_args; i++) {
9014cf56f13d8c Xu Kuohai 2025-05-27 2429 stack_slots = (m->arg_size[i] + 7) / 8;
9014cf56f13d8c Xu Kuohai 2025-05-27 2430 a->bstack_for_args += stack_slots * 8;
9014cf56f13d8c Xu Kuohai 2025-05-27 2431 a->ostack_for_args = a->ostack_for_args + stack_slots * 8;
efc9909fdce00a Xu Kuohai 2022-07-11 2432 }
efc9909fdce00a Xu Kuohai 2022-07-11 2433
9014cf56f13d8c Xu Kuohai 2025-05-27 2434 return 0;
9014cf56f13d8c Xu Kuohai 2025-05-27 2435 }
9014cf56f13d8c Xu Kuohai 2025-05-27 2436
9014cf56f13d8c Xu Kuohai 2025-05-27 2437 static void clear_garbage(struct jit_ctx *ctx, int reg, int effective_bytes)
9014cf56f13d8c Xu Kuohai 2025-05-27 2438 {
9014cf56f13d8c Xu Kuohai 2025-05-27 2439 if (effective_bytes) {
9014cf56f13d8c Xu Kuohai 2025-05-27 2440 int garbage_bits = 64 - 8 * effective_bytes;
9014cf56f13d8c Xu Kuohai 2025-05-27 2441 #ifdef CONFIG_CPU_BIG_ENDIAN
9014cf56f13d8c Xu Kuohai 2025-05-27 2442 /* garbage bits are at the right end */
9014cf56f13d8c Xu Kuohai 2025-05-27 2443 emit(A64_LSR(1, reg, reg, garbage_bits), ctx);
9014cf56f13d8c Xu Kuohai 2025-05-27 2444 emit(A64_LSL(1, reg, reg, garbage_bits), ctx);
9014cf56f13d8c Xu Kuohai 2025-05-27 2445 #else
9014cf56f13d8c Xu Kuohai 2025-05-27 2446 /* garbage bits are at the left end */
9014cf56f13d8c Xu Kuohai 2025-05-27 2447 emit(A64_LSL(1, reg, reg, garbage_bits), ctx);
9014cf56f13d8c Xu Kuohai 2025-05-27 2448 emit(A64_LSR(1, reg, reg, garbage_bits), ctx);
9014cf56f13d8c Xu Kuohai 2025-05-27 2449 #endif
efc9909fdce00a Xu Kuohai 2022-07-11 2450 }
efc9909fdce00a Xu Kuohai 2022-07-11 2451 }
efc9909fdce00a Xu Kuohai 2022-07-11 2452
9014cf56f13d8c Xu Kuohai 2025-05-27 2453 static void save_args(struct jit_ctx *ctx, int bargs_off, int oargs_off,
9014cf56f13d8c Xu Kuohai 2025-05-27 2454 const struct btf_func_model *m,
9014cf56f13d8c Xu Kuohai 2025-05-27 2455 const struct arg_aux *a,
9014cf56f13d8c Xu Kuohai 2025-05-27 2456 bool for_call_origin)
efc9909fdce00a Xu Kuohai 2022-07-11 2457 {
efc9909fdce00a Xu Kuohai 2022-07-11 2458 int i;
9014cf56f13d8c Xu Kuohai 2025-05-27 2459 int reg;
9014cf56f13d8c Xu Kuohai 2025-05-27 2460 int doff;
9014cf56f13d8c Xu Kuohai 2025-05-27 2461 int soff;
9014cf56f13d8c Xu Kuohai 2025-05-27 2462 int slots;
9014cf56f13d8c Xu Kuohai 2025-05-27 2463 u8 tmp = bpf2a64[TMP_REG_1];
9014cf56f13d8c Xu Kuohai 2025-05-27 2464
9014cf56f13d8c Xu Kuohai 2025-05-27 2465 /* store arguments to the stack for the bpf program, or restore
9014cf56f13d8c Xu Kuohai 2025-05-27 2466 * arguments from stack for the original function
9014cf56f13d8c Xu Kuohai 2025-05-27 2467 */
9014cf56f13d8c Xu Kuohai 2025-05-27 2468 for (reg = 0; reg < a->regs_for_args; reg++) {
9014cf56f13d8c Xu Kuohai 2025-05-27 2469 emit(for_call_origin ?
9014cf56f13d8c Xu Kuohai 2025-05-27 2470 A64_LDR64I(reg, A64_SP, bargs_off) :
9014cf56f13d8c Xu Kuohai 2025-05-27 2471 A64_STR64I(reg, A64_SP, bargs_off),
9014cf56f13d8c Xu Kuohai 2025-05-27 2472 ctx);
9014cf56f13d8c Xu Kuohai 2025-05-27 2473 bargs_off += 8;
9014cf56f13d8c Xu Kuohai 2025-05-27 2474 }
9014cf56f13d8c Xu Kuohai 2025-05-27 2475
9014cf56f13d8c Xu Kuohai 2025-05-27 2476 soff = 32; /* on stack arguments start from FP + 32 */
9014cf56f13d8c Xu Kuohai 2025-05-27 2477 doff = (for_call_origin ? oargs_off : bargs_off);
9014cf56f13d8c Xu Kuohai 2025-05-27 2478
9014cf56f13d8c Xu Kuohai 2025-05-27 2479 /* save on stack arguments */
9014cf56f13d8c Xu Kuohai 2025-05-27 2480 for (i = a->args_in_regs; i < m->nr_args; i++) {
9014cf56f13d8c Xu Kuohai 2025-05-27 2481 slots = (m->arg_size[i] + 7) / 8;
9014cf56f13d8c Xu Kuohai 2025-05-27 2482 /* verifier ensures arg_size <= 16, so slots equals 1 or 2 */
9014cf56f13d8c Xu Kuohai 2025-05-27 2483 while (slots-- > 0) {
9014cf56f13d8c Xu Kuohai 2025-05-27 2484 emit(A64_LDR64I(tmp, A64_FP, soff), ctx);
9014cf56f13d8c Xu Kuohai 2025-05-27 2485 /* if there is unused space in the last slot, clear
9014cf56f13d8c Xu Kuohai 2025-05-27 2486 * the garbage contained in the space.
9014cf56f13d8c Xu Kuohai 2025-05-27 2487 */
9014cf56f13d8c Xu Kuohai 2025-05-27 2488 if (slots == 0 && !for_call_origin)
9014cf56f13d8c Xu Kuohai 2025-05-27 2489 clear_garbage(ctx, tmp, m->arg_size[i] % 8);
9014cf56f13d8c Xu Kuohai 2025-05-27 2490 emit(A64_STR64I(tmp, A64_SP, doff), ctx);
9014cf56f13d8c Xu Kuohai 2025-05-27 2491 soff += 8;
9014cf56f13d8c Xu Kuohai 2025-05-27 2492 doff += 8;
9014cf56f13d8c Xu Kuohai 2025-05-27 2493 }
9014cf56f13d8c Xu Kuohai 2025-05-27 2494 }
9014cf56f13d8c Xu Kuohai 2025-05-27 2495 }
efc9909fdce00a Xu Kuohai 2022-07-11 2496
9014cf56f13d8c Xu Kuohai 2025-05-27 2497 static void restore_args(struct jit_ctx *ctx, int bargs_off, int nregs)
9014cf56f13d8c Xu Kuohai 2025-05-27 2498 {
9014cf56f13d8c Xu Kuohai 2025-05-27 2499 int reg;
efc9909fdce00a Xu Kuohai 2022-07-11 2500
9014cf56f13d8c Xu Kuohai 2025-05-27 2501 for (reg = 0; reg < nregs; reg++) {
9014cf56f13d8c Xu Kuohai 2025-05-27 2502 emit(A64_LDR64I(reg, A64_SP, bargs_off), ctx);
9014cf56f13d8c Xu Kuohai 2025-05-27 2503 bargs_off += 8;
efc9909fdce00a Xu Kuohai 2022-07-11 2504 }
efc9909fdce00a Xu Kuohai 2022-07-11 2505 }
efc9909fdce00a Xu Kuohai 2022-07-11 2506
87cb58aebdf700 Xu Kuohai 2024-10-25 2507 static bool is_struct_ops_tramp(const struct bpf_tramp_links *fentry_links)
87cb58aebdf700 Xu Kuohai 2024-10-25 2508 {
87cb58aebdf700 Xu Kuohai 2024-10-25 @2509 return fentry_links->nr_links == 1 &&
87cb58aebdf700 Xu Kuohai 2024-10-25 2510 fentry_links->links[0]->link.type == BPF_LINK_TYPE_STRUCT_OPS;
87cb58aebdf700 Xu Kuohai 2024-10-25 2511 }
87cb58aebdf700 Xu Kuohai 2024-10-25 2512
:::::: The code at line 2311 was first introduced by commit
:::::: efc9909fdce00a827a37609628223cd45bf95d0b bpf, arm64: Add bpf trampoline for arm64
:::::: TO: Xu Kuohai <xukuohai@huawei.com>
:::::: CC: Daniel Borkmann <daniel@iogearbox.net>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-01-31 6:32 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202601310745.maOTHc2a-lkp@intel.com \
--to=lkp@intel.com \
--cc=jolsa@kernel.org \
--cc=oe-kbuild-all@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.