Commit 5a802442 authored by Michael Holzheu's avatar Michael Holzheu Committed by Martin Schwidefsky

s390/bpf: Fix JMP_JGE_K (A >= K) and JMP_JGT_K (A > K)

Currently the signed COMPARE HALFWORD IMMEDIATE (chi) and COMPARE (c)
instructions are used to compare "A" with "K". This is not correct
because "A" and "K" are both unsigned. To fix this remove the
chi instruction (no unsigned analogon available) and use the
unsigned COMPARE LOGICAL (cl) instruction instead of COMPARE (c).
Signed-off-by: default avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent f800c25b
...@@ -448,15 +448,12 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, ...@@ -448,15 +448,12 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter,
mask = 0x800000; /* je */ mask = 0x800000; /* je */
kbranch: /* Emit compare if the branch targets are different */ kbranch: /* Emit compare if the branch targets are different */
if (filter->jt != filter->jf) { if (filter->jt != filter->jf) {
if (K <= 16383) if (test_facility(21))
/* chi %r5,<K> */
EMIT4_IMM(0xa75e0000, K);
else if (test_facility(21))
/* clfi %r5,<K> */ /* clfi %r5,<K> */
EMIT6_IMM(0xc25f0000, K); EMIT6_IMM(0xc25f0000, K);
else else
/* c %r5,<d(K)>(%r13) */ /* cl %r5,<d(K)>(%r13) */
EMIT4_DISP(0x5950d000, EMIT_CONST(K)); EMIT4_DISP(0x5550d000, EMIT_CONST(K));
} }
branch: if (filter->jt == filter->jf) { branch: if (filter->jt == filter->jf) {
if (filter->jt == 0) if (filter->jt == 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment