Skip to content

Commit 017f800

Browse files
committed
arch: rx: Add ARCH_EXCEPT for RX architect
Adding ARCH_EXCEPT for RX architect by using unconditional trap interrupt no 3. Signed-off-by: Duy Nguyen <duy.nguyen.xa@renesas.com>
1 parent b7f046d commit 017f800

File tree

6 files changed

+198
-51
lines changed

6 files changed

+198
-51
lines changed

arch/rx/core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ zephyr_library_sources(
1111
thread.c
1212
vects.c
1313
isr_exit.S
14+
fatal.c
1415
)
1516

1617
zephyr_library_sources_ifdef(CONFIG_IRQ_OFFLOAD irq_offload.c)

arch/rx/core/fatal.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright (c) 2025 Renesas Electronics Corporation
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/**
8+
* @file
9+
* @brief Fatal fault handling
10+
*
11+
* This module implements the routines necessary for handling fatal faults on
12+
* RX CPUs.
13+
*/
14+
15+
#include <zephyr/kernel.h>
16+
#include <zephyr/arch/cpu.h>
17+
#include <kernel_arch_data.h>
18+
#include <zephyr/logging/log.h>
19+
#include <zephyr/irq.h>
20+
LOG_MODULE_DECLARE(os, CONFIG_KERNEL_LOG_LEVEL);
21+
22+
#ifdef CONFIG_EXCEPTION_DEBUG
23+
static void dump_rx_esf(const struct arch_esf *esf)
24+
{
25+
LOG_ERR(" ACC_L: 0x%08x ACC_H: 0x%08x", esf->acc_l, esf->acc_h);
26+
LOG_ERR(" r1: 0x%08x r2: 0x%08x r3: 0x%08x", esf->r1, esf->r2, esf->r3);
27+
LOG_ERR(" r4: 0x%08x r5: 0x%08x r6: 0x%08x", esf->r4, esf->r5, esf->r6);
28+
LOG_ERR(" r7: 0x%08x r8: 0x%08x r9: 0x%08x", esf->r7, esf->r8, esf->r9);
29+
LOG_ERR(" r10: 0x%08x r11: 0x%08x r12: 0x%08x", esf->r10, esf->r11, esf->r12);
30+
LOG_ERR(" r13: 0x%08x r14: 0x%08x r15: 0x%08x", esf->r13, esf->r14, esf->r15);
31+
LOG_ERR(" PC: 0x%08x PSW: 0x%08x", esf->entry_point, esf->psw);
32+
}
33+
#endif
34+
35+
void z_rx_fatal_error(unsigned int reason, const struct arch_esf *esf)
36+
{
37+
#ifdef CONFIG_EXCEPTION_DEBUG
38+
if (esf != NULL) {
39+
dump_rx_esf(esf);
40+
}
41+
#endif /* CONFIG_EXCEPTION_DEBUG */
42+
43+
z_fatal_error(reason, esf);
44+
}
45+
FUNC_NORETURN void arch_system_halt(unsigned int reason)
46+
{
47+
ARG_UNUSED(reason);
48+
49+
__asm__("brk");
50+
51+
CODE_UNREACHABLE;
52+
}

arch/rx/core/vects.c

Lines changed: 107 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,28 @@ static void __ISR__ reserved_isr(void)
138138
REGISTER_RESTORE_EXIT();
139139
}
140140

141+
static void __ISR__ INT_RuntimeFatalInterrupt(void)
142+
{
143+
REGISTER_SAVE();
144+
ISR_DIRECT_HEADER();
145+
146+
uint32_t reason;
147+
const struct arch_esf *esf;
148+
149+
/* Read the current values of CPU registers r1 and r0 into C variables
150+
* 'reason' is expected to contain the exception reason (from r1)
151+
* 'esf' is expected to contain a pointer to the exception stack frame (from r0)
152+
*/
153+
__asm__ volatile("mov r1, %0\n\t"
154+
"mov r0, %1\n\t"
155+
: "=r"(reason), "=r"(esf));
156+
157+
z_rx_fatal_error(reason, esf);
158+
159+
ISR_DIRECT_FOOTER(0);
160+
REGISTER_RESTORE_EXIT();
161+
}
162+
141163
/* wrapper for z_rx_context_switch_isr, defined in switch.S */
142164
extern void __ISR__ switch_isr_wrapper(void);
143165

