From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47293) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yxqqo-0005YM-Rn for qemu-devel@nongnu.org; Thu, 28 May 2015 01:59:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yxqql-0004u2-VG for qemu-devel@nongnu.org; Thu, 28 May 2015 01:59:30 -0400 Received: from mail-bn1bon0064.outbound.protection.outlook.com ([157.56.111.64]:40809 helo=na01-bn1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yxqql-0004tu-QK for qemu-devel@nongnu.org; Thu, 28 May 2015 01:59:27 -0400 Date: Thu, 28 May 2015 15:55:31 +1000 From: "Edgar E. Iglesias" Message-ID: <20150528055531.GO30952@toto> References: <1432060414-5195-1-git-send-email-peter.maydell@linaro.org> <1432060414-5195-14-git-send-email-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1432060414-5195-14-git-send-email-peter.maydell@linaro.org> Subject: Re: [Qemu-devel] [PATCH 13/14] target-arm: Don't halt on WFI unless we don't have any work List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: agraf@suse.de, serge.fdrv@gmail.com, alex.bennee@linaro.org, qemu-devel@nongnu.org, patches@linaro.org On Tue, May 19, 2015 at 07:33:33PM +0100, Peter Maydell wrote: > Just NOP the WFI instruction if we have work to do. > This doesn't make much difference currently (though it does avoid > jumping out to the top level loop and immediately restarting), > but the distinction between "halt" and "don't halt" will become > more important when the decision to halt requires us to trap > to a higher exception level instead. > > Suggested-by: Edgar E. Iglesias > Signed-off-by: Peter Maydell Reviewed-by: Edgar E. Iglesias > --- > target-arm/op_helper.c | 7 +++++++ > target-arm/translate-a64.c | 4 ++++ > target-arm/translate.c | 4 ++++ > 3 files changed, 15 insertions(+) > > diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c > index 5963f3b..517dacc 100644 > --- a/target-arm/op_helper.c > +++ b/target-arm/op_helper.c > @@ -252,6 +252,13 @@ void HELPER(wfi)(CPUARMState *env) > { > CPUState *cs = CPU(arm_env_get_cpu(env)); > > + if (cpu_has_work(cs)) { > + /* Don't bother to go into our "low power state" if > + * we would just wake up immediately. > + */ > + return; > + } > + > cs->exception_index = EXCP_HLT; > cs->halted = 1; > cpu_loop_exit(cs); > diff --git a/target-arm/translate-a64.c b/target-arm/translate-a64.c > index 8d08ccd..ffa6cb8 100644 > --- a/target-arm/translate-a64.c > +++ b/target-arm/translate-a64.c > @@ -11113,6 +11113,10 @@ void gen_intermediate_code_internal_a64(ARMCPU *cpu, > */ > gen_a64_set_pc_im(dc->pc); > gen_helper_wfi(cpu_env); > + /* The helper doesn't necessarily throw an exception, but we > + * must go back to the main loop to check for interrupts anyway. > + */ > + tcg_gen_exit_tb(0); > break; > } > } > diff --git a/target-arm/translate.c b/target-arm/translate.c > index ed2c43d..6493b9a 100644 > --- a/target-arm/translate.c > +++ b/target-arm/translate.c > @@ -11351,6 +11351,10 @@ static inline void gen_intermediate_code_internal(ARMCPU *cpu, > break; > case DISAS_WFI: > gen_helper_wfi(cpu_env); > + /* The helper doesn't necessarily throw an exception, but we > + * must go back to the main loop to check for interrupts anyway. > + */ > + tcg_gen_exit_tb(0); > break; > case DISAS_WFE: > gen_helper_wfe(cpu_env); > -- > 1.9.1 >