[PATCH v3 00/12] whpx: i386: Windows 10 and performance fixes

Mohamed Mediouni posted 12 patches 1 week, 2 days ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260324151323.74473-1-mohamed@unpredictable.fr
Maintainers: Roman Bolshakov <rbolshakov@ddn.com>, Phil Dennis-Jordan <phil@philjordan.eu>, Wei Liu <wei.liu@kernel.org>, Pedro Barbuda <pbarbuda@microsoft.com>, Mohamed Mediouni <mohamed@unpredictable.fr>
target/i386/emulate/x86_emu.h     |   6 +
target/i386/emulate/x86_helpers.c |  83 +++++----
target/i386/emulate/x86_mmu.c     |  11 +-
target/i386/hvf/x86.c             |  11 ++
target/i386/whpx/whpx-all.c       | 280 +++++++++++++++++++++++++-----
5 files changed, 302 insertions(+), 89 deletions(-)
[PATCH v3 00/12] whpx: i386: Windows 10 and performance fixes
Posted by Mohamed Mediouni 1 week, 2 days ago
On Windows 10, the paravirtualisation enlightenments aren't available.
And neither is performance monitoring. Using the former as a gate to
operate in a reduced-functionality mode on Windows 10.

And on the performance side, some state is really expensive to fetch
or write with Hyper-V so switch some less-essential state to on demand.

The effect of this is magnified on Windows 10 because Hyper-V enlightenments
are not available there.

Side note: On Windows 11, use WHP with kernel-irqchip=on. On Windows 10, looks
like issues there are still lingering, with issues #289 and #346 still problematic.

v1 -> v2:
- fix x86 HVF compatibility
- small nits
- added workaround for an issue that showed up during 32-bit Linux boot
on AMD

v2 -> v3:
- Remove ad-hoc workaround in segment fetching and replace it by something
more proper.
The affected commits are "whpx: i386: fetch segments on-demand". The old
workaround separate commit is no longer present (or needed)

Issue number: https://gitlab.com/qemu-project/qemu/-/work_items/3349

Mohamed Mediouni (12):
  whpx: i386: workaround for Windows 10 support
  whpx: i386: enable exceptions VM exit only when needed
  whpx: i386: skip TSC read for MMIO exits
  whpx: i386: skip XCRs read for MMIO exits
  whpx: i386: don't restore segment registers after MMIO handling
  target/i386: emulate: add new callbacks
  whpx: i386: add implementation of new x86_emul_ops
  target/i386: emulate: indirect access to CRs
  whpx: i386: indirect access to CRs
  target/i386: emulate: segmentation rework
  whpx: i386: fetch segments on-demand
  whpx: i386: fast runtime state reads

 target/i386/emulate/x86_emu.h     |   6 +
 target/i386/emulate/x86_helpers.c |  83 +++++----
 target/i386/emulate/x86_mmu.c     |  11 +-
 target/i386/hvf/x86.c             |  11 ++
 target/i386/whpx/whpx-all.c       | 280 +++++++++++++++++++++++++-----
 5 files changed, 302 insertions(+), 89 deletions(-)

-- 
2.50.1 (Apple Git-155)
Re: [PATCH v3 00/12] whpx: i386: Windows 10 and performance fixes
Posted by Mohamed Mediouni 1 week, 2 days ago
> On 24. Mar 2026, at 16:13, Mohamed Mediouni <mohamed@unpredictable.fr> wrote:
> 
> On Windows 10, the paravirtualisation enlightenments aren't available.
> And neither is performance monitoring. Using the former as a gate to
> operate in a reduced-functionality mode on Windows 10.
> 
> And on the performance side, some state is really expensive to fetch
> or write with Hyper-V so switch some less-essential state to on demand.
> 
> The effect of this is magnified on Windows 10 because Hyper-V enlightenments
> are not available there.
> 

Some performance numbers from https://gitlab.com/qemu-project/qemu/-/work_items/3349
on Windows 10:

QEMU 10.2: 2 minutes
QEMU 11.0rc0: 8 minutes
This series: back to 2 minutes

This brings us to performance parity with older QEMU using winhvemulation 
on Windows 10.

> Side note: On Windows 11, use WHP with kernel-irqchip=on. On Windows 10, looks
> like issues there are still lingering, with issues #289 and #346 still problematic.
> 
> v1 -> v2:
> - fix x86 HVF compatibility
> - small nits
> - added workaround for an issue that showed up during 32-bit Linux boot
> on AMD
> 
> v2 -> v3:
> - Remove ad-hoc workaround in segment fetching and replace it by something
> more proper.
> The affected commits are "whpx: i386: fetch segments on-demand". The old
> workaround separate commit is no longer present (or needed)
> 
> Issue number: https://gitlab.com/qemu-project/qemu/-/work_items/3349
> 
> Mohamed Mediouni (12):
>  whpx: i386: workaround for Windows 10 support
>  whpx: i386: enable exceptions VM exit only when needed
>  whpx: i386: skip TSC read for MMIO exits
>  whpx: i386: skip XCRs read for MMIO exits
>  whpx: i386: don't restore segment registers after MMIO handling
>  target/i386: emulate: add new callbacks
>  whpx: i386: add implementation of new x86_emul_ops
>  target/i386: emulate: indirect access to CRs
>  whpx: i386: indirect access to CRs
>  target/i386: emulate: segmentation rework
>  whpx: i386: fetch segments on-demand
>  whpx: i386: fast runtime state reads
> 
> target/i386/emulate/x86_emu.h     |   6 +
> target/i386/emulate/x86_helpers.c |  83 +++++----
> target/i386/emulate/x86_mmu.c     |  11 +-
> target/i386/hvf/x86.c             |  11 ++
> target/i386/whpx/whpx-all.c       | 280 +++++++++++++++++++++++++-----
> 5 files changed, 302 insertions(+), 89 deletions(-)
> 
> -- 
> 2.50.1 (Apple Git-155)
> 
Re: [PATCH v3 00/12] whpx: i386: Windows 10 and performance fixes
Posted by Paolo Bonzini 1 week, 2 days ago
Queued, thanks.  Perhaps you can make target/i386/emulate remember
the registers it has already queried, and cache them in to env?

Paolo