#define BPF_MAX_INSN_SIZE      128
 #define BPF_INSN_SAFETY                64
 
-#define STACKSIZE \
-       (MAX_BPF_STACK + \
-        32 /* space for rbx, r13, r14, r15 */ + \
+#define AUX_STACK_SPACE \
+       (32 /* space for rbx, r13, r14, r15 */ + \
         8 /* space for skb_copy_bits() buffer */)
 
-#define PROLOGUE_SIZE 48
+#define PROLOGUE_SIZE 37
 
 /* emit x64 prologue code for BPF program and check it's size.
  * bpf_tail_call helper will skip it while jumping into another program
        EMIT1(0x55); /* push rbp */
        EMIT3(0x48, 0x89, 0xE5); /* mov rbp,rsp */
 
-       /* sub rsp, STACKSIZE */
-       EMIT3_off32(0x48, 0x81, 0xEC, STACKSIZE);
+       /* sub rsp, MAX_BPF_STACK + AUX_STACK_SPACE */
+       EMIT3_off32(0x48, 0x81, 0xEC, MAX_BPF_STACK + AUX_STACK_SPACE);
+
+       /* sub rbp, AUX_STACK_SPACE */
+       EMIT4(0x48, 0x83, 0xED, AUX_STACK_SPACE);
 
        /* all classic BPF filters use R6(rbx) save it */
 
-       /* mov qword ptr [rbp-X],rbx */
-       EMIT3_off32(0x48, 0x89, 0x9D, -STACKSIZE);
+       /* mov qword ptr [rbp+0],rbx */
+       EMIT4(0x48, 0x89, 0x5D, 0);
 
        /* bpf_convert_filter() maps classic BPF register X to R7 and uses R8
         * as temporary, so all tcpdump filters need to spill/fill R7(r13) and
         * than synthetic ones. Therefore not worth adding complexity.
         */
 
-       /* mov qword ptr [rbp-X],r13 */
-       EMIT3_off32(0x4C, 0x89, 0xAD, -STACKSIZE + 8);
-       /* mov qword ptr [rbp-X],r14 */
-       EMIT3_off32(0x4C, 0x89, 0xB5, -STACKSIZE + 16);
-       /* mov qword ptr [rbp-X],r15 */
-       EMIT3_off32(0x4C, 0x89, 0xBD, -STACKSIZE + 24);
+       /* mov qword ptr [rbp+8],r13 */
+       EMIT4(0x4C, 0x89, 0x6D, 8);
+       /* mov qword ptr [rbp+16],r14 */
+       EMIT4(0x4C, 0x89, 0x75, 16);
+       /* mov qword ptr [rbp+24],r15 */
+       EMIT4(0x4C, 0x89, 0x7D, 24);
 
        /* Clear the tail call counter (tail_call_cnt): for eBPF tail calls
         * we need to reset the counter to 0. It's done in two instructions,
 
        /* xor eax, eax */
        EMIT2(0x31, 0xc0);
-       /* mov qword ptr [rbp-X], rax */
-       EMIT3_off32(0x48, 0x89, 0x85, -STACKSIZE + 32);
+       /* mov qword ptr [rbp+32], rax */
+       EMIT4(0x48, 0x89, 0x45, 32);
 
        BUILD_BUG_ON(cnt != PROLOGUE_SIZE);
        *pprog = prog;
        /* if (tail_call_cnt > MAX_TAIL_CALL_CNT)
         *   goto out;
         */
-       EMIT2_off32(0x8B, 0x85, -STACKSIZE + 36); /* mov eax, dword ptr [rbp - 516] */
+       EMIT2_off32(0x8B, 0x85, 36);              /* mov eax, dword ptr [rbp + 36] */
        EMIT3(0x83, 0xF8, MAX_TAIL_CALL_CNT);     /* cmp eax, MAX_TAIL_CALL_CNT */
 #define OFFSET2 36
        EMIT2(X86_JA, OFFSET2);                   /* ja out */
        label2 = cnt;
        EMIT3(0x83, 0xC0, 0x01);                  /* add eax, 1 */
-       EMIT2_off32(0x89, 0x85, -STACKSIZE + 36); /* mov dword ptr [rbp - 516], eax */
+       EMIT2_off32(0x89, 0x85, 36);              /* mov dword ptr [rbp + 36], eax */
 
        /* prog = array->ptrs[index]; */
        EMIT4_off32(0x48, 0x8D, 0x84, 0xD6,       /* lea rax, [rsi + rdx * 8 + offsetof(...)] */
                        seen_exit = true;
                        /* update cleanup_addr */
                        ctx->cleanup_addr = proglen;
-                       /* mov rbx, qword ptr [rbp-X] */
-                       EMIT3_off32(0x48, 0x8B, 0x9D, -STACKSIZE);
-                       /* mov r13, qword ptr [rbp-X] */
-                       EMIT3_off32(0x4C, 0x8B, 0xAD, -STACKSIZE + 8);
-                       /* mov r14, qword ptr [rbp-X] */
-                       EMIT3_off32(0x4C, 0x8B, 0xB5, -STACKSIZE + 16);
-                       /* mov r15, qword ptr [rbp-X] */
-                       EMIT3_off32(0x4C, 0x8B, 0xBD, -STACKSIZE + 24);
-
+                       /* mov rbx, qword ptr [rbp+0] */
+                       EMIT4(0x48, 0x8B, 0x5D, 0);
+                       /* mov r13, qword ptr [rbp+8] */
+                       EMIT4(0x4C, 0x8B, 0x6D, 8);
+                       /* mov r14, qword ptr [rbp+16] */
+                       EMIT4(0x4C, 0x8B, 0x75, 16);
+                       /* mov r15, qword ptr [rbp+24] */
+                       EMIT4(0x4C, 0x8B, 0x7D, 24);
+
+                       /* add rbp, AUX_STACK_SPACE */
+                       EMIT4(0x48, 0x83, 0xC5, AUX_STACK_SPACE);
                        EMIT1(0xC9); /* leave */
                        EMIT1(0xC3); /* ret */
                        break;