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