@@ -444,56 +466,90 @@ const void *FixedVectors[] FVECT_SECT = {
444466
};
445467

446468
const fp RelocatableVectors[] RVECT_SECT = {
447-
reserved_isr, switch_isr_wrapper, reserved_isr, reserved_isr, reserved_isr,
448-
reserved_isr, reserved_isr, reserved_isr, reserved_isr, reserved_isr,
449-
reserved_isr, reserved_isr, reserved_isr, reserved_isr, reserved_isr,
450-
reserved_isr, int_demux_16, int_demux_17, int_demux_18, int_demux_19,
451-
int_demux_20, int_demux_21, int_demux_22, int_demux_23, int_demux_24,
452-
int_demux_25, int_demux_26, int_demux_27, int_demux_28, int_demux_29,
453-
int_demux_30, int_demux_31, int_demux_32, int_demux_33, int_demux_34,
454-
int_demux_35, int_demux_36, int_demux_37, int_demux_38, int_demux_39,
455-
int_demux_40, int_demux_41, int_demux_42, int_demux_43, int_demux_44,
456-
int_demux_45, int_demux_46, int_demux_47, int_demux_48, int_demux_49,
457-
int_demux_50, int_demux_51, int_demux_52, int_demux_53, int_demux_54,
458-
int_demux_55, int_demux_56, int_demux_57, int_demux_58, int_demux_59,
459-
int_demux_60, int_demux_61, int_demux_62, int_demux_63, int_demux_64,
460-
int_demux_65, int_demux_66, int_demux_67, int_demux_68, int_demux_69,
461-
int_demux_70, int_demux_71, int_demux_72, int_demux_73, int_demux_74,
462-
int_demux_75, int_demux_76, int_demux_77, int_demux_78, int_demux_79,
463-
int_demux_80, int_demux_81, int_demux_82, int_demux_83, int_demux_84,
464-
int_demux_85, int_demux_86, int_demux_87, int_demux_88, int_demux_89,
465-
int_demux_90, int_demux_91, int_demux_92, int_demux_93, int_demux_94,
466-
int_demux_95, int_demux_96, int_demux_97, int_demux_98, int_demux_99,
467-
int_demux_100, int_demux_101, int_demux_102, int_demux_103, int_demux_104,
468-
int_demux_105, int_demux_106, int_demux_107, int_demux_108, int_demux_109,
469-
int_demux_110, int_demux_111, int_demux_112, int_demux_113, int_demux_114,
470-
int_demux_115, int_demux_116, int_demux_117, int_demux_118, int_demux_119,
471-
int_demux_120, int_demux_121, int_demux_122, int_demux_123, int_demux_124,
472-
int_demux_125, int_demux_126, int_demux_127, int_demux_128, int_demux_129,
473-
int_demux_130, int_demux_131, int_demux_132, int_demux_133, int_demux_134,
474-
int_demux_135, int_demux_136, int_demux_137, int_demux_138, int_demux_139,
475-
int_demux_140, int_demux_141, int_demux_142, int_demux_143, int_demux_144,
476-
int_demux_145, int_demux_146, int_demux_147, int_demux_148, int_demux_149,
477-
int_demux_150, int_demux_151, int_demux_152, int_demux_153, int_demux_154,
478-
int_demux_155, int_demux_156, int_demux_157, int_demux_158, int_demux_159,
479-
int_demux_160, int_demux_161, int_demux_162, int_demux_163, int_demux_164,
480-
int_demux_165, int_demux_166, int_demux_167, int_demux_168, int_demux_169,
481-
int_demux_170, int_demux_171, int_demux_172, int_demux_173, int_demux_174,
482-
int_demux_175, int_demux_176, int_demux_177, int_demux_178, int_demux_179,
483-
int_demux_180, int_demux_181, int_demux_182, int_demux_183, int_demux_184,
484-
int_demux_185, int_demux_186, int_demux_187, int_demux_188, int_demux_189,
485-
int_demux_190, int_demux_191, int_demux_192, int_demux_193, int_demux_194,
486-
int_demux_195, int_demux_196, int_demux_197, int_demux_198, int_demux_199,
487-
int_demux_200, int_demux_201, int_demux_202, int_demux_203, int_demux_204,
488-
int_demux_205, int_demux_206, int_demux_207, int_demux_208, int_demux_209,
489-
int_demux_210, int_demux_211, int_demux_212, int_demux_213, int_demux_214,
490-
int_demux_215, int_demux_216, int_demux_217, int_demux_218, int_demux_219,
491-
int_demux_220, int_demux_221, int_demux_222, int_demux_223, int_demux_224,
492-
int_demux_225, int_demux_226, int_demux_227, int_demux_228, int_demux_229,
493-
int_demux_230, int_demux_231, int_demux_232, int_demux_233, int_demux_234,
494-
int_demux_235, int_demux_236, int_demux_237, int_demux_238, int_demux_239,
495-
int_demux_240, int_demux_241, int_demux_242, int_demux_243, int_demux_244,
496-
int_demux_245, int_demux_246, int_demux_247, int_demux_248, int_demux_249,
497-
int_demux_250, int_demux_251, int_demux_252, int_demux_253, int_demux_254,
469+
reserved_isr, switch_isr_wrapper, INT_RuntimeFatalInterrupt,
470+
reserved_isr, reserved_isr, reserved_isr,
471+
reserved_isr, reserved_isr, reserved_isr,
472+
reserved_isr, reserved_isr, reserved_isr,
473+
reserved_isr, reserved_isr, reserved_isr,
474+
reserved_isr, int_demux_16, int_demux_17,
475+
int_demux_18, int_demux_19, int_demux_20,
476+
int_demux_21, int_demux_22, int_demux_23,
477+
int_demux_24, int_demux_25, int_demux_26,
478+
int_demux_27, int_demux_28, int_demux_29,
479+
int_demux_30, int_demux_31, int_demux_32,
480+
int_demux_33, int_demux_34, int_demux_35,
481+
int_demux_36, int_demux_37, int_demux_38,
482+
int_demux_39, int_demux_40, int_demux_41,
483+
int_demux_42, int_demux_43, int_demux_44,
484+
int_demux_45, int_demux_46, int_demux_47,
485+
int_demux_48, int_demux_49, int_demux_50,
486+
int_demux_51, int_demux_52, int_demux_53,
487+
int_demux_54, int_demux_55, int_demux_56,
488+
int_demux_57, int_demux_58, int_demux_59,
489+
int_demux_60, int_demux_61, int_demux_62,
490+
int_demux_63, int_demux_64, int_demux_65,
491+
int_demux_66, int_demux_67, int_demux_68,
492+
int_demux_69, int_demux_70, int_demux_71,
493+
int_demux_72, int_demux_73, int_demux_74,
494+
int_demux_75, int_demux_76, int_demux_77,
495+
int_demux_78, int_demux_79, int_demux_80,
496+
int_demux_81, int_demux_82, int_demux_83,
497+
int_demux_84, int_demux_85, int_demux_86,
498+
int_demux_87, int_demux_88, int_demux_89,
499+
int_demux_90, int_demux_91, int_demux_92,
500+
int_demux_93, int_demux_94, int_demux_95,
501+
int_demux_96, int_demux_97, int_demux_98,
502+
int_demux_99, int_demux_100, int_demux_101,
503+
int_demux_102, int_demux_103, int_demux_104,
504+
int_demux_105, int_demux_106, int_demux_107,
505+
int_demux_108, int_demux_109, int_demux_110,
506+
int_demux_111, int_demux_112, int_demux_113,
507+
int_demux_114, int_demux_115, int_demux_116,
508+
int_demux_117, int_demux_118, int_demux_119,
509+
int_demux_120, int_demux_121, int_demux_122,
510+
int_demux_123, int_demux_124, int_demux_125,
511+
int_demux_126, int_demux_127, int_demux_128,
512+
int_demux_129, int_demux_130, int_demux_131,
513+
int_demux_132, int_demux_133, int_demux_134,
514+
int_demux_135, int_demux_136, int_demux_137,
515+
int_demux_138, int_demux_139, int_demux_140,
516+
int_demux_141, int_demux_142, int_demux_143,
517+
int_demux_144, int_demux_145, int_demux_146,
518+
int_demux_147, int_demux_148, int_demux_149,
519+
int_demux_150, int_demux_151, int_demux_152,
520+
int_demux_153, int_demux_154, int_demux_155,
521+
int_demux_156, int_demux_157, int_demux_158,
522+
int_demux_159, int_demux_160, int_demux_161,
523+
int_demux_162, int_demux_163, int_demux_164,
524+
int_demux_165, int_demux_166, int_demux_167,
525+
int_demux_168, int_demux_169, int_demux_170,
526+
int_demux_171, int_demux_172, int_demux_173,
527+
int_demux_174, int_demux_175, int_demux_176,
528+
int_demux_177, int_demux_178, int_demux_179,
529+
int_demux_180, int_demux_181, int_demux_182,
530+
int_demux_183, int_demux_184, int_demux_185,
531+
int_demux_186, int_demux_187, int_demux_188,
532+
int_demux_189, int_demux_190, int_demux_191,
533+
int_demux_192, int_demux_193, int_demux_194,
534+
int_demux_195, int_demux_196, int_demux_197,
535+
int_demux_198, int_demux_199, int_demux_200,
536+
int_demux_201, int_demux_202, int_demux_203,
537+
int_demux_204, int_demux_205, int_demux_206,
538+
int_demux_207, int_demux_208, int_demux_209,
539+
int_demux_210, int_demux_211, int_demux_212,
540+
int_demux_213, int_demux_214, int_demux_215,
541+
int_demux_216, int_demux_217, int_demux_218,
542+
int_demux_219, int_demux_220, int_demux_221,
543+
int_demux_222, int_demux_223, int_demux_224,
544+
int_demux_225, int_demux_226, int_demux_227,
545+
int_demux_228, int_demux_229, int_demux_230,
546+
int_demux_231, int_demux_232, int_demux_233,
547+
int_demux_234, int_demux_235, int_demux_236,
548+
int_demux_237, int_demux_238, int_demux_239,
549+
int_demux_240, int_demux_241, int_demux_242,
550+
int_demux_243, int_demux_244, int_demux_245,
551+
int_demux_246, int_demux_247, int_demux_248,
552+
int_demux_249, int_demux_250, int_demux_251,
553+
int_demux_252, int_demux_253, int_demux_254,
498554
int_demux_255,
499555
};

