[PATCH v3 0/2] Add support for cmpxchg16b emulation

From: Sairaj Kodilkar

Date: Wed Aug 26 2026 - 03:02:28 EST


This series adds 128-bit compare-exchange support needed for KVM to
emulate guest cmpxchg16b instructions.

The AMD IOMMU driver updates 256-bit device table entries with two
128-bit cmpxchg operations. For hardware-accelerated vIOMMU, QEMU traps
those DTE accesses to install nested page tables [1]. KVM must emulate
guest cmpxchg16b on the trapped MMIO regions; without that, DTE access
emulation fails.

Patch 1: extends the x86 user CMPXCHG helpers with
__try_cmpxchg128_user_asm() (cmpxchg16b on x86-64), wired into
unsafe_try_cmpxchg_user().

Patch 2: extends KVM CMPXCHG8B emulation to 16-byte operands (REX.W=1) and
uses the new helper for atomic 16-byte compare-exchange on guest RAM via
emulator_cmpxchg_emulated().

You can find the KUT to test this series at [2].

[1] https://github.com/AMDESE/qemu-iommu/blob/wip/for_iommufd_hw_queue-v8_amd_viommu_20260106/hw/i386/amd_viommu.c#L517
[2] https://lore.kernel.org/kvm/20260706062153.346-1-sarunkod@xxxxxxx/T/#u

Changes since v2:
https://lore.kernel.org/all/20260706063035.1139-1-sarunkod@xxxxxxx/
Patch 1: Trigger build failure if __try_cmpxchg128_user_asm is called on 32 bit
machines [Sean]

Sairaj Kodilkar (2):
x86/uaccess: Extend CMPXCHG user helpers to 128-bit operands
KVM: x86: Add support for cmpxchg16b emulation

arch/x86/include/asm/uaccess.h | 56 +++++++++++++++++++++++++++++++++-
arch/x86/kvm/emulate.c | 50 ++++++++++++++++++++----------
arch/x86/kvm/kvm_emulate.h | 6 ++++
arch/x86/kvm/x86.c | 7 ++++-
4 files changed, 101 insertions(+), 18 deletions(-)


base-commit: 45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229
--
2.34.1