/* * Copyright (c) 2019-2020 Cobham Gaisler AB * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include LOG_MODULE_DECLARE(os, CONFIG_KERNEL_LOG_LEVEL); FUNC_NORETURN void z_irq_spurious(const void *unused) { uint32_t tbr; ARG_UNUSED(unused); __asm__ volatile ( "rd %%tbr, %0" : "=r" (tbr) ); LOG_ERR("Spurious interrupt detected! IRQ: %d", (tbr >> 4) & 0xf); z_sparc_fatal_error(K_ERR_SPURIOUS_IRQ, NULL); } void z_sparc_enter_irq(uint32_t irl) { struct _isr_table_entry *ite; _current_cpu->nested++; #ifdef CONFIG_IRQ_OFFLOAD if (irl != 141U) { irl = z_sparc_int_get_source(irl); ite = &_sw_isr_table[irl]; ite->isr(ite->arg); } else { z_irq_do_offload(); } #else /* Get the actual interrupt source from the interrupt controller */ irl = z_sparc_int_get_source(irl); ite = &_sw_isr_table[irl]; ite->isr(ite->arg); #endif _current_cpu->nested--; #ifdef CONFIG_STACK_SENTINEL z_check_stack_sentinel(); #endif }