選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

setjmp.h 804B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #ifndef ETHERBOOT_SETJMP_H
  2. #define ETHERBOOT_SETJMP_H
  3. FILE_LICENCE ( GPL2_OR_LATER );
  4. #include <stdint.h>
  5. #include <realmode.h>
  6. /** A jump buffer */
  7. typedef struct {
  8. uint32_t retaddr;
  9. uint32_t ebx;
  10. uint32_t esp;
  11. uint32_t ebp;
  12. uint32_t esi;
  13. uint32_t edi;
  14. } jmp_buf[1];
  15. /** A real-mode-extended jump buffer */
  16. typedef struct {
  17. jmp_buf env;
  18. uint16_t rm_ss;
  19. uint16_t rm_sp;
  20. } rmjmp_buf[1];
  21. extern int __asmcall setjmp ( jmp_buf env );
  22. extern void __asmcall longjmp ( jmp_buf env, int val );
  23. #define rmsetjmp( _env ) ( { \
  24. (_env)->rm_ss = rm_ss; \
  25. (_env)->rm_sp = rm_sp; \
  26. setjmp ( (_env)->env ); } ) \
  27. #define rmlongjmp( _env, _val ) do { \
  28. rm_ss = (_env)->rm_ss; \
  29. rm_sp = (_env)->rm_sp; \
  30. longjmp ( (_env)->env, (_val) ); \
  31. } while ( 0 )
  32. #endif /* ETHERBOOT_SETJMP_H */