summaryrefslogtreecommitdiffstats
path: root/src/arch/i386/include/setjmp.h
blob: c18d03e1d017136cc76c41a828731067f63e7859 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef ETHERBOOT_SETJMP_H
#define ETHERBOOT_SETJMP_H

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