target/arm/cpu.h | 16 +++ target/arm/internals.h | 22 ++- target/arm/syndrome.h | 2 +- target/arm/tcg/helper-defs.h | 3 +- target/arm/tcg/translate.h | 18 +++ target/arm/tcg/a32.decode | 5 +- target/arm/tcg/a64.decode | 5 +- target/arm/tcg/t16.decode | 4 +- target/arm/tcg/t32.decode | 4 +- target/arm/arm-powerctl.c | 6 +- target/arm/cpu.c | 53 +++++-- target/arm/helper.c | 8 +- target/arm/kvm.c | 5 +- target/arm/machine.c | 2 +- target/arm/tcg/op_helper.c | 253 ++++++++++++++++++++++++++++++--- target/arm/tcg/translate-a64.c | 64 +++++---- target/arm/tcg/translate.c | 31 ++-- 17 files changed, 395 insertions(+), 106 deletions(-)
This series fully models the behaviour of WFxT instructions. We
already had support for WFE for M-profile but we left off A-profile as
it has more potential sources of wake-ups. The main one is the event
stream which includes events from significant bits of the timer
ticking over.
The refactoring from the previous iterations of the patch have now
been merged.
I've dropped trying to fully model the global monitor in favour of
taking advantage of the architectural flexibility to have an IMPDEF
event wake up for any reason. We treat the setting of exclusive_addr
as such a reason because it indicates the current vCPU is in a ldstx
exclusive region and we don't want the guest to deadlock. This does mean
the system won't sleep on WFE enabled locks but people shouldn't be
relying on QEMU to model real world sleep patterns anyway given the
efficiency of emulation compared to real HW.
I've written a test case using kvm-unit-tests:
Message-ID: <20260527111822.1563679-1-alex.bennee@linaro.org>
Date: Wed, 27 May 2026 12:18:21 +0100
Subject: [kvm-unit-tests PATCH v2] arm: add wfx test case
From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org>
All patches are now reviewed.
v7
- more r-b's
- extended comment for typo fix
v6
- add typo fix
- addressed rth's comments
v5
- addressed rth's comments
- all but one patch now reviewed
v4
- precursor refactor patches now merged
- dropped global monitor emulation
- addressed other comments
- tested with check-tcg and kvm-unit-test wfx tests
v3
- fixed the WFE exception handling
v2
- I've kept the tests separate, see:
Message-ID: <20260417164328.1009132-1-alex.bennee@linaro.org>
Date: Fri, 17 Apr 2026 17:43:20 +0100
Subject: [PATCH 0/7] tests/tcg: more capabilities for aarch64-softmmu tests
From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org>
- tweaks to global monitor behaviour
- STLR/STL will also trigger events to avoid deadlocks
- see under the --- in the patches for details
Alex.
Alex Bennée (8):
target/arm: fix WFET typo in syndrome
target/arm: teach arm_cpu_has_work about halting reasons
target/arm: redefine event stream fields
target/arm: ensure aarch64 DISAS_WFE will exit
target/arm: implements SEV/SEVL for all modes
target/arm: enable event stream on WFE instructions
target/arm: handle the WFE trap case
target/arm: implement WFET
target/arm/cpu.h | 16 +++
target/arm/internals.h | 22 ++-
target/arm/syndrome.h | 2 +-
target/arm/tcg/helper-defs.h | 3 +-
target/arm/tcg/translate.h | 18 +++
target/arm/tcg/a32.decode | 5 +-
target/arm/tcg/a64.decode | 5 +-
target/arm/tcg/t16.decode | 4 +-
target/arm/tcg/t32.decode | 4 +-
target/arm/arm-powerctl.c | 6 +-
target/arm/cpu.c | 53 +++++--
target/arm/helper.c | 8 +-
target/arm/kvm.c | 5 +-
target/arm/machine.c | 2 +-
target/arm/tcg/op_helper.c | 253 ++++++++++++++++++++++++++++++---
target/arm/tcg/translate-a64.c | 64 +++++----
target/arm/tcg/translate.c | 31 ++--
17 files changed, 395 insertions(+), 106 deletions(-)
--
2.47.3
On Fri, 29 May 2026 at 09:29, Alex Bennée <alex.bennee@linaro.org> wrote: > > This series fully models the behaviour of WFxT instructions. We > already had support for WFE for M-profile but we left off A-profile as > it has more potential sources of wake-ups. The main one is the event > stream which includes events from significant bits of the timer > ticking over. > > The refactoring from the previous iterations of the patch have now > been merged. > > I've dropped trying to fully model the global monitor in favour of > taking advantage of the architectural flexibility to have an IMPDEF > event wake up for any reason. We treat the setting of exclusive_addr > as such a reason because it indicates the current vCPU is in a ldstx > exclusive region and we don't want the guest to deadlock. This does mean > the system won't sleep on WFE enabled locks but people shouldn't be > relying on QEMU to model real world sleep patterns anyway given the > efficiency of emulation compared to real HW. > > I've written a test case using kvm-unit-tests: > > Message-ID: <20260527111822.1563679-1-alex.bennee@linaro.org> > Date: Wed, 27 May 2026 12:18:21 +0100 > Subject: [kvm-unit-tests PATCH v2] arm: add wfx test case > From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org> > > All patches are now reviewed. Applied to target-arm.next, thanks. -- PMM
Peter Maydell <peter.maydell@linaro.org> writes:
> On Fri, 29 May 2026 at 09:29, Alex Bennée <alex.bennee@linaro.org> wrote:
>>
>> This series fully models the behaviour of WFxT instructions. We
>> already had support for WFE for M-profile but we left off A-profile as
>> it has more potential sources of wake-ups. The main one is the event
>> stream which includes events from significant bits of the timer
>> ticking over.
>>
>> The refactoring from the previous iterations of the patch have now
>> been merged.
>>
>> I've dropped trying to fully model the global monitor in favour of
>> taking advantage of the architectural flexibility to have an IMPDEF
>> event wake up for any reason. We treat the setting of exclusive_addr
>> as such a reason because it indicates the current vCPU is in a ldstx
>> exclusive region and we don't want the guest to deadlock. This does mean
>> the system won't sleep on WFE enabled locks but people shouldn't be
>> relying on QEMU to model real world sleep patterns anyway given the
>> efficiency of emulation compared to real HW.
>>
>> I've written a test case using kvm-unit-tests:
>>
>> Message-ID: <20260527111822.1563679-1-alex.bennee@linaro.org>
>> Date: Wed, 27 May 2026 12:18:21 +0100
>> Subject: [kvm-unit-tests PATCH v2] arm: add wfx test case
>> From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org>
>>
>> All patches are now reviewed.
>
>
>
> Applied to target-arm.next, thanks.
Is it too late to drop them? I've a fix for 2/8:
--8<---------------cut here---------------start------------->8---
modified include/hw/core/sysemu-cpu-ops.h
@@ -18,6 +18,9 @@
typedef struct SysemuCPUOps {
/**
* @has_work: Callback for checking if there is work to do.
+ *
+ * This function should be idempotent (i.e. not change state) as
+ * it will likely be queried multiple times before a CPU resumes.
*/
bool (*has_work)(CPUState *cpu); /* MANDATORY NON-NULL */
/**
modified target/arm/cpu.c
@@ -158,7 +158,6 @@ static bool arm_cpu_has_work(CPUState *cs)
* A wake-up event should only wake us if we are halted on a WFE
*/
if (cpu->env.halt_reason == HALT_WFE && cpu->env.event_register) {
- cpu->env.halt_reason = NOT_HALTED;
return true;
}
@@ -170,7 +169,6 @@ static bool arm_cpu_has_work(CPUState *cs)
| CPU_INTERRUPT_NMI | CPU_INTERRUPT_VINMI | CPU_INTERRUPT_VFNMI
| CPU_INTERRUPT_VFIQ | CPU_INTERRUPT_VIRQ | CPU_INTERRUPT_VSERR
| CPU_INTERRUPT_EXITTB)) {
- cpu->env.halt_reason = NOT_HALTED;
return true;
}
@@ -874,6 +872,8 @@ bool arm_cpu_exec_halt(CPUState *cs)
if (cpu->wfxt_timer) {
timer_del(cpu->wfxt_timer);
}
+ /* clear the halt reason */
+ cpu->env.halt_reason = NOT_HALTED;
}
return leave_halt;
}
--8<---------------cut here---------------end--------------->8---
>
> -- PMM
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
On Fri, 12 Jun 2026 at 18:18, Alex Bennée <alex.bennee@linaro.org> wrote: > > Peter Maydell <peter.maydell@linaro.org> writes: > > > On Fri, 29 May 2026 at 09:29, Alex Bennée <alex.bennee@linaro.org> wrote: > >> > >> This series fully models the behaviour of WFxT instructions. We > >> already had support for WFE for M-profile but we left off A-profile as > >> it has more potential sources of wake-ups. The main one is the event > >> stream which includes events from significant bits of the timer > >> ticking over. > >> > >> The refactoring from the previous iterations of the patch have now > >> been merged. > >> > >> I've dropped trying to fully model the global monitor in favour of > >> taking advantage of the architectural flexibility to have an IMPDEF > >> event wake up for any reason. We treat the setting of exclusive_addr > >> as such a reason because it indicates the current vCPU is in a ldstx > >> exclusive region and we don't want the guest to deadlock. This does mean > >> the system won't sleep on WFE enabled locks but people shouldn't be > >> relying on QEMU to model real world sleep patterns anyway given the > >> efficiency of emulation compared to real HW. > >> > >> I've written a test case using kvm-unit-tests: > >> > >> Message-ID: <20260527111822.1563679-1-alex.bennee@linaro.org> > >> Date: Wed, 27 May 2026 12:18:21 +0100 > >> Subject: [kvm-unit-tests PATCH v2] arm: add wfx test case > >> From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org> > >> > >> All patches are now reviewed. > > > > > > > > Applied to target-arm.next, thanks. > > Is it too late to drop them? I've a fix for 2/8: That change is already in upstream git, so you'll need to send the fix as a standalone patch, I'm afraid. -- PMM
Peter Maydell <peter.maydell@linaro.org> writes: > On Fri, 12 Jun 2026 at 18:18, Alex Bennée <alex.bennee@linaro.org> wrote: >> >> Peter Maydell <peter.maydell@linaro.org> writes: >> >> > On Fri, 29 May 2026 at 09:29, Alex Bennée <alex.bennee@linaro.org> wrote: >> >> >> >> This series fully models the behaviour of WFxT instructions. We >> >> already had support for WFE for M-profile but we left off A-profile as >> >> it has more potential sources of wake-ups. The main one is the event >> >> stream which includes events from significant bits of the timer >> >> ticking over. >> >> >> >> The refactoring from the previous iterations of the patch have now >> >> been merged. >> >> >> >> I've dropped trying to fully model the global monitor in favour of >> >> taking advantage of the architectural flexibility to have an IMPDEF >> >> event wake up for any reason. We treat the setting of exclusive_addr >> >> as such a reason because it indicates the current vCPU is in a ldstx >> >> exclusive region and we don't want the guest to deadlock. This does mean >> >> the system won't sleep on WFE enabled locks but people shouldn't be >> >> relying on QEMU to model real world sleep patterns anyway given the >> >> efficiency of emulation compared to real HW. >> >> >> >> I've written a test case using kvm-unit-tests: >> >> >> >> Message-ID: <20260527111822.1563679-1-alex.bennee@linaro.org> >> >> Date: Wed, 27 May 2026 12:18:21 +0100 >> >> Subject: [kvm-unit-tests PATCH v2] arm: add wfx test case >> >> From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org> >> >> >> >> All patches are now reviewed. >> > >> > >> > >> > Applied to target-arm.next, thanks. >> >> Is it too late to drop them? I've a fix for 2/8: > > That change is already in upstream git, so you'll need to > send the fix as a standalone patch, I'm afraid. No worries, I'll fix it up in the re-base. > > -- PMM -- Alex Bennée Virtualisation Tech Lead @ Linaro
On Mon, 8 Jun 2026 at 14:51, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Fri, 29 May 2026 at 09:29, Alex Bennée <alex.bennee@linaro.org> wrote:
> >
> > This series fully models the behaviour of WFxT instructions. We
> > already had support for WFE for M-profile but we left off A-profile as
> > it has more potential sources of wake-ups. The main one is the event
> > stream which includes events from significant bits of the timer
> > ticking over.
> >
> > The refactoring from the previous iterations of the patch have now
> > been merged.
> >
> > I've dropped trying to fully model the global monitor in favour of
> > taking advantage of the architectural flexibility to have an IMPDEF
> > event wake up for any reason. We treat the setting of exclusive_addr
> > as such a reason because it indicates the current vCPU is in a ldstx
> > exclusive region and we don't want the guest to deadlock. This does mean
> > the system won't sleep on WFE enabled locks but people shouldn't be
> > relying on QEMU to model real world sleep patterns anyway given the
> > efficiency of emulation compared to real HW.
> >
> > I've written a test case using kvm-unit-tests:
> >
> > Message-ID: <20260527111822.1563679-1-alex.bennee@linaro.org>
> > Date: Wed, 27 May 2026 12:18:21 +0100
> > Subject: [kvm-unit-tests PATCH v2] arm: add wfx test case
> > From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org>
> >
> > All patches are now reviewed.
>
>
>
> Applied to target-arm.next, thanks.
This turns out to cause failures in "make check-functional": some
tests now time out. It looks like the patch that triggers this
is the "enable event stream on WFE instructions".
13/79 func-thorough+func-arm-thorough+thorough -
qemu:func-arm-aspeed_rainier ERROR 36.17s
exit status 1
74/79 func-thorough+func-arm-thorough+thorough -
qemu:func-arm-smdkc210 TIMEOUT 90.01s
killed by signal 15 SIGTERM
75/79 func-thorough+func-arm-thorough+thorough - qemu:func-arm-raspi2
TIMEOUT 120.01s killed by signal 15
SIGTERM
76/79 func-thorough+func-arm-thorough+thorough -
qemu:func-arm-quanta_gsj TIMEOUT 240.01s
killed by signal 15 SIGTERM
77/79 func-thorough+func-arm-thorough+thorough - qemu:func-arm-bpim2u
TIMEOUT 500.01s killed by signal 15
SIGTERM
78/79 func-thorough+func-arm-thorough+thorough -
qemu:func-arm-orangepi TIMEOUT 540.01s
killed by signal 15 SIGTERM
79/79 func-thorough+func-aarch64-thorough+thorough -
qemu:func-aarch64-sbsaref_freebsd TIMEOUT 720.02s
killed by signal 15 SIGTERM
I've kept the first 4 patches, but dropped patches 5-8.
I also noticed a problem with patch 5 which I've commented on.
thanks
-- PMM
Peter Maydell <peter.maydell@linaro.org> writes: > On Mon, 8 Jun 2026 at 14:51, Peter Maydell <peter.maydell@linaro.org> wrote: >> >> On Fri, 29 May 2026 at 09:29, Alex Bennée <alex.bennee@linaro.org> wrote: >> > >> > This series fully models the behaviour of WFxT instructions. We >> > already had support for WFE for M-profile but we left off A-profile as >> > it has more potential sources of wake-ups. The main one is the event >> > stream which includes events from significant bits of the timer >> > ticking over. >> > >> > The refactoring from the previous iterations of the patch have now >> > been merged. >> > >> > I've dropped trying to fully model the global monitor in favour of >> > taking advantage of the architectural flexibility to have an IMPDEF >> > event wake up for any reason. We treat the setting of exclusive_addr >> > as such a reason because it indicates the current vCPU is in a ldstx >> > exclusive region and we don't want the guest to deadlock. This does mean >> > the system won't sleep on WFE enabled locks but people shouldn't be >> > relying on QEMU to model real world sleep patterns anyway given the >> > efficiency of emulation compared to real HW. >> > >> > I've written a test case using kvm-unit-tests: >> > >> > Message-ID: <20260527111822.1563679-1-alex.bennee@linaro.org> >> > Date: Wed, 27 May 2026 12:18:21 +0100 >> > Subject: [kvm-unit-tests PATCH v2] arm: add wfx test case >> > From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org> >> > >> > All patches are now reviewed. >> >> >> >> Applied to target-arm.next, thanks. > > This turns out to cause failures in "make check-functional": some > tests now time out. It looks like the patch that triggers this > is the "enable event stream on WFE instructions". > > 13/79 func-thorough+func-arm-thorough+thorough - > qemu:func-arm-aspeed_rainier ERROR 36.17s > exit status 1 > 74/79 func-thorough+func-arm-thorough+thorough - > qemu:func-arm-smdkc210 TIMEOUT 90.01s > killed by signal 15 SIGTERM > 75/79 func-thorough+func-arm-thorough+thorough - qemu:func-arm-raspi2 > TIMEOUT 120.01s killed by signal 15 > SIGTERM > 76/79 func-thorough+func-arm-thorough+thorough - > qemu:func-arm-quanta_gsj TIMEOUT 240.01s > killed by signal 15 SIGTERM > 77/79 func-thorough+func-arm-thorough+thorough - qemu:func-arm-bpim2u > TIMEOUT 500.01s killed by signal 15 > SIGTERM > 78/79 func-thorough+func-arm-thorough+thorough - > qemu:func-arm-orangepi TIMEOUT 540.01s > killed by signal 15 SIGTERM > 79/79 func-thorough+func-aarch64-thorough+thorough - > qemu:func-aarch64-sbsaref_freebsd TIMEOUT 720.02s > killed by signal 15 SIGTERM > > > I've kept the first 4 patches, but dropped patches 5-8. > I also noticed a problem with patch 5 which I've commented on. OK I'll have a look. > > thanks > -- PMM -- Alex Bennée Virtualisation Tech Lead @ Linaro
© 2016 - 2026 Red Hat, Inc.