aboutsummaryrefslogtreecommitdiff
path: root/arch/sparc
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2014-02-21 15:12:04 -0500
committerSteven Rostedt <rostedt@goodmis.org>2014-02-21 15:12:04 -0500
commitfe7ef49a026fada706d93f504d368ebd0c0ef17b (patch)
tree51b54dc52e1cbecc944e9738de65608960f84db5 /arch/sparc
parentba9c4b4d0b1a45b83b40eb1b8fa3d9d1be32fd97 (diff)
parent1569265782ef26ed77ce45ebeb0676f11d4c114a (diff)
Merge tag 'v3.10.29' into v3.10-rt
This is the 3.10.29 stable release
Diffstat (limited to 'arch/sparc')
-rw-r--r--arch/sparc/net/bpf_jit_comp.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c
index d36a85ebb5e0..fd95862c65aa 100644
--- a/arch/sparc/net/bpf_jit_comp.c
+++ b/arch/sparc/net/bpf_jit_comp.c
@@ -497,9 +497,20 @@ void bpf_jit_compile(struct sk_filter *fp)
case BPF_S_ALU_MUL_K: /* A *= K */
emit_alu_K(MUL, K);
break;
- case BPF_S_ALU_DIV_K: /* A /= K */
- emit_alu_K(MUL, K);
- emit_read_y(r_A);
+ case BPF_S_ALU_DIV_K: /* A /= K with K != 0*/
+ if (K == 1)
+ break;
+ emit_write_y(G0);
+#ifdef CONFIG_SPARC32
+ /* The Sparc v8 architecture requires
+ * three instructions between a %y
+ * register write and the first use.
+ */
+ emit_nop();
+ emit_nop();
+ emit_nop();
+#endif
+ emit_alu_K(DIV, K);
break;
case BPF_S_ALU_DIV_X: /* A /= X; */
emit_cmpi(r_X, 0);