X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmach-support-arm64.c;h=33c076974114e42346192fd12c7ed6503408e3d5;hb=c334db5e2ced29fb03fe2be4b603bbacb91021f8;hp=a1ef2e2b3a2954ea681ae05b735f00775525a761;hpb=47a53dff1bb5bb7b6f2ed98c8b86dbcfa64f342d;p=mono.git diff --git a/mono/utils/mach-support-arm64.c b/mono/utils/mach-support-arm64.c index a1ef2e2b3a2..33c07697411 100644 --- a/mono/utils/mach-support-arm64.c +++ b/mono/utils/mach-support-arm64.c @@ -1,5 +1,6 @@ -/* - * mach-support-arm.c: mach support for ARM +/** + * \file + * mach support for ARM * * Authors: * Geoff Norton (gnorton@novell.com) @@ -66,35 +67,44 @@ mono_mach_arch_get_mcontext_size () } void -mono_mach_arch_thread_state_to_mcontext (thread_state_t state, void *context) +mono_mach_arch_thread_states_to_mcontext (thread_state_t state, thread_state_t fpstate, void *context) { arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + arm_neon_state64_t *arch_fpstate = (arm_neon_state64_t*) fpstate; struct __darwin_mcontext64 *ctx = (struct __darwin_mcontext64 *) context; ctx->__ss = arch_state->ts_64; + ctx->__ns = *arch_fpstate; } void -mono_mach_arch_mcontext_to_thread_state (void *context, thread_state_t state) +mono_mach_arch_mcontext_to_thread_states (void *context, thread_state_t state, thread_state_t fpstate) { arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + arm_neon_state64_t *arch_fpstate = (arm_neon_state64_t*) fpstate; struct __darwin_mcontext64 *ctx = (struct __darwin_mcontext64 *) context; arch_state->ts_64 = ctx->__ss; + *arch_fpstate = ctx->__ns; } void -mono_mach_arch_thread_state_to_mono_context (thread_state_t state, MonoContext *context) +mono_mach_arch_thread_states_to_mono_context (thread_state_t state, thread_state_t fpstate, MonoContext *context) { int i; arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + arm_neon_state64_t *arch_fpstate = (arm_neon_state64_t*) fpstate; + for (i = 0; i < 29; ++i) - context->regs [i] = arch_state->uts.ts_64.__x [i]; + context->regs [i] = arch_state->ts_64.__x [i]; + + context->regs [ARMREG_R29] = arch_state->ts_64.__fp; + context->regs [ARMREG_R30] = arch_state->ts_64.__lr; + context->regs [ARMREG_SP] = arch_state->ts_64.__sp; + context->pc = arch_state->ts_64.__pc; - context->regs [ARMREG_R29] = arch_state->uts.ts_64.__fp; - context->regs [ARMREG_R30] = arch_state->uts.ts_64.__lr; - context->regs [ARMREG_R31] = arch_state->uts.ts_64.__sp; - context->pc = arch_state->uts.ts_64.__pc; + for (i = 0; i < 32; ++i) + context->fregs [i] = arch_fpstate->__v [i]; } int @@ -103,22 +113,38 @@ mono_mach_arch_get_thread_state_size () return sizeof (arm_unified_thread_state_t); } +int +mono_mach_arch_get_thread_fpstate_size () +{ + return sizeof (arm_neon_state64_t); +} + kern_return_t -mono_mach_arch_get_thread_state (thread_port_t thread, thread_state_t state, mach_msg_type_number_t *count) +mono_mach_arch_get_thread_states (thread_port_t thread, thread_state_t state, mach_msg_type_number_t *count, thread_state_t fpstate, mach_msg_type_number_t *fpcount) { arm_unified_thread_state_t *arch_state = (arm_unified_thread_state_t *) state; + arm_neon_state64_t *arch_fpstate = (arm_neon_state64_t *) fpstate; 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); + if (ret != KERN_SUCCESS) + return ret; + + *fpcount = ARM_NEON_STATE64_COUNT; + ret = thread_get_state (thread, ARM_NEON_STATE64, (thread_state_t) arch_fpstate, fpcount); 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) +mono_mach_arch_set_thread_states (thread_port_t thread, thread_state_t state, mach_msg_type_number_t count, thread_state_t fpstate, mach_msg_type_number_t fpcount) { - return thread_set_state (thread, ARM_UNIFIED_THREAD_STATE, state, count); + kern_return_t ret; + ret = thread_set_state (thread, ARM_UNIFIED_THREAD_STATE, state, count); + if (ret != KERN_SUCCESS) + return ret; + ret = thread_set_state (thread, ARM_NEON_STATE64, fpstate, fpcount); + return ret; } void *