aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-04-02 16:51:52 +0100
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-04-02 16:51:52 +0100
commit8a3970eca45ccd88f0cbc8c2b671c9aa7962d336 (patch)
tree4eaa542ad3ee0d0fb610cbe2349163015dec1107
parente2a44bc7a4f19cebdb17a5153cc443f420d9fe5d (diff)
downloadxen-8a3970eca45ccd88f0cbc8c2b671c9aa7962d336.tar.gz
xen-8a3970eca45ccd88f0cbc8c2b671c9aa7962d336.tar.bz2
xen-8a3970eca45ccd88f0cbc8c2b671c9aa7962d336.zip
hvm svm: Clear FS/GS base MSR intercepts.
Signed-off-by: Mats Petersson <mats.petersson@amd.com>
-rw-r--r--xen/arch/x86/hvm/svm/vmcb.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/xen/arch/x86/hvm/svm/vmcb.c b/xen/arch/x86/hvm/svm/vmcb.c
index 01e3a8b371..9f49815f29 100644
--- a/xen/arch/x86/hvm/svm/vmcb.c
+++ b/xen/arch/x86/hvm/svm/vmcb.c
@@ -79,6 +79,30 @@ struct host_save_area *alloc_host_save_area(void)
return hsa;
}
+static void disable_intercept_for_msr(char *msr_bitmap, u32 msr)
+{
+ /*
+ * See AMD64 Programmers Manual, Vol 2, Section 15.10 (MSR-Bitmap Address).
+ */
+ if ( msr <= 0x1fff )
+ {
+ __clear_bit(msr*2, msr_bitmap + 0x000);
+ __clear_bit(msr*2+1, msr_bitmap + 0x000);
+ }
+ else if ( (msr >= 0xc0000000) && (msr <= 0xc0001fff) )
+ {
+ msr &= 0x1fff;
+ __clear_bit(msr*2, msr_bitmap + 0x800);
+ __clear_bit(msr*2+1, msr_bitmap + 0x800);
+ }
+ else if ( (msr >= 0xc001000) && (msr <= 0xc0011fff) )
+ {
+ msr &= 0x1fff;
+ __clear_bit(msr*2, msr_bitmap + 0x1000);
+ __clear_bit(msr*2+1, msr_bitmap + 0x1000);
+ }
+}
+
static int construct_vmcb(struct vcpu *v)
{
struct arch_svm_struct *arch_svm = &v->arch.hvm_svm;
@@ -114,6 +138,10 @@ static int construct_vmcb(struct vcpu *v)
if ( arch_svm->msrpm == NULL )
return -ENOMEM;
memset(arch_svm->msrpm, 0xff, MSRPM_SIZE);
+
+ disable_intercept_for_msr((char *)arch_svm->msrpm, MSR_FS_BASE);
+ disable_intercept_for_msr((char *)arch_svm->msrpm, MSR_GS_BASE);
+
vmcb->msrpm_base_pa = (u64)virt_to_maddr(arch_svm->msrpm);
vmcb->iopm_base_pa = (u64)virt_to_maddr(hvm_io_bitmap);