__ppc_get_timebase() is only present when glibc is used. Signed-off-by: Piotr Kubaj <pku...@freebsd.org> --- lib/eal/ppc/include/rte_altivec.h | 3 +++ lib/eal/ppc/include/rte_cycles.h | 12 ++++++++++++ lib/eal/ppc/rte_cycles.c | 16 ++++++++++++++++ 3 files changed, 31 insertions(+)
diff --git a/lib/eal/ppc/include/rte_altivec.h b/lib/eal/ppc/include/rte_altivec.h index 1551a94544..3fcc819c11 100644 --- a/lib/eal/ppc/include/rte_altivec.h +++ b/lib/eal/ppc/include/rte_altivec.h @@ -7,6 +7,9 @@ #define _RTE_ALTIVEC_H_ /* To include altivec.h, GCC version must be >= 4.8 */ +#ifdef __clang__ +#define vector __vector +#endif #include <altivec.h> /* diff --git a/lib/eal/ppc/include/rte_cycles.h b/lib/eal/ppc/include/rte_cycles.h index 5585f9273c..a8307ceaff 100644 --- a/lib/eal/ppc/include/rte_cycles.h +++ b/lib/eal/ppc/include/rte_cycles.h @@ -10,7 +10,13 @@ extern "C" { #endif +#ifdef linux +#include <features.h> +#endif + +#ifdef __GLIBC__ #include <sys/platform/ppc.h> +#endif #include "generic/rte_cycles.h" @@ -26,7 +32,13 @@ extern "C" { static inline uint64_t rte_rdtsc(void) { +#ifdef __GLIBC__ return __ppc_get_timebase(); +#else + uint64_t __tb; + __asm__ volatile ("mfspr %0, 268" : "=r" (__tb)); + return __tb; +#endif } static inline uint64_t diff --git a/lib/eal/ppc/rte_cycles.c b/lib/eal/ppc/rte_cycles.c index 3180adb0ff..48545c4d67 100644 --- a/lib/eal/ppc/rte_cycles.c +++ b/lib/eal/ppc/rte_cycles.c @@ -2,12 +2,28 @@ * Copyright (C) IBM Corporation 2019. */ +#ifdef linux +#include <features.h> +#elif defined(__FreeBSD__) +#include <sys/types.h> +#include <sys/sysctl.h> +#endif + +#ifdef __GLIBC__ #include <sys/platform/ppc.h> +#endif #include "eal_private.h" uint64_t get_tsc_freq_arch(void) { +#ifdef __GLIBC__ return __ppc_get_timebase_freq(); +#elif defined(__FreeBSD__) + uint64_t freq; + size_t length = sizeof(freq); + sysctlbyname("kern.timecounter.tc.timebase.frequency", &freq, &length, NULL, 0); + return freq; +#endif } -- 2.31.1