ref: f801657f77f3923ec2388c25bdcb036c8019ba89
dir: /trap.c/
#include <u.h>
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "thumb2.h"
#include "include/ureg.h"
#include "libkern/kern.h"
#include "port/error.h"
#define print_regs(sp) \
print("\npc=0x%08ux\nsp=0x%08ux\n", *(int*)(sp + 60), sp); \
print("r0=0x%08ux\nr1=0x%08ux\nr2=0x%08ux\nr3=0x%08ux\n", \
*(int *)(sp + 36),*(int *)(sp + 40),*(int *)(sp + 44),*(int *)(sp + 48)); \
print("r4=0x%08ux\nr5=0x%08ux\nr6=0x%08ux\nr7=0x%08ux\n", \
*(int *)(sp),*(int *)(sp + 4),*(int *)(sp + 8),*(int *)(sp + 12)); \
print("r8=0x%08ux\nr9=0x%08ux\nr10=0x%08ux\nr11=0x%08ux\n", \
*(int *)(sp + 16),*(int *)(sp + 20),*(int *)(sp + 24),*(int *)(sp + 28)); \
print("r12=0x%08ux\nlr=0x%08ux\n", \
*(int *)(sp + 32),*(int *)(sp + 56));
void
trapinit()
{
/* Enable the usage fault exception. */
*(int *)SHCSR_ADDR |= SHCSR_USGFAULTENA;
/* Enable division by zero trapping. */
*(int *)CCR_ADDR |= CCR_DIV_0_TRP | CCR_UNALIGN_TRP;
}
void
switcher(Ureg *ureg)
{
int t;
if (up) up->pc = ureg->pc;
t = m->ticks; /* CPU time per proc */
up = nil; /* no process at interrupt level */
hzclock(ureg);
m->inidle = 0;
up = m->proc;
/* The number of clock ticks is partly used to determine preemption. */
preemption(m->ticks - t);
m->intr++;
m->inidle = 0;
splhi();
}
void
linkproc(void)
{
spllo();
(*up->kpfun)(up->arg);
pexit("end proc", 1);
}
void
kprocchild(Proc *p, void (*func)(void*), void *arg)
{
p->sched.pc = (ulong)linkproc;
p->sched.sp = (ulong)p->kstack+KSTACK-8;
p->kpfun = func;
p->arg = arg;
}
/* fault handlers */
void
dummy_panic()
{
panic("dummy panic\n");
}
void
hard_fault_handler(int sp)
{
print_regs(sp)
allocdump();
panic("hard fault\n");
}
void
bus_fault_handler(int sp)
{
print_regs(sp)
allocdump();
panic("bus fault\n");
}
void
usage_fault_handler(int sp)
{
print_regs(sp)
allocdump();
panic("usage fault\n");
}
void
mem_manage_handler(int sp)
{
print_regs(sp)
allocdump();
panic("memory management\n");
}