qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v3] fix WFI/WFE length in syndrome register


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH v3] fix WFI/WFE length in syndrome register
Date: Wed, 25 Oct 2017 15:34:53 +0100

On 24 October 2017 at 18:59, Stefano Stabellini <address@hidden> wrote:
> WFI/E are often, but not always, 4 bytes long. When they are, we need to
> set ARM_EL_IL_SHIFT in the syndrome register.
>
> Pass the instruction length to HELPER(wfi), use it to decrement pc
> appropriately and to pass an is_16bit flag to syn_wfx, which sets
> ARM_EL_IL_SHIFT if needed.
>
> Set dc->insn in both arm_tr_translate_insn and thumb_tr_translate_insn.
>
> Signed-off-by: Stefano Stabellini <address@hidden>

> diff --git a/target/arm/translate.c b/target/arm/translate.c
> index 4da1a4c..0a7b67c 100644
> --- a/target/arm/translate.c
> +++ b/target/arm/translate.c
> @@ -12124,6 +12124,7 @@ static void arm_tr_translate_insn(DisasContextBase 
> *dcbase, CPUState *cpu)
>      }
>
>      insn = arm_ldl_code(env, dc->pc, dc->sctlr_b);
> +    dc->insn = insn;
>      dc->pc += 4;
>      disas_arm_insn(dc, insn);
>
> @@ -12191,6 +12192,7 @@ static void thumb_tr_translate_insn(DisasContextBase 
> *dcbase, CPUState *cpu)
>      }
>
>      insn = arm_lduw_code(env, dc->pc, dc->sctlr_b);
> +    dc->insn = insn;
>      is_16bit = thumb_insn_is_16bit(dc, insn);
>      dc->pc += 2;
>      if (!is_16bit) {

This isn't quite in the right place, because it's before we load the
second half of a 32 bit Thumb insn, so it won't give dc->insn the
correct full width insn value in that case.

I'm going to take this patch into target-arm.next and fix it up locally
rather than making you spin a v4.

thanks
-- PMM



reply via email to

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