mirror of https://gitlab.com/qemu-project/qemu
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
| /*
 | |
|  * icount - Instruction Counter API
 | |
|  * CPU timers state API
 | |
|  *
 | |
|  * Copyright 2020 SUSE LLC
 | |
|  * SPDX-License-Identifier: GPL-2.0-or-later
 | |
|  */
 | |
| 
 | |
| #ifndef EXEC_ICOUNT_H
 | |
| #define EXEC_ICOUNT_H
 | |
| 
 | |
| /**
 | |
|  * ICountMode: icount enablement state:
 | |
|  *
 | |
|  * @ICOUNT_DISABLED: Disabled - Do not count executed instructions.
 | |
|  * @ICOUNT_PRECISE: Enabled - Fixed conversion of insn to ns via "shift" option
 | |
|  * @ICOUNT_ADAPTATIVE: Enabled - Runtime adaptive algorithm to compute shift
 | |
|  */
 | |
| typedef enum {
 | |
|     ICOUNT_DISABLED = 0,
 | |
|     ICOUNT_PRECISE,
 | |
|     ICOUNT_ADAPTATIVE,
 | |
| } ICountMode;
 | |
| 
 | |
| #ifdef CONFIG_TCG
 | |
| extern ICountMode use_icount;
 | |
| #define icount_enabled() (use_icount)
 | |
| #else
 | |
| #define icount_enabled() ICOUNT_DISABLED
 | |
| #endif
 | |
| 
 | |
| /* Protect the CONFIG_USER_ONLY test vs poisoning. */
 | |
| #if defined(COMPILING_PER_TARGET) || defined(COMPILING_SYSTEM_VS_USER)
 | |
| # ifdef CONFIG_USER_ONLY
 | |
| #  undef  icount_enabled
 | |
| #  define icount_enabled() ICOUNT_DISABLED
 | |
| # endif
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * Update the icount with the executed instructions. Called by
 | |
|  * cpus-tcg vCPU thread so the main-loop can see time has moved forward.
 | |
|  */
 | |
| void icount_update(CPUState *cpu);
 | |
| 
 | |
| /* get raw icount value */
 | |
| int64_t icount_get_raw(void);
 | |
| 
 | |
| /* return the virtual CPU time in ns, based on the instruction counter. */
 | |
| int64_t icount_get(void);
 | |
| /*
 | |
|  * convert an instruction counter value to ns, based on the icount shift.
 | |
|  * This shift is set as a fixed value with the icount "shift" option
 | |
|  * (precise mode), or it is constantly approximated and corrected at
 | |
|  * runtime in adaptive mode.
 | |
|  */
 | |
| int64_t icount_to_ns(int64_t icount);
 | |
| 
 | |
| /**
 | |
|  * icount_configure: configure the icount options, including "shift"
 | |
|  * @opts: Options to parse
 | |
|  * @errp: pointer to a NULL-initialized error object
 | |
|  *
 | |
|  * Return: true on success, else false setting @errp with error
 | |
|  */
 | |
| bool icount_configure(QemuOpts *opts, Error **errp);
 | |
| 
 | |
| /* used by tcg vcpu thread to calc icount budget */
 | |
| int64_t icount_round(int64_t count);
 | |
| 
 | |
| /* if the CPUs are idle, start accounting real time to virtual clock. */
 | |
| void icount_start_warp_timer(void);
 | |
| void icount_account_warp_timer(void);
 | |
| void icount_notify_exit(void);
 | |
| 
 | |
| #endif /* EXEC_ICOUNT_H */
 |