These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / arch / i386 / include / setjmp.h
1 #ifndef _SETJMP_H
2 #define _SETJMP_H
3
4 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
5
6 #include <stdint.h>
7 #include <realmode.h>
8
9 /** A jump buffer */
10 typedef struct {
11         /** Saved return address */
12         uint32_t retaddr;
13         /** Saved stack pointer */
14         uint32_t stack;
15         /** Saved %ebx */
16         uint32_t ebx;
17         /** Saved %esi */
18         uint32_t esi;
19         /** Saved %edi */
20         uint32_t edi;
21         /** Saved %ebp */
22         uint32_t ebp;
23 } jmp_buf[1];
24
25 /** A real-mode-extended jump buffer */
26 typedef struct {
27         /** Jump buffer */
28         jmp_buf env;
29         /** Real-mode stack pointer */
30         segoff_t rm_stack;
31 } rmjmp_buf[1];
32
33 extern int __asmcall __attribute__ (( returns_twice ))
34 setjmp ( jmp_buf env );
35
36 extern void __asmcall __attribute__ (( noreturn ))
37 longjmp ( jmp_buf env, int val );
38
39 #define rmsetjmp( _env ) ( {                                    \
40         (_env)->rm_stack.segment = rm_ss;                       \
41         (_env)->rm_stack.offset = rm_sp;                        \
42         setjmp ( (_env)->env ); } )                             \
43
44 #define rmlongjmp( _env, _val ) do {                            \
45         rm_ss = (_env)->rm_stack.segment;                       \
46         rm_sp = (_env)->rm_stack.offset;                        \
47         longjmp ( (_env)->env, (_val) );                        \
48         } while ( 0 )
49
50 #endif /* _SETJMP_H */