xref: /openbmc/u-boot/arch/x86/cpu/i386/setjmp.S (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0 */
24d3ac6c3SSimon Glass/*
34d3ac6c3SSimon Glass * Written by H. Peter Anvin <hpa@zytor.com>
44d3ac6c3SSimon Glass * Brought in from Linux v4.4 and modified for U-Boot
54d3ac6c3SSimon Glass * From Linux arch/um/sys-i386/setjmp.S
64d3ac6c3SSimon Glass */
74d3ac6c3SSimon Glass
84d3ac6c3SSimon Glass#define _REGPARM
94d3ac6c3SSimon Glass
104d3ac6c3SSimon Glass/*
114d3ac6c3SSimon Glass * The jmp_buf is assumed to contain the following, in order:
124d3ac6c3SSimon Glass *	%ebx
134d3ac6c3SSimon Glass *	%esp
144d3ac6c3SSimon Glass *	%ebp
154d3ac6c3SSimon Glass *	%esi
164d3ac6c3SSimon Glass *	%edi
174d3ac6c3SSimon Glass *	<return address>
184d3ac6c3SSimon Glass */
194d3ac6c3SSimon Glass
204d3ac6c3SSimon Glass	.text
214d3ac6c3SSimon Glass	.align 4
224d3ac6c3SSimon Glass	.globl setjmp
234d3ac6c3SSimon Glass	.type setjmp, @function
244d3ac6c3SSimon Glasssetjmp:
254d3ac6c3SSimon Glass#ifdef _REGPARM
264d3ac6c3SSimon Glass	movl %eax, %edx
274d3ac6c3SSimon Glass#else
284d3ac6c3SSimon Glass	movl 4(%esp), %edx
294d3ac6c3SSimon Glass#endif
304d3ac6c3SSimon Glass	popl %ecx		/* Return address, and adjust the stack */
314d3ac6c3SSimon Glass	xorl %eax, %eax		/* Return value */
324d3ac6c3SSimon Glass	movl %ebx, (%edx)
334d3ac6c3SSimon Glass	movl %esp, 4(%edx)	/* Post-return %esp! */
344d3ac6c3SSimon Glass	pushl %ecx		/* Make the call/return stack happy */
354d3ac6c3SSimon Glass	movl %ebp, 8(%edx)
364d3ac6c3SSimon Glass	movl %esi, 12(%edx)
374d3ac6c3SSimon Glass	movl %edi, 16(%edx)
384d3ac6c3SSimon Glass	movl %ecx, 20(%edx)	/* Return address */
394d3ac6c3SSimon Glass	ret
404d3ac6c3SSimon Glass
414d3ac6c3SSimon Glass	/* Provide function size if needed */
424d3ac6c3SSimon Glass	.size setjmp, .-setjmp
434d3ac6c3SSimon Glass
444d3ac6c3SSimon Glass	.align 4
454d3ac6c3SSimon Glass	.globl longjmp
464d3ac6c3SSimon Glass	.type longjmp, @function
474d3ac6c3SSimon Glasslongjmp:
484d3ac6c3SSimon Glass#ifdef _REGPARM
494d3ac6c3SSimon Glass	xchgl %eax, %edx
504d3ac6c3SSimon Glass#else
514d3ac6c3SSimon Glass	movl 4(%esp), %edx	/* jmp_ptr address */
524d3ac6c3SSimon Glass#endif
534d3ac6c3SSimon Glass	movl (%edx), %ebx
544d3ac6c3SSimon Glass	movl 4(%edx), %esp
554d3ac6c3SSimon Glass	movl 8(%edx), %ebp
564d3ac6c3SSimon Glass	movl 12(%edx), %esi
574d3ac6c3SSimon Glass	movl 16(%edx), %edi
584d3ac6c3SSimon Glass	jmp *20(%edx)
594d3ac6c3SSimon Glass
604d3ac6c3SSimon Glass	.size longjmp, .-longjmp
61