@@ -33,7 +33,9 @@ extern "C"
3333/* A type to wrap the native context type, which is ucontext_t on some
3434 * platforms and another type elsewhere. */
3535#if HAVE_UCONTEXT_T
36+ #if HAVE_UCONTEXT_H
3637#include < ucontext.h>
38+ #endif // HAVE_UCONTEXT_H
3739
3840typedef ucontext_t native_context_t ;
3941#else // HAVE_UCONTEXT_T
@@ -874,6 +876,41 @@ inline void *FPREG_Xstate_Hi16Zmm(const ucontext_t *uc, uint32_t *featureSize)
874876 *featureSize = sizeof (_STRUCT_ZMM_REG) * 16 ;
875877 return reinterpret_cast <void *>(&((_STRUCT_X86_AVX512_STATE64&)FPSTATE (uc)).__fpu_zmm16 );
876878}
879+ #elif defined(TARGET_HAIKU)
880+
881+ #define MCREG_Rbp (mc ) ((mc).rbp)
882+ #define MCREG_Rip (mc ) ((mc).rip)
883+ #define MCREG_Rsp (mc ) ((mc).rsp)
884+ #define MCREG_Rsi (mc ) ((mc).rsi)
885+ #define MCREG_Rdi (mc ) ((mc).rdi)
886+ #define MCREG_Rbx (mc ) ((mc).rbx)
887+ #define MCREG_Rdx (mc ) ((mc).rdx)
888+ #define MCREG_Rcx (mc ) ((mc).rcx)
889+ #define MCREG_Rax (mc ) ((mc).rax)
890+ #define MCREG_R8 (mc ) ((mc).r8)
891+ #define MCREG_R9 (mc ) ((mc).r9)
892+ #define MCREG_R10 (mc ) ((mc).r10)
893+ #define MCREG_R11 (mc ) ((mc).r11)
894+ #define MCREG_R12 (mc ) ((mc).r12)
895+ #define MCREG_R13 (mc ) ((mc).r13)
896+ #define MCREG_R14 (mc ) ((mc).r14)
897+ #define MCREG_R15 (mc ) ((mc).r15)
898+ #define MCREG_EFlags (mc ) ((mc).rflags)
899+ // Haiku: missing SegCs
900+
901+ #define FPSTATE (uc ) ((uc)->uc_mcontext.fpu)
902+ #define FPREG_ControlWord (uc ) FPSTATE(uc).fp_fxsave.control
903+ #define FPREG_StatusWord (uc ) FPSTATE(uc).fp_fxsave.status
904+ #define FPREG_TagWord (uc ) FPSTATE(uc).fp_fxsave.tag
905+ #define FPREG_MxCsr (uc ) FPSTATE(uc).fp_fxsave.mxcsr
906+ #define FPREG_MxCsr_Mask (uc ) FPSTATE(uc).fp_fxsave.mscsr_mask
907+ #define FPREG_ErrorOffset (uc ) *(DWORD*) &(FPSTATE(uc).fp_fxsave.rip)
908+ #define FPREG_ErrorSelector (uc ) *((WORD*) &(FPSTATE(uc).fp_fxsave.rip) + 2 )
909+ #define FPREG_DataOffset (uc ) *(DWORD*) &(FPSTATE(uc).fp_fxsave.rdp)
910+ #define FPREG_DataSelector (uc ) *((WORD*) &(FPSTATE(uc).fp_fxsave.rdp) + 2 )
911+
912+ #define FPREG_Xmm (uc, index ) *(M128A*) &(FPSTATE(uc).fp_fxsave.xmm[index])
913+ #define FPREG_St (uc, index ) *(M128A*) &(FPSTATE(uc).fp_fxsave.fp[index].value)
877914#else // TARGET_OSX
878915
879916 // For FreeBSD, as found in x86/ucontext.h
0 commit comments