sh: Add unaligned memory access for PC relative intructions
This adds unaligned memory access support for the following instructions: mov.w @(disp,PC),Rn mov.l @(disp,PC),Rn These instructions are often used on SH2A toolchains. Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
0710b91c51
commit
34f7145a63
|
@ -316,6 +316,35 @@ static int handle_unaligned_ins(insn_size_t instruction, struct pt_regs *regs,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
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;
|
return ret;
|
||||||
|
|
||||||
|
@ -496,6 +525,9 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x9000: /* mov.w @(disp,Rm),Rn */
|
||||||
|
goto simple;
|
||||||
|
|
||||||
case 0xA000: /* bra label */
|
case 0xA000: /* bra label */
|
||||||
ret = handle_delayslot(regs, instruction, ma);
|
ret = handle_delayslot(regs, instruction, ma);
|
||||||
if (ret==0)
|
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);
|
regs->pc += SH_PC_12BIT_OFFSET(instruction);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0xD000: /* mov.l @(disp,Rm),Rn */
|
||||||
|
goto simple;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue