Skip to content

Commit 8eca2d8

Browse files
puranjaymohanopsiff
authored andcommitted
bpf, arm64: Fix fp initialization for exception boundary
[ Upstream commit b114fcee766d5101eada1aca7bb5fd0a86c89b35 ] In the ARM64 BPF JIT when prog->aux->exception_boundary is set for a BPF program, find_used_callee_regs() is not called because for a program acting as exception boundary, all callee saved registers are saved. find_used_callee_regs() sets `ctx->fp_used = true;` when it sees FP being used in any of the instructions. For programs acting as exception boundary, ctx->fp_used remains false even if frame pointer is used by the program and therefore, FP is not set-up for such programs in the prologue. This can cause the kernel to crash due to a pagefault. Fix it by setting ctx->fp_used = true for exception boundary programs as fp is always saved in such programs. Fixes: 5d4fa9e ("bpf, arm64: Avoid blindly saving/restoring all callee-saved registers") Signed-off-by: Puranjay Mohan <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Acked-by: Xu Kuohai <[email protected]> Link: https://lore.kernel.org/bpf/[email protected] Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit 0dbef493cae7d451f740558665893c000adb2321)
1 parent 49b1319 commit 8eca2d8

File tree

1 file changed

+1
-0
lines changed

1 file changed

+1
-0
lines changed

arch/arm64/net/bpf_jit_comp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ static void push_callee_regs(struct jit_ctx *ctx)
399399
emit(A64_PUSH(A64_R(23), A64_R(24), A64_SP), ctx);
400400
emit(A64_PUSH(A64_R(25), A64_R(26), A64_SP), ctx);
401401
emit(A64_PUSH(A64_R(27), A64_R(28), A64_SP), ctx);
402+
ctx->fp_used = true;
402403
} else {
403404
find_used_callee_regs(ctx);
404405
for (i = 0; i + 1 < ctx->nr_used_callee_reg; i += 2) {

0 commit comments

Comments
 (0)