|
@@ -1844,27 +1844,32 @@ static int emulate_sys_reg(u32 id, u64 *valp)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int emulate_mrs(struct pt_regs *regs, u32 insn)
|
|
|
+int do_emulate_mrs(struct pt_regs *regs, u32 sys_reg, u32 rt)
|
|
|
{
|
|
|
int rc;
|
|
|
- u32 sys_reg, dst;
|
|
|
u64 val;
|
|
|
|
|
|
- /*
|
|
|
- * sys_reg values are defined as used in mrs/msr instruction.
|
|
|
- * shift the imm value to get the encoding.
|
|
|
- */
|
|
|
- sys_reg = (u32)aarch64_insn_decode_immediate(AARCH64_INSN_IMM_16, insn) << 5;
|
|
|
rc = emulate_sys_reg(sys_reg, &val);
|
|
|
if (!rc) {
|
|
|
- dst = aarch64_insn_decode_register(AARCH64_INSN_REGTYPE_RT, insn);
|
|
|
- pt_regs_write_reg(regs, dst, val);
|
|
|
+ pt_regs_write_reg(regs, rt, val);
|
|
|
arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
|
|
|
}
|
|
|
-
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+static int emulate_mrs(struct pt_regs *regs, u32 insn)
|
|
|
+{
|
|
|
+ u32 sys_reg, rt;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * sys_reg values are defined as used in mrs/msr instruction.
|
|
|
+ * shift the imm value to get the encoding.
|
|
|
+ */
|
|
|
+ sys_reg = (u32)aarch64_insn_decode_immediate(AARCH64_INSN_IMM_16, insn) << 5;
|
|
|
+ rt = aarch64_insn_decode_register(AARCH64_INSN_REGTYPE_RT, insn);
|
|
|
+ return do_emulate_mrs(regs, sys_reg, rt);
|
|
|
+}
|
|
|
+
|
|
|
static struct undef_hook mrs_hook = {
|
|
|
.instr_mask = 0xfff00000,
|
|
|
.instr_val = 0xd5300000,
|