cpus: call cpu_update_icount on read
This ensures each time the vCPU thread reads the icount we update the master timer_state.qemu_icount field. This way as long as updates are in BQL protected sections (which they should be) the main-loop can never come to update the log and find time has gone backwards. Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
		
							parent
							
								
									eda5f7c6a1
								
							
						
					
					
						commit
						1d05906b95
					
				
							
								
								
									
										10
									
								
								cpus.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								cpus.c
									
									
									
									
									
								
							| @ -253,19 +253,21 @@ void cpu_update_icount(CPUState *cpu) | ||||
| 
 | ||||
| int64_t cpu_get_icount_raw(void) | ||||
| { | ||||
|     int64_t icount; | ||||
|     CPUState *cpu = current_cpu; | ||||
| 
 | ||||
|     icount = atomic_read(&timers_state.qemu_icount); | ||||
|     if (cpu && cpu->running) { | ||||
|         if (!cpu->can_do_io) { | ||||
|             fprintf(stderr, "Bad icount read\n"); | ||||
|             exit(1); | ||||
|         } | ||||
|         /* Take into account what has run */ | ||||
|         icount += cpu_get_icount_executed(cpu); | ||||
|         cpu_update_icount(cpu); | ||||
|     } | ||||
|     return icount; | ||||
| #ifdef CONFIG_ATOMIC64 | ||||
|     return atomic_read__nocheck(&timers_state.qemu_icount); | ||||
| #else /* FIXME: we need 64bit atomics to do this safely */ | ||||
|     return timers_state.qemu_icount; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /* Return the virtual CPU time, based on the instruction counter.  */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alex Bennée
						Alex Bennée