| #ifndef ETHERBOOT_SETJMP_H |
| #define ETHERBOOT_SETJMP_H |
| |
| FILE_LICENCE ( GPL2_OR_LATER ); |
| |
| #include <stdint.h> |
| #include <realmode.h> |
| |
| /** A jump buffer */ |
| typedef struct { |
| uint32_t retaddr; |
| uint32_t ebx; |
| uint32_t esp; |
| uint32_t ebp; |
| uint32_t esi; |
| uint32_t edi; |
| } jmp_buf[1]; |
| |
| /** A real-mode-extended jump buffer */ |
| typedef struct { |
| jmp_buf env; |
| uint16_t rm_ss; |
| uint16_t rm_sp; |
| } rmjmp_buf[1]; |
| |
| extern int __asmcall setjmp ( jmp_buf env ); |
| extern void __asmcall longjmp ( jmp_buf env, int val ); |
| |
| #define rmsetjmp( _env ) ( { \ |
| (_env)->rm_ss = rm_ss; \ |
| (_env)->rm_sp = rm_sp; \ |
| setjmp ( (_env)->env ); } ) \ |
| |
| #define rmlongjmp( _env, _val ) do { \ |
| rm_ss = (_env)->rm_ss; \ |
| rm_sp = (_env)->rm_sp; \ |
| longjmp ( (_env)->env, (_val) ); \ |
| } while ( 0 ) |
| |
| #endif /* ETHERBOOT_SETJMP_H */ |