diff options
Diffstat (limited to 'arch/arm/mm/alignment.c')
| -rw-r--r-- | arch/arm/mm/alignment.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index b8cb1a2688a0..83792f4324ea 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c @@ -41,6 +41,7 @@   * This code is not portable to processors with late data abort handling.   */  #define CODING_BITS(i)	(i & 0x0e000000) +#define COND_BITS(i)	(i & 0xf0000000)  #define LDST_I_BIT(i)	(i & (1 << 26))		/* Immediate constant	*/  #define LDST_P_BIT(i)	(i & (1 << 24))		/* Preindex		*/ @@ -76,6 +77,7 @@  static unsigned long ai_user;  static unsigned long ai_sys; +static void *ai_sys_last_pc;  static unsigned long ai_skipped;  static unsigned long ai_half;  static unsigned long ai_word; @@ -130,7 +132,7 @@ static const char *usermode_action[] = {  static int alignment_proc_show(struct seq_file *m, void *v)  {  	seq_printf(m, "User:\t\t%lu\n", ai_user); -	seq_printf(m, "System:\t\t%lu\n", ai_sys); +	seq_printf(m, "System:\t\t%lu (%pF)\n", ai_sys, ai_sys_last_pc);  	seq_printf(m, "Skipped:\t%lu\n", ai_skipped);  	seq_printf(m, "Half:\t\t%lu\n", ai_half);  	seq_printf(m, "Word:\t\t%lu\n", ai_word); @@ -794,6 +796,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)  		goto user;  	ai_sys += 1; +	ai_sys_last_pc = (void *)instruction_pointer(regs);   fixup: @@ -819,6 +822,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)  		break;  	case 0x04000000:	/* ldr or str immediate */ +		if (COND_BITS(instr) == 0xf0000000) /* NEON VLDn, VSTn */ +			goto bad;  		offset.un = OFFSET_BITS(instr);  		handler = do_alignment_ldrstr;  		break;  |