|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/3] vm_event: svm: Fix incorrect monitored_msr() check
monitored_msr() is called with truncated MSR values (&= 0x1fff)
which doesn't match the original one, making the check incorrect.
Fix that by keeping the msr value intact and computing the bitmap
offset separately (in msr_offset).
Fixes: 2746088d9cb4 ("svm: don't clear interception for MSRs required for
introspection")
Signed-off-by: Teddy Astie <teddy.astie@xxxxxxxxxx>
---
Should we multiply by 2 msr_offset instead of doing that in {set,clear}_bit() ?
xen/arch/x86/hvm/svm/svm.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 7a16289f85..d986f3aa8f 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -234,23 +234,22 @@ svm_msrbit(unsigned long *msr_bitmap, uint32_t msr)
void svm_intercept_msr(struct vcpu *v, uint32_t msr, int flags)
{
unsigned long *msr_bit;
+ unsigned int msr_offset = msr & 0x1fff;
const struct domain *d = v->domain;
msr_bit = svm_msrbit(v->arch.hvm.svm.msrpm, msr);
if ( msr_bit == NULL )
return;
- msr &= 0x1fff;
-
if ( flags & MSR_INTERCEPT_READ )
- __set_bit(msr * 2, msr_bit);
+ __set_bit(msr_offset * 2, msr_bit);
else if ( !monitored_msr(d, msr) )
- __clear_bit(msr * 2, msr_bit);
+ __clear_bit(msr_offset * 2, msr_bit);
if ( flags & MSR_INTERCEPT_WRITE )
- __set_bit(msr * 2 + 1, msr_bit);
+ __set_bit(msr_offset * 2 + 1, msr_bit);
else if ( !monitored_msr(d, msr) )
- __clear_bit(msr * 2 + 1, msr_bit);
+ __clear_bit(msr_offset * 2 + 1, msr_bit);
}
#ifdef CONFIG_VM_EVENT
--
2.55.0
--
Teddy Astie | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |