[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