mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
46 lines
1.3 KiB
C
46 lines
1.3 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||
|
|
||
|
#include <asm/setjmp.h>
|
||
|
|
||
|
/**
|
||
|
* struct resume_data - data for resume after interrupt
|
||
|
*/
|
||
|
struct resume_data {
|
||
|
/** @jump: longjmp buffer */
|
||
|
jmp_buf jump;
|
||
|
/** @code: exception code */
|
||
|
ulong code;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* set_resume() - set longjmp buffer for resuming after exception
|
||
|
*
|
||
|
* By calling this function it is possible to use a long jump to catch an
|
||
|
* exception. The caller sets the long jump buffer with set_resume() and then
|
||
|
* executes setjmp(). If an exception occurs, the code will return to the
|
||
|
* setjmp caller(). The exception code will be returned in @data->code.
|
||
|
*
|
||
|
* After the critical operation call set_resume(NULL) so that an exception in
|
||
|
* another part of the code will not accidently invoke the long jump.
|
||
|
*
|
||
|
* .. code-block:: c
|
||
|
*
|
||
|
* // This example shows how to use set_resume().
|
||
|
*
|
||
|
* struct resume_data resume;
|
||
|
* int ret;
|
||
|
*
|
||
|
* set_resume(&resume);
|
||
|
* ret = setjmp(resume.jump);
|
||
|
* if (ret) {
|
||
|
* printf("An exception %ld occurred\n", resume.code);
|
||
|
* } else {
|
||
|
* // Do what might raise an exception here.
|
||
|
* }
|
||
|
* set_resume(NULL);
|
||
|
*
|
||
|
* @data: pointer to structure with longjmp address
|
||
|
* Return: 0 before an exception, 1 after an exception occurred
|
||
|
*/
|
||
|
void set_resume(struct resume_data *data);
|