Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

s390/bpf: Zero-extend bpf prog return values and kfunc arguments

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: 528eb2cb87bc ("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>

authored by

Ilya Leoshkevich and committed by
Alexei Starovoitov
202e42e4 bb41fcef

+24 -15
+24 -15
arch/s390/net/bpf_jit_comp.c
··· 830 830 } 831 831 832 832 /* 833 - * Sign-extend the register if necessary 833 + * Sign- or zero-extend the register if necessary 834 834 */ 835 - static int sign_extend(struct bpf_jit *jit, int r, u8 size, u8 flags) 835 + static int sign_zero_extend(struct bpf_jit *jit, int r, u8 size, u8 flags) 836 836 { 837 - if (!(flags & BTF_FMODEL_SIGNED_ARG)) 838 - return 0; 839 - 840 837 switch (size) { 841 838 case 1: 842 - /* lgbr %r,%r */ 843 - EMIT4(0xb9060000, r, r); 839 + if (flags & BTF_FMODEL_SIGNED_ARG) 840 + /* lgbr %r,%r */ 841 + EMIT4(0xb9060000, r, r); 842 + else 843 + /* llgcr %r,%r */ 844 + EMIT4(0xb9840000, r, r); 844 845 return 0; 845 846 case 2: 846 - /* lghr %r,%r */ 847 - EMIT4(0xb9070000, r, r); 847 + if (flags & BTF_FMODEL_SIGNED_ARG) 848 + /* lghr %r,%r */ 849 + EMIT4(0xb9070000, r, r); 850 + else 851 + /* llghr %r,%r */ 852 + EMIT4(0xb9850000, r, r); 848 853 return 0; 849 854 case 4: 850 - /* lgfr %r,%r */ 851 - EMIT4(0xb9140000, r, r); 855 + if (flags & BTF_FMODEL_SIGNED_ARG) 856 + /* lgfr %r,%r */ 857 + EMIT4(0xb9140000, r, r); 858 + else 859 + /* llgfr %r,%r */ 860 + EMIT4(0xb9160000, r, r); 852 861 return 0; 853 862 case 8: 854 863 return 0; ··· 1807 1798 return -1; 1808 1799 1809 1800 for (j = 0; j < m->nr_args; j++) { 1810 - if (sign_extend(jit, BPF_REG_1 + j, 1811 - m->arg_size[j], 1812 - m->arg_flags[j])) 1801 + if (sign_zero_extend(jit, BPF_REG_1 + j, 1802 + m->arg_size[j], 1803 + m->arg_flags[j])) 1813 1804 return -1; 1814 1805 } 1815 1806 } ··· 2575 2566 EMIT6_PCREL_RILB_PTR(0xc0050000, REG_14, p->bpf_func); 2576 2567 /* stg %r2,retval_off(%r15) */ 2577 2568 if (save_ret) { 2578 - if (sign_extend(jit, REG_2, m->ret_size, m->ret_flags)) 2569 + if (sign_zero_extend(jit, REG_2, m->ret_size, m->ret_flags)) 2579 2570 return -1; 2580 2571 EMIT6_DISP_LH(0xe3000000, 0x0024, REG_2, REG_0, REG_15, 2581 2572 tjit->retval_off);