From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xen.org>
Cc: "Andrew Cooper" <andrew.cooper3@citrix.com>,
"Sergey Dyasli" <sergey.dyasli@citrix.com>,
"Wei Liu" <wei.liu2@citrix.com>,
"Jan Beulich" <JBeulich@suse.com>,
"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [PATCH v4 1/3] x86/msr: Dispatch Xen and Viridian MSRs from guest_{wr, rd}msr()
Date: Wed, 12 Sep 2018 13:00:47 +0100 [thread overview]
Message-ID: <1536753647-17165-1-git-send-email-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <1536692177-15675-2-git-send-email-andrew.cooper3@citrix.com>
Despite the complicated diff in {svm,vmx}_msr_write_intercept(), it is just
the 0 case losing one level of indentation, as part of removing the call to
wrmsr_hypervisor_regs().
The case blocks in guest_{wr,rd}msr() use raw numbers, partly for consistency
with the CPUID side of things, but mainly because this is clearer code to
follow. In particular, the Xen block may overlap with the Viridian block if
Viridian is not enabled for the domain, and trying to express this with named
literals caused more confusion that it solved.
Future changes with clean up the individual APIs, including allowing these
MSRs to be usable for vcpus other than current (no callers exist with v !=
current).
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Wei Liu <wei.liu2@citrix.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Sergey Dyasli <sergey.dyasli@citrix.com>
v3:
* Split out of previous series. Retain appropriate R-by's
v4:
* Retain switch() for interpreting the result of wrmsr_hypervisor_regs()
---
xen/arch/x86/hvm/svm/svm.c | 27 +++-----------------------
xen/arch/x86/hvm/vmx/vmx.c | 28 ++++-----------------------
xen/arch/x86/msr.c | 43 ++++++++++++++++++++++++++++++++++++++----
xen/arch/x86/pv/emul-priv-op.c | 6 ------
4 files changed, 46 insertions(+), 58 deletions(-)
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 34d55b4..ef8f271 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -2016,10 +2016,6 @@ static int svm_msr_read_intercept(unsigned int msr, uint64_t *msr_content)
else if ( ret )
break;
- if ( rdmsr_viridian_regs(msr, msr_content) ||
- rdmsr_hypervisor_regs(msr, msr_content) )
- break;
-
if ( rdmsr_safe(msr, *msr_content) == 0 )
break;
@@ -2218,28 +2214,11 @@ static int svm_msr_write_intercept(unsigned int msr, uint64_t msr_content)
else if ( ret )
break;
- if ( wrmsr_viridian_regs(msr, msr_content) )
+ /* Match up with the RDMSR side; ultimately this should go away. */
+ if ( rdmsr_safe(msr, msr_content) == 0 )
break;
- switch ( wrmsr_hypervisor_regs(msr, msr_content) )
- {
- case -ERESTART:
- result = X86EMUL_RETRY;
- break;
- case 0:
- /*
- * Match up with the RDMSR side for now; ultimately this entire
- * case block should go away.
- */
- if ( rdmsr_safe(msr, msr_content) == 0 )
- break;
- goto gpf;
- case 1:
- break;
- default:
- goto gpf;
- }
- break;
+ goto gpf;
}
return result;
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index b2e1a28..bf90e22 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -2965,10 +2965,6 @@ static int vmx_msr_read_intercept(unsigned int msr, uint64_t *msr_content)
break;
}
- if ( rdmsr_viridian_regs(msr, msr_content) ||
- rdmsr_hypervisor_regs(msr, msr_content) )
- break;
-
if ( rdmsr_safe(msr, *msr_content) == 0 )
break;
@@ -3249,31 +3245,15 @@ static int vmx_msr_write_intercept(unsigned int msr, uint64_t msr_content)
if ( passive_domain_do_wrmsr(msr, msr_content) )
return X86EMUL_OKAY;
- if ( wrmsr_viridian_regs(msr, msr_content) )
- break;
-
if ( vmx_write_guest_msr(v, msr, msr_content) == 0 ||
is_last_branch_msr(msr) )
break;
- switch ( wrmsr_hypervisor_regs(msr, msr_content) )
- {
- case -ERESTART:
- return X86EMUL_RETRY;
- case 0:
- /*
- * Match up with the RDMSR side for now; ultimately this
- * entire case block should go away.
- */
- if ( rdmsr_safe(msr, msr_content) == 0 )
- break;
- goto gp_fault;
- case 1:
+ /* Match up with the RDMSR side; ultimately this should go away. */
+ if ( rdmsr_safe(msr, msr_content) == 0 )
break;
- default:
- goto gp_fault;
- }
- break;
+
+ goto gp_fault;
}
return X86EMUL_OKAY;
diff --git a/xen/arch/x86/msr.c b/xen/arch/x86/msr.c
index b675f3a..d7c38f1 100644
--- a/xen/arch/x86/msr.c
+++ b/xen/arch/x86/msr.c
@@ -114,9 +114,11 @@ int init_vcpu_msr_policy(struct vcpu *v)
int guest_rdmsr(const struct vcpu *v, uint32_t msr, uint64_t *val)
{
- const struct cpuid_policy *cp = v->domain->arch.cpuid;
- const struct msr_policy *mp = v->domain->arch.msr;
+ const struct domain *d = v->domain;
+ const struct cpuid_policy *cp = d->arch.cpuid;
+ const struct msr_policy *mp = d->arch.msr;
const struct vcpu_msrs *msrs = v->arch.msrs;
+ int ret = X86EMUL_OKAY;
switch ( msr )
{
@@ -145,11 +147,25 @@ int guest_rdmsr(const struct vcpu *v, uint32_t msr, uint64_t *val)
*val = msrs->misc_features_enables.raw;
break;
+ case 0x40000000 ... 0x400001ff:
+ if ( is_viridian_domain(d) )
+ {
+ ret = (rdmsr_viridian_regs(msr, val)
+ ? X86EMUL_OKAY : X86EMUL_EXCEPTION);
+ break;
+ }
+
+ /* Fallthrough. */
+ case 0x40000200 ... 0x400002ff:
+ ret = (rdmsr_hypervisor_regs(msr, val)
+ ? X86EMUL_OKAY : X86EMUL_EXCEPTION);
+ break;
+
default:
return X86EMUL_UNHANDLEABLE;
}
- return X86EMUL_OKAY;
+ return ret;
gp_fault:
return X86EMUL_EXCEPTION;
@@ -162,6 +178,7 @@ int guest_wrmsr(struct vcpu *v, uint32_t msr, uint64_t val)
const struct cpuid_policy *cp = d->arch.cpuid;
const struct msr_policy *mp = d->arch.msr;
struct vcpu_msrs *msrs = v->arch.msrs;
+ int ret = X86EMUL_OKAY;
switch ( msr )
{
@@ -252,11 +269,29 @@ int guest_wrmsr(struct vcpu *v, uint32_t msr, uint64_t val)
break;
}
+ case 0x40000000 ... 0x400001ff:
+ if ( is_viridian_domain(d) )
+ {
+ ret = (wrmsr_viridian_regs(msr, val)
+ ? X86EMUL_OKAY : X86EMUL_EXCEPTION);
+ break;
+ }
+
+ /* Fallthrough. */
+ case 0x40000200 ... 0x400002ff:
+ switch ( wrmsr_hypervisor_regs(msr, val) )
+ {
+ case -ERESTART: ret = X86EMUL_RETRY; break;
+ case 1: ret = X86EMUL_OKAY; break;
+ default: ret = X86EMUL_EXCEPTION; break;
+ }
+ break;
+
default:
return X86EMUL_UNHANDLEABLE;
}
- return X86EMUL_OKAY;
+ return ret;
gp_fault:
return X86EMUL_EXCEPTION;
diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c
index 45941ea..6422f91 100644
--- a/xen/arch/x86/pv/emul-priv-op.c
+++ b/xen/arch/x86/pv/emul-priv-op.c
@@ -950,9 +950,6 @@ static int read_msr(unsigned int reg, uint64_t *val,
}
/* fall through */
default:
- if ( rdmsr_hypervisor_regs(reg, val) )
- return X86EMUL_OKAY;
-
rc = vmce_rdmsr(reg, val);
if ( rc < 0 )
break;
@@ -1149,9 +1146,6 @@ static int write_msr(unsigned int reg, uint64_t val,
}
/* fall through */
default:
- if ( wrmsr_hypervisor_regs(reg, val) == 1 )
- return X86EMUL_OKAY;
-
rc = vmce_wrmsr(reg, val);
if ( rc < 0 )
break;
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-09-12 12:00 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-11 18:56 [PATCH v3 0/3] x86: Cleanup of MSR handling for Xen and Viridian ranges Andrew Cooper
2018-09-11 18:56 ` [PATCH v3 1/3] x86/msr: Dispatch Xen and Viridian MSRs from guest_{wr, rd}msr() Andrew Cooper
2018-09-12 12:00 ` Andrew Cooper [this message]
2018-09-13 7:54 ` [PATCH v4 " Sergey Dyasli
2018-09-13 12:25 ` Jan Beulich
2018-09-11 18:56 ` [PATCH v3 2/3] x86/viridan: Clean up Viridian MSR infrastructure Andrew Cooper
2018-09-12 8:14 ` Sergey Dyasli
2018-09-13 12:28 ` Jan Beulich
2018-09-11 18:56 ` [PATCH v3 3/3] x86: Clean up the Xen " Andrew Cooper
2018-09-12 8:29 ` Sergey Dyasli
2018-09-12 9:12 ` Andrew Cooper
2018-09-12 9:17 ` Jan Beulich
2018-09-12 9:24 ` Andrew Cooper
2018-09-12 10:05 ` Jan Beulich
2018-09-12 12:02 ` Andrew Cooper
2018-09-12 9:46 ` Sergey Dyasli
2018-09-12 10:23 ` Andrew Cooper
2018-09-13 7:57 ` Sergey Dyasli
2018-09-13 12:30 ` Jan Beulich
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=1536753647-17165-1-git-send-email-andrew.cooper3@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=JBeulich@suse.com \
--cc=roger.pau@citrix.com \
--cc=sergey.dyasli@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).