1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <setjmp.h>
4 
5 /**
6  * struct resume_data - data for resume after interrupt
7  */
8 struct resume_data {
9 	/** @jump: longjmp buffer */
10 	jmp_buf jump;
11 	/** @code: exception code */
12 	ulong code;
13 };
14 
15 /**
16  * set_resume() - set longjmp buffer for resuming after exception
17  *
18  * By calling this function it is possible to use a long jump to catch an
19  * exception. The caller sets the long jump buffer with set_resume() and then
20  * executes setjmp(). If an exception occurs, the code will return to the
21  * setjmp caller(). The exception code will be returned in @data->code.
22  *
23  * After the critical operation call set_resume(NULL) so that an exception in
24  * another part of the code will not accidently invoke the long jump.
25  *
26  * .. code-block:: c
27  *
28  *     // This example shows how to use set_resume().
29  *
30  *     struct resume_data resume;
31  *     int ret;
32  *
33  *     set_resume(&resume);
34  *     ret = setjmp(resume.jump);
35  *     if (ret) {
36  *          printf("An exception %ld occurred\n", resume.code);
37  *     } else {
38  *          // Do what might raise an exception here.
39  *     }
40  *     set_resume(NULL);
41  *
42  * @data:	pointer to structure with longjmp address
43  * Return:	0 before an exception, 1 after an exception occurred
44  */
45 void set_resume(struct resume_data *data);
46