[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xen: allow guests to set caching attributes for MMIOs
Hi all, this patch allows guests that have directly mapped MMIO regions to set the caching attributes for them, and only for them. Currently we have just an on\off check for a directly assigned device instead of looking for directly mapped MMIO regions. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> --- diff -r 28e5409e3fb3 xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c Wed Apr 07 16:22:05 2010 +0100 +++ b/xen/arch/x86/hvm/hvm.c Wed Apr 07 17:33:15 2010 +0100 @@ -1126,7 +1126,7 @@ } } - if ( has_arch_pdevs(v->domain) ) + if ( has_arch_mmios(v->domain) ) { if ( (value & X86_CR0_CD) && !(value & X86_CR0_NW) ) { diff -r 28e5409e3fb3 xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Wed Apr 07 16:22:05 2010 +0100 +++ b/xen/arch/x86/hvm/svm/svm.c Wed Apr 07 17:33:15 2010 +0100 @@ -1228,7 +1228,7 @@ static void svm_wbinvd_intercept(void) { - if ( has_arch_pdevs(current->domain) ) + if ( has_arch_mmios(current->domain) ) on_each_cpu(wbinvd_ipi, NULL, 1); } diff -r 28e5409e3fb3 xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Wed Apr 07 16:22:05 2010 +0100 +++ b/xen/arch/x86/hvm/vmx/vmx.c Wed Apr 07 17:33:15 2010 +0100 @@ -2109,7 +2109,7 @@ static void vmx_wbinvd_intercept(void) { - if ( !has_arch_pdevs(current->domain) ) + if ( !has_arch_mmios(current->domain) ) return; if ( cpu_has_wbinvd_exiting ) diff -r 28e5409e3fb3 xen/arch/x86/mm/shadow/multi.c --- a/xen/arch/x86/mm/shadow/multi.c Wed Apr 07 16:22:05 2010 +0100 +++ b/xen/arch/x86/mm/shadow/multi.c Wed Apr 07 17:33:15 2010 +0100 @@ -28,6 +28,7 @@ #include <xen/sched.h> #include <xen/perfc.h> #include <xen/domain_page.h> +#include <xen/iocap.h> #include <asm/page.h> #include <asm/current.h> #include <asm/shadow.h> @@ -546,7 +547,8 @@ * For HVM domains with direct access to MMIO areas, set the correct * caching attributes in the shadows to match what was asked for. */ - if ( (level == 1) && is_hvm_domain(d) && has_arch_pdevs(d) && + if ( (level == 1) && is_hvm_domain(d) && + iomem_access_permitted(d, mfn_x(target_mfn), mfn_x(target_mfn) + 1) && !is_xen_heap_mfn(mfn_x(target_mfn)) ) { unsigned int type; diff -r 28e5409e3fb3 xen/include/asm-ia64/domain.h --- a/xen/include/asm-ia64/domain.h Wed Apr 07 16:22:05 2010 +0100 +++ b/xen/include/asm-ia64/domain.h Wed Apr 07 17:33:15 2010 +0100 @@ -45,6 +45,7 @@ __attribute__ ((noreturn, format (printf, 2, 3))); #define has_arch_pdevs(d) (!list_empty(&(d)->arch.pdev_list)) +#define has_arch_mmios(d) (!rangeset_is_empty((d)->iomem_caps)) struct mm_struct { volatile pgd_t * pgd; diff -r 28e5409e3fb3 xen/include/asm-x86/domain.h --- a/xen/include/asm-x86/domain.h Wed Apr 07 16:22:05 2010 +0100 +++ b/xen/include/asm-x86/domain.h Wed Apr 07 17:33:15 2010 +0100 @@ -329,6 +329,7 @@ } __cacheline_aligned; #define has_arch_pdevs(d) (!list_empty(&(d)->arch.pdev_list)) +#define has_arch_mmios(d) (!rangeset_is_empty((d)->iomem_caps)) #ifdef CONFIG_X86_64 #define perdomain_pt_pgidx(v) \ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |