Module Name: src Committed By: matt Date: Wed Mar 5 02:18:30 UTC 2014
Modified Files: src/sys/arch/arm/arm: undefined.c Log Message: frame -> tf printf out the insn, faulting pc, lr, sp when we get an undefined insn int the kernel. To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/sys/arch/arm/arm/undefined.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/arm/undefined.c diff -u src/sys/arch/arm/arm/undefined.c:1.51 src/sys/arch/arm/arm/undefined.c:1.52 --- src/sys/arch/arm/arm/undefined.c:1.51 Wed Jan 29 18:45:21 2014 +++ src/sys/arch/arm/arm/undefined.c Wed Mar 5 02:18:30 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: undefined.c,v 1.51 2014/01/29 18:45:21 matt Exp $ */ +/* $NetBSD: undefined.c,v 1.52 2014/03/05 02:18:30 matt Exp $ */ /* * Copyright (c) 2001 Ben Harris. @@ -54,7 +54,7 @@ #include <sys/kgdb.h> #endif -__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.51 2014/01/29 18:45:21 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.52 2014/03/05 02:18:30 matt Exp $"); #include <sys/kmem.h> #include <sys/queue.h> @@ -128,12 +128,12 @@ static struct evcnt cp15_ev = EVCNT_ATTACH_STATIC(cp15_ev); static int -cp15_trapper(u_int addr, u_int insn, struct trapframe *frame, int code) +cp15_trapper(u_int addr, u_int insn, struct trapframe *tf, int code) { struct lwp * const l = curlwp; #if defined(THUMB_CODE) && !defined(CPU_ARMV7) - if (frame->tf_spsr & PSR_T_bit) + if (tf->tf_spsr & PSR_T_bit) return 1; #endif if (code != FAULT_USER) @@ -149,14 +149,14 @@ cp15_trapper(u_int addr, u_int insn, str /* * Get a pointer to the register used in the instruction to be emulated. */ - register_t * const regp = &frame->tf_r0 + regno; + register_t * const regp = &tf->tf_r0 + regno; /* * Handle MRC p15, 0, <Rd>, c13, c0, 3 (Read User read-only thread id) */ if ((insn & 0xffff0fff) == 0xee1d0f70) { *regp = (uintptr_t)l->l_private; - frame->tf_pc += INSN_SIZE; + tf->tf_pc += INSN_SIZE; cp15_ev.ev_count++; return 0; } @@ -170,7 +170,7 @@ cp15_trapper(u_int addr, u_int insn, str *regp = pcb->pcb_user_pid_rw; else pcb->pcb_user_pid_rw = *regp; - frame->tf_pc += INSN_SIZE; + tf->tf_pc += INSN_SIZE; cp15_ev.ev_count++; return 0; } @@ -179,12 +179,12 @@ cp15_trapper(u_int addr, u_int insn, str } static int -gdb_trapper(u_int addr, u_int insn, struct trapframe *frame, int code) +gdb_trapper(u_int addr, u_int insn, struct trapframe *tf, int code) { struct lwp * const l = curlwp; #ifdef THUMB_CODE - if (frame->tf_spsr & PSR_T_bit) { + if (tf->tf_spsr & PSR_T_bit) { if (insn == GDB_THUMB_BREAKPOINT) goto bkpt; } @@ -207,7 +207,7 @@ gdb_trapper(u_int addr, u_int insn, stru return 0; } #ifdef KGDB - return !kgdb_trap(T_BREAKPOINT, frame); + return !kgdb_trap(T_BREAKPOINT, tf); #endif } } @@ -247,10 +247,10 @@ static struct evcnt und_ev = EVCNT_ATTACH_STATIC(und_ev); void -undefinedinstruction(trapframe_t *frame) +undefinedinstruction(trapframe_t *tf) { struct lwp *l; - u_int fault_pc; + vaddr_t fault_pc; int fault_instruction; int fault_code; int coprocessor; @@ -264,36 +264,36 @@ undefinedinstruction(trapframe_t *frame) /* Enable interrupts if they were enabled before the exception. */ #ifdef acorn26 - if ((frame->tf_r15 & R15_IRQ_DISABLE) == 0) + if ((tf->tf_r15 & R15_IRQ_DISABLE) == 0) int_on(); #else - restore_interrupts(frame->tf_spsr & IF32_bits); + restore_interrupts(tf->tf_spsr & IF32_bits); #endif #ifndef acorn26 #ifdef THUMB_CODE - if (frame->tf_spsr & PSR_T_bit) - frame->tf_pc -= THUMB_INSN_SIZE; + if (tf->tf_spsr & PSR_T_bit) + tf->tf_pc -= THUMB_INSN_SIZE; else #endif { - frame->tf_pc -= INSN_SIZE; + tf->tf_pc -= INSN_SIZE; } #endif #ifdef __PROG26 - fault_pc = frame->tf_r15 & R15_PC; + fault_pc = tf->tf_r15 & R15_PC; #else - fault_pc = frame->tf_pc; + fault_pc = tf->tf_pc; #endif /* Get the current lwp/proc structure or lwp0/proc0 if there is none. */ l = curlwp; #ifdef __PROG26 - if ((frame->tf_r15 & R15_MODE) == R15_MODE_USR) { + if ((tf->tf_r15 & R15_MODE) == R15_MODE_USR) { #else - if ((frame->tf_spsr & PSR_MODE) == PSR_USR32_MODE) { + if ((tf->tf_spsr & PSR_MODE) == PSR_USR32_MODE) { #endif user = 1; LWP_CACHE_CREDS(l, l->l_proc); @@ -302,7 +302,7 @@ undefinedinstruction(trapframe_t *frame) #ifdef THUMB_CODE - if (frame->tf_spsr & PSR_T_bit) { + if (tf->tf_spsr & PSR_T_bit) { fault_instruction = read_thumb_insn(fault_pc, user); if (fault_instruction >= 0xe000) { fault_instruction = (fault_instruction << 16) @@ -342,7 +342,7 @@ undefinedinstruction(trapframe_t *frame) curcpu()->ci_data.cpu_ntrap++; #ifdef THUMB_CODE - if ((frame->tf_spsr & PSR_T_bit) && !CPU_IS_ARMV7_P()) { + if ((tf->tf_spsr & PSR_T_bit) && !CPU_IS_ARMV7_P()) { coprocessor = THUMB_UNKNOWN_HANDLER; } else @@ -364,7 +364,7 @@ undefinedinstruction(trapframe_t *frame) && (fault_instruction & 0xf0000000) != 0xf0000000) { coprocessor = (fault_instruction >> 8) & 0x0f; #ifdef THUMB_CODE - } else if ((frame->tf_spsr & PSR_T_bit) && !CPU_IS_ARMV7_P()) { + } else if ((tf->tf_spsr & PSR_T_bit) && !CPU_IS_ARMV7_P()) { coprocessor = THUMB_UNKNOWN_HANDLER; #endif } else { @@ -378,13 +378,13 @@ undefinedinstruction(trapframe_t *frame) * time of fault. */ fault_code = FAULT_USER; - lwp_settrapframe(l, frame); + lwp_settrapframe(l, tf); } else fault_code = 0; /* OK this is were we do something about the instruction. */ LIST_FOREACH(uh, &undefined_handlers[coprocessor], uh_link) - if (uh->uh_handler(fault_pc, fault_instruction, frame, + if (uh->uh_handler(fault_pc, fault_instruction, tf, fault_code) == 0) break; @@ -415,10 +415,11 @@ undefinedinstruction(trapframe_t *frame) if ((fault_code & FAULT_USER) == 0) { #ifdef DDB - db_printf("Undefined instruction in kernel\n"); - kdb_trap(T_FAULT, frame); + db_printf("Undefined instruction %#x in kernel at %#lx (LR %#x SP %#x)\n", + fault_instruction, fault_pc, tf->tf_svc_lr, tf->tf_svc_sp); + kdb_trap(T_FAULT, tf); #else - panic("undefined instruction in kernel"); + panic("undefined instruction %#x in kernel at %#lx", fault_instruction, fault_pc); #endif } KSI_INIT_TRAP(&ksi);