X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmach-support-arm.c;h=eb1e009bfc20c8648ef993432ee01ef1f7f25cda;hb=19f49f93f9ec66cfd54b458796c3b0800d6fb9c3;hp=5f242752ef75d6e211a390373268f94e92bc4bb2;hpb=f37e86ff58d7b5a47484e60aded45bf8b98ae918;p=mono.git diff --git a/mono/utils/mach-support-arm.c b/mono/utils/mach-support-arm.c index 5f242752ef7..eb1e009bfc2 100644 --- a/mono/utils/mach-support-arm.c +++ b/mono/utils/mach-support-arm.c @@ -45,66 +45,113 @@ static int tls_vector_offset; void * mono_mach_arch_get_ip (thread_state_t state) { + /* Can't use unified_thread_state on !ARM64 since this has to compile on armv6 too */ +#ifdef TARGET_ARM64 + arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + + return (void *) arch_state->ts_64.__pc; +#else arm_thread_state_t *arch_state = (arm_thread_state_t *) state; return (void *) arch_state->__pc; +#endif } void * mono_mach_arch_get_sp (thread_state_t state) { +#ifdef TARGET_ARM64 + arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + + return (void *) arch_state->ts_64.__sp; +#else arm_thread_state_t *arch_state = (arm_thread_state_t *) state; return (void *) arch_state->__sp; +#endif } int mono_mach_arch_get_mcontext_size () { +#ifdef TARGET_ARM64 + return sizeof (struct __darwin_mcontext64); +#else return sizeof (struct __darwin_mcontext); +#endif } void mono_mach_arch_thread_state_to_mcontext (thread_state_t state, void *context) { +#ifdef TARGET_ARM64 + arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + struct __darwin_mcontext64 *ctx = (struct __darwin_mcontext64 *) context; + + ctx->__ss = arch_state->ts_64; +#else arm_thread_state_t *arch_state = (arm_thread_state_t *) state; struct __darwin_mcontext *ctx = (struct __darwin_mcontext *) context; ctx->__ss = *arch_state; +#endif } void mono_mach_arch_mcontext_to_thread_state (void *context, thread_state_t state) { +#ifdef TARGET_ARM64 + arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + struct __darwin_mcontext64 *ctx = (struct __darwin_mcontext64 *) context; + + arch_state->ts_64 = ctx->__ss; +#else arm_thread_state_t *arch_state = (arm_thread_state_t *) state; struct __darwin_mcontext *ctx = (struct __darwin_mcontext *) context; *arch_state = ctx->__ss; +#endif } int mono_mach_arch_get_thread_state_size () { +#ifdef TARGET_ARM64 + return sizeof (arm_unified_thread_state_t); +#else return sizeof (arm_thread_state_t); +#endif } kern_return_t mono_mach_arch_get_thread_state (thread_port_t thread, thread_state_t state, mach_msg_type_number_t *count) { +#ifdef TARGET_ARM64 + arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + kern_return_t ret; + + *count = ARM_UNIFIED_THREAD_STATE_COUNT; + + ret = thread_get_state (thread, ARM_UNIFIED_THREAD_STATE, (thread_state_t) arch_state, count); +#else arm_thread_state_t *arch_state = (arm_thread_state_t *) state; kern_return_t ret; *count = ARM_THREAD_STATE_COUNT; ret = thread_get_state (thread, ARM_THREAD_STATE, (thread_state_t) arch_state, count); - +#endif return ret; } kern_return_t mono_mach_arch_set_thread_state (thread_port_t thread, thread_state_t state, mach_msg_type_number_t count) { +#ifdef TARGET_ARM64 + return thread_set_state (thread, ARM_UNIFIED_THREAD_STATE_COUNT, state, count); +#else return thread_set_state (thread, ARM_THREAD_STATE_COUNT, state, count); +#endif } void *