From: Dongxiao Xu <dongxiao.xu@intel.com>
To: xen-devel@lists.xen.org
Cc: eddie.dong@intel.com, jun.nakajima@intel.com
Subject: [PATCH v4 11/11] nested vmx: check host ability when intercept MSR read
Date: Thu, 6 Dec 2012 21:01:11 +0800 [thread overview]
Message-ID: <1354798871-5632-12-git-send-email-dongxiao.xu@intel.com> (raw)
In-Reply-To: <1354798871-5632-1-git-send-email-dongxiao.xu@intel.com>
When guest hypervisor tries to read MSR value, we intercept this behavior
and return certain emulated values. Besides that, we also need to ensure
that those emulated values must compatible with host ability.
Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
---
xen/arch/x86/hvm/vmx/vvmx.c | 16 +++++++++++++---
1 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c
index 178adbc..cacbee4 100644
--- a/xen/arch/x86/hvm/vmx/vvmx.c
+++ b/xen/arch/x86/hvm/vmx/vvmx.c
@@ -1314,24 +1314,29 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs)
return X86EMUL_OKAY;
}
+#define combine_host_cap(data, host_data) \
+ (((data & host_data) & (~0ul << 32)) | \
+ ((uint32_t)(data | host_data)))
+
/*
* Capability reporting
*/
int nvmx_msr_read_intercept(unsigned int msr, u64 *msr_content)
{
- u64 data = 0, tmp = 0;
+ u64 data = 0, host_data = 0, tmp = 0;
int r = 1;
if ( !nestedhvm_enabled(current->domain) )
return 0;
+ rdmsrl(msr, host_data);
+
/*
* Remove unsupport features from n1 guest capability MSR
*/
switch (msr) {
case MSR_IA32_VMX_BASIC:
- data = VVMCS_REVISION | ((u64)PAGE_SIZE) << 32 |
- ((u64)MTRR_TYPE_WRBACK) << 50 | VMX_BASIC_DEFAULT1_ZERO;
+ data = (host_data & (~0ul << 32)) | VVMCS_REVISION;
break;
case MSR_IA32_VMX_PINBASED_CTLS:
case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
@@ -1341,6 +1346,7 @@ int nvmx_msr_read_intercept(unsigned int msr, u64 *msr_content)
PIN_BASED_PREEMPT_TIMER;
tmp = VMX_PINBASED_CTLS_DEFAULT1;
data = ((data | tmp) << 32) | (tmp);
+ data = combine_host_cap(data, host_data);
break;
case MSR_IA32_VMX_PROCBASED_CTLS:
case MSR_IA32_VMX_TRUE_PROCBASED_CTLS:
@@ -1368,6 +1374,7 @@ int nvmx_msr_read_intercept(unsigned int msr, u64 *msr_content)
tmp = VMX_PROCBASED_CTLS_DEFAULT1;
/* 0-settings */
data = ((data | tmp) << 32) | (tmp);
+ data = combine_host_cap(data, host_data);
break;
case MSR_IA32_VMX_PROCBASED_CTLS2:
/* 1-seetings */
@@ -1376,6 +1383,7 @@ int nvmx_msr_read_intercept(unsigned int msr, u64 *msr_content)
/* 0-settings */
tmp = 0;
data = (data << 32) | tmp;
+ data = combine_host_cap(data, host_data);
break;
case MSR_IA32_VMX_EXIT_CTLS:
case MSR_IA32_VMX_TRUE_EXIT_CTLS:
@@ -1391,6 +1399,7 @@ int nvmx_msr_read_intercept(unsigned int msr, u64 *msr_content)
VM_EXIT_LOAD_PERF_GLOBAL_CTRL;
/* 0-settings */
data = ((data | tmp) << 32) | tmp;
+ data = combine_host_cap(data, host_data);
break;
case MSR_IA32_VMX_ENTRY_CTLS:
case MSR_IA32_VMX_TRUE_ENTRY_CTLS:
@@ -1401,6 +1410,7 @@ int nvmx_msr_read_intercept(unsigned int msr, u64 *msr_content)
VM_ENTRY_LOAD_PERF_GLOBAL_CTRL |
VM_ENTRY_IA32E_MODE;
data = ((data | tmp) << 32) | tmp;
+ data = combine_host_cap(data, host_data);
break;
case IA32_FEATURE_CONTROL_MSR:
--
1.7.1
next prev parent reply other threads:[~2012-12-06 13:01 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-06 13:01 [PATCH v4 00/11] nested vmx: bug fixes and feature enabling Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 01/11] nested vmx: emulate MSR bitmaps Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 02/11] nested vmx: use literal name instead of hard numbers Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 03/11] nested vmx: expose bit 55 of IA32_VMX_BASIC_MSR to guest VMM Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 04/11] nested vmx: fix rflags status in virtual vmexit Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 05/11] nested vmx: fix handling of RDTSC Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 06/11] nested vmx: fix DR access VM exit Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 07/11] nested vmx: enable IA32E mode while do VM entry Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 08/11] nested vmx: enable "Virtualize APIC accesses" feature for L1 VMM Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 09/11] nested vmx: enable PAUSE and RDPMC exiting " Dongxiao Xu
2012-12-06 13:01 ` [PATCH v4 10/11] nested vmx: fix interrupt delivery to L2 guest Dongxiao Xu
2012-12-06 13:01 ` Dongxiao Xu [this message]
2012-12-06 13:30 ` [PATCH v4 11/11] nested vmx: check host ability when intercept MSR read Jan Beulich
2012-12-06 13:31 ` [PATCH v4 00/11] nested vmx: bug fixes and feature enabling Jan Beulich
2012-12-06 14:29 ` Xu, Dongxiao
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=1354798871-5632-12-git-send-email-dongxiao.xu@intel.com \
--to=dongxiao.xu@intel.com \
--cc=eddie.dong@intel.com \
--cc=jun.nakajima@intel.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).