From: Sean Christopherson <seanjc@google.com>
To: Wanpeng Li <kernellwp@gmail.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
Paolo Bonzini <pbonzini@redhat.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Wanpeng Li <wanpengli@tencent.com>,
Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>
Subject: Re: [PATCH] KVM: X86: Fix warning caused by stale emulation context
Date: Mon, 24 May 2021 15:32:37 +0000 [thread overview]
Message-ID: <YKvHFbPfGnaQ4huw@google.com> (raw)
In-Reply-To: <1621830954-31963-1-git-send-email-wanpengli@tencent.com>
On Sun, May 23, 2021, Wanpeng Li wrote:
> From: Wanpeng Li <wanpengli@tencent.com>
>
> Reported by syzkaller:
>
> WARNING: CPU: 7 PID: 10526 at /home/kernel/ssd/linux/arch/x86/kvm//x86.c:7621 x86_emulate_instruction+0x41b/0x510 [kvm]
> RIP: 0010:x86_emulate_instruction+0x41b/0x510 [kvm]
> Call Trace:
> kvm_mmu_page_fault+0x126/0x8f0 [kvm]
> vmx_handle_exit+0x11e/0x680 [kvm_intel]
> vcpu_enter_guest+0xd95/0x1b40 [kvm]
> kvm_arch_vcpu_ioctl_run+0x377/0x6a0 [kvm]
> kvm_vcpu_ioctl+0x389/0x630 [kvm]
> __x64_sys_ioctl+0x8e/0xd0
> do_syscall_64+0x3c/0xb0
> entry_SYSCALL_64_after_hwframe+0x44/0xae
>
> Commit 4a1e10d5b5d8c (KVM: x86: handle hardware breakpoints during emulation())
> adds hardware breakpoints check before emulation the instruction and parts of
> emulation context initialization, actually we don't have EMULTYPE_NO_DECODE flag
> here and the emulation context will not be reused. Commit c8848cee74ff (KVM: x86:
> set ctxt->have_exception in x86_decode_insn()) triggers the warning because it
> catches the stale emulation context has #UD, however, it is not during instruction
> decoding which should result in EMULATION_FAILED. This patch fixes it by moving
> the second part emulation context initialization before hardware breakpoints check.
>
> syzkaller source: https://syzkaller.appspot.com/x/repro.c?x=134683fdd00000
>
> Reported-by: syzbot+71271244f206d17f6441@syzkaller.appspotmail.com
> Fixes: 4a1e10d5b5d8 (KVM: x86: handle hardware breakpoints during emulation)
> Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
> ---
> arch/x86/kvm/x86.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index bbc4e04..eca69f9 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -7552,6 +7552,13 @@ int x86_decode_emulated_instruction(struct kvm_vcpu *vcpu, int emulation_type,
>
> init_emulate_ctxt(vcpu);
>
> + ctxt->interruptibility = 0;
> + ctxt->have_exception = false;
> + ctxt->exception.vector = -1;
> + ctxt->perm_ok = false;
What about moving this block all the way into init_emulate_ctxt()?
> + ctxt->ud = emulation_type & EMULTYPE_TRAP_UD;
This can be left where it is since ctxt->ud is consumed only by x86_decode_insn().
I don't have a strong preference as it really only matters for the backport. For
upstream, we can kill it off in a follow-up patch by passing emulation_type to
x86_decode_insn() and dropping ctxt->ud altogether. Tracking that info in ctxt
for literally one call is silly.
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 8a0ccdb56076..b62944046d7d 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -5322,7 +5322,8 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
ctxt->execute = opcode.u.execute;
- if (unlikely(ctxt->ud) && likely(!(ctxt->d & EmulateOnUD)))
+ if (unlikely(emulation_type & EMULTYPE_TRAP_UD) &&
+ likely(!(ctxt->d & EmulateOnUD)))
return EMULATION_FAILED;
if (unlikely(ctxt->d &
diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h
index f016838faedd..2ad32600a8e3 100644
--- a/arch/x86/kvm/kvm_emulate.h
+++ b/arch/x86/kvm/kvm_emulate.h
@@ -314,7 +314,6 @@ struct x86_emulate_ctxt {
int interruptibility;
bool perm_ok; /* do not check permissions if true */
- bool ud; /* inject an #UD if host doesn't support insn */
bool tf; /* TF value before instruction (after for syscall/sysret) */
bool have_exception;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index a224601d89e2..48b49c24c086 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -7552,8 +7552,6 @@ int x86_decode_emulated_instruction(struct kvm_vcpu *vcpu, int emulation_type,
init_emulate_ctxt(vcpu);
- ctxt->ud = emulation_type & EMULTYPE_TRAP_UD;
-
/*
* We will reenter on the same instruction since we do not set
* complete_userspace_io. This does not handle watchpoints yet,
@@ -7563,7 +7561,7 @@ int x86_decode_emulated_instruction(struct kvm_vcpu *vcpu, int emulation_type,
kvm_vcpu_check_breakpoint(vcpu, &r))
return r;
- r = x86_decode_insn(ctxt, insn, insn_len);
+ r = x86_decode_insn(ctxt, insn, insn_len, emulation_type);
trace_kvm_emulate_insn_start(vcpu);
++vcpu->stat.insn_emulation;
> +
> /*
> * We will reenter on the same instruction since we do not set
> * complete_userspace_io. This does not handle watchpoints yet,
> @@ -7561,13 +7568,6 @@ int x86_decode_emulated_instruction(struct kvm_vcpu *vcpu, int emulation_type,
> kvm_vcpu_check_breakpoint(vcpu, &r))
> return r;
>
> - ctxt->interruptibility = 0;
> - ctxt->have_exception = false;
> - ctxt->exception.vector = -1;
> - ctxt->perm_ok = false;
> -
> - ctxt->ud = emulation_type & EMULTYPE_TRAP_UD;
> -
> r = x86_decode_insn(ctxt, insn, insn_len);
>
> trace_kvm_emulate_insn_start(vcpu);
> --
> 2.7.4
>
next prev parent reply other threads:[~2021-05-24 16:05 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-24 4:35 [PATCH] KVM: X86: Fix warning caused by stale emulation context Wanpeng Li
2021-05-24 15:32 ` Sean Christopherson [this message]
2021-05-25 1:17 ` Wanpeng Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YKvHFbPfGnaQ4huw@google.com \
--to=seanjc@google.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kernellwp@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.