Additional exception handlers.
Signed-off-by: imi415 <imi415.public@gmail.com>
This commit is contained in:
parent
886fc31ff0
commit
85ce765a43
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue