From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl0-f66.google.com ([209.85.160.66]:36489 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751998AbeBVDxZ (ORCPT ); Wed, 21 Feb 2018 22:53:25 -0500 Received: by mail-pl0-f66.google.com with SMTP id v3so2213448plg.3 for ; Wed, 21 Feb 2018 19:53:24 -0800 (PST) Message-ID: <1519271602.55655.50.camel@gmail.com> Subject: Re: [PATCH bpf] bpf, x64: implement retpoline for tail call From: Eric Dumazet To: Alexei Starovoitov Cc: Daniel Borkmann , ast@kernel.org, torvalds@linux-foundation.org, netdev@vger.kernel.org Date: Wed, 21 Feb 2018 19:53:22 -0800 In-Reply-To: <20180222034325.lecpbghrrmxy2ilt@ast-mbp.dhcp.thefacebook.com> References: <20180222000507.3374-1-daniel@iogearbox.net> <1519268642.55655.46.camel@gmail.com> <20180222034325.lecpbghrrmxy2ilt@ast-mbp.dhcp.thefacebook.com> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: netdev-owner@vger.kernel.org List-ID: On Wed, 2018-02-21 at 19:43 -0800, Alexei Starovoitov wrote: > On Wed, Feb 21, 2018 at 07:04:02PM -0800, Eric Dumazet wrote: > > On Thu, 2018-02-22 at 01:05 +0100, Daniel Borkmann wrote: > > > > ... > > > > > +/* Instead of plain jmp %rax, we emit a retpoline to control > > > + * speculative execution for the indirect branch. > > > + */ > > > +static void emit_retpoline_rax_trampoline(u8 **pprog) > > > +{ > > > + u8 *prog = *pprog; > > > + int cnt = 0; > > > + > > > + EMIT1_off32(0xE8, 7); /* callq */ > > > + /* capture_spec: */ > > > + EMIT2(0xF3, 0x90); /* pause */ > > > + EMIT3(0x0F, 0xAE, 0xE8); /* lfence */ > > > + EMIT2(0xEB, 0xF9); /* jmp */ > > > + /* set_up_target: */ > > > + EMIT4(0x48, 0x89, 0x04, 0x24); /* mov %rax,(%rsp) */ > > > + EMIT1(0xC3); /* retq */ > > > + > > > + BUILD_BUG_ON(cnt != RETPOLINE_SIZE); > > > + *pprog = prog; > > > > You might define the actual code sequence (and length) in > > arch/x86/include/asm/nospec-branch.h > > > > If we need to adjust code sequences for RETPOLINE, then we wont > > forget/miss that arch/x86/net/bpf_jit_comp.c had it hard-coded. > > like adding a comment to asm/nospec-branch.h that says > "dont forget to adjust bpf_jit_comp.c" ? > but clang/gcc generate slightly different sequences for > retpoline anyway, so even if '.macro RETPOLINE_JMP' in > nospec-branch.h changes it doesn't mean that x64 jit has to change. > So what kinda comment there would make sense? I was thinking of something very explicit : /* byte sequence for following assembly code used by eBPF call ... ... retq */ #define RETPOLINE_RAX_DIRECT_FOR_EBPF \        EMIT1_off32(0xE8, 7);    /* callq */ \        /* capture_spec: */ \        EMIT2(0xF3, 0x90);       /* pause */ \        EMIT3(0x0F, 0xAE, 0xE8); /* lfence */ \        EMIT2(0xEB, 0xF9);       /* jmp */ \        /* set_up_target: */ \        EMIT4(0x48, 0x89, 0x04, 0x24); /* mov %rax,(%rsp) */ \        EMIT1(0xC3);             /* retq */ \ Might be simply byte encoded, (array of 17 bytes) Well, something like that anyway...