Additional exception handlers.

Signed-off-by: imi415 <imi415.public@gmail.com>
This commit is contained in:
imi415 2022-09-07 23:11:11 +08:00
parent 886fc31ff0
commit 85ce765a43
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
3 changed files with 59 additions and 4 deletions

View File

@ -3,6 +3,7 @@
#include <stdint.h> #include <stdint.h>
#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 #endif // SH4_CORE_H

View File

@ -5,7 +5,9 @@
#define WEAK_IRQ_ATTR __attribute__((weak, interrupt_handler)) #define WEAK_IRQ_ATTR __attribute__((weak, interrupt_handler))
typedef enum { typedef enum {
EXP_TYPE_TRAP = 0x160, EXP_TYPE_RADDERR = 0x0E0,
EXP_TYPE_WADDERR = 0x100,
EXP_TYPE_TRAP = 0x160,
} expevt_type_t; } expevt_type_t;
typedef enum { typedef enum {
@ -20,7 +22,9 @@ typedef enum {
} intevt_type_t; } intevt_type_t;
typedef enum { typedef enum {
TRA_TYPE_SYSCALL = 34, TRA_TYPE_START_SCHEDULER = 32,
TRA_TYPE_YIELD = 33,
TRA_TYPE_SYSCALL = 34,
} tra_type_t; } tra_type_t;
/* ========================= TMU 0/1/2 Underrun Interrupt Handlers ================================= */ /* ========================= TMU 0/1/2 Underrun Interrupt Handlers ================================= */
@ -39,16 +43,32 @@ WEAK_ATTR void tuni2_handler(void) {
/* ========================= ASC(UART) 0/1/2 Interrupt Handlers ================================= */ /* ========================= 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) { WEAK_ATTR void asc2_handler(void) {
/* Does nothing */ /* Does nothing */
} }
WEAK_ATTR void asc3_handler(void) {
/* Does nothing */
}
/* ========================= Different Trap Code Handlers ================================= */ /* ========================= Different Trap Code Handlers ================================= */
WEAK_ATTR void syscall_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { WEAK_ATTR void syscall_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
/* Does nothing */ /* 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 ================================= */ /* ========================= TRAPA(Trap) Exception Handlers ================================= */
WEAK_ATTR void trap_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { 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: case TRA_TYPE_SYSCALL:
syscall_handler(p1, p2, p3, p4); syscall_handler(p1, p2, p3, p4);
break; break;
case TRA_TYPE_YIELD:
yield_handler(p1, p2, p3, p4);
break;
default: default:
break; 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 ================================= */ /* ========================= System Exception Handlers ================================= */
WEAK_IRQ_ATTR void general_exc_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { 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: case EXP_TYPE_TRAP:
trap_handler(p1, p2, p3, p4); trap_handler(p1, p2, p3, p4);
break; break;
case EXP_TYPE_RADDERR:
radderr_handler();
break;
case EXP_TYPE_WADDERR:
wadderr_handler();
break;
default: default:
break; break;
} }
@ -90,9 +135,18 @@ WEAK_IRQ_ATTR void general_int_handler(void) {
case INT_TYPE_TMU_TNUI2: case INT_TYPE_TMU_TNUI2:
tuni2_handler(); tuni2_handler();
break; break;
case INT_TYPE_ASC_UART0:
asc0_handler();
break;
case INT_TYPE_ASC_UART1:
asc1_handler();
break;
case INT_TYPE_ASC_UART2: case INT_TYPE_ASC_UART2:
asc2_handler(); asc2_handler();
break; break;
case INT_TYPE_ASC_UART3:
asc3_handler();
break;
default: default:
break; break;
} }

View File

@ -40,7 +40,7 @@ void delay_ms(uint32_t msec) {
/* Wait until underflow occurs */ /* Wait until underflow occurs */
while (s_tmu_flag != 1) { while (s_tmu_flag != 1) {
asm("sleep"); __sleep();
} }
s_tmu_flag = 0U; s_tmu_flag = 0U;