mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:22:46 +00:00 
			
		
		
		
	 06883ed8a3
			
		
	
	
		06883ed8a3
		
	
	
	
	
		
			
			The System V ABI for both x86 and x86_64 requires that the stack pointer is 16-byte aligned on entry. Previously we did not align the stack pointer properly. As far as "main" was concerned the stack alignment was correct even without this patch due to how the C++ _start function and the kernel interacted, i.e. the kernel misaligned the stack as far as the ABI was concerned but that misalignment (read: it was properly aligned for a regular function call - but misaligned in terms of what the ABI dictates) was actually expected by our _start function.
		
			
				
	
	
		
			28 lines
		
	
	
	
		
			765 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			28 lines
		
	
	
	
		
			765 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, Gunnar Beutner <gbeutner@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
|     .align 4
 | |
|     .globl _invoke_entry
 | |
|     .hidden _invoke_entry
 | |
|     .type _invoke_entry,@function
 | |
| _invoke_entry: # (argc, argv, envp, entry)
 | |
|     addl $4, %esp # return address
 | |
|     popl %edi # argc
 | |
|     popl %esi # argv
 | |
|     popl %edx # envp
 | |
|     popl %ecx # entry
 | |
| 
 | |
|     // The System V ABI for x86 and x86_64 prescribes that the stack pointer is 16-byte aligned
 | |
|     andl $~15, %esp
 | |
| 
 | |
|     // We're going to push three arguments so we need to align the stack for that
 | |
|     subl $4, %esp
 | |
| 
 | |
|     // FIXME: The way we're setting up the stack and passing arguments to the entry point isn't ABI-compliant
 | |
|     pushl %edx
 | |
|     pushl %esi
 | |
|     pushl %edi
 | |
|     jmp *%ecx
 |