All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@linaro.org>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: Stefano.Stabellini@eu.citrix.com, Tim Deegan <tim@xen.org>,
	patches@linaro.org, xen-devel@lists.xen.org
Subject: Re: [PATCH v2 3/3] xen/arm: errata 766422: decode thumb store during data abort
Date: Tue, 30 Jul 2013 18:37:42 +0100	[thread overview]
Message-ID: <51F7F9E6.5000704@linaro.org> (raw)
In-Reply-To: <1375110911.12741.34.camel@kazak.uk.xensource.com>

On 07/29/2013 04:15 PM, Ian Campbell wrote:
> On Thu, 2013-07-25 at 16:21 +0100, Julien Grall wrote:
>> @@ -996,6 +997,28 @@ done:
>>      if (first) unmap_domain_page(first);
>>  }
>>  
>> +static int read_instruction(struct cpu_user_regs *regs, unsigned len,
>> +                            uint32_t *instr)
>> +{
>> +    int rc;
>> +
>> +    rc = raw_copy_from_guest(instr, (void * __user)regs->pc, (len ? 4 : 2));
>> +
>> +    if ( rc )
>> +        return rc;
>> +
>> +    if ( !len ) /* 16-bit instruction */
>> +        *instr &= 0xffff;
>> +    else /* 32-bit instruction */
>> +    {
>> +        /* THUMB 32-bit instruction consisting of 2 consecutive halfwords */
> 
> Please could you incorporate something like Tim's description from
> <20130729144626.GI37169@ocelot.phlegethon.org> to make it totally
> obvious what is going on here.
> 
>> +        if ( regs->cpsr & PSR_THUMB )
>> +            *instr = (*instr & 0xffff) << 16 | (*instr & 0xffff0000) >> 16;
> 
> Please can you add a comment like
>           /* else: already in correct order for an ARM instruction */
> 
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>>  static void do_trap_data_abort_guest(struct cpu_user_regs *regs,
>>                                       struct hsr_dabt dabt)
>>  {
>> @@ -1021,6 +1044,27 @@ static void do_trap_data_abort_guest(struct cpu_user_regs *regs,
>>      if ( !dabt.valid )
>>          goto bad_data_abort;
>>  
>> +    /*
>> +     * Errata 766422: Thumb store translation fault to Hypervisor may
>> +     * not have correct HSR Rt value.
>> +     */
>> +    if ( cpu_has_errata_766422() && (regs->cpsr & PSR_THUMB) && dabt.write )
>> +    {
>> +        uint32_t instr = 0;
>> +
>> +        rc = read_instruction(regs, dabt.len, &instr);
>> +        if ( rc )
>> +            goto bad_data_abort;
>> +
>> +        /* Retrieve the transfer register from the instruction */
>> +        if ( dabt.len )
>> +            /* With 32-bit store instruction, the register is in [12..15] */
>> +            info.dabt.reg = (instr & 0xf000) >> 12;
>> +        else
>> +            /* With 16-bit store instruction, the register is in [0..3] */
>> +            info.dabt.reg = instr & 0x7;
> 
> Encoding T2 (store via imm8 offset from sp) has it in 8..10.

Right but ... from ARM DDI 0406C.b B3-1432: an instruction is valid if
it "is not using the PC as its destination register". So this
instruction is consider as invalid and will go to "bad_data_abort".

Is a comment is enough to explain why we don't need to decode it?

> 
> Also for clarity I think you should write "With a NN-bit Thumb store
> instruction".
> 
>> +    }
>> +
>>      if (handle_mmio(&info))
>>      {
>>          regs->pc += dabt.len ? 4 : 2;
>> diff --git a/xen/include/asm-arm/arm32/processor.h b/xen/include/asm-arm/arm32/processor.h
>> index b266252..bc82fbc 100644
>> --- a/xen/include/asm-arm/arm32/processor.h
>> +++ b/xen/include/asm-arm/arm32/processor.h
>> @@ -111,6 +111,9 @@ struct cpu_user_regs
>>  #define READ_SYSREG(R...)       READ_SYSREG32(R)
>>  #define WRITE_SYSREG(V, R...)   WRITE_SYSREG32(V, R)
>>  
>> +/* Errata 766422: only Cortex A15 r0p4 is affected */
>> +#define cpu_has_errata_766422() (current_cpu_data.midr.bits == 0x410fc0f4)
> 
> Do we have unlikely() in Xen? If yes then I think this is a good place
> to use it.

Yes. I will use it.

-- 
Julien

  reply	other threads:[~2013-07-30 17:37 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-25 15:21 [PATCH v2 0/3] Add support for THUMB guest kernel Julien Grall
2013-07-25 15:21 ` [PATCH v2 1/3] xen/arm: Don't emulate the MMIO access if the instruction syndrome is invalid Julien Grall
2013-07-29 15:57   ` Ian Campbell
2013-07-25 15:21 ` [PATCH v2 2/3] xen/arm: Allow secondary cpus to start in THUMB Julien Grall
2013-07-29 15:57   ` Ian Campbell
2013-07-25 15:21 ` [PATCH v2 3/3] xen/arm: errata 766422: decode thumb store during data abort Julien Grall
2013-07-29 15:15   ` Ian Campbell
2013-07-30 17:37     ` Julien Grall [this message]
2013-07-31  8:47       ` Ian Campbell
2013-07-31 10:19         ` Julien Grall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51F7F9E6.5000704@linaro.org \
    --to=julien.grall@linaro.org \
    --cc=Ian.Campbell@citrix.com \
    --cc=Stefano.Stabellini@eu.citrix.com \
    --cc=patches@linaro.org \
    --cc=tim@xen.org \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.