From 85ce765a43827ffa06e080681812c97b2ec72df9 Mon Sep 17 00:00:00 2001 From: imi415 Date: Wed, 7 Sep 2022 23:11:11 +0800 Subject: [PATCH] Additional exception handlers. Signed-off-by: imi415 --- include/sh4_core.h | 3 ++- src/stx7105_exc.c | 58 +++++++++++++++++++++++++++++++++++++++++++-- src/stx7105_utils.c | 2 +- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/include/sh4_core.h b/include/sh4_core.h index 3cb821d..958b07f 100644 --- a/include/sh4_core.h +++ b/include/sh4_core.h @@ -3,6 +3,7 @@ #include -#define __trapa(code) asm volatile("trapa %0" :: "i" (code)) +#define __trapa(code) asm volatile("trapa %0" ::"i"(code)) +#define __sleep() asm volatile("sleep") #endif // SH4_CORE_H diff --git a/src/stx7105_exc.c b/src/stx7105_exc.c index 10d32eb..f354202 100644 --- a/src/stx7105_exc.c +++ b/src/stx7105_exc.c @@ -5,7 +5,9 @@ #define WEAK_IRQ_ATTR __attribute__((weak, interrupt_handler)) typedef enum { - EXP_TYPE_TRAP = 0x160, + EXP_TYPE_RADDERR = 0x0E0, + EXP_TYPE_WADDERR = 0x100, + EXP_TYPE_TRAP = 0x160, } expevt_type_t; typedef enum { @@ -20,7 +22,9 @@ typedef enum { } intevt_type_t; typedef enum { - TRA_TYPE_SYSCALL = 34, + TRA_TYPE_START_SCHEDULER = 32, + TRA_TYPE_YIELD = 33, + TRA_TYPE_SYSCALL = 34, } tra_type_t; /* ========================= TMU 0/1/2 Underrun Interrupt Handlers ================================= */ @@ -39,16 +43,32 @@ WEAK_ATTR void tuni2_handler(void) { /* ========================= ASC(UART) 0/1/2 Interrupt Handlers ================================= */ +WEAK_ATTR void asc0_handler(void) { + /* Does nothing */ +} + +WEAK_ATTR void asc1_handler(void) { + /* Does nothing */ +} + WEAK_ATTR void asc2_handler(void) { /* Does nothing */ } +WEAK_ATTR void asc3_handler(void) { + /* Does nothing */ +} + /* ========================= Different Trap Code Handlers ================================= */ WEAK_ATTR void syscall_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { /* Does nothing */ } +WEAK_ATTR void yield_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { + /* Does nothing */ +} + /* ========================= TRAPA(Trap) Exception Handlers ================================= */ WEAK_ATTR void trap_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { @@ -58,11 +78,30 @@ WEAK_ATTR void trap_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) case TRA_TYPE_SYSCALL: syscall_handler(p1, p2, p3, p4); break; + case TRA_TYPE_YIELD: + yield_handler(p1, p2, p3, p4); + break; default: break; } } +/* ========================= Address Error Exception Handlers ================================= */ + +WEAK_ATTR void radderr_handler(void) { + /* Dead... */ + for (;;) { + /* Loop... */ + } +} + +WEAK_ATTR void wadderr_handler(void) { + /* Dead... */ + for (;;) { + /* Loop... */ + } +} + /* ========================= System Exception Handlers ================================= */ WEAK_IRQ_ATTR void general_exc_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { @@ -71,6 +110,12 @@ WEAK_IRQ_ATTR void general_exc_handler(uint32_t p1, uint32_t p2, uint32_t p3, ui case EXP_TYPE_TRAP: trap_handler(p1, p2, p3, p4); break; + case EXP_TYPE_RADDERR: + radderr_handler(); + break; + case EXP_TYPE_WADDERR: + wadderr_handler(); + break; default: break; } @@ -90,9 +135,18 @@ WEAK_IRQ_ATTR void general_int_handler(void) { case INT_TYPE_TMU_TNUI2: tuni2_handler(); break; + case INT_TYPE_ASC_UART0: + asc0_handler(); + break; + case INT_TYPE_ASC_UART1: + asc1_handler(); + break; case INT_TYPE_ASC_UART2: asc2_handler(); break; + case INT_TYPE_ASC_UART3: + asc3_handler(); + break; default: break; } diff --git a/src/stx7105_utils.c b/src/stx7105_utils.c index 6df3e5f..afc72f0 100644 --- a/src/stx7105_utils.c +++ b/src/stx7105_utils.c @@ -40,7 +40,7 @@ void delay_ms(uint32_t msec) { /* Wait until underflow occurs */ while (s_tmu_flag != 1) { - asm("sleep"); + __sleep(); } s_tmu_flag = 0U;