You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.9 KiB
70 lines
1.9 KiB
/* |
|
* Copyright (c) 2014 Wind River Systems, Inc. |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
/** |
|
* @file |
|
* @brief Fatal fault handling |
|
* |
|
* This module implements the routines necessary for handling fatal faults on |
|
* ARCv2 CPUs. |
|
*/ |
|
|
|
#include <zephyr/kernel.h> |
|
#include <offsets_short.h> |
|
#include <zephyr/arch/cpu.h> |
|
#include <zephyr/logging/log.h> |
|
#include <kernel_arch_data.h> |
|
#include <zephyr/arch/arc/v2/exc.h> |
|
|
|
LOG_MODULE_DECLARE(os, CONFIG_KERNEL_LOG_LEVEL); |
|
|
|
#ifdef CONFIG_ARC_EXCEPTION_DEBUG |
|
static void dump_arc_esf(const z_arch_esf_t *esf) |
|
{ |
|
LOG_ERR(" r0: 0x%" PRIxPTR " r1: 0x%" PRIxPTR " r2: 0x%" PRIxPTR " r3: 0x%" PRIxPTR "", |
|
esf->r0, esf->r1, esf->r2, esf->r3); |
|
LOG_ERR(" r4: 0x%" PRIxPTR " r5: 0x%" PRIxPTR " r6: 0x%" PRIxPTR " r7: 0x%" PRIxPTR "", |
|
esf->r4, esf->r5, esf->r6, esf->r7); |
|
LOG_ERR(" r8: 0x%" PRIxPTR " r9: 0x%" PRIxPTR " r10: 0x%" PRIxPTR " r11: 0x%" PRIxPTR "", |
|
esf->r8, esf->r9, esf->r10, esf->r11); |
|
LOG_ERR("r12: 0x%" PRIxPTR " r13: 0x%" PRIxPTR " pc: 0x%" PRIxPTR "", |
|
esf->r12, esf->r13, esf->pc); |
|
LOG_ERR(" blink: 0x%" PRIxPTR " status32: 0x%" PRIxPTR "", esf->blink, esf->status32); |
|
#ifdef CONFIG_ARC_HAS_ZOL |
|
LOG_ERR("lp_end: 0x%" PRIxPTR " lp_start: 0x%" PRIxPTR " lp_count: 0x%" PRIxPTR "", |
|
esf->lp_end, esf->lp_start, esf->lp_count); |
|
#endif /* CONFIG_ARC_HAS_ZOL */ |
|
} |
|
#endif |
|
|
|
void z_arc_fatal_error(unsigned int reason, const z_arch_esf_t *esf) |
|
{ |
|
#ifdef CONFIG_ARC_EXCEPTION_DEBUG |
|
if (esf != NULL) { |
|
dump_arc_esf(esf); |
|
} |
|
#endif /* CONFIG_ARC_EXCEPTION_DEBUG */ |
|
|
|
z_fatal_error(reason, esf); |
|
} |
|
|
|
FUNC_NORETURN void arch_syscall_oops(void *ssf_ptr) |
|
{ |
|
/* TODO: convert ssf_ptr contents into an esf, they are not the same */ |
|
ARG_UNUSED(ssf_ptr); |
|
|
|
z_arc_fatal_error(K_ERR_KERNEL_OOPS, NULL); |
|
CODE_UNREACHABLE; |
|
} |
|
|
|
FUNC_NORETURN void arch_system_halt(unsigned int reason) |
|
{ |
|
ARG_UNUSED(reason); |
|
|
|
__asm__("brk"); |
|
|
|
CODE_UNREACHABLE; |
|
}
|
|
|