You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

setjmp.h 1.0KB

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