فهرست منبع

Kernel: Make processes start with a 16-byte-aligned stack

Sahan Fernando 4 سال پیش
والد
کامیت
bd563f0b3c
1فایلهای تغییر یافته به همراه6 افزوده شده و 0 حذف شده
  1. 6 0
      Kernel/Syscalls/execve.cpp

+ 6 - 0
Kernel/Syscalls/execve.cpp

@@ -131,12 +131,18 @@ static KResultOr<FlatPtr> make_userspace_stack_for_main_thread(Region& region, V
 
 
     // NOTE: The stack needs to be 16-byte aligned.
     // NOTE: The stack needs to be 16-byte aligned.
     new_esp -= new_esp % 16;
     new_esp -= new_esp % 16;
+    // GCC assumes that the return address has been pushed to the stack when it enters the function,
+    // so we need to reserve an extra pointer's worth of bytes below this to make GCC's stack alignment
+    // calculations work
+    new_esp -= sizeof(void*);
 
 
     push_on_new_stack((FlatPtr)envp);
     push_on_new_stack((FlatPtr)envp);
     push_on_new_stack((FlatPtr)argv);
     push_on_new_stack((FlatPtr)argv);
     push_on_new_stack((FlatPtr)argv_entries.size());
     push_on_new_stack((FlatPtr)argv_entries.size());
     push_on_new_stack(0);
     push_on_new_stack(0);
 
 
+    VERIFY((new_esp + sizeof(void*)) % 16 == 0);
+
     return new_esp;
     return new_esp;
 }
 }