From 161c807083bf5d889079a64604a176073eea8e1f Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Fri, 22 Sep 2017 01:36:07 +0300 Subject: [PATCH] [amd64] Add XMM registers to MonoContext on linux Fix for #50189 --- mono/utils/mono-context.h | 10 +++++++++- mono/utils/mono-sigcontext.h | 21 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/mono/utils/mono-context.h b/mono/utils/mono-context.h index 827e0ed9f81..bac2fb331a1 100644 --- a/mono/utils/mono-context.h +++ b/mono/utils/mono-context.h @@ -22,9 +22,17 @@ #define MONO_CONTEXT_OFFSET(field, index, field_type) \ "i" (offsetof (MonoContext, field) + (index) * sizeof (field_type)) +#if defined(TARGET_X86) #if defined(__APPLE__) typedef struct __darwin_xmm_reg MonoContextSimdReg; #endif +#elif defined(TARGET_AMD64) +#if defined(__APPLE__) +typedef struct __darwin_xmm_reg MonoContextSimdReg; +#elif defined(__linux__) +typedef struct _libc_xmmreg MonoContextSimdReg; +#endif +#endif /* * General notes about mono-context. @@ -237,7 +245,7 @@ typedef struct { typedef struct { mgreg_t gregs [AMD64_NREG]; -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__linux__) MonoContextSimdReg fregs [AMD64_XMM_NREG]; #else double fregs [AMD64_XMM_NREG]; diff --git a/mono/utils/mono-sigcontext.h b/mono/utils/mono-sigcontext.h index 479b8d4bf01..3837e698a16 100644 --- a/mono/utils/mono-sigcontext.h +++ b/mono/utils/mono-sigcontext.h @@ -260,6 +260,7 @@ typedef struct ucontext { #define UCONTEXT_REG_R15(ctx) (((ucontext_t*)(ctx))->sc_r15) #elif !defined(HOST_WIN32) #define UCONTEXT_GREGS(ctx) ((guint64*)&(((ucontext_t*)(ctx))->uc_mcontext.gregs)) + #define UCONTEXT_FREGS(ctx) (((ucontext_t*)(ctx))->uc_mcontext.fpregs->_xmm) #endif #ifdef UCONTEXT_GREGS @@ -282,6 +283,26 @@ typedef struct ucontext { #define UCONTEXT_REG_R15(ctx) (UCONTEXT_GREGS ((ctx)) [REG_R15]) #endif +#ifdef UCONTEXT_FREGS +#define UCONTEXT_REG_XMM +#define UCONTEXT_REG_XMM0(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM0]) +#define UCONTEXT_REG_XMM1(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM1]) +#define UCONTEXT_REG_XMM2(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM2]) +#define UCONTEXT_REG_XMM3(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM3]) +#define UCONTEXT_REG_XMM4(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM4]) +#define UCONTEXT_REG_XMM5(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM5]) +#define UCONTEXT_REG_XMM6(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM6]) +#define UCONTEXT_REG_XMM7(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM7]) +#define UCONTEXT_REG_XMM8(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM8]) +#define UCONTEXT_REG_XMM9(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM9]) +#define UCONTEXT_REG_XMM10(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM10]) +#define UCONTEXT_REG_XMM11(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM11]) +#define UCONTEXT_REG_XMM12(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM12]) +#define UCONTEXT_REG_XMM13(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM13]) +#define UCONTEXT_REG_XMM14(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM14]) +#define UCONTEXT_REG_XMM15(ctx) (UCONTEXT_FREGS ((ctx)) [AMD64_XMM15]) +#endif + #elif defined(__mono_ppc__) #if HAVE_UCONTEXT_H -- 2.25.1