Skip to content

Commit 4fdb5dd

Browse files
chenhengqichenhuacai
authored andcommitted
LoongArch: BPF: Implement bpf_addr_space_cast instruction
LLVM generates bpf_addr_space_cast instruction while translating pointers between native (zero) address space and __attribute__((address_space(N))). The addr_space=0 is reserved as bpf_arena address space. rY = addr_space_cast(rX, 0, 1) is processed by the verifier and converted to normal 32-bit move: wX = wY rY = addr_space_cast(rX, 1, 0) has to be converted by JIT. With this, the following test cases passed: $ ./test_progs -a arena_htab,arena_list,arena_strsearch,verifier_arena,verifier_arena_large #4/1 arena_htab/arena_htab_llvm:OK #4/2 arena_htab/arena_htab_asm:OK #4 arena_htab:OK #5/1 arena_list/arena_list_1:OK #5/2 arena_list/arena_list_1000:OK #5 arena_list:OK #7/1 arena_strsearch/arena_strsearch:OK #7 arena_strsearch:OK #507/1 verifier_arena/basic_alloc1:OK #507/2 verifier_arena/basic_alloc2:OK #507/3 verifier_arena/basic_alloc3:OK #507/4 verifier_arena/basic_reserve1:OK #507/5 verifier_arena/basic_reserve2:OK #507/6 verifier_arena/reserve_twice:OK #507/7 verifier_arena/reserve_invalid_region:OK #507/8 verifier_arena/iter_maps1:OK #507/9 verifier_arena/iter_maps2:OK #507/10 verifier_arena/iter_maps3:OK #507 verifier_arena:OK #508/1 verifier_arena_large/big_alloc1:OK #508/2 verifier_arena_large/access_reserved:OK #508/3 verifier_arena_large/request_partially_reserved:OK #508/4 verifier_arena_large/free_reserved:OK #508/5 verifier_arena_large/big_alloc2:OK #508 verifier_arena_large:OK Summary: 5/20 PASSED, 0 SKIPPED, 0 FAILED Acked-by: Tiezhu Yang <yangtiezhu@loongson.cn> Tested-by: Vincent Li <vincent.mc.li@gmail.com> Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent ef54c51 commit 4fdb5dd

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

arch/loongarch/net/bpf_jit.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,15 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
559559
/* dst = src */
560560
case BPF_ALU | BPF_MOV | BPF_X:
561561
case BPF_ALU64 | BPF_MOV | BPF_X:
562+
if (insn_is_cast_user(insn)) {
563+
move_reg(ctx, t1, src);
564+
emit_zext_32(ctx, t1, true);
565+
move_imm(ctx, dst, (ctx->user_vm_start >> 32) << 32, false);
566+
emit_insn(ctx, beq, t1, LOONGARCH_GPR_ZERO, 1);
567+
emit_insn(ctx, or, t1, dst, t1);
568+
move_reg(ctx, dst, t1);
569+
break;
570+
}
562571
switch (off) {
563572
case 0:
564573
move_reg(ctx, dst, src);
@@ -1955,6 +1964,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
19551964
memset(&ctx, 0, sizeof(ctx));
19561965
ctx.prog = prog;
19571966
ctx.arena_vm_start = bpf_arena_get_kern_vm_start(prog->aux->arena);
1967+
ctx.user_vm_start = bpf_arena_get_user_vm_start(prog->aux->arena);
19581968

19591969
ctx.offset = kvcalloc(prog->len + 1, sizeof(u32), GFP_KERNEL);
19601970
if (ctx.offset == NULL) {
@@ -2110,6 +2120,11 @@ bool bpf_jit_bypass_spec_v4(void)
21102120
return true;
21112121
}
21122122

2123+
bool bpf_jit_supports_arena(void)
2124+
{
2125+
return true;
2126+
}
2127+
21132128
/* Indicate the JIT backend supports mixing bpf2bpf and tailcalls. */
21142129
bool bpf_jit_supports_subprog_tailcalls(void)
21152130
{

arch/loongarch/net/bpf_jit.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct jit_ctx {
2121
union loongarch_instruction *ro_image;
2222
u32 stack_size;
2323
u64 arena_vm_start;
24+
u64 user_vm_start;
2425
};
2526

2627
struct jit_data {

0 commit comments

Comments
 (0)