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