From: Peter Maydell Date: Sun, 2 Mar 2014 19:36:38 +0000 (+0000) Subject: linux-user/signal.c: Fix AArch64 big-endian FP register restore X-Git-Tag: v2.0.0-rc0~28^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4cf2348026002d64556f89d0971c663311be2525;p=thirdparty%2Fqemu.git linux-user/signal.c: Fix AArch64 big-endian FP register restore Fix the loop restoring the FP registers from the signal frame to match the one used when setting up the signal frame, so that it handles TARGET_WORDS_BIGENDIAN being set. Signed-off-by: Peter Maydell Signed-off-by: Riku Voipio Reviewed-by: Richard Henderson --- diff --git a/linux-user/signal.c b/linux-user/signal.c index 04638e2ead7..29734b2c523 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -1233,8 +1233,14 @@ static int target_restore_sigframe(CPUARMState *env, return 1; } - for (i = 0; i < 32 * 2; i++) { - __get_user(env->vfp.regs[i], &aux->fpsimd.vregs[i]); + for (i = 0; i < 32; i++) { +#ifdef TARGET_WORDS_BIGENDIAN + __get_user(env->vfp.regs[i * 2], &aux->fpsimd.vregs[i * 2 + 1]); + __get_user(env->vfp.regs[i * 2 + 1], &aux->fpsimd.vregs[i * 2]); +#else + __get_user(env->vfp.regs[i * 2], &aux->fpsimd.vregs[i * 2]); + __get_user(env->vfp.regs[i * 2 + 1], &aux->fpsimd.vregs[i * 2 + 1]); +#endif } __get_user(fpsr, &aux->fpsimd.fpsr); vfp_set_fpsr(env, fpsr);