On Thu, Apr 23, 2015 at 11:57:10AM +0100, Peter Maydell wrote:
> On 23 April 2015 at 11:39, Edgar E. Iglesias <edgar.igles...@gmail.com> wrote:
> >
> > On 23/04/2015 6:00 pm, "Peter Maydell" <peter.mayd...@linaro.org> wrote:
> >> In theory you could maybe check has_work() for the WFI case,
> >> since doing an EXCP_HLT really should cause us to stop until
> >> has_work is true, but it seems a bit fragile -- could we really
> >> guarantee that nothing would change between this point and
> >> when we went back through the main loop that would change
> >> whether has_work evaluates true or not? I think that it's better
> >> there too to just always take the trap: setting EXCP_HLT is our
> >> "going into a low power state" and so we should take the trap
> >> if we would otherwise have done that.
> >
> > I think functional wise we are OK.
> > The implementation can AFAIK always choose to nop for whatever reason (e.g
> > has_work()). Only when we choose to enter low power, the trap comes into
> > play.
> 
> Ah, so in helper_wfi() do something like
> 
>     if (!has_work()) {
>        if (trapping wfi) {
>            EXCP_UDEF code;
>        } else {
>            EXCP_HALT code;
>        }
>     }
>     /* otherwise just return, making this WFI a nop */
> 
> ?
> 
> I think that would work.

Yes.

Maybe we can consider YIELD instead of NOP when has_work() is true as a WFI
is probably a good hint from guests to reschedule QEMU CPUs.


> 
> > Maybe wfe is the most problematic one because it fires more frequently and
> > often when has_work() is true?
> 
> Yes, I think we should start by not trapping on WFE and then look
> at how good/bad perf is.

Sounds good to me.

Thanks!
Edgar

Reply via email to