zephyr/arch/sparc/core/irq_manage.c

53 lines
1.0 KiB
C

/*
* Copyright (c) 2019-2020 Cobham Gaisler AB
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <kernel.h>
#include <kernel_internal.h>
#include <kswap.h>
#include <logging/log.h>
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 != 141) {
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
}