arch/rx/include/kernel_arch_func.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ static inline bool arch_is_in_isr(void)
2525
}
2626

2727
extern void z_rx_arch_switch(void *switch_to, void **switched_from);
28+
extern void z_rx_fatal_error(unsigned int reason, const struct arch_esf *esf);
2829

2930
static inline void arch_switch(void *switch_to, void **switched_from)
3031
{

include/zephyr/arch/rx/arch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <zephyr/arch/rx/thread.h>
1515
#include <zephyr/arch/rx/misc.h>
1616
#include <zephyr/arch/rx/arch_inlines.h>
17+
#include <zephyr/arch/rx/error.h>
1718
#include <zephyr/arch/common/sys_bitops.h>
1819
#include <zephyr/arch/common/sys_io.h>
1920
#include <zephyr/arch/common/ffs.h>

include/zephyr/arch/rx/error.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright (c) 2025 Renesas Electronics Corporation
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/**
8+
* @file
9+
* @brief Renesas RX arch public error handling
10+
*
11+
* Renesas RX-specific kernel error handling interface. Included by
12+
* rx/arch.h.
13+
*/
14+
15+
#ifndef ZEPHYR_INCLUDE_ARCH_RX_ERROR_H_
16+
#define ZEPHYR_INCLUDE_ARCH_RX_ERROR_H_
17+
18+
#include <stdbool.h>
19+
20+
#ifdef __cplusplus
21+
extern "C" {
22+
#endif
23+
24+
#define ARCH_EXCEPT(reason_p) \
25+
do { \
26+
arch_irq_unlock(0); \
27+
__asm__ volatile("mov %[_reason], r1\n\t" \
28+
"int #2\n\t" ::[_reason] "r"(reason_p) \
29+
: "r1", "memory"); \
30+
} while (false)
31+
32+
#ifdef __cplusplus
33+
}
34+
#endif
35+
36+
#endif /* ZEPHYR_INCLUDE_ARCH_RX_ERROR_H_ */

0 commit comments

Comments
 (0)