From f33b8d32a1a02d070870469b457ae7a46512e6e9 Mon Sep 17 00:00:00 2001 From: Andrew Boie Date: Wed, 29 Jun 2016 16:29:15 -0700 Subject: [PATCH] nios2: implement kernel_event_logger Interrupts and context switches are logged. Since this CPU does not have a power-saving instruction, it never enters a sleep state so we do not call _sys_k_event_logger_enter_sleep() from anywhere. Change-Id: Idcef388e93ffea373446997a0f87e93a4db44331 Signed-off-by: Andrew Boie --- arch/nios2/core/irq_manage.c | 5 ++ arch/nios2/core/swap.S | 7 ++- arch/nios2/include/kernel_event_logger_arch.h | 51 +++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 arch/nios2/include/kernel_event_logger_arch.h diff --git a/arch/nios2/core/irq_manage.c b/arch/nios2/core/irq_manage.c index 3ff327949ea..02949ccf0a3 100644 --- a/arch/nios2/core/irq_manage.c +++ b/arch/nios2/core/irq_manage.c @@ -27,6 +27,7 @@ #include #include #include +#include void _irq_spurious(void *unused) { @@ -102,6 +103,10 @@ void _enter_irq(uint32_t ipending) while (ipending) { _IsrTableEntry_t *ite; +#ifdef CONFIG_KERNEL_EVENT_LOGGER_INTERRUPT + _sys_k_event_logger_interrupt(); +#endif + index = find_lsb_set(ipending) - 1; ipending &= ~(1 << index); diff --git a/arch/nios2/core/swap.S b/arch/nios2/core/swap.S index bac3167ee57..c659db333ef 100644 --- a/arch/nios2/core/swap.S +++ b/arch/nios2/core/swap.S @@ -23,6 +23,9 @@ GTEXT(_Swap) GTEXT(_thread_entry_wrapper) +/* imports */ +GTEXT(_sys_k_event_logger_context_switch) + /* unsigned int _Swap(unsigned int key) * * Always called with interrupts locked @@ -58,7 +61,9 @@ SECTION_FUNC(exception.other, _Swap) */ stw r4, __tTCS_coopReg_OFFSET + __t_coop_key_OFFSET(r11) - /* FIXME call _sys_k_event_logger_context_switch */ +#if CONFIG_KERNEL_EVENT_LOGGER_CONTEXT_SWITCH + call _sys_k_event_logger_context_switch +#endif /* Find the next context to run. Choose _nanokernel.fiber * if non-NULL */ diff --git a/arch/nios2/include/kernel_event_logger_arch.h b/arch/nios2/include/kernel_event_logger_arch.h new file mode 100644 index 00000000000..b7fb6b4975f --- /dev/null +++ b/arch/nios2/include/kernel_event_logger_arch.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016 Intel Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file + * @brief Kernel event logger support for Nios II + */ + +#ifndef __KERNEL_EVENT_LOGGER_ARCH_H__ +#define __KERNEL_EVENT_LOGGER_ARCH_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Get the identification of the current interrupt. + * + * This routine obtain the key of the interrupt that is currently processed + * if it is called from a ISR context. + * + * @return The key of the interrupt that is currently being processed. + */ +static inline int _sys_current_irq_key_get(void) +{ + uint32_t ipending; + + ipending = _nios2_creg_read(NIOS2_CR_IPENDING); + return find_lsb_set(ipending) - 1; +} + +#ifdef __cplusplus +} +#endif + +#endif /* __KERNEL_EVENT_LOGGER_ARCH_H__ */