alpha-linux-user: Fix a3 error return with v0 error bypass.
We were failing to initialize a3 for syscalls that bypass the negative return value error check. Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
		
							parent
							
								
									e7ea6cbefd
								
							
						
					
					
						commit
						0e141977e6
					
				| 
						 | 
				
			
			@ -2846,13 +2846,11 @@ void cpu_loop(CPUAlphaState *env)
 | 
			
		|||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                /* Syscall writes 0 to V0 to bypass error check, similar
 | 
			
		||||
                   to how this is handled internal to Linux kernel.  */
 | 
			
		||||
                if (env->ir[IR_V0] == 0) {
 | 
			
		||||
                    env->ir[IR_V0] = sysret;
 | 
			
		||||
                } else {
 | 
			
		||||
                    env->ir[IR_V0] = (sysret < 0 ? -sysret : sysret);
 | 
			
		||||
                    env->ir[IR_A3] = (sysret < 0);
 | 
			
		||||
                }
 | 
			
		||||
                   to how this is handled internal to Linux kernel.
 | 
			
		||||
                   (Ab)use trapnr temporarily as boolean indicating error.  */
 | 
			
		||||
                trapnr = (env->ir[IR_V0] != 0 && sysret < 0);
 | 
			
		||||
                env->ir[IR_V0] = (trapnr ? -sysret : sysret);
 | 
			
		||||
                env->ir[IR_A3] = trapnr;
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x86:
 | 
			
		||||
                /* IMB */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue