linux-user: Fix fault address truncation AArch64

On AArch64 the si_addr field of siginfo_t is truncated to 32 bits
because the fault address passes through an uint32_t variable.

Follow Peters suggestion and drop the uint32_t variable
since its only used once in the Aarch64 loop.

Reported-by: Amanieu d'Antras <amanieu@gmail.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
Riku Voipio 2014-10-23 11:27:40 +03:00
parent c5e4a5a95e
commit 686581adcf

View File

@ -1006,7 +1006,6 @@ void cpu_loop(CPUARMState *env)
CPUState *cs = CPU(arm_env_get_cpu(env)); CPUState *cs = CPU(arm_env_get_cpu(env));
int trapnr, sig; int trapnr, sig;
target_siginfo_t info; target_siginfo_t info;
uint32_t addr;
for (;;) { for (;;) {
cpu_exec_start(cs); cpu_exec_start(cs);
@ -1042,12 +1041,11 @@ void cpu_loop(CPUARMState *env)
/* fall through for segv */ /* fall through for segv */
case EXCP_PREFETCH_ABORT: case EXCP_PREFETCH_ABORT:
case EXCP_DATA_ABORT: case EXCP_DATA_ABORT:
addr = env->exception.vaddress;
info.si_signo = SIGSEGV; info.si_signo = SIGSEGV;
info.si_errno = 0; info.si_errno = 0;
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = addr; info._sifields._sigfault._addr = env->exception.vaddress;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case EXCP_DEBUG: case EXCP_DEBUG: