| 
									
										
										
										
											2008-10-22 22:26:29 -07:00
										 |  |  | #ifndef _ASM_X86_PVCLOCK_ABI_H
 | 
					
						
							|  |  |  | #define _ASM_X86_PVCLOCK_ABI_H
 | 
					
						
							| 
									
										
										
										
											2008-06-03 16:17:29 +02:00
										 |  |  | #ifndef __ASSEMBLY__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * These structs MUST NOT be changed. | 
					
						
							|  |  |  |  * They are the ABI between hypervisor and guest OS. | 
					
						
							|  |  |  |  * Both Xen and KVM are using this. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * pvclock_vcpu_time_info holds the system time and the tsc timestamp | 
					
						
							|  |  |  |  * of the last update. So the guest can use the tsc delta to get a | 
					
						
							|  |  |  |  * more precise system time.  There is one per virtual cpu. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * pvclock_wall_clock references the point in time when the system | 
					
						
							|  |  |  |  * time was zero (usually boot time), thus the guest calculates the | 
					
						
							|  |  |  |  * current wall clock by adding the system time. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Protocol for the "version" fields is: hypervisor raises it (making | 
					
						
							|  |  |  |  * it uneven) before it starts updating the fields and raises it again | 
					
						
							|  |  |  |  * (making it even) when it is done.  Thus the guest can make sure the | 
					
						
							|  |  |  |  * time values it got are consistent by checking the version before | 
					
						
							|  |  |  |  * and after reading them. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct pvclock_vcpu_time_info { | 
					
						
							|  |  |  | 	u32   version; | 
					
						
							|  |  |  | 	u32   pad0; | 
					
						
							|  |  |  | 	u64   tsc_timestamp; | 
					
						
							|  |  |  | 	u64   system_time; | 
					
						
							|  |  |  | 	u32   tsc_to_system_mul; | 
					
						
							|  |  |  | 	s8    tsc_shift; | 
					
						
							| 
									
										
										
										
											2010-05-11 12:17:39 -04:00
										 |  |  | 	u8    flags; | 
					
						
							|  |  |  | 	u8    pad[2]; | 
					
						
							| 
									
										
										
										
											2008-06-03 16:17:29 +02:00
										 |  |  | } __attribute__((__packed__)); /* 32 bytes */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct pvclock_wall_clock { | 
					
						
							|  |  |  | 	u32   version; | 
					
						
							|  |  |  | 	u32   sec; | 
					
						
							|  |  |  | 	u32   nsec; | 
					
						
							|  |  |  | } __attribute__((__packed__)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-11 12:17:45 -04:00
										 |  |  | #define PVCLOCK_TSC_STABLE_BIT	(1 << 0)
 | 
					
						
							| 
									
										
										
										
											2012-03-10 14:37:25 -05:00
										 |  |  | #define PVCLOCK_GUEST_STOPPED	(1 << 1)
 | 
					
						
							| 
									
										
										
										
											2008-06-03 16:17:29 +02:00
										 |  |  | #endif /* __ASSEMBLY__ */
 | 
					
						
							| 
									
										
										
										
											2008-10-22 22:26:29 -07:00
										 |  |  | #endif /* _ASM_X86_PVCLOCK_ABI_H */
 |