/* * Copyright 2016, General Dynamics C4 Systems * * SPDX-License-Identifier: GPL-2.0-only */ #pragma once #include #include #include #include /* This C function should be the first thing called from C after entry from * assembly. It provides a single place to do any entry work that is not * done in assembly for various reasons */ static inline void c_entry_hook(void) { arch_c_entry_hook(); #if defined(CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES) || defined(CONFIG_BENCHMARK_TRACK_UTILISATION) ksEnter = timestamp(); #endif } /* This C function should be the last thing called from C before exiting * the kernel (be it to assembly or returning to user space). It provides * a place to provide any additional instrumentation or functionality * in C before leaving the kernel */ static inline void c_exit_hook(void) { #ifdef CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES benchmark_track_exit(); #endif /* CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES */ #ifdef CONFIG_BENCHMARK_TRACK_UTILISATION if (likely(NODE_STATE(benchmark_log_utilisation_enabled))) { timestamp_t exit = timestamp(); NODE_STATE(ksCurThread)->benchmark.number_kernel_entries++; NODE_STATE(ksCurThread)->benchmark.kernel_utilisation += exit - ksEnter; NODE_STATE(benchmark_kernel_number_entries)++; NODE_STATE(benchmark_kernel_time) += exit - ksEnter; } #endif /* CONFIG_BENCHMARK_TRACK_UTILISATION */ arch_c_exit_hook(); }