From: Jan Beulich Date: Fri, 2 May 2014 08:50:55 +0000 (+0200) Subject: x86/EPT: fix pinned cache attribute range checking X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~5122 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=aaef67041b6974800ab8f421900559db14bb5903;p=xen.git x86/EPT: fix pinned cache attribute range checking This wasn't done properly by 4d66f069 ("x86: fix pinned cache attribute handling"): The passed in GFN shouldn't be assumed to be order aligned. Signed-off-by: Jan Beulich Acked-by: Kevin Tian Reviewed-by: Tim Deegan --- diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c index 34215f4467..98a4f34793 100644 --- a/xen/arch/x86/hvm/mtrr.c +++ b/xen/arch/x86/hvm/mtrr.c @@ -590,6 +590,7 @@ int hvm_get_mem_pinned_cacheattr( uint32_t *type) { struct hvm_mem_pinned_cacheattr_range *range; + uint64_t mask = ~(uint64_t)0 << order; int rc = 0; *type = ~0; @@ -602,15 +603,15 @@ int hvm_get_mem_pinned_cacheattr( &d->arch.hvm_domain.pinned_cacheattr_ranges, list ) { - if ( (guest_fn >= range->start) && - (guest_fn + (1UL << order) - 1 <= range->end) ) + if ( ((guest_fn & mask) >= range->start) && + ((guest_fn | ~mask) <= range->end) ) { *type = range->type; rc = 1; break; } - if ( (guest_fn <= range->end) && - (range->start <= guest_fn + (1UL << order) - 1) ) + if ( ((guest_fn & mask) <= range->end) && + (range->start <= (guest_fn | ~mask)) ) { rc = -1; break;