regs->pc += hsr.len ? 4 : 2;
}
-/* Read as zero + write ignore */
+/* Read as zero and write ignore */
static void handle_raz_wi(struct cpu_user_regs *regs,
register_t *reg,
bool_t read,
advance_pc(regs, hsr);
}
+/* Write only as write ignore */
+static void handle_wo_wi(struct cpu_user_regs *regs,
+ register_t *reg,
+ bool_t read,
+ const union hsr hsr)
+{
+ if ( read )
+ return inject_undef_exception(regs, hsr);
+ /* else: ignore */
+
+ advance_pc(regs, hsr);
+}
+
+/* Read only as read as zero */
+static void handle_ro_raz(struct cpu_user_regs *regs,
+ register_t *reg,
+ bool_t read,
+ const union hsr hsr)
+{
+ if ( !read )
+ return inject_undef_exception(regs, hsr);
+ /* else: raz */
+
+ *reg = 0;
+
+ advance_pc(regs, hsr);
+}
+
static void do_cp15_32(struct cpu_user_regs *regs,
const union hsr hsr)
{
* Read-only register. Accessible by EL0 if DBGDSCRext.UDCCdis
* is set to 0, which we emulated below.
*/
- if ( !cp32.read )
- return inject_undef_exception(regs, hsr);
-
- *r = 0;
- break;
+ return handle_ro_raz(regs, r, cp32.read, hsr);
case HSR_CPREG32(DBGDSCREXT):
if ( usr_mode(regs) )
case HSR_CPREG32(DBGOSLAR):
if ( usr_mode(regs) )
return inject_undef_exception(regs, hsr);
- /* WO */
- if ( cp32.read )
- return inject_undef_exception(regs, hsr);
- /* else: ignore */
- break;
+ return handle_wo_wi(regs, r, cp32.read, hsr);
default:
gdprintk(XENLOG_ERR,
"%s p14, %d, r%d, cr%d, cr%d, %d @ 0x%"PRIregister"\n",
* Accessible at EL0 only if MDSCR_EL1.TDCC is set to 0. We emulate that
* register as RAZ/WI above. So RO at both EL0 and EL1.
*/
- if ( !hsr.sysreg.read )
- return inject_undef_exception(regs, hsr);
-
- *x = 0;
- break;
+ return handle_ro_raz(regs, x, hsr.sysreg.read, hsr);
/* - Perf monitors */
case HSR_SYSREG_PMUSERENR_EL0:
/* Write only, Write ignore registers: */
case HSR_SYSREG_OSLAR_EL1:
- if ( hsr.sysreg.read )
- return inject_undef_exception(regs, hsr);
- /* else: write ignored */
- break;
+ return handle_wo_wi(regs, x, hsr.sysreg.read, hsr);
+
case HSR_SYSREG_CNTP_CTL_EL0:
case HSR_SYSREG_CNTP_TVAL_EL0:
case HSR_SYSREG_CNTP_CVAL_EL0: