@@ -33,7 +33,9 @@ extern "C"
33
33
/* A type to wrap the native context type, which is ucontext_t on some
34
34
* platforms and another type elsewhere. */
35
35
#if HAVE_UCONTEXT_T
36
+ #if HAVE_UCONTEXT_H
36
37
#include < ucontext.h>
38
+ #endif // HAVE_UCONTEXT_H
37
39
38
40
typedef ucontext_t native_context_t ;
39
41
#else // HAVE_UCONTEXT_T
@@ -874,6 +876,41 @@ inline void *FPREG_Xstate_Hi16Zmm(const ucontext_t *uc, uint32_t *featureSize)
874
876
*featureSize = sizeof (_STRUCT_ZMM_REG) * 16 ;
875
877
return reinterpret_cast <void *>(&((_STRUCT_X86_AVX512_STATE64&)FPSTATE (uc)).__fpu_zmm16 );
876
878
}
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)
877
914
#else // TARGET_OSX
878
915
879
916
// For FreeBSD, as found in x86/ucontext.h
0 commit comments