Skip to content

Commit 44c4f99

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 86eab67 commit 44c4f99

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
@@ -842,25 +842,34 @@ static int bpf_jit_probe_post(struct bpf_jit *jit, struct bpf_prog *fp,
842842
}
843843

844844
/*
845-
* Sign-extend the register if necessary
845+
* Sign- or zero-extend the register if necessary
846846
*/
847-
static int sign_extend(struct bpf_jit *jit, int r, u8 size, u8 flags)
847+
static int sign_zero_extend(struct bpf_jit *jit, int r, u8 size, u8 flags)
848848
{
849-
if (!(flags & BTF_FMODEL_SIGNED_ARG))
850-
return 0;
851-
852849
switch (size) {
853850
case 1:
854-
/* lgbr %r,%r */
855-
EMIT4(0xb9060000, r, r);
851+
if (flags & BTF_FMODEL_SIGNED_ARG)
852+
/* lgbr %r,%r */
853+
EMIT4(0xb9060000, r, r);
854+
else
855+
/* llgcr %r,%r */
856+
EMIT4(0xb9840000, r, r);
856857
return 0;
857858
case 2:
858-
/* lghr %r,%r */
859-
EMIT4(0xb9070000, r, r);
859+
if (flags & BTF_FMODEL_SIGNED_ARG)
860+
/* lghr %r,%r */
861+
EMIT4(0xb9070000, r, r);
862+
else
863+
/* llghr %r,%r */
864+
EMIT4(0xb9850000, r, r);
860865
return 0;
861866
case 4:
862-
/* lgfr %r,%r */
863-
EMIT4(0xb9140000, r, r);
867+
if (flags & BTF_FMODEL_SIGNED_ARG)
868+
/* lgfr %r,%r */
869+
EMIT4(0xb9140000, r, r);
870+
else
871+
/* llgfr %r,%r */
872+
EMIT4(0xb9160000, r, r);
864873
return 0;
865874
case 8:
866875
return 0;
@@ -1802,9 +1811,9 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
18021811
return -1;
18031812

18041813
for (j = 0; j < m->nr_args; j++) {
1805-
if (sign_extend(jit, BPF_REG_1 + j,
1806-
m->arg_size[j],
1807-
m->arg_flags[j]))
1814+
if (sign_zero_extend(jit, BPF_REG_1 + j,
1815+
m->arg_size[j],
1816+
m->arg_flags[j]))
18081817
return -1;
18091818
}
18101819
}
@@ -2551,7 +2560,7 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
25512560
call_r1(jit);
25522561
/* stg %r2,retval_off(%r15) */
25532562
if (save_ret) {
2554-
if (sign_extend(jit, REG_2, m->ret_size, m->ret_flags))
2563+
if (sign_zero_extend(jit, REG_2, m->ret_size, m->ret_flags))
25552564
return -1;
25562565
EMIT6_DISP_LH(0xe3000000, 0x0024, REG_2, REG_0, REG_15,
25572566
tjit->retval_off);

0 commit comments

Comments
 (0)