xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xen.org>
Cc: "Kevin Tian" <kevin.tian@intel.com>,
	"Wei Liu" <wei.liu2@citrix.com>,
	"Jan Beulich" <JBeulich@suse.com>,
	"Andrew Cooper" <andrew.cooper3@citrix.com>,
	"Jun Nakajima" <jun.nakajima@intel.com>,
	"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [PATCH 5/9] x86/vmx: Fix handing of MSR_DEBUGCTL on VMExit
Date: Tue, 22 May 2018 12:20:42 +0100	[thread overview]
Message-ID: <1526988046-22948-6-git-send-email-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <1526988046-22948-1-git-send-email-andrew.cooper3@citrix.com>

Currently, whenever the guest writes a nonzero value to MSR_DEBUGCTL, Xen
updates a host MSR load list entry with the current hardware value of
MSR_DEBUGCTL.  This is wrong.

On VMExit, hardware automatically resets MSR_DEBUGCTL to 0.  The only case
where different behaviour is needed is if Xen is debugging itself, and this
needs setting up unconditionally for the lifetime of the VM.

The `ler` command line boolean is the only way to configure any use of
MSR_DEBUGCTL for Xen, so tie the host load list entry to this setting in
construct_vmcs().  Any runtime update of Xen's MSR_DEBUGCTL setting requires
more complicated synchronisation across all the running VMs.

In the exceedingly common case, this avoids the unnecessary overhead of having
a host load entry performing the same zeroing operation that hardware has
already performed as part of the VMExit.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Jun Nakajima <jun.nakajima@intel.com>
CC: Kevin Tian <kevin.tian@intel.com>
CC: Wei Liu <wei.liu2@citrix.com>
CC: Roger Pau Monné <roger.pau@citrix.com>

Notes for backporting: This change probably does want backporting, but depends
on the previous patch "Support remote access to the MSR lists", and adds an
extra rdmsr to the vcpu construction path (resolved in a later patch).
---
 xen/arch/x86/hvm/vmx/vmcs.c | 6 ++++++
 xen/arch/x86/hvm/vmx/vmx.c  | 3 +--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index 8bf54c4..2035a6d 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -996,6 +996,7 @@ static int construct_vmcs(struct vcpu *v)
     struct domain *d = v->domain;
     u32 vmexit_ctl = vmx_vmexit_control;
     u32 vmentry_ctl = vmx_vmentry_control;
+    int rc;
 
     vmx_vmcs_enter(v);
 
@@ -1266,6 +1267,11 @@ static int construct_vmcs(struct vcpu *v)
     if ( cpu_has_vmx_tsc_scaling )
         __vmwrite(TSC_MULTIPLIER, d->arch.hvm_domain.tsc_scaling_ratio);
 
+    /* If using host debugging, restore Xen's setting on vmexit. */
+    if ( this_cpu(ler_msr) &&
+         (rc = vmx_add_host_load_msr(v, MSR_IA32_DEBUGCTLMSR))  )
+        return rc;
+
     vmx_vmcs_exit(v);
 
     /* will update HOST & GUEST_CR3 as reqd */
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index 3950b12..f9cfb6d 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -3120,8 +3120,7 @@ static int vmx_msr_write_intercept(unsigned int msr, uint64_t msr_content)
                     }
         }
 
-        if ( (rc < 0) ||
-             (msr_content && (vmx_add_host_load_msr(v, msr) < 0)) )
+        if ( rc < 0 )
             hvm_inject_hw_exception(TRAP_machine_check, X86_EVENT_NO_EC);
         else
             __vmwrite(GUEST_IA32_DEBUGCTL, msr_content);
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  parent reply	other threads:[~2018-05-22 11:20 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-22 11:20 [PATCH 0/9] x86/vmx: Don't leak EFER.NXE into guest context Andrew Cooper
2018-05-22 11:20 ` [PATCH 1/9] x86/vmx: API improvements for MSR load/save infrastructure Andrew Cooper
2018-05-23 16:01   ` Roger Pau Monné
2018-05-23 17:02     ` Andrew Cooper
2018-05-27  3:26   ` Tian, Kevin
2018-05-22 11:20 ` [PATCH 2/9] x86/vmx: Internal cleanup " Andrew Cooper
2018-05-23 16:28   ` Roger Pau Monné
2018-05-23 16:54     ` Andrew Cooper
2018-05-24 14:45   ` Jan Beulich
2018-05-27  3:30   ` Tian, Kevin
2018-05-22 11:20 ` [PATCH 3/9] x86/vmx: Factor locate_msr_entry() out of vmx_find_msr() and vmx_add_msr() Andrew Cooper
2018-05-23 16:39   ` Roger Pau Monné
2018-05-23 16:55     ` Andrew Cooper
2018-05-24 10:53       ` Roger Pau Monné
2018-05-24 10:59         ` Andrew Cooper
2018-05-24 12:16           ` Roger Pau Monné
2018-05-27  3:38   ` Tian, Kevin
2018-05-22 11:20 ` [PATCH 4/9] x86/vmx: Support remote access to the MSR lists Andrew Cooper
2018-05-24 11:50   ` Roger Pau Monné
2018-05-24 12:03     ` Andrew Cooper
2018-05-24 14:53   ` Jan Beulich
2018-05-27  3:47   ` Tian, Kevin
2018-05-28 15:15     ` Andrew Cooper
2018-05-22 11:20 ` Andrew Cooper [this message]
2018-05-22 12:53   ` [PATCH 5/9] x86/vmx: Fix handing of MSR_DEBUGCTL on VMExit Andrew Cooper
2018-05-24 12:14   ` Roger Pau Monné
2018-05-24 12:39     ` Andrew Cooper
2018-05-24 13:53       ` Jan Beulich
2018-05-24 15:08   ` Jan Beulich
2018-05-24 15:51     ` Andrew Cooper
2018-05-27  3:56   ` Tian, Kevin
2018-05-28 15:30     ` Andrew Cooper
2018-05-22 11:20 ` [PATCH 6/9] x86/vmx: Pass an MSR value into vmx_msr_add() Andrew Cooper
2018-05-24 15:12   ` Jan Beulich
2018-05-30 18:09     ` Andrew Cooper
2018-05-22 11:20 ` [PATCH 7/9] x86/vmx: Support load-only guest MSR list entries Andrew Cooper
2018-05-24 15:19   ` Jan Beulich
2018-05-24 15:37   ` Roger Pau Monné
2018-05-22 11:20 ` [PATCH 8/9] x86/vmx: Support removing MSRs from the host/guest load/save lists Andrew Cooper
2018-05-24 15:42   ` Roger Pau Monné
2018-05-24 15:45     ` Andrew Cooper
2018-05-22 11:20 ` [PATCH 9/9] x86/vmx: Don't leak EFER.NXE into guest context Andrew Cooper
2018-05-24 16:01   ` Roger Pau Monné
2018-05-24 16:48     ` Andrew Cooper
2018-05-25  7:27       ` Jan Beulich
2018-05-25  8:03         ` Andrew Cooper
2018-05-25  6:23   ` Tim Deegan
2018-05-25  7:49   ` Jan Beulich
2018-05-25  8:36     ` Andrew Cooper
2018-05-25 11:36       ` Jan Beulich
2018-05-25 11:48         ` Andrew Cooper

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=1526988046-22948-6-git-send-email-andrew.cooper3@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=JBeulich@suse.com \
    --cc=jun.nakajima@intel.com \
    --cc=kevin.tian@intel.com \
    --cc=roger.pau@citrix.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).