xref: /dpdk/lib/eal/x86/include/rte_cycles.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation.
399a2dd95SBruce Richardson  * Copyright(c) 2013 6WIND S.A.
499a2dd95SBruce Richardson  */
599a2dd95SBruce Richardson 
699a2dd95SBruce Richardson #ifndef _RTE_CYCLES_X86_64_H_
799a2dd95SBruce Richardson #define _RTE_CYCLES_X86_64_H_
899a2dd95SBruce Richardson 
958e7eb1aSTyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC
1058e7eb1aSTyler Retzlaff #include <intrin.h>
1158e7eb1aSTyler Retzlaff #else
1258e7eb1aSTyler Retzlaff #include <x86intrin.h>
1358e7eb1aSTyler Retzlaff #endif
1458e7eb1aSTyler Retzlaff 
1599a2dd95SBruce Richardson #include "generic/rte_cycles.h"
1699a2dd95SBruce Richardson 
1799a2dd95SBruce Richardson #ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT
1899a2dd95SBruce Richardson /* Global switch to use VMWARE mapping of TSC instead of RDTSC */
1999a2dd95SBruce Richardson extern int rte_cycles_vmware_tsc_map;
2099a2dd95SBruce Richardson #include <rte_branch_prediction.h>
2199a2dd95SBruce Richardson #endif
2299a2dd95SBruce Richardson #include <rte_common.h>
2399a2dd95SBruce Richardson #include <rte_config.h>
2499a2dd95SBruce Richardson 
25*719834a6SMattias Rönnblom #ifdef __cplusplus
26*719834a6SMattias Rönnblom extern "C" {
27*719834a6SMattias Rönnblom #endif
28*719834a6SMattias Rönnblom 
2999a2dd95SBruce Richardson static inline uint64_t
3099a2dd95SBruce Richardson rte_rdtsc(void)
3199a2dd95SBruce Richardson {
3258e7eb1aSTyler Retzlaff #ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT
3399a2dd95SBruce Richardson 	union {
3499a2dd95SBruce Richardson 		uint64_t tsc_64;
3599a2dd95SBruce Richardson 		struct {
3699a2dd95SBruce Richardson 			uint32_t lo_32;
3799a2dd95SBruce Richardson 			uint32_t hi_32;
3899a2dd95SBruce Richardson 		};
3999a2dd95SBruce Richardson 	} tsc;
4099a2dd95SBruce Richardson 
4199a2dd95SBruce Richardson 	if (unlikely(rte_cycles_vmware_tsc_map)) {
4299a2dd95SBruce Richardson 		/* ecx = 0x10000 corresponds to the physical TSC for VMware */
4399a2dd95SBruce Richardson 		asm volatile("rdpmc" :
4499a2dd95SBruce Richardson 		             "=a" (tsc.lo_32),
4599a2dd95SBruce Richardson 		             "=d" (tsc.hi_32) :
4699a2dd95SBruce Richardson 		             "c"(0x10000));
4799a2dd95SBruce Richardson 		return tsc.tsc_64;
4899a2dd95SBruce Richardson 	}
4999a2dd95SBruce Richardson #endif
5058e7eb1aSTyler Retzlaff 	return __rdtsc();
5199a2dd95SBruce Richardson }
5299a2dd95SBruce Richardson 
5399a2dd95SBruce Richardson static inline uint64_t
5499a2dd95SBruce Richardson rte_rdtsc_precise(void)
5599a2dd95SBruce Richardson {
5699a2dd95SBruce Richardson 	rte_mb();
5799a2dd95SBruce Richardson 	return rte_rdtsc();
5899a2dd95SBruce Richardson }
5999a2dd95SBruce Richardson 
6099a2dd95SBruce Richardson static inline uint64_t
6199a2dd95SBruce Richardson rte_get_tsc_cycles(void) { return rte_rdtsc(); }
6299a2dd95SBruce Richardson 
6399a2dd95SBruce Richardson #ifdef __cplusplus
6499a2dd95SBruce Richardson }
6599a2dd95SBruce Richardson #endif
6699a2dd95SBruce Richardson 
6799a2dd95SBruce Richardson #endif /* _RTE_CYCLES_X86_64_H_ */
68