diff options
Diffstat (limited to 'src/arch/i386/include/setjmp.h')
-rw-r--r-- | src/arch/i386/include/setjmp.h | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/src/arch/i386/include/setjmp.h b/src/arch/i386/include/setjmp.h index 60e4b12..c18d03e 100644 --- a/src/arch/i386/include/setjmp.h +++ b/src/arch/i386/include/setjmp.h @@ -1,12 +1,38 @@ #ifndef ETHERBOOT_SETJMP_H #define ETHERBOOT_SETJMP_H +#include <stdint.h> +#include <realmode.h> -/* Define a type for use by setjmp and longjmp */ -#define JBLEN 6 -typedef unsigned long jmp_buf[JBLEN]; +/** 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]; -extern int __asmcall setjmp (jmp_buf env); -extern void __asmcall longjmp (jmp_buf env, int val); +/** 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 */ |