Skip to content

Commit edc90a1

Browse files
iii-igregkh
authored andcommitted
s390/bpf: Zero-extend bpf prog return values and kfunc arguments
[ Upstream commit 202e42e ] s390x ABI requires callers to zero-extend unsigned arguments and sign-extend signed arguments, and callees to zero-extend unsigned return values and sign-extend signed return values. s390 BPF JIT currently implements only sign extension. Fix this omission and implement zero extension too. Fixes: 528eb2c ("s390/bpf: Implement arch_prepare_bpf_trampoline()") Reported-by: Hari Bathini <hbathini@linux.ibm.com> Closes: https://lore.kernel.org/bpf/20260312080113.843408-1-hbathini@linux.ibm.com/ Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Tested-by: Ihor Solodrai <ihor.solodrai@linux.dev> Link: https://lore.kernel.org/r/20260313174807.581826-1-iii@linux.ibm.com Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent e70b9c2 commit edc90a1

1 file changed

Lines changed: 24 additions & 15 deletions

File tree

arch/s390/net/bpf_jit_comp.c

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -759,25 +759,34 @@ static int bpf_jit_probe_mem(struct bpf_jit *jit, struct bpf_prog *fp,
759759
}
760760

761761
/*
762-
* Sign-extend the register if necessary
762+
* Sign- or zero-extend the register if necessary
763763
*/
764-
static int sign_extend(struct bpf_jit *jit, int r, u8 size, u8 flags)
764+
static int sign_zero_extend(struct bpf_jit *jit, int r, u8 size, u8 flags)
765765
{
766-
if (!(flags & BTF_FMODEL_SIGNED_ARG))
767-
return 0;
768-
769766
switch (size) {
770767
case 1:
771-
/* lgbr %r,%r */
772-
EMIT4(0xb9060000, r, r);
768+
if (flags & BTF_FMODEL_SIGNED_ARG)
769+
/* lgbr %r,%r */
770+
EMIT4(0xb9060000, r, r);
771+
else
772+
/* llgcr %r,%r */
773+
EMIT4(0xb9840000, r, r);
773774
return 0;
774775
case 2:
775-
/* lghr %r,%r */
776-
EMIT4(0xb9070000, r, r);
776+
if (flags & BTF_FMODEL_SIGNED_ARG)
777+
/* lghr %r,%r */
778+
EMIT4(0xb9070000, r, r);
779+
else
780+
/* llghr %r,%r */
781+
EMIT4(0xb9850000, r, r);
777782
return 0;
778783
case 4:
779-
/* lgfr %r,%r */
780-
EMIT4(0xb9140000, r, r);
784+
if (flags & BTF_FMODEL_SIGNED_ARG)
785+
/* lgfr %r,%r */
786+
EMIT4(0xb9140000, r, r);
787+
else
788+
/* llgfr %r,%r */
789+
EMIT4(0xb9160000, r, r);
781790
return 0;
782791
case 8:
783792
return 0;
@@ -1452,9 +1461,9 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
14521461
return -1;
14531462

14541463
for (j = 0; j < m->nr_args; j++) {
1455-
if (sign_extend(jit, BPF_REG_1 + j,
1456-
m->arg_size[j],
1457-
m->arg_flags[j]))
1464+
if (sign_zero_extend(jit, BPF_REG_1 + j,
1465+
m->arg_size[j],
1466+
m->arg_flags[j]))
14581467
return -1;
14591468
}
14601469
}
@@ -2186,7 +2195,7 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
21862195
call_r1(jit);
21872196
/* stg %r2,retval_off(%r15) */
21882197
if (save_ret) {
2189-
if (sign_extend(jit, REG_2, m->ret_size, m->ret_flags))
2198+
if (sign_zero_extend(jit, REG_2, m->ret_size, m->ret_flags))
21902199
return -1;
21912200
EMIT6_DISP_LH(0xe3000000, 0x0024, REG_2, REG_0, REG_15,
21922201
tjit->retval_off);

0 commit comments

Comments
 (0)