|
@@ -316,6 +316,35 @@ static int handle_unaligned_ins(insn_size_t instruction, struct pt_regs *regs,
|
|
|
break;
|
|
|
}
|
|
|
break;
|
|
|
+
|
|
|
+ case 9: /* mov.w @(disp,PC),Rn */
|
|
|
+ srcu = (unsigned char __user *)regs->pc;
|
|
|
+ srcu += 4;
|
|
|
+ srcu += (instruction & 0x00FF) << 1;
|
|
|
+ dst = (unsigned char *)rn;
|
|
|
+ *(unsigned long *)dst = 0;
|
|
|
+
|
|
|
+#if !defined(__LITTLE_ENDIAN__)
|
|
|
+ dst += 2;
|
|
|
+#endif
|
|
|
+
|
|
|
+ if (ma->from(dst, srcu, 2))
|
|
|
+ goto fetch_fault;
|
|
|
+ sign_extend(2, dst);
|
|
|
+ ret = 0;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 0xd: /* mov.l @(disp,PC),Rn */
|
|
|
+ srcu = (unsigned char __user *)(regs->pc & ~0x3);
|
|
|
+ srcu += 4;
|
|
|
+ srcu += (instruction & 0x00FF) << 2;
|
|
|
+ dst = (unsigned char *)rn;
|
|
|
+ *(unsigned long *)dst = 0;
|
|
|
+
|
|
|
+ if (ma->from(dst, srcu, 4))
|
|
|
+ goto fetch_fault;
|
|
|
+ ret = 0;
|
|
|
+ break;
|
|
|
}
|
|
|
return ret;
|
|
|
|
|
@@ -496,6 +525,9 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs,
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
+ case 0x9000: /* mov.w @(disp,Rm),Rn */
|
|
|
+ goto simple;
|
|
|
+
|
|
|
case 0xA000: /* bra label */
|
|
|
ret = handle_delayslot(regs, instruction, ma);
|
|
|
if (ret==0)
|
|
@@ -509,6 +541,9 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs,
|
|
|
regs->pc += SH_PC_12BIT_OFFSET(instruction);
|
|
|
}
|
|
|
break;
|
|
|
+
|
|
|
+ case 0xD000: /* mov.l @(disp,Rm),Rn */
|
|
|
+ goto simple;
|
|
|
}
|
|
|
return ret;
|
|
|
|