Vhex-kernel/src/kernel/drivers/vbr/exception.c

91 lines
2.2 KiB
C
Raw Normal View History

2020-03-15 00:56:31 +01:00
#include <kernel/devices/earlyterm.h>
#include <kernel/drivers/vbr.h>
#include <kernel/process.h>
void exception_handler(void)
{
extern struct process *process_current;
uint32_t stack;
uint32_t spc;
uint32_t ssr;
uint32_t evt;
uint32_t tea;
// Get some registers's data.
__asm__ volatile ("stc spc, %0" : "=r"(spc));
__asm__ volatile ("stc ssr, %0" : "=r"(ssr));
__asm__ volatile ("mov r15, %0" : "=r"(stack));
// Get event code and tea regsiter
evt = *((uint32_t *)0xff000024);
tea = *((uint32_t *)0xff00000c);
// Display error screen
2020-03-15 00:56:31 +01:00
earlyterm_clear();
switch (evt)
{
case EXP_CODE_ACCESS_READ:
case EXP_CODE_ACCESS_WRITE:
earlyterm_write("CPU Access Violation (R/W)\n");
earlyterm_write("> Address : %p\n", tea);
break;
case EXP_CODE_BAD_INSTR:
case EXP_CODE_BAD_SLOTINSTR:
if(evt == EXP_CODE_BAD_SLOTINSTR)
earlyterm_write("Illegal slot instruction\n");
else
earlyterm_write("Illegal instruction\n");
earlyterm_write("> TEA value = %p\n", tea);
earlyterm_write("> TEA correct = %p\n", tea >> 2 << 2);
break;
case EXP_CODE_USER_BREAK:
earlyterm_write("Unexpected User Break exception.\n");
while(1);
case EXP_CODE_TLB_INITWRITE:
earlyterm_write("Initial MMU page write (bloking).\n");
while (1);
case EXP_CODE_TLB_PROTECT_R:
case EXP_CODE_TLB_PROTECT_W:
earlyterm_write("TLB protection violation (blocking)");
while (1);
case EXP_CODE_TLB_READ:
case EXP_CODE_TLB_WRITE:
earlyterm_write("TLB miss (blocking)");
while (1);
default:
earlyterm_write("Ho crap ! Unkonow exception !\n");
earlyterm_write("> EXPEVT : %#x\n", evt);
earlyterm_write("> TEA value = %p\n", tea);
}
// Common display
earlyterm_write("> SPC Value = %p\n", spc);
earlyterm_write("> Process : %p\n", process_current);
earlyterm_write("> Process entry : %p\n", process_current->memory.program.start);
earlyterm_write("> Proc rela. PC = %p\n", spc - (uint32_t)process_current->memory.program.start);
while (1);
/* // Write exception informations.
2020-03-15 00:56:31 +01:00
earlyterm_write(
"Ho crap ! Exception !\n"
"tra: %#x\n"
"expevt: %#x\n"
"spc: %#x\n"
"ssr: %#x\n"
"sr: %#x",
*((uint32_t *)0xff000020),
,
spc,
ssr,
sr
);
while (1);*/
}