diff options
author | Boris Ostrovsky <boris.ostrovsky@oracle.com> | 2013-04-15 11:23:25 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-04-15 11:23:25 +0200 |
commit | 6f3c6d1ed8d2c8b6cd5d9689159e3647bf428dcd (patch) | |
tree | 6f771541c2c91da817ccde8f03075e2bca76a779 /xen/arch/x86/hvm/svm | |
parent | 6a727d6be892ea5ff818446d96974bebdf8ac3a2 (diff) | |
download | xen-6f3c6d1ed8d2c8b6cd5d9689159e3647bf428dcd.tar.gz xen-6f3c6d1ed8d2c8b6cd5d9689159e3647bf428dcd.tar.bz2 xen-6f3c6d1ed8d2c8b6cd5d9689159e3647bf428dcd.zip |
x86/AMD: Allow more fine-grained control of VMCB MSR Permission Map
Currently VMCB's MSRPM can be updated to either intercept both reads and
writes to an MSR or not intercept neither. In some cases we may want to
be more selective and intercept one but not the other.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Dietmar Hahn <dietmar.hahn@ts.fujitsu.com>
Diffstat (limited to 'xen/arch/x86/hvm/svm')
-rw-r--r-- | xen/arch/x86/hvm/svm/svm.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index f170ffbea5..8ce37c9c98 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -137,7 +137,7 @@ svm_msrbit(unsigned long *msr_bitmap, uint32_t msr) return msr_bit; } -void svm_intercept_msr(struct vcpu *v, uint32_t msr, int enable) +void svm_intercept_msr(struct vcpu *v, uint32_t msr, int flags) { unsigned long *msr_bit; @@ -145,16 +145,15 @@ void svm_intercept_msr(struct vcpu *v, uint32_t msr, int enable) BUG_ON(msr_bit == NULL); msr &= 0x1fff; - if ( enable ) - { - __set_bit(msr * 2, msr_bit); + if ( flags & MSR_INTERCEPT_READ ) + __set_bit(msr * 2, msr_bit); + else + __clear_bit(msr * 2, msr_bit); + + if ( flags & MSR_INTERCEPT_WRITE ) __set_bit(msr * 2 + 1, msr_bit); - } else - { - __clear_bit(msr * 2, msr_bit); __clear_bit(msr * 2 + 1, msr_bit); - } } static void svm_save_dr(struct vcpu *v) |