diff options
Diffstat (limited to 'arch/sparc/net/bpf_jit_comp_64.c')
| -rw-r--r-- | arch/sparc/net/bpf_jit_comp_64.c | 80 | 
1 files changed, 2 insertions, 78 deletions
diff --git a/arch/sparc/net/bpf_jit_comp_64.c b/arch/sparc/net/bpf_jit_comp_64.c index 48a25869349b..222785af550b 100644 --- a/arch/sparc/net/bpf_jit_comp_64.c +++ b/arch/sparc/net/bpf_jit_comp_64.c @@ -48,10 +48,6 @@ static void bpf_flush_icache(void *start_, void *end_)  	}  } -#define SEEN_DATAREF 1 /* might call external helpers */ -#define SEEN_XREG    2 /* ebx is used */ -#define SEEN_MEM     4 /* use mem[] for temporary storage */ -  #define S13(X)		((X) & 0x1fff)  #define S5(X)		((X) & 0x1f)  #define IMMED		0x00002000 @@ -198,7 +194,6 @@ struct jit_ctx {  	bool 			tmp_1_used;  	bool 			tmp_2_used;  	bool 			tmp_3_used; -	bool			saw_ld_abs_ind;  	bool			saw_frame_pointer;  	bool			saw_call;  	bool			saw_tail_call; @@ -207,9 +202,7 @@ struct jit_ctx {  #define TMP_REG_1	(MAX_BPF_JIT_REG + 0)  #define TMP_REG_2	(MAX_BPF_JIT_REG + 1) -#define SKB_HLEN_REG	(MAX_BPF_JIT_REG + 2) -#define SKB_DATA_REG	(MAX_BPF_JIT_REG + 3) -#define TMP_REG_3	(MAX_BPF_JIT_REG + 4) +#define TMP_REG_3	(MAX_BPF_JIT_REG + 2)  /* Map BPF registers to SPARC registers */  static const int bpf2sparc[] = { @@ -238,9 +231,6 @@ static const int bpf2sparc[] = {  	[TMP_REG_1] = G1,  	[TMP_REG_2] = G2,  	[TMP_REG_3] = G3, - -	[SKB_HLEN_REG] = L4, -	[SKB_DATA_REG] = L5,  };  static void emit(const u32 insn, struct jit_ctx *ctx) @@ -800,25 +790,6 @@ static int emit_compare_and_branch(const u8 code, const u8 dst, u8 src,  	return 0;  } -static void load_skb_regs(struct jit_ctx *ctx, u8 r_skb) -{ -	const u8 r_headlen = bpf2sparc[SKB_HLEN_REG]; -	const u8 r_data = bpf2sparc[SKB_DATA_REG]; -	const u8 r_tmp = bpf2sparc[TMP_REG_1]; -	unsigned int off; - -	off = offsetof(struct sk_buff, len); -	emit(LD32I | RS1(r_skb) | S13(off) | RD(r_headlen), ctx); - -	off = offsetof(struct sk_buff, data_len); -	emit(LD32I | RS1(r_skb) | S13(off) | RD(r_tmp), ctx); - -	emit(SUB | RS1(r_headlen) | RS2(r_tmp) | RD(r_headlen), ctx); - -	off = offsetof(struct sk_buff, data); -	emit(LDPTRI | RS1(r_skb) | S13(off) | RD(r_data), ctx); -} -  /* Just skip the save instruction and the ctx register move.  */  #define BPF_TAILCALL_PROLOGUE_SKIP	16  #define BPF_TAILCALL_CNT_SP_OFF		(STACK_BIAS + 128) @@ -857,9 +828,6 @@ static void build_prologue(struct jit_ctx *ctx)  	emit_reg_move(I0, O0, ctx);  	/* If you add anything here, adjust BPF_TAILCALL_PROLOGUE_SKIP above. */ - -	if (ctx->saw_ld_abs_ind) -		load_skb_regs(ctx, bpf2sparc[BPF_REG_1]);  }  static void build_epilogue(struct jit_ctx *ctx) @@ -926,7 +894,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)  	const int i = insn - ctx->prog->insnsi;  	const s16 off = insn->off;  	const s32 imm = insn->imm; -	u32 *func;  	if (insn->src_reg == BPF_REG_FP)  		ctx->saw_frame_pointer = true; @@ -1225,16 +1192,11 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)  		u8 *func = ((u8 *)__bpf_call_base) + imm;  		ctx->saw_call = true; -		if (ctx->saw_ld_abs_ind && bpf_helper_changes_pkt_data(func)) -			emit_reg_move(bpf2sparc[BPF_REG_1], L7, ctx);  		emit_call((u32 *)func, ctx);  		emit_nop(ctx);  		emit_reg_move(O0, bpf2sparc[BPF_REG_0], ctx); - -		if (ctx->saw_ld_abs_ind && bpf_helper_changes_pkt_data(func)) -			load_skb_regs(ctx, L7);  		break;  	} @@ -1412,43 +1374,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)  		emit_nop(ctx);  		break;  	} -#define CHOOSE_LOAD_FUNC(K, func) \ -		((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative_offset : func) : func##_positive_offset) - -	/* R0 = ntohx(*(size *)(((struct sk_buff *)R6)->data + imm)) */ -	case BPF_LD | BPF_ABS | BPF_W: -		func = CHOOSE_LOAD_FUNC(imm, bpf_jit_load_word); -		goto common_load; -	case BPF_LD | BPF_ABS | BPF_H: -		func = CHOOSE_LOAD_FUNC(imm, bpf_jit_load_half); -		goto common_load; -	case BPF_LD | BPF_ABS | BPF_B: -		func = CHOOSE_LOAD_FUNC(imm, bpf_jit_load_byte); -		goto common_load; -	/* R0 = ntohx(*(size *)(((struct sk_buff *)R6)->data + src + imm)) */ -	case BPF_LD | BPF_IND | BPF_W: -		func = bpf_jit_load_word; -		goto common_load; -	case BPF_LD | BPF_IND | BPF_H: -		func = bpf_jit_load_half; -		goto common_load; - -	case BPF_LD | BPF_IND | BPF_B: -		func = bpf_jit_load_byte; -	common_load: -		ctx->saw_ld_abs_ind = true; - -		emit_reg_move(bpf2sparc[BPF_REG_6], O0, ctx); -		emit_loadimm(imm, O1, ctx); - -		if (BPF_MODE(code) == BPF_IND) -			emit_alu(ADD, src, O1, ctx); - -		emit_call(func, ctx); -		emit_alu_K(SRA, O1, 0, ctx); - -		emit_reg_move(O0, bpf2sparc[BPF_REG_0], ctx); -		break;  	default:  		pr_err_once("unknown opcode %02x\n", code); @@ -1583,12 +1508,11 @@ skip_init_ctx:  		build_epilogue(&ctx);  		if (bpf_jit_enable > 1) -			pr_info("Pass %d: shrink = %d, seen = [%c%c%c%c%c%c%c]\n", pass, +			pr_info("Pass %d: shrink = %d, seen = [%c%c%c%c%c%c]\n", pass,  				image_size - (ctx.idx * 4),  				ctx.tmp_1_used ? '1' : ' ',  				ctx.tmp_2_used ? '2' : ' ',  				ctx.tmp_3_used ? '3' : ' ', -				ctx.saw_ld_abs_ind ? 'L' : ' ',  				ctx.saw_frame_pointer ? 'F' : ' ',  				ctx.saw_call ? 'C' : ' ',  				ctx.saw_tail_call ? 'T' : ' ');  |