diff mbox series

[bpf] sparc: Adjust bpf JIT prologue for PSEUDO calls.

Message ID 20181126.215509.1232556702688169875.davem@davemloft.net
State Accepted, archived
Delegated to: BPF Maintainers
Headers show
Series [bpf] sparc: Adjust bpf JIT prologue for PSEUDO calls. | expand

Commit Message

David Miller Nov. 27, 2018, 5:55 a.m. UTC
Move all arguments into output registers from input registers.

This path is exercised by test_verifier.c's "calls: two calls with
args" test.  Adjust BPF_TAILCALL_PROLOGUE_SKIP as needed.

Let's also make the prologue length a constant size regardless of
the combination of ->saw_frame_pointer and ->saw_tail_call
settings.

Signed-off-by: David S. Miller <davem@davemloft.net>

Comments

Daniel Borkmann Nov. 27, 2018, 8:48 a.m. UTC | #1
On 11/27/2018 06:55 AM, David Miller wrote:
> 
> Move all arguments into output registers from input registers.
> 
> This path is exercised by test_verifier.c's "calls: two calls with
> args" test.  Adjust BPF_TAILCALL_PROLOGUE_SKIP as needed.
> 
> Let's also make the prologue length a constant size regardless of
> the combination of ->saw_frame_pointer and ->saw_tail_call
> settings.
> 
> Signed-off-by: David S. Miller <davem@davemloft.net>

Applied to bpf, thanks David!
diff mbox series

Patch

diff --git a/arch/sparc/net/bpf_jit_comp_64.c b/arch/sparc/net/bpf_jit_comp_64.c
index 222785a..5fda4f7 100644
--- a/arch/sparc/net/bpf_jit_comp_64.c
+++ b/arch/sparc/net/bpf_jit_comp_64.c
@@ -791,7 +791,7 @@  static int emit_compare_and_branch(const u8 code, const u8 dst, u8 src,
 }
 
 /* Just skip the save instruction and the ctx register move.  */
-#define BPF_TAILCALL_PROLOGUE_SKIP	16
+#define BPF_TAILCALL_PROLOGUE_SKIP	32
 #define BPF_TAILCALL_CNT_SP_OFF		(STACK_BIAS + 128)
 
 static void build_prologue(struct jit_ctx *ctx)
@@ -824,9 +824,15 @@  static void build_prologue(struct jit_ctx *ctx)
 		const u8 vfp = bpf2sparc[BPF_REG_FP];
 
 		emit(ADD | IMMED | RS1(FP) | S13(STACK_BIAS) | RD(vfp), ctx);
+	} else {
+		emit_nop(ctx);
 	}
 
 	emit_reg_move(I0, O0, ctx);
+	emit_reg_move(I1, O1, ctx);
+	emit_reg_move(I2, O2, ctx);
+	emit_reg_move(I3, O3, ctx);
+	emit_reg_move(I4, O4, ctx);
 	/* If you add anything here, adjust BPF_TAILCALL_PROLOGUE_SKIP above. */
 }