diff options
author | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2007-04-02 16:51:52 +0100 |
---|---|---|
committer | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2007-04-02 16:51:52 +0100 |
commit | 8a3970eca45ccd88f0cbc8c2b671c9aa7962d336 (patch) | |
tree | 4eaa542ad3ee0d0fb610cbe2349163015dec1107 | |
parent | e2a44bc7a4f19cebdb17a5153cc443f420d9fe5d (diff) | |
download | xen-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.c | 28 |
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); |