# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1270737052 -3600
# Node ID 5fdfbdd6ca41b86c89b690d2754735569108a6e6
# Parent 28e5409e3fb377830a5f4346fd414d3d158f3483
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@xxxxxxxxxxxxx>
---
xen/arch/x86/hvm/hvm.c | 2 +-
xen/arch/x86/hvm/svm/svm.c | 2 +-
xen/arch/x86/hvm/vmx/vmx.c | 2 +-
xen/arch/x86/mm/shadow/multi.c | 4 +++-
xen/include/asm-ia64/domain.h | 1 +
xen/include/asm-x86/domain.h | 1 +
6 files changed, 8 insertions(+), 4 deletions(-)
diff -r 28e5409e3fb3 -r 5fdfbdd6ca41 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 Thu Apr 08 15:30:52 2010 +0100
@@ -1126,7 +1126,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 -r 28e5409e3fb3 -r 5fdfbdd6ca41 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 Thu Apr 08 15:30:52 2010 +0100
@@ -1228,7 +1228,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 -r 28e5409e3fb3 -r 5fdfbdd6ca41 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 Thu Apr 08 15:30:52 2010 +0100
@@ -2109,7 +2109,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 -r 28e5409e3fb3 -r 5fdfbdd6ca41 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 Thu Apr 08 15:30:52 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 @@ _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 -r 28e5409e3fb3 -r 5fdfbdd6ca41 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 Thu Apr 08 15:30:52 2010 +0100
@@ -45,6 +45,7 @@ extern void panic_domain(struct pt_regs
__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 -r 5fdfbdd6ca41 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 Thu Apr 08 15:30:52 2010 +0100
@@ -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) \
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|