/* SPDX-License-Identifier: GPL-2.0 */ /* * Written by H. Peter Anvin * Brought in from Linux v4.4 and modified for U-Boot * From Linux arch/um/sys-i386/setjmp.S */ #define _REGPARM /* * The jmp_buf is assumed to contain the following, in order: * %ebx * %esp * %ebp * %esi * %edi * */ .text .align 4 .globl setjmp .type setjmp, @function setjmp: #ifdef _REGPARM movl %eax, %edx #else movl 4(%esp), %edx #endif popl %ecx /* Return address, and adjust the stack */ xorl %eax, %eax /* Return value */ movl %ebx, (%edx) movl %esp, 4(%edx) /* Post-return %esp! */ pushl %ecx /* Make the call/return stack happy */ movl %ebp, 8(%edx) movl %esi, 12(%edx) movl %edi, 16(%edx) movl %ecx, 20(%edx) /* Return address */ ret /* Provide function size if needed */ .size setjmp, .-setjmp .align 4 .globl longjmp .type longjmp, @function longjmp: #ifdef _REGPARM xchgl %eax, %edx #else movl 4(%esp), %edx /* jmp_ptr address */ movl 8(%esp), %eax /* Return value */ #endif movl (%edx), %ebx movl 4(%edx), %esp movl 8(%edx), %ebp movl 12(%edx), %esi movl 16(%edx), %edi test %eax, %eax jnz nz inc %eax nz: jmp *20(%edx) .size longjmp, .-longjmp