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: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
f800c25b7a
commit
5a80244246
|
@ -448,15 +448,12 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter,
|
|||
mask = 0x800000; /* je */
|
||||
kbranch: /* Emit compare if the branch targets are different */
|
||||
if (filter->jt != filter->jf) {
|
||||
if (K <= 16383)
|
||||
/* chi %r5,<K> */
|
||||
EMIT4_IMM(0xa75e0000, K);
|
||||
else if (test_facility(21))
|
||||
if (test_facility(21))
|
||||
/* clfi %r5,<K> */
|
||||
EMIT6_IMM(0xc25f0000, K);
|
||||
else
|
||||
/* c %r5,<d(K)>(%r13) */
|
||||
EMIT4_DISP(0x5950d000, EMIT_CONST(K));
|
||||
/* cl %r5,<d(K)>(%r13) */
|
||||
EMIT4_DISP(0x5550d000, EMIT_CONST(K));
|
||||
}
|
||||
branch: if (filter->jt == filter->jf) {
|
||||
if (filter->jt == 0)
|
||||
|
|
Loading…
Reference in New Issue