OSDN Git Service

s390/bpf: Add expoline to tail calls
authorIlya Leoshkevich <iii@linux.ibm.com>
Sun, 29 Jan 2023 19:04:55 +0000 (20:04 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 30 Jan 2023 03:16:28 +0000 (19:16 -0800)
All the indirect jumps in the eBPF JIT already use expolines, except
for the tail call one.

Fixes: de5cb6eb514e ("s390: use expoline thunks in the BPF JIT")
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Link: https://lore.kernel.org/r/20230129190501.1624747-3-iii@linux.ibm.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
arch/s390/net/bpf_jit_comp.c

index eb1a78c..8400a06 100644 (file)
@@ -1393,8 +1393,16 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
                /* lg %r1,bpf_func(%r1) */
                EMIT6_DISP_LH(0xe3000000, 0x0004, REG_1, REG_1, REG_0,
                              offsetof(struct bpf_prog, bpf_func));
-               /* bc 0xf,tail_call_start(%r1) */
-               _EMIT4(0x47f01000 + jit->tail_call_start);
+               if (nospec_uses_trampoline()) {
+                       jit->seen |= SEEN_FUNC;
+                       /* aghi %r1,tail_call_start */
+                       EMIT4_IMM(0xa70b0000, REG_1, jit->tail_call_start);
+                       /* brcl 0xf,__s390_indirect_jump_r1 */
+                       EMIT6_PCREL_RILC(0xc0040000, 0xf, jit->r1_thunk_ip);
+               } else {
+                       /* bc 0xf,tail_call_start(%r1) */
+                       _EMIT4(0x47f01000 + jit->tail_call_start);
+               }
                /* out: */
                if (jit->prg_buf) {
                        *(u16 *)(jit->prg_buf + patch_1_clrj + 2) =