diff options
Diffstat (limited to 'platform/linux-generic/arch')
5 files changed, 62 insertions, 34 deletions
diff --git a/platform/linux-generic/arch/aarch64/odp/api/abi/cpu_time.h b/platform/linux-generic/arch/aarch64/odp/api/abi/cpu_time.h new file mode 100644 index 000000000..781ee683c --- /dev/null +++ b/platform/linux-generic/arch/aarch64/odp/api/abi/cpu_time.h @@ -0,0 +1,50 @@ +/* Copyright (c) 2021, Nokia + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_API_ABI_CPU_TIME_H_ +#define ODP_API_ABI_CPU_TIME_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> + +static inline uint64_t _odp_cpu_global_time(void) +{ + uint64_t cntvct; + + __asm__ volatile("mrs %0, cntvct_el0" : "=r"(cntvct) : : "memory"); + + return cntvct; +} + +static inline uint64_t _odp_cpu_global_time_strict(void) +{ + uint64_t cntvct; + + __asm__ volatile("isb" ::: "memory"); + __asm__ volatile("mrs %0, cntvct_el0" : "=r"(cntvct) : : "memory"); + + return cntvct; +} + +static inline uint64_t _odp_cpu_global_time_freq(void) +{ + uint64_t cntfrq; + + __asm__ volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq) : : ); + + return cntfrq; +} + +int _odp_cpu_has_global_time(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/linux-generic/arch/aarch64/odp_global_time.c b/platform/linux-generic/arch/aarch64/odp_global_time.c index fa59f5a15..53561b00c 100644 --- a/platform/linux-generic/arch/aarch64/odp_global_time.c +++ b/platform/linux-generic/arch/aarch64/odp_global_time.c @@ -4,33 +4,8 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#include <odp_posix_extensions.h> - -#include <time.h> - -#include <odp_debug_internal.h> #include <odp/api/abi/cpu_time.h> -#include <odp/visibility_begin.h> - -uint64_t _odp_cpu_global_time(void) -{ - uint64_t cntvct; - - /* - * To be consistent with other architectures, do not issue a - * serializing instruction, e.g. ISB, before reading this - * sys reg. - */ - - /* Memory clobber to minimize optimization around load from sys reg. */ - __asm__ volatile("mrs %0, cntvct_el0" : "=r"(cntvct) : : "memory"); - - return cntvct; -} - -#include <odp/visibility_end.h> - int _odp_cpu_has_global_time(void) { uint64_t hz = _odp_cpu_global_time_freq(); @@ -48,12 +23,3 @@ int _odp_cpu_has_global_time(void) */ return hz >= 1000000 && hz <= 6000000000; } - -uint64_t _odp_cpu_global_time_freq(void) -{ - uint64_t cntfrq; - - __asm__ volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq) : : ); - - return cntfrq; -} diff --git a/platform/linux-generic/arch/default/odp/api/abi/cpu_time.h b/platform/linux-generic/arch/default/odp/api/abi/cpu_time.h index 09138e70a..24e1c7d33 100644 --- a/platform/linux-generic/arch/default/odp/api/abi/cpu_time.h +++ b/platform/linux-generic/arch/default/odp/api/abi/cpu_time.h @@ -15,6 +15,7 @@ extern "C" { int _odp_cpu_has_global_time(void); uint64_t _odp_cpu_global_time(void); +uint64_t _odp_cpu_global_time_strict(void); uint64_t _odp_cpu_global_time_freq(void); #ifdef __cplusplus diff --git a/platform/linux-generic/arch/default/odp_global_time.c b/platform/linux-generic/arch/default/odp_global_time.c index facffea7d..ee835413f 100644 --- a/platform/linux-generic/arch/default/odp_global_time.c +++ b/platform/linux-generic/arch/default/odp_global_time.c @@ -13,6 +13,11 @@ uint64_t _odp_cpu_global_time(void) return 0; } +uint64_t _odp_cpu_global_time_strict(void) +{ + return 0; +} + #include <odp/visibility_end.h> int _odp_cpu_has_global_time(void) diff --git a/platform/linux-generic/arch/x86/odp/api/abi/cpu_time.h b/platform/linux-generic/arch/x86/odp/api/abi/cpu_time.h index 05ff0db94..c74c4d606 100644 --- a/platform/linux-generic/arch/x86/odp/api/abi/cpu_time.h +++ b/platform/linux-generic/arch/x86/odp/api/abi/cpu_time.h @@ -19,6 +19,12 @@ static inline uint64_t _odp_cpu_global_time(void) return _odp_cpu_rdtsc(); } +static inline uint64_t _odp_cpu_global_time_strict(void) +{ + __atomic_thread_fence(__ATOMIC_SEQ_CST); + return _odp_cpu_rdtsc(); +} + int _odp_cpu_has_global_time(void); uint64_t _odp_cpu_global_time_freq(void); |