Commit 2e46477a authored by Denis Kirjanov's avatar Denis Kirjanov Committed by David S. Miller
Browse files

mips: bpf: Fix broken BPF_MOD



Remove optimize_div() from BPF_MOD | BPF_K case
since we don't know the dividend and fix the
emit_mod() by reading the mod operation result from HI register

Signed-off-by: default avatarDenis Kirjanov <kda@linux-powerpc.org>
Reviewed-by: default avatarMarkos Chandras <markos.chandras@imgtec.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f2a01517
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -426,7 +426,7 @@ static inline void emit_mod(unsigned int dst, unsigned int src,
		u32 *p = &ctx->target[ctx->idx];
		u32 *p = &ctx->target[ctx->idx];
		uasm_i_divu(&p, dst, src);
		uasm_i_divu(&p, dst, src);
		p = &ctx->target[ctx->idx + 1];
		p = &ctx->target[ctx->idx + 1];
		uasm_i_mflo(&p, dst);
		uasm_i_mfhi(&p, dst);
	}
	}
	ctx->idx += 2; /* 2 insts */
	ctx->idx += 2; /* 2 insts */
}
}
@@ -971,7 +971,7 @@ load_ind:
			break;
			break;
		case BPF_ALU | BPF_MOD | BPF_K:
		case BPF_ALU | BPF_MOD | BPF_K:
			/* A %= k */
			/* A %= k */
			if (k == 1 || optimize_div(&k)) {
			if (k == 1) {
				ctx->flags |= SEEN_A;
				ctx->flags |= SEEN_A;
				emit_jit_reg_move(r_A, r_zero, ctx);
				emit_jit_reg_move(r_A, r_zero, ctx);
			} else {
			} else {