xref: /OK3568_Linux_fs/u-boot/arch/x86/cpu/i386/setjmp.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Written by H. Peter Anvin <hpa@zytor.com>
3*4882a593Smuzhiyun * Brought in from Linux v4.4 and modified for U-Boot
4*4882a593Smuzhiyun * From Linux arch/um/sys-i386/setjmp.S
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun#define _REGPARM
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun/*
12*4882a593Smuzhiyun * The jmp_buf is assumed to contain the following, in order:
13*4882a593Smuzhiyun *	%ebx
14*4882a593Smuzhiyun *	%esp
15*4882a593Smuzhiyun *	%ebp
16*4882a593Smuzhiyun *	%esi
17*4882a593Smuzhiyun *	%edi
18*4882a593Smuzhiyun *	<return address>
19*4882a593Smuzhiyun */
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun	.text
22*4882a593Smuzhiyun	.align 4
23*4882a593Smuzhiyun	.globl setjmp
24*4882a593Smuzhiyun	.type setjmp, @function
25*4882a593Smuzhiyunsetjmp:
26*4882a593Smuzhiyun#ifdef _REGPARM
27*4882a593Smuzhiyun	movl %eax, %edx
28*4882a593Smuzhiyun#else
29*4882a593Smuzhiyun	movl 4(%esp), %edx
30*4882a593Smuzhiyun#endif
31*4882a593Smuzhiyun	popl %ecx		/* Return address, and adjust the stack */
32*4882a593Smuzhiyun	xorl %eax, %eax		/* Return value */
33*4882a593Smuzhiyun	movl %ebx, (%edx)
34*4882a593Smuzhiyun	movl %esp, 4(%edx)	/* Post-return %esp! */
35*4882a593Smuzhiyun	pushl %ecx		/* Make the call/return stack happy */
36*4882a593Smuzhiyun	movl %ebp, 8(%edx)
37*4882a593Smuzhiyun	movl %esi, 12(%edx)
38*4882a593Smuzhiyun	movl %edi, 16(%edx)
39*4882a593Smuzhiyun	movl %ecx, 20(%edx)	/* Return address */
40*4882a593Smuzhiyun	ret
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun	/* Provide function size if needed */
43*4882a593Smuzhiyun	.size setjmp, .-setjmp
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun	.align 4
46*4882a593Smuzhiyun	.globl longjmp
47*4882a593Smuzhiyun	.type longjmp, @function
48*4882a593Smuzhiyunlongjmp:
49*4882a593Smuzhiyun#ifdef _REGPARM
50*4882a593Smuzhiyun	xchgl %eax, %edx
51*4882a593Smuzhiyun#else
52*4882a593Smuzhiyun	movl 4(%esp), %edx	/* jmp_ptr address */
53*4882a593Smuzhiyun#endif
54*4882a593Smuzhiyun	movl (%edx), %ebx
55*4882a593Smuzhiyun	movl 4(%edx), %esp
56*4882a593Smuzhiyun	movl 8(%edx), %ebp
57*4882a593Smuzhiyun	movl 12(%edx), %esi
58*4882a593Smuzhiyun	movl 16(%edx), %edi
59*4882a593Smuzhiyun	jmp *20(%edx)
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun	.size longjmp, .-longjmp
62