On Tue, 23 Dec 2025 at 12:02, Ashish Anand <[email protected]> wrote:
>
> From: "ashish.a6" <[email protected]>
>
>     Currently, QEMU implements the 'Wait For Event' (WFE) instruction as a
>     a simple yield. This causes high host CPU usage because Guest
>     RTOS idle loops effectively become busy-wait loops.
>
>     To improve efficiency, this patch transitions WFE to use the architectural
>     'Halt' state (EXCP_HLT) for M-profile CPUs. This allows the host thread
>     to sleep when the guest is idle.


> diff --git a/target/arm/cpu.h b/target/arm/cpu.h
> index 39f2b2e54d..44433a444c 100644
> --- a/target/arm/cpu.h
> +++ b/target/arm/cpu.h
> @@ -639,6 +639,7 @@ typedef struct CPUArchState {
>          uint32_t nsacr;
>          uint32_t ltpsize;
>          uint32_t vpr;
> +        uint32_t event_register;
>      } v7m;

One more small thing that I thought of -- although we're only
implementing WFE support for M-profile here, the concept of the
event register is the same for A-profile. So we should put the
field in the top level of the CPU state struct, not inside the v7m
sub-struct. That way it's available for us to use and share
if and when we ever do it for A-profile.

> +static bool m_event_needed(void *opaque)
> +{
> +    ARMCPU *cpu = opaque;
> +    /* Only save the state if the event register is set (non-zero) */
> +    return cpu->env.v7m.event_register != 0;
> +}
> +
> +static const VMStateDescription vmstate_m_event = {
> +    .name = "cpu/m/event",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .needed = m_event_needed,
> +    .fields = (const VMStateField[]) {
> +        VMSTATE_UINT32(env.v7m.event_register, ARMCPU),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};

...and so similarly the migration handling should not have
anything M-profile specific to it.

thanks
-- PMM

Reply via email to