/vm/os-freebsd-x86.32.hpp

http://github.com/abeaumont/factor · C++ Header · 44 lines · 38 code · 6 blank · 0 comment · 10 complexity · 11666c2d33ac4143994f869bd7ca3415 MD5 · raw file

  1. #include <ucontext.h>
  2. #include <machine/npx.h>
  3. namespace factor
  4. {
  5. inline static unsigned int uap_fpu_status(void *uap)
  6. {
  7. ucontext_t *ucontext = (ucontext_t *)uap;
  8. if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_387)
  9. {
  10. struct save87 *x87 = (struct save87 *)(&ucontext->uc_mcontext.mc_fpstate);
  11. return x87->sv_env.en_sw;
  12. }
  13. else if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_XMM)
  14. {
  15. struct savexmm *xmm = (struct savexmm *)(&ucontext->uc_mcontext.mc_fpstate);
  16. return xmm->sv_env.en_sw | xmm->sv_env.en_mxcsr;
  17. }
  18. else
  19. return 0;
  20. }
  21. inline static void uap_clear_fpu_status(void *uap)
  22. {
  23. ucontext_t *ucontext = (ucontext_t *)uap;
  24. if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_387)
  25. {
  26. struct save87 *x87 = (struct save87 *)(&ucontext->uc_mcontext.mc_fpstate);
  27. x87->sv_env.en_sw = 0;
  28. }
  29. else if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_XMM)
  30. {
  31. struct savexmm *xmm = (struct savexmm *)(&ucontext->uc_mcontext.mc_fpstate);
  32. xmm->sv_env.en_sw = 0;
  33. xmm->sv_env.en_mxcsr &= 0xffffffc0;
  34. }
  35. }
  36. #define UAP_STACK_POINTER(ucontext) (((ucontext_t *)ucontext)->uc_mcontext.mc_esp)
  37. #define UAP_PROGRAM_COUNTER(ucontext) (((ucontext_t *)ucontext)->uc_mcontext.mc_eip)
  38. }