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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user