linux-user: enable tb unlinking when compiled with NPTL
Fixes receiving signals when guest code is being executed in a tight loop. For an example, try interrupting the following code with ctrl-c. http://nchipin.kos.to/test-loop.c The tight loop is ofcourse brainless, but it is also exactly how the waitpid* testcases are implemented. Signed-off-by: Riku Voipio <riku.voipio@nokia.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
		
							parent
							
								
									58faa1a6db
								
							
						
					
					
						commit
						f76cfe56d9
					
				
							
								
								
									
										8
									
								
								exec.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								exec.c
									
									
									
									
									
								
							| @ -1530,24 +1530,22 @@ void cpu_set_log_filename(const char *filename) | ||||
| 
 | ||||
| static void cpu_unlink_tb(CPUState *env) | ||||
| { | ||||
| #if defined(CONFIG_USE_NPTL) | ||||
|     /* FIXME: TB unchaining isn't SMP safe.  For now just ignore the
 | ||||
|        problem and hope the cpu will stop of its own accord.  For userspace | ||||
|        emulation this often isn't actually as bad as it sounds.  Often | ||||
|        signals are used primarily to interrupt blocking syscalls.  */ | ||||
| #else | ||||
|     TranslationBlock *tb; | ||||
|     static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED; | ||||
| 
 | ||||
|     tb = env->current_tb; | ||||
|     /* if the cpu is currently executing code, we must unlink it and
 | ||||
|        all the potentially executing TB */ | ||||
|     if (tb && !testandset(&interrupt_lock)) { | ||||
|     if (tb) { | ||||
|         spin_lock(&interrupt_lock); | ||||
|         env->current_tb = NULL; | ||||
|         tb_reset_jump_recursive(tb); | ||||
|         resetlock(&interrupt_lock); | ||||
|         spin_unlock(&interrupt_lock); | ||||
|     } | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /* mask must never be zero, except for A20 change call */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Riku Voipio
						Riku Voipio