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:
parent
c5e4a5a95e
commit
686581adcf
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user