qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 3/3] target-arm: Comments to mark location of pe


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH 3/3] target-arm: Comments to mark location of pending work for 56 bit addresses
Date: Thu, 29 Sep 2016 18:27:38 -0700

On 16 September 2016 at 10:34, Thomas Hanson <address@hidden> wrote:
> Certain instructions which can not directly load a tagged address value
> may trigger a corner case when the address size is 56 bits.  This is
> because incrementing or offsetting from the current PC can cause an
> arithetic roll-over into the tag bits.  Per the ARM ARM spec, these cases
> should also be addressed by cleaning up the tag field.
>
> This work was not done at this time since the changes could not be tested
> with current CPU models.  Comments have been added to flag the locations
> where this will need to be fixed once a model is available.

This is *not* why we haven't done this work. We haven't done it
because the maximum virtual address size permitted by the
architecture is less than 56 bits, and so this is a "can't happen"
situation.

> 3 comments added in same file to identify cases in a switch.

This should be a separate patch, because it is unrelated to the
tagged address stuff.

> Signed-off-by: Thomas Hanson <address@hidden>
> ---
>  target-arm/translate-a64.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/target-arm/translate-a64.c b/target-arm/translate-a64.c
> index 4d6f951..8810180 100644
> --- a/target-arm/translate-a64.c
> +++ b/target-arm/translate-a64.c
> @@ -1205,6 +1205,9 @@ static inline AArch64DecodeFn *lookup_disas_fn(const 
> AArch64DecodeTable *table,
>   */
>  static void disas_uncond_b_imm(DisasContext *s, uint32_t insn)
>  {
> +    /*If/when address size is 56 bits, this could overflow into address tag

Missing space before "If".

> +     * byte, and that byte should be fixed per ARM ARM spec.
> +     */
>      uint64_t addr = s->pc + sextract32(insn, 0, 26) * 4 - 4;
>
>      if (insn & (1U << 31)) {
> @@ -1232,6 +1235,9 @@ static void disas_comp_b_imm(DisasContext *s, uint32_t 
> insn)
>      sf = extract32(insn, 31, 1);
>      op = extract32(insn, 24, 1); /* 0: CBZ; 1: CBNZ */
>      rt = extract32(insn, 0, 5);
> +    /*If/when address size is 56 bits, this could overflow into address tag
> +     * byte, and that byte should be fixed per ARM ARM spec.
> +     */
>      addr = s->pc + sextract32(insn, 5, 19) * 4 - 4;
>
>      tcg_cmp = read_cpu_reg(s, rt, sf);
> @@ -1260,6 +1266,9 @@ static void disas_test_b_imm(DisasContext *s, uint32_t 
> insn)
>
>      bit_pos = (extract32(insn, 31, 1) << 5) | extract32(insn, 19, 5);
>      op = extract32(insn, 24, 1); /* 0: TBZ; 1: TBNZ */
> +    /*If/when address size is 56 bits, this could overflow into address tag
> +     * byte, and that byte should be fixed per ARM ARM spec.
> +     */
>      addr = s->pc + sextract32(insn, 5, 14) * 4 - 4;
>      rt = extract32(insn, 0, 5);
>
> @@ -1289,6 +1298,9 @@ static void disas_cond_b_imm(DisasContext *s, uint32_t 
> insn)
>          unallocated_encoding(s);
>          return;
>      }
> +    /*If/when address size is 56 bits, this could overflow into address tag
> +     * byte, and that byte should be fixed per ARM ARM spec.
> +     */
>      addr = s->pc + sextract32(insn, 5, 19) * 4 - 4;
>      cond = extract32(insn, 0, 4);
>
> @@ -1636,12 +1648,12 @@ static void disas_exc(DisasContext *s, uint32_t insn)
>           * instruction works properly.
>           */
>          switch (op2_ll) {
> -        case 1:
> +        case 1:                                                     /* SVC */
>              gen_ss_advance(s);
>              gen_exception_insn(s, 0, EXCP_SWI, syn_aa64_svc(imm16),
>                                 default_exception_el(s));
>              break;
> -        case 2:
> +        case 2:                                                     /* HVC */
>              if (s->current_el == 0) {
>                  unallocated_encoding(s);
>                  break;
> @@ -1654,7 +1666,7 @@ static void disas_exc(DisasContext *s, uint32_t insn)
>              gen_ss_advance(s);
>              gen_exception_insn(s, 0, EXCP_HVC, syn_aa64_hvc(imm16), 2);
>              break;
> -        case 3:
> +        case 3:                                                     /* SMC */
>              if (s->current_el == 0) {
>                  unallocated_encoding(s);
>                  break;
> --
> 1.9.1

thanks
-- PMM



reply via email to

[Prev in Thread] Current Thread [Next in Thread]