]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/bpf: Use brcl for jumping to exit_ip if necessary
authorIlya Leoshkevich <iii@linux.ibm.com>
Fri, 17 Jul 2020 16:53:24 +0000 (18:53 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Aug 2020 06:23:59 +0000 (08:23 +0200)
[ Upstream commit 5fa6974471c5518a50bdd814067508dbcb477251 ]

"BPF_MAXINSNS: Maximum possible literals" test causes panic with
bpf_jit_harden = 2. The reason is that BPF_JMP | BPF_EXIT is always
emitted as brc, however, after removal of JITed image size
limitations, brcl might be required.

Fix by using brcl when necessary.

Fixes: 4e9b4a6883dd ("s390/bpf: Use relative long branches")
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200717165326.6786-4-iii@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/s390/net/bpf_jit_comp.c

index ac227ea13cbe743a17dab296d9a559367ef37c17..650b89eb693e635d900b7c6aab7474fb87de452f 100644 (file)
@@ -1267,8 +1267,12 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
                last = (i == fp->len - 1) ? 1 : 0;
                if (last)
                        break;
-               /* j <exit> */
-               EMIT4_PCREL(0xa7f40000, jit->exit_ip - jit->prg);
+               if (!is_first_pass(jit) && can_use_rel(jit, jit->exit_ip))
+                       /* brc 0xf, <exit> */
+                       EMIT4_PCREL_RIC(0xa7040000, 0xf, jit->exit_ip);
+               else
+                       /* brcl 0xf, <exit> */
+                       EMIT6_PCREL_RILC(0xc0040000, 0xf, jit->exit_ip);
                break;
        /*
         * Branch relative (number of skipped instructions) to offset on