]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
bpf: Reserve space for BPF trampoline in BPF programs
authorAlexei Starovoitov <ast@kernel.org>
Thu, 14 Nov 2019 18:57:13 +0000 (10:57 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 15 Nov 2019 22:44:06 +0000 (23:44 +0100)
BPF trampoline can be made to work with existing 5 bytes of BPF program
prologue, but let's add 5 bytes of NOPs to the beginning of every JITed BPF
program to make BPF trampoline job easier. They can be removed in the future.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Acked-by: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20191114185720.1641606-14-ast@kernel.org
arch/x86/net/bpf_jit_comp.c

index be2b43a894f60702eefdf61ad5969a63c049bc3e..c06096df9118d105514c72e9566f2e0e06869b76 100644 (file)
@@ -206,7 +206,7 @@ struct jit_context {
 /* number of bytes emit_call() needs to generate call instruction */
 #define X86_CALL_SIZE          5
 
-#define PROLOGUE_SIZE          20
+#define PROLOGUE_SIZE          25
 
 /*
  * Emit x86-64 prologue code for BPF program and check its size.
@@ -215,8 +215,13 @@ struct jit_context {
 static void emit_prologue(u8 **pprog, u32 stack_depth, bool ebpf_from_cbpf)
 {
        u8 *prog = *pprog;
-       int cnt = 0;
+       int cnt = X86_CALL_SIZE;
 
+       /* BPF trampoline can be made to work without these nops,
+        * but let's waste 5 bytes for now and optimize later
+        */
+       memcpy(prog, ideal_nops[NOP_ATOMIC5], cnt);
+       prog += cnt;
        EMIT1(0x55);             /* push rbp */
        EMIT3(0x48, 0x89, 0xE5); /* mov rbp, rsp */
        /* sub rsp, rounded_stack_depth */