#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 */