61 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * Written by H. Peter Anvin <hpa@zytor.com>
 | |
|  * Brought in from Linux v4.4 and modified for U-Boot
 | |
|  * From Linux arch/um/sys-i386/setjmp.S
 | |
|  */
 | |
| 
 | |
| #define _REGPARM
 | |
| 
 | |
| /*
 | |
|  * The jmp_buf is assumed to contain the following, in order:
 | |
|  *	%ebx
 | |
|  *	%esp
 | |
|  *	%ebp
 | |
|  *	%esi
 | |
|  *	%edi
 | |
|  *	<return address>
 | |
|  */
 | |
| 
 | |
| 	.text
 | |
| 	.align 4
 | |
| 	.globl setjmp
 | |
| 	.type setjmp, @function
 | |
| setjmp:
 | |
| #ifdef _REGPARM
 | |
| 	movl %eax, %edx
 | |
| #else
 | |
| 	movl 4(%esp), %edx
 | |
| #endif
 | |
| 	popl %ecx		/* Return address, and adjust the stack */
 | |
| 	xorl %eax, %eax		/* Return value */
 | |
| 	movl %ebx, (%edx)
 | |
| 	movl %esp, 4(%edx)	/* Post-return %esp! */
 | |
| 	pushl %ecx		/* Make the call/return stack happy */
 | |
| 	movl %ebp, 8(%edx)
 | |
| 	movl %esi, 12(%edx)
 | |
| 	movl %edi, 16(%edx)
 | |
| 	movl %ecx, 20(%edx)	/* Return address */
 | |
| 	ret
 | |
| 
 | |
| 	/* Provide function size if needed */
 | |
| 	.size setjmp, .-setjmp
 | |
| 
 | |
| 	.align 4
 | |
| 	.globl longjmp
 | |
| 	.type longjmp, @function
 | |
| longjmp:
 | |
| #ifdef _REGPARM
 | |
| 	xchgl %eax, %edx
 | |
| #else
 | |
| 	movl 4(%esp), %edx	/* jmp_ptr address */
 | |
| #endif
 | |
| 	movl (%edx), %ebx
 | |
| 	movl 4(%edx), %esp
 | |
| 	movl 8(%edx), %ebp
 | |
| 	movl 12(%edx), %esi
 | |
| 	movl 16(%edx), %edi
 | |
| 	jmp *20(%edx)
 | |
| 
 | |
| 	.size longjmp, .-longjmp
 |