| From 7778d2442ed092b3a507d6072c3614248fdab75c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 17 Jul 2020 18:53:24 +0200 |
| Subject: s390/bpf: Use brcl for jumping to exit_ip if necessary |
| |
| From: Ilya Leoshkevich <iii@linux.ibm.com> |
| |
| [ 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 | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c |
| index ac227ea13cbe7..650b89eb693e6 100644 |
| --- a/arch/s390/net/bpf_jit_comp.c |
| +++ b/arch/s390/net/bpf_jit_comp.c |
| @@ -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 |
| -- |
| 2.25.1 |
| |