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