@@ -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