diff options
Diffstat (limited to 'platform/linux-generic/arch')
5 files changed, 68 insertions, 35 deletions
diff --git a/platform/linux-generic/arch/default/odp/api/abi/cpu_inlines.h b/platform/linux-generic/arch/default/odp/api/abi/cpu_inlines.h new file mode 100644 index 000000000..f9c2bae9d --- /dev/null +++ b/platform/linux-generic/arch/default/odp/api/abi/cpu_inlines.h @@ -0,0 +1,15 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_ARCH_CPU_INLINES_H_ +#define ODP_ARCH_CPU_INLINES_H_ + +#undef odp_cpu_pause +#undef odp_cpu_cycles +#undef odp_cpu_cycles_max +#undef odp_cpu_cycles_resolution + +#endif diff --git a/platform/linux-generic/arch/x86/odp/api/abi/cpu.h b/platform/linux-generic/arch/x86/odp/api/abi/cpu.h index 523fa99e5..9224af9a0 100644 --- a/platform/linux-generic/arch/x86/odp/api/abi/cpu.h +++ b/platform/linux-generic/arch/x86/odp/api/abi/cpu.h @@ -13,14 +13,8 @@ extern "C" { #define ODP_CACHE_LINE_SIZE 64 -static inline void odp_cpu_pause(void) -{ -#ifdef __SSE2__ - __asm__ __volatile__ ("pause"); -#else - __asm__ __volatile__ ("rep; nop"); -#endif -} +/* Inlined functions for non-ABI compat mode */ +#include <odp/api/plat/cpu_inlines.h> #ifdef __cplusplus } diff --git a/platform/linux-generic/arch/x86/odp/api/abi/cpu_inlines.h b/platform/linux-generic/arch/x86/odp/api/abi/cpu_inlines.h new file mode 100644 index 000000000..63be3da65 --- /dev/null +++ b/platform/linux-generic/arch/x86/odp/api/abi/cpu_inlines.h @@ -0,0 +1,48 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_ARCH_CPU_INLINES_H_ +#define ODP_ARCH_CPU_INLINES_H_ + +#include <stdint.h> + +_ODP_INLINE void odp_cpu_pause(void) +{ +#ifdef __SSE2__ + __asm__ __volatile__ ("pause"); +#else + __asm__ __volatile__ ("rep; nop"); +#endif +} + +_ODP_INLINE uint64_t odp_cpu_cycles(void) +{ + union { + uint64_t tsc_64; + struct { + uint32_t lo_32; + uint32_t hi_32; + }; + } tsc; + + __asm__ __volatile__ ("rdtsc" : + "=a" (tsc.lo_32), + "=d" (tsc.hi_32) : : "memory"); + + return tsc.tsc_64; +} + +_ODP_INLINE uint64_t odp_cpu_cycles_max(void) +{ + return UINT64_MAX; +} + +_ODP_INLINE uint64_t odp_cpu_cycles_resolution(void) +{ + return 1; +} + +#endif diff --git a/platform/linux-generic/arch/x86/odp_cpu_cycles.c b/platform/linux-generic/arch/x86/odp_cpu_cycles.c index 4e50b6da0..c7d97a764 100644 --- a/platform/linux-generic/arch/x86/odp_cpu_cycles.c +++ b/platform/linux-generic/arch/x86/odp_cpu_cycles.c @@ -10,33 +10,6 @@ #include <odp_init_internal.h> #include <odp_debug_internal.h> -uint64_t odp_cpu_cycles(void) -{ - union { - uint64_t tsc_64; - struct { - uint32_t lo_32; - uint32_t hi_32; - }; - } tsc; - - __asm__ __volatile__ ("rdtsc" : - "=a" (tsc.lo_32), - "=d" (tsc.hi_32) : : "memory"); - - return tsc.tsc_64; -} - -uint64_t odp_cpu_cycles_max(void) -{ - return UINT64_MAX; -} - -uint64_t odp_cpu_cycles_resolution(void) -{ - return 1; -} - int _odp_cpu_cycles_init_global(void) { if (cpu_flags_has_rdtsc() == 0) { diff --git a/platform/linux-generic/arch/x86/odp_global_time.c b/platform/linux-generic/arch/x86/odp_global_time.c index 70a1a1a7a..da22d45a5 100644 --- a/platform/linux-generic/arch/x86/odp_global_time.c +++ b/platform/linux-generic/arch/x86/odp_global_time.c @@ -15,6 +15,9 @@ #include <odp_debug_internal.h> #include <odp_arch_time_internal.h> +/* Inlined API functions */ +#include <odp/api/plat/cpu_inlines.h> + uint64_t cpu_global_time(void) { return odp_cpu_cycles(); |