Module Name: src Committed By: matt Date: Sun Aug 18 08:08:15 UTC 2013
Modified Files: src/sys/arch/arm/arm: undefined.c Log Message: Properly recognize Thumb2 instructions. (a thumb2 FP programs correctly runs now). To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 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.49 src/sys/arch/arm/arm/undefined.c:1.50 --- src/sys/arch/arm/arm/undefined.c:1.49 Sun Aug 18 06:28:18 2013 +++ src/sys/arch/arm/arm/undefined.c Sun Aug 18 08:08:15 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: undefined.c,v 1.49 2013/08/18 06:28:18 matt Exp $ */ +/* $NetBSD: undefined.c,v 1.50 2013/08/18 08:08:15 matt Exp $ */ /* * Copyright (c) 2001 Ben Harris. @@ -54,7 +54,7 @@ #include <sys/kgdb.h> #endif -__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.49 2013/08/18 06:28:18 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.50 2013/08/18 08:08:15 matt Exp $"); #include <sys/kmem.h> #include <sys/queue.h> @@ -303,7 +303,7 @@ undefinedinstruction(trapframe_t *frame) #ifdef THUMB_CODE if (frame->tf_spsr & PSR_T_bit) { - const uint16_t *pc = (const uint16_t *)(fault_pc & ~1); + const uint16_t * const pc = (const uint16_t *)(fault_pc & ~1); fault_instruction = pc[0]; #if defined(__ARMEB__) && defined(_ARM_ARCH_7) fault_instruction = le16toh(fault_instruction); @@ -353,7 +353,7 @@ undefinedinstruction(trapframe_t *frame) curcpu()->ci_data.cpu_ntrap++; #ifdef THUMB_CODE - if (frame->tf_spsr & PSR_T_bit) { + if ((frame->tf_spsr & PSR_T_bit) && !CPU_IS_ARMV7_P()) { coprocessor = THUMB_UNKNOWN_HANDLER; } else @@ -372,10 +372,15 @@ undefinedinstruction(trapframe_t *frame) */ if ((fault_instruction & (1 << 27)) != 0 - && (fault_instruction & 0xf0000000) != 0xf0000000) + && (fault_instruction & 0xf0000000) != 0xf0000000) { coprocessor = (fault_instruction >> 8) & 0x0f; - else +#ifdef THUMB_CODE + } else if ((frame->tf_spsr & PSR_T_bit) && !CPU_IS_ARMV7_P()) { + coprocessor = THUMB_UNKNOWN_HANDLER; +#endif + } else { coprocessor = CORE_UNKNOWN_HANDLER; + } } if (user) {