#define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PGD)
 #endif
 
+#define SIZEOF_PTREGS 17*4
+
 /*
  * Number of possible pages in the lowmem region.
  *
 .data
 .balign 4
 ENTRY(initial_stack)
-       .long init_thread_union+THREAD_SIZE
+       /*
+        * The SIZEOF_PTREGS gap is a convention which helps the in-kernel
+        * unwinder reliably detect the end of the stack.
+        */
+       .long init_thread_union + THREAD_SIZE - SIZEOF_PTREGS - \
+             TOP_OF_KERNEL_STACK_PADDING;
 
 __INITRODATA
 int_msg:
 
         * tables and then reload them.
         */
 
-       /*
-        * Setup stack for verify_cpu(). "-8" because initial_stack is defined
-        * this way, see below. Our best guess is a NULL ptr for stack
-        * termination heuristics and we don't want to break anything which
-        * might depend on it (kgdb, ...).
-        */
-       leaq    (__end_init_task - 8)(%rip), %rsp
+       /* Set up the stack for verify_cpu(), similar to initial_stack below */
+       leaq    (__end_init_task - SIZEOF_PTREGS)(%rip), %rsp
 
        /* Sanitize CPU configuration */
        call verify_cpu
        GLOBAL(initial_gs)
        .quad   INIT_PER_CPU_VAR(irq_stack_union)
        GLOBAL(initial_stack)
-       .quad  init_thread_union+THREAD_SIZE-8
+       /*
+        * The SIZEOF_PTREGS gap is a convention which helps the in-kernel
+        * unwinder reliably detect the end of the stack.
+        */
+       .quad  init_thread_union + THREAD_SIZE - SIZEOF_PTREGS
        __FINITDATA
 
 bad_address: