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