1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 3 #ifndef _SETJMP_H_ 4 #define _SETJMP_H_ 1 5 6 /** 7 * DOC: Overview 8 * 9 * The long jump API allows to perform nonlocal gotos, that is jump from one 10 * function to another typically further down in the stack, while properly 11 * restoring the stack's state (unwinding). The two functions needed to do this 12 * are setjmp() and longjmp(). 13 * 14 * In addition to these two standard POSIX.1-2001/C89 functions, a third one is 15 * present in U-Boot: initjmp(). It is an extension which allows to implement 16 * user-mode threads. 17 */ 18 19 #ifdef CONFIG_HAVE_SETJMP 20 #include <asm/setjmp.h> 21 #else 22 struct jmp_buf_data { 23 }; 24 #endif 25 #include <linux/compiler_attributes.h> 26 #include <stddef.h> 27 28 /** 29 * typedef jmp_buf - information needed to restore a calling environment 30 */ 31 typedef struct jmp_buf_data jmp_buf[1]; 32 33 /** 34 * setjmp() - prepare for a long jump 35 * 36 * Registers, the stack pointer, and the return address are saved in the 37 * jump bufffer. The function returns zero afterwards. When longjmp() is 38 * executed the function returns a second time with a non-zero value. 39 * 40 * @env: jump buffer used to store register values 41 * Return: 0 after setting up jump buffer, non-zero after longjmp() 42 */ 43 int setjmp(jmp_buf env); 44 45 /** 46 * longjmp() - long jump 47 * 48 * Jump back to the address and the register state saved by setjmp(). 49 * 50 * @env: jump buffer 51 * @val: value to be returned by setjmp(), 0 is replaced by 1 52 */ 53 void longjmp(jmp_buf env, int val); 54 55 /** 56 * initjmp() - prepare for a long jump to a given function with a given stack 57 * 58 * This function sets up a jump buffer for later use with longjmp(). It allows 59 * to branch to a specific function with a specific stack. Please note that 60 * @func MUST NOT return. It shall typically restore the main stack and resume 61 * execution by doing a long jump to a jump buffer initialized by setjmp() 62 * before the long jump. initjmp() allows to implement multithreading. 63 * 64 * @env: jump buffer 65 * @func: function to be called on longjmp(), MUST NOT RETURN 66 * @stack_base: the stack to be used by @func (lower address) 67 * @stack_sz: the stack size in bytes 68 */ 69 int initjmp(jmp_buf env, void __noreturn (*func)(void), void *stack_base, 70 size_t stack_sz); 71 72 #endif /* _SETJMP_H_ */ 73