qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 11/26] target/arm: Rearrange decode in disas_unc


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH 11/26] target/arm: Rearrange decode in disas_uncond_b_reg
Date: Tue, 11 Dec 2018 15:40:18 +0000

On Fri, 7 Dec 2018 at 10:36, Richard Henderson
<address@hidden> wrote:
>
> This will enable PAuth decode in a subsequent patch.
>
> Signed-off-by: Richard Henderson <address@hidden>
> ---
>  target/arm/translate-a64.c | 34 +++++++++++++++++++++++-----------
>  1 file changed, 23 insertions(+), 11 deletions(-)
>
> diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
> index c84c2dbb66..5fa2647771 100644
> --- a/target/arm/translate-a64.c
> +++ b/target/arm/translate-a64.c
> @@ -1989,32 +1989,41 @@ static void disas_uncond_b_reg(DisasContext *s, 
> uint32_t insn)
>      rn = extract32(insn, 5, 5);
>      op4 = extract32(insn, 0, 5);
>
> -    if (op4 != 0x0 || op3 != 0x0 || op2 != 0x1f) {
> -        unallocated_encoding(s);
> -        return;
> +    if (op2 != 0x1f) {
> +        goto do_unallocated;
>      }
>
>      switch (opc) {
>      case 0: /* BR */
>      case 1: /* BLR */
>      case 2: /* RET */
> -        gen_a64_set_pc(s, cpu_reg(s, rn));
> +        if (op3 == 0 && op4 == 0) {
> +            dst = cpu_reg(s, rn);
> +        } else {
> +            goto do_unallocated;
> +        }
> +        gen_a64_set_pc(s, dst);
>          /* BLR also needs to load return address */
>          if (opc == 1) {
>              tcg_gen_movi_i64(cpu_reg(s, 30), s->pc);
>          }
>          break;
> +
>      case 4: /* ERET */
>          if (s->current_el == 0) {
> -            unallocated_encoding(s);
> -            return;
> -        }
> -        if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
> -            gen_io_start();
> +            goto do_unallocated;
>          }
>          dst = tcg_temp_new_i64();
>          tcg_gen_ld_i64(dst, cpu_env,
>                         offsetof(CPUARMState, elr_el[s->current_el]));
> +        if (op3 == 0 && op4 == 0) {
> +            ;
> +        } else {
> +            goto do_unallocated;


This decode check should go before any code has been
emittede (ie before the tcg_gen_ld_i64 above it).

> +        }
> +        if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
> +            gen_io_start();
> +        }
>          gen_helper_exception_return(cpu_env, dst);
>          tcg_temp_free_i64(dst);
>          if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
> @@ -2023,14 +2032,17 @@ static void disas_uncond_b_reg(DisasContext *s, 
> uint32_t insn)
>          /* Must exit loop to check un-masked IRQs */
>          s->base.is_jmp = DISAS_EXIT;
>          return;
> +
>      case 5: /* DRPS */
> -        if (rn != 0x1f) {
> -            unallocated_encoding(s);
> +        if (op3 != 0 || op4 != 0 || rn != 0x1f) {
> +            goto do_unallocated;
>          } else {
>              unsupported_encoding(s, insn);
>          }
>          return;
> +
>      default:
> +    do_unallocated:
>          unallocated_encoding(s);
>          return;
>      }

thanks
-- PMM



reply via email to

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