xref: /dpdk/lib/eal/x86/include/rte_cycles.h (revision 99a2dd95)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation.
3  * Copyright(c) 2013 6WIND S.A.
4  */
5 
6 #ifndef _RTE_CYCLES_X86_64_H_
7 #define _RTE_CYCLES_X86_64_H_
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 #include "generic/rte_cycles.h"
14 
15 #ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT
16 /* Global switch to use VMWARE mapping of TSC instead of RDTSC */
17 extern int rte_cycles_vmware_tsc_map;
18 #include <rte_branch_prediction.h>
19 #endif
20 #include <rte_common.h>
21 #include <rte_config.h>
22 
23 static inline uint64_t
rte_rdtsc(void)24 rte_rdtsc(void)
25 {
26 	union {
27 		uint64_t tsc_64;
28 		RTE_STD_C11
29 		struct {
30 			uint32_t lo_32;
31 			uint32_t hi_32;
32 		};
33 	} tsc;
34 
35 #ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT
36 	if (unlikely(rte_cycles_vmware_tsc_map)) {
37 		/* ecx = 0x10000 corresponds to the physical TSC for VMware */
38 		asm volatile("rdpmc" :
39 		             "=a" (tsc.lo_32),
40 		             "=d" (tsc.hi_32) :
41 		             "c"(0x10000));
42 		return tsc.tsc_64;
43 	}
44 #endif
45 
46 	asm volatile("rdtsc" :
47 		     "=a" (tsc.lo_32),
48 		     "=d" (tsc.hi_32));
49 	return tsc.tsc_64;
50 }
51 
52 static inline uint64_t
rte_rdtsc_precise(void)53 rte_rdtsc_precise(void)
54 {
55 	rte_mb();
56 	return rte_rdtsc();
57 }
58 
59 static inline uint64_t
rte_get_tsc_cycles(void)60 rte_get_tsc_cycles(void) { return rte_rdtsc(); }
61 
62 #ifdef __cplusplus
63 }
64 #endif
65 
66 #endif /* _RTE_CYCLES_X86_64_H_ */
67