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

From: Sairaj Kodilkar

Date: Mon Jul 06 2026 - 04:01:50 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

---

Base: 8cd9520d35a6c38db6567e97dd93b1f11f185dc6

---

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(-)

--
2.34.1