Prevent cpsr_write/_read be put out of line in op.o (fixes a segfault on some platforms).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3633 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									c3e3682388
								
							
						
					
					
						commit
						2f4a40e569
					
				| @ -327,8 +327,6 @@ fork_exec(struct socket *so, const char *ex, int do_pty) | ||||
| 			lprint("Error: openpty failed: %s\n", strerror(errno)); | ||||
| 			return 0; | ||||
| 		} | ||||
| #else | ||||
|                 return 0; | ||||
| #endif | ||||
| 	} else { | ||||
| 		addr.sin_family = AF_INET; | ||||
|  | ||||
| @ -248,16 +248,9 @@ void cpu_unlock(void); | ||||
| #define CPSR_EXEC (CPSR_T | CPSR_IT | CPSR_J) | ||||
| 
 | ||||
| /* Return the current CPSR value.  */ | ||||
| static inline uint32_t cpsr_read(CPUARMState *env) | ||||
| { | ||||
|     int ZF; | ||||
|     ZF = (env->NZF == 0); | ||||
|     return env->uncached_cpsr | (env->NZF & 0x80000000) | (ZF << 30) | | ||||
|         (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27) | ||||
|         | (env->thumb << 5) | ((env->condexec_bits & 3) << 25) | ||||
|         | ((env->condexec_bits & 0xfc) << 8) | ||||
|         | (env->GE << 16); | ||||
| } | ||||
| uint32_t cpsr_read(CPUARMState *env); | ||||
| /* Set the CPSR.  Note that some bits of mask must be all-set or all-clear.  */ | ||||
| void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask); | ||||
| 
 | ||||
| /* Return the current xPSR value.  */ | ||||
| static inline uint32_t xpsr_read(CPUARMState *env) | ||||
| @ -271,38 +264,6 @@ static inline uint32_t xpsr_read(CPUARMState *env) | ||||
|         | env->v7m.exception; | ||||
| } | ||||
| 
 | ||||
| /* Set the CPSR.  Note that some bits of mask must be all-set or all-clear.  */ | ||||
| static inline void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) | ||||
| { | ||||
|     /* NOTE: N = 1 and Z = 1 cannot be stored currently */ | ||||
|     if (mask & CPSR_NZCV) { | ||||
|         env->NZF = (val & 0xc0000000) ^ 0x40000000; | ||||
|         env->CF = (val >> 29) & 1; | ||||
|         env->VF = (val << 3) & 0x80000000; | ||||
|     } | ||||
|     if (mask & CPSR_Q) | ||||
|         env->QF = ((val & CPSR_Q) != 0); | ||||
|     if (mask & CPSR_T) | ||||
|         env->thumb = ((val & CPSR_T) != 0); | ||||
|     if (mask & CPSR_IT_0_1) { | ||||
|         env->condexec_bits &= ~3; | ||||
|         env->condexec_bits |= (val >> 25) & 3; | ||||
|     } | ||||
|     if (mask & CPSR_IT_2_7) { | ||||
|         env->condexec_bits &= 3; | ||||
|         env->condexec_bits |= (val >> 8) & 0xfc; | ||||
|     } | ||||
|     if (mask & CPSR_GE) { | ||||
|         env->GE = (val >> 16) & 0xf; | ||||
|     } | ||||
| 
 | ||||
|     if ((env->uncached_cpsr ^ val) & mask & CPSR_M) { | ||||
|         switch_mode(env, val & CPSR_M); | ||||
|     } | ||||
|     mask &= ~CACHED_CPSR_BITS; | ||||
|     env->uncached_cpsr = (env->uncached_cpsr & ~mask) | (val & mask); | ||||
| } | ||||
| 
 | ||||
| /* Set the xPSR.  Note that some bits of mask must be all-set or all-clear.  */ | ||||
| static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) | ||||
| { | ||||
|  | ||||
| @ -272,6 +272,48 @@ uint32_t helper_neon_mul_p8(uint32_t op1, uint32_t op2) | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| uint32_t cpsr_read(CPUARMState *env) | ||||
| { | ||||
|     int ZF; | ||||
|     ZF = (env->NZF == 0); | ||||
|     return env->uncached_cpsr | (env->NZF & 0x80000000) | (ZF << 30) | | ||||
|         (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27) | ||||
|         | (env->thumb << 5) | ((env->condexec_bits & 3) << 25) | ||||
|         | ((env->condexec_bits & 0xfc) << 8) | ||||
|         | (env->GE << 16); | ||||
| } | ||||
| 
 | ||||
| void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) | ||||
| { | ||||
|     /* NOTE: N = 1 and Z = 1 cannot be stored currently */ | ||||
|     if (mask & CPSR_NZCV) { | ||||
|         env->NZF = (val & 0xc0000000) ^ 0x40000000; | ||||
|         env->CF = (val >> 29) & 1; | ||||
|         env->VF = (val << 3) & 0x80000000; | ||||
|     } | ||||
|     if (mask & CPSR_Q) | ||||
|         env->QF = ((val & CPSR_Q) != 0); | ||||
|     if (mask & CPSR_T) | ||||
|         env->thumb = ((val & CPSR_T) != 0); | ||||
|     if (mask & CPSR_IT_0_1) { | ||||
|         env->condexec_bits &= ~3; | ||||
|         env->condexec_bits |= (val >> 25) & 3; | ||||
|     } | ||||
|     if (mask & CPSR_IT_2_7) { | ||||
|         env->condexec_bits &= 3; | ||||
|         env->condexec_bits |= (val >> 8) & 0xfc; | ||||
|     } | ||||
|     if (mask & CPSR_GE) { | ||||
|         env->GE = (val >> 16) & 0xf; | ||||
|     } | ||||
| 
 | ||||
|     if ((env->uncached_cpsr ^ val) & mask & CPSR_M) { | ||||
|         switch_mode(env, val & CPSR_M); | ||||
|     } | ||||
|     mask &= ~CACHED_CPSR_BITS; | ||||
|     env->uncached_cpsr = (env->uncached_cpsr & ~mask) | (val & mask); | ||||
| } | ||||
| 
 | ||||
| #if defined(CONFIG_USER_ONLY) | ||||
| 
 | ||||
| void do_interrupt (CPUState *env) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 balrog
						balrog