From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Campbell Subject: Re: [PATCH 04/19] xen: arm: provide and use a handle_raz_wi helper Date: Thu, 2 Apr 2015 17:19:56 +0100 Message-ID: <1427991596.4037.109.camel@citrix.com> References: <1427796446.2115.34.camel@citrix.com> <1427796462-24376-4-git-send-email-ian.campbell@citrix.com> <551D5CC0.9030709@citrix.com> <1427988686.4037.103.camel@citrix.com> <551D6407.70203@citrix.com> <1427989822.4037.105.camel@citrix.com> <1427990468.4037.107.camel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1427990468.4037.107.camel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Julien Grall Cc: xen-devel@lists.xen.org, julien.grall@linaro.org, tim@xen.org, stefano.stabellini@eu.citrix.com List-Id: xen-devel@lists.xenproject.org On Thu, 2015-04-02 at 17:01 +0100, Ian Campbell wrote: > On Thu, 2015-04-02 at 16:50 +0100, Ian Campbell wrote: > > > Writing to the bottom half (e.g. w0) of a register implicitly clears the > > top half, IIRC, so I think a kernel is unlikely to want to do this, even > > if it could (which I'm not quite convinced of). > > That said, I'll see if I can make something work with the handle_* > taking the reg number instead of a pointer and calling select_user_reg > in each. Actually don't even need that, I think the following does what is needed. I'm not 100% convinced it is needed though, but it's simple enough, and I can't find anything in the ARM ARM right now which rules out what you are suggesting, even if it is unlikely. Ian. diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 71e349a..61a2106 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1585,7 +1585,14 @@ static void handle_raz_wi(struct cpu_user_regs *regs, return inject_undef_exception(regs, hsr); if ( read ) - *reg = 0; + { +#ifdef CONFIG_ARM_64 + if ( psr_mode_is_32bit(regs->cpsr) ) + *reg &= ~0xffffffffUL; + else +#endif + *reg = 0; + } /* else: write ignored */ advance_pc(regs, hsr); @@ -1622,7 +1629,12 @@ static void handle_ro_raz(struct cpu_user_regs *regs, return inject_undef_exception(regs, hsr); /* else: raz */ - *reg = 0; +#ifdef CONFIG_ARM_64 + if ( psr_mode_is_32bit(regs->cpsr) ) + *reg &= ~0xffffffffUL; + else +#endif + *reg = 0; advance_pc(regs, hsr); }