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