hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/riscv/net/bpf_jit_core.c
....@@ -83,6 +83,12 @@
8383 prog = orig_prog;
8484 goto out_offset;
8585 }
86
+
87
+ if (build_body(ctx, extra_pass, NULL)) {
88
+ prog = orig_prog;
89
+ goto out_offset;
90
+ }
91
+
8692 for (i = 0; i < prog->len; i++) {
8793 prev_ninsns += 32;
8894 ctx->offset[i] = prev_ninsns;
....@@ -91,11 +97,15 @@
9197 for (i = 0; i < NR_JIT_ITERATIONS; i++) {
9298 pass++;
9399 ctx->ninsns = 0;
100
+
101
+ bpf_jit_build_prologue(ctx);
102
+ ctx->prologue_len = ctx->ninsns;
103
+
94104 if (build_body(ctx, extra_pass, ctx->offset)) {
95105 prog = orig_prog;
96106 goto out_offset;
97107 }
98
- bpf_jit_build_prologue(ctx);
108
+
99109 ctx->epilogue_offset = ctx->ninsns;
100110 bpf_jit_build_epilogue(ctx);
101111
....@@ -153,6 +163,10 @@
153163 bpf_flush_icache(jit_data->header, ctx->insns + ctx->ninsns);
154164
155165 if (!prog->is_func || extra_pass) {
166
+ bpf_jit_binary_lock_ro(jit_data->header);
167
+ for (i = 0; i < prog->len; i++)
168
+ ctx->offset[i] = ninsns_rvoff(ctx->offset[i]);
169
+ bpf_prog_fill_jited_linfo(prog, ctx->offset);
156170 out_offset:
157171 kfree(ctx->offset);
158172 kfree(jit_data);
....@@ -165,3 +179,16 @@
165179 tmp : orig_prog);
166180 return prog;
167181 }
182
+
183
+void *bpf_jit_alloc_exec(unsigned long size)
184
+{
185
+ return __vmalloc_node_range(size, PAGE_SIZE, BPF_JIT_REGION_START,
186
+ BPF_JIT_REGION_END, GFP_KERNEL,
187
+ PAGE_KERNEL, 0, NUMA_NO_NODE,
188
+ __builtin_return_address(0));
189
+}
190
+
191
+void bpf_jit_free_exec(void *addr)
192
+{
193
+ return vfree(addr);
194
+}