aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-05-10 09:43:41 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-05-10 09:43:41 +0100
commit817b6bf86d745c8e6cd00a218c236dc04b399642 (patch)
tree64a22ff16af8d5a5c345d3692b44fd2b3b8d82c9
parent55225065b3306a2735337c1c70a12bb6baa876a9 (diff)
downloadxen-817b6bf86d745c8e6cd00a218c236dc04b399642.tar.gz
xen-817b6bf86d745c8e6cd00a218c236dc04b399642.tar.bz2
xen-817b6bf86d745c8e6cd00a218c236dc04b399642.zip
xen: allow guests to set caching attributes for MMIOs
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@eu.citrix.com> xen-unstable changeset: 21119:5fdfbdd6ca41 xen-unstable date: Thu Apr 08 15:30:52 2010 +0100
-rw-r--r--xen/arch/x86/hvm/hvm.c2
-rw-r--r--xen/arch/x86/hvm/svm/svm.c2
-rw-r--r--xen/arch/x86/hvm/vmx/vmx.c2
-rw-r--r--xen/arch/x86/mm/shadow/multi.c4
-rw-r--r--xen/include/asm-ia64/domain.h1
-rw-r--r--xen/include/asm-x86/domain.h1
6 files changed, 8 insertions, 4 deletions
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 216f818f1c..d936829a14 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -1120,7 +1120,7 @@ int hvm_set_cr0(unsigned long value)
}
}
- if ( has_arch_pdevs(v->domain) )
+ if ( has_arch_mmios(v->domain) )
{
if ( (value & X86_CR0_CD) && !(value & X86_CR0_NW) )
{
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 8ef1bdb463..fae90f4f67 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -1225,7 +1225,7 @@ static void wbinvd_ipi(void *info)
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 --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index b54dc8e82c..0f1a085812 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -2087,7 +2087,7 @@ static void wbinvd_ipi(void *info)
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 --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c
index 4368b65737..d647dc5b26 100644
--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -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>
@@ -563,7 +564,8 @@ _sh_propagate(struct vcpu *v,
* 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 --git a/xen/include/asm-ia64/domain.h b/xen/include/asm-ia64/domain.h
index d181b5f826..14064ce247 100644
--- a/xen/include/asm-ia64/domain.h
+++ b/xen/include/asm-ia64/domain.h
@@ -45,6 +45,7 @@ extern void panic_domain(struct pt_regs *, const char *, ...)
__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 --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
index de238a0492..35661b85b2 100644
--- a/xen/include/asm-x86/domain.h
+++ b/xen/include/asm-x86/domain.h
@@ -329,6 +329,7 @@ struct arch_domain
} __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) \