Skip to content

Commit 366b0e0

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 3849f0e commit 366b0e0

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

833833
/*
834-
* Sign-extend the register if necessary
834+
* Sign- or zero-extend the register if necessary
835835
*/
836-
static int sign_extend(struct bpf_jit *jit, int r, u8 size, u8 flags)
836+
static int sign_zero_extend(struct bpf_jit *jit, int r, u8 size, u8 flags)
837837
{
838-
if (!(flags & BTF_FMODEL_SIGNED_ARG))
839-
return 0;
840-
841838
switch (size) {
842839
case 1:
843-
/* lgbr %r,%r */
844-
EMIT4(0xb9060000, r, r);
840+
if (flags & BTF_FMODEL_SIGNED_ARG)
841+
/* lgbr %r,%r */
842+
EMIT4(0xb9060000, r, r);
843+
else
844+
/* llgcr %r,%r */
845+
EMIT4(0xb9840000, r, r);
845846
return 0;
846847
case 2:
847-
/* lghr %r,%r */
848-
EMIT4(0xb9070000, r, r);
848+
if (flags & BTF_FMODEL_SIGNED_ARG)
849+
/* lghr %r,%r */
850+
EMIT4(0xb9070000, r, r);
851+
else
852+
/* llghr %r,%r */
853+
EMIT4(0xb9850000, r, r);
849854
return 0;
850855
case 4:
851-
/* lgfr %r,%r */
852-
EMIT4(0xb9140000, r, r);
856+
if (flags & BTF_FMODEL_SIGNED_ARG)
857+
/* lgfr %r,%r */
858+
EMIT4(0xb9140000, r, r);
859+
else
860+
/* llgfr %r,%r */
861+
EMIT4(0xb9160000, r, r);
853862
return 0;
854863
case 8:
855864
return 0;
@@ -1799,9 +1808,9 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
17991808
return -1;
18001809

18011810
for (j = 0; j < m->nr_args; j++) {
1802-
if (sign_extend(jit, BPF_REG_1 + j,
1803-
m->arg_size[j],
1804-
m->arg_flags[j]))
1811+
if (sign_zero_extend(jit, BPF_REG_1 + j,
1812+
m->arg_size[j],
1813+
m->arg_flags[j]))
18051814
return -1;
18061815
}
18071816
}
@@ -2555,7 +2564,7 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
25552564
EMIT6_PCREL_RILB_PTR(0xc0050000, REG_14, p->bpf_func);
25562565
/* stg %r2,retval_off(%r15) */
25572566
if (save_ret) {
2558-
if (sign_extend(jit, REG_2, m->ret_size, m->ret_flags))
2567+
if (sign_zero_extend(jit, REG_2, m->ret_size, m->ret_flags))
25592568
return -1;
25602569
EMIT6_DISP_LH(0xe3000000, 0x0024, REG_2, REG_0, REG_15,
25612570
tjit->retval_off);

0 commit comments

Comments
 (0)