[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 05/19] xen: arm: Add and use r/o+raz and w/o+wi helpers
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- v2: Move last paramter of a handle_ro_raz call to next patch where it belongs. --- xen/arch/arm/traps.c | 52 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 8b1846a..b54aef6 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1587,6 +1587,34 @@ static void handle_raz_wi(struct cpu_user_regs *regs, advance_pc(regs, hsr); } +/* Write only + 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 + 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) { @@ -1737,11 +1765,7 @@ static void do_cp14_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) ) @@ -1768,11 +1792,7 @@ static void do_cp14_32(struct cpu_user_regs *regs, const union hsr hsr) 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", @@ -1857,11 +1877,7 @@ static void do_sysreg(struct cpu_user_regs *regs, * 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: @@ -1891,10 +1907,8 @@ static void do_sysreg(struct cpu_user_regs *regs, /* 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: -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |