Commit 7366830
KVM: x86: Don't (re)check L1 intercepts when completing userspace I/O
commit e750f85 upstream.
When completing emulation of instruction that generated a userspace exit
for I/O, don't recheck L1 intercepts as KVM has already finished that
phase of instruction execution, i.e. has already committed to allowing L2
to perform I/O. If L1 (or host userspace) modifies the I/O permission
bitmaps during the exit to userspace, KVM will treat the access as being
intercepted despite already having emulated the I/O access.
Pivot on EMULTYPE_NO_DECODE to detect that KVM is completing emulation.
Of the three users of EMULTYPE_NO_DECODE, only complete_emulated_io() (the
intended "recipient") can reach the code in question. gp_interception()'s
use is mutually exclusive with is_guest_mode(), and
complete_emulated_insn_gp() unconditionally pairs EMULTYPE_NO_DECODE with
EMULTYPE_SKIP.
The bad behavior was detected by a syzkaller program that toggles port I/O
interception during the userspace I/O exit, ultimately resulting in a WARN
on vcpu->arch.pio.count being non-zero due to KVM no completing emulation
of the I/O instruction.
WARNING: CPU: 23 PID: 1083 at arch/x86/kvm/x86.c:8039 emulator_pio_in_out+0x154/0x170 [kvm]
Modules linked in: kvm_intel kvm irqbypass
CPU: 23 UID: 1000 PID: 1083 Comm: repro Not tainted 6.16.0-rc5-c1610d2d66b1-next-vm Rust-for-Linux#74 NONE
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
RIP: 0010:emulator_pio_in_out+0x154/0x170 [kvm]
PKRU: 55555554
Call Trace:
<TASK>
kvm_fast_pio+0xd6/0x1d0 [kvm]
vmx_handle_exit+0x149/0x610 [kvm_intel]
kvm_arch_vcpu_ioctl_run+0xda8/0x1ac0 [kvm]
kvm_vcpu_ioctl+0x244/0x8c0 [kvm]
__x64_sys_ioctl+0x8a/0xd0
do_syscall_64+0x5d/0xc60
entry_SYSCALL_64_after_hwframe+0x4b/0x53
</TASK>
Reported-by: syzbot+cc2032ba16cc2018ca25@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/all/68790db4.a00a0220.3af5df.0020.GAE@google.com
Fixes: 8a76d7f ("KVM: x86: Add x86 callback for intercept check")
Cc: stable@vger.kernel.org
Cc: Jim Mattson <jmattson@google.com>
Link: https://lore.kernel.org/r/20250715190638.1899116-1-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent 94797b8 commit 7366830
3 files changed
+13
-14
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5107 | 5107 | | |
5108 | 5108 | | |
5109 | 5109 | | |
5110 | | - | |
| 5110 | + | |
5111 | 5111 | | |
5112 | 5112 | | |
5113 | 5113 | | |
5114 | 5114 | | |
5115 | | - | |
5116 | 5115 | | |
5117 | 5116 | | |
5118 | 5117 | | |
| |||
5160 | 5159 | | |
5161 | 5160 | | |
5162 | 5161 | | |
5163 | | - | |
| 5162 | + | |
5164 | 5163 | | |
5165 | 5164 | | |
5166 | 5165 | | |
| |||
5189 | 5188 | | |
5190 | 5189 | | |
5191 | 5190 | | |
5192 | | - | |
| 5191 | + | |
5193 | 5192 | | |
5194 | 5193 | | |
5195 | 5194 | | |
| |||
5243 | 5242 | | |
5244 | 5243 | | |
5245 | 5244 | | |
5246 | | - | |
| 5245 | + | |
5247 | 5246 | | |
5248 | 5247 | | |
5249 | 5248 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
235 | 235 | | |
236 | 236 | | |
237 | 237 | | |
238 | | - | |
239 | 238 | | |
240 | 239 | | |
241 | 240 | | |
| |||
521 | 520 | | |
522 | 521 | | |
523 | 522 | | |
524 | | - | |
| 523 | + | |
525 | 524 | | |
526 | 525 | | |
527 | 526 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8470 | 8470 | | |
8471 | 8471 | | |
8472 | 8472 | | |
8473 | | - | |
8474 | | - | |
8475 | | - | |
8476 | | - | |
8477 | | - | |
8478 | 8473 | | |
8479 | 8474 | | |
8480 | 8475 | | |
| |||
8558 | 8553 | | |
8559 | 8554 | | |
8560 | 8555 | | |
8561 | | - | |
8562 | 8556 | | |
8563 | 8557 | | |
8564 | 8558 | | |
| |||
9143 | 9137 | | |
9144 | 9138 | | |
9145 | 9139 | | |
9146 | | - | |
| 9140 | + | |
| 9141 | + | |
| 9142 | + | |
| 9143 | + | |
| 9144 | + | |
| 9145 | + | |
| 9146 | + | |
| 9147 | + | |
9147 | 9148 | | |
9148 | 9149 | | |
9149 | 9150 | | |
| |||
0 commit comments