Changeset View
Changeset View
Standalone View
Standalone View
sys/powerpc/powerpc/trap.c
Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
static void syscall(struct trapframe *frame); | static void syscall(struct trapframe *frame); | ||||
#if defined(__powerpc64__) && defined(AIM) | #if defined(__powerpc64__) && defined(AIM) | ||||
static void normalize_inputs(void); | static void normalize_inputs(void); | ||||
#endif | #endif | ||||
extern vm_offset_t __startkernel; | extern vm_offset_t __startkernel; | ||||
extern int copy_fault(void); | |||||
extern int fusufault(void); | |||||
#ifdef KDB | #ifdef KDB | ||||
int db_trap_glue(struct trapframe *); /* Called from trap_subr.S */ | int db_trap_glue(struct trapframe *); /* Called from trap_subr.S */ | ||||
#endif | #endif | ||||
struct powerpc_exception { | struct powerpc_exception { | ||||
u_int vector; | u_int vector; | ||||
char *name; | char *name; | ||||
}; | }; | ||||
▲ Show 20 Lines • Show All 476 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
static int | static int | ||||
handle_onfault(struct trapframe *frame) | handle_onfault(struct trapframe *frame) | ||||
{ | { | ||||
struct thread *td; | struct thread *td; | ||||
jmp_buf *fb; | jmp_buf *fb; | ||||
td = curthread; | td = curthread; | ||||
#if defined(__powerpc64__) || defined(BOOKE) | |||||
uintptr_t dispatch = (uintptr_t)td->td_pcb->pcb_onfault; | |||||
if (dispatch == 0) | |||||
return (0); | |||||
/* Short-circuit radix and Book-E paths. */ | |||||
switch (dispatch) { | |||||
case COPYFAULT: | |||||
frame->srr0 = (uintptr_t)copy_fault; | |||||
return (1); | |||||
case FUSUFAULT: | |||||
frame->srr0 = (uintptr_t)fusufault; | |||||
return (1); | |||||
default: | |||||
break; | |||||
} | |||||
#endif | |||||
fb = td->td_pcb->pcb_onfault; | fb = td->td_pcb->pcb_onfault; | ||||
if (fb != NULL) { | if (fb != NULL) { | ||||
frame->srr0 = (*fb)->_jb[FAULTBUF_LR]; | frame->srr0 = (*fb)->_jb[FAULTBUF_LR]; | ||||
frame->fixreg[1] = (*fb)->_jb[FAULTBUF_R1]; | frame->fixreg[1] = (*fb)->_jb[FAULTBUF_R1]; | ||||
frame->fixreg[2] = (*fb)->_jb[FAULTBUF_R2]; | frame->fixreg[2] = (*fb)->_jb[FAULTBUF_R2]; | ||||
frame->fixreg[3] = 1; | frame->fixreg[3] = 1; | ||||
frame->cr = (*fb)->_jb[FAULTBUF_CR]; | frame->cr = (*fb)->_jb[FAULTBUF_CR]; | ||||
bcopy(&(*fb)->_jb[FAULTBUF_R14], &frame->fixreg[14], | bcopy(&(*fb)->_jb[FAULTBUF_R14], &frame->fixreg[14], | ||||
▲ Show 20 Lines • Show All 368 Lines • Show Last 20 Lines |