WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [IA64] IO ports for driver domains.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] IO ports for driver domains.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 28 Jul 2006 16:21:49 +0000
Delivery-date: Fri, 28 Jul 2006 09:31:45 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 199d53efd02974b9e78f4492a3baee426e4e03c3
# Parent  14f8c17c980834ccb9da8c1f712a593ac6eacfcd
[IA64] IO ports for driver domains.

Map/unmap IO ports.

Signed-off-by: Tristan Gingold <tristan.gingold@xxxxxxxx>
---
 xen/arch/ia64/xen/dom0_ops.c  |    5 ++-
 xen/arch/ia64/xen/dom_fw.c    |   20 ++++++++-------
 xen/arch/ia64/xen/mm.c        |   56 ++++++++++++++++++++++++++++++++++++++++++
 xen/include/asm-ia64/domain.h |    4 +++
 xen/include/asm-ia64/iocap.h  |    9 +++---
 5 files changed, 79 insertions(+), 15 deletions(-)

diff -r 14f8c17c9808 -r 199d53efd029 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Thu Jul 27 09:47:59 2006 -0600
+++ b/xen/arch/ia64/xen/dom0_ops.c      Thu Jul 27 10:00:00 2006 -0600
@@ -285,6 +285,7 @@ long arch_do_dom0_op(dom0_op_t *op, XEN_
         struct domain *d;
         unsigned int fp = op->u.ioport_permission.first_port;
         unsigned int np = op->u.ioport_permission.nr_ports;
+        unsigned int lp = fp + np - 1;
 
         ret = -ESRCH;
         d = find_domain_by_id(op->u.ioport_permission.domain);
@@ -295,9 +296,9 @@ long arch_do_dom0_op(dom0_op_t *op, XEN_
             ret = 0;
         else {
             if (op->u.ioport_permission.allow_access)
-                ret = ioports_permit_access(d, fp, fp + np - 1);
+                ret = ioports_permit_access(d, fp, lp);
             else
-                ret = ioports_deny_access(d, fp, fp + np - 1);
+                ret = ioports_deny_access(d, fp, lp);
         }
 
         put_domain(d);
diff -r 14f8c17c9808 -r 199d53efd029 xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c        Thu Jul 27 09:47:59 2006 -0600
+++ b/xen/arch/ia64/xen/dom_fw.c        Thu Jul 27 10:00:00 2006 -0600
@@ -855,15 +855,17 @@ dom_fw_init (struct domain *d, struct ia
        } else {
 #ifndef CONFIG_XEN_IA64_DOM0_VP
                /* Dom0 maps legacy mmio in first MB.  */
-               MAKE_MD(EFI_LOADER_DATA,EFI_MEMORY_WB,0*MB,1*MB, 1);
-               
MAKE_MD(EFI_CONVENTIONAL_MEMORY,EFI_MEMORY_WB,HYPERCALL_END,maxmem, 1);
-#endif
-               /* hypercall patches live here, masquerade as reserved PAL 
memory */
-               
MAKE_MD(EFI_PAL_CODE,EFI_MEMORY_WB|EFI_MEMORY_RUNTIME,HYPERCALL_START,HYPERCALL_END,
 1);
-               /* Create a dummy entry for IO ports, so that IO accesses are
-                  trapped by Xen.  */
-               MAKE_MD(EFI_MEMORY_MAPPED_IO_PORT_SPACE,EFI_MEMORY_UC,
-                       0x00000ffffc000000, 0x00000fffffffffff, 1);
+               MAKE_MD(EFI_LOADER_DATA, EFI_MEMORY_WB, 0*MB, 1*MB, 1);
+               MAKE_MD(EFI_CONVENTIONAL_MEMORY, EFI_MEMORY_WB,
+                       HYPERCALL_END, maxmem, 1);
+#endif
+               /* hypercall patches live here, masquerade as reserved
+                  PAL memory */
+               MAKE_MD(EFI_PAL_CODE, EFI_MEMORY_WB | EFI_MEMORY_RUNTIME,
+                       HYPERCALL_START, HYPERCALL_END, 1);
+               /* Create an entry for IO ports.  */
+               MAKE_MD(EFI_MEMORY_MAPPED_IO_PORT_SPACE, EFI_MEMORY_UC,
+                       IO_PORTS_PADDR, IO_PORTS_PADDR + IO_PORTS_SIZE, 1);
                MAKE_MD(EFI_RESERVED_TYPE,0,0,0,0);
        }
 
diff -r 14f8c17c9808 -r 199d53efd029 xen/arch/ia64/xen/mm.c
--- a/xen/arch/ia64/xen/mm.c    Thu Jul 27 09:47:59 2006 -0600
+++ b/xen/arch/ia64/xen/mm.c    Thu Jul 27 10:00:00 2006 -0600
@@ -179,6 +179,8 @@ static void domain_page_flush(struct dom
 static void domain_page_flush(struct domain* d, unsigned long mpaddr,
                               unsigned long old_mfn, unsigned long new_mfn);
 #endif
+
+extern unsigned long ia64_iobase;
 
 static struct domain *dom_xen, *dom_io;
 
@@ -892,6 +894,60 @@ assign_domain_page(struct domain *d,
     // because __assign_domain_page() uses set_pte_rel() which has
     // release semantics, smp_mb() isn't needed.
     __assign_domain_page(d, mpaddr, physaddr, ASSIGN_writable);
+}
+
+int
+ioports_permit_access(struct domain *d, unsigned long fp, unsigned long lp)
+{
+    int ret;
+    unsigned long off;
+    unsigned long fp_offset;
+    unsigned long lp_offset;
+
+    ret = rangeset_add_range(d->arch.ioport_caps, fp, lp);
+    if (ret != 0)
+        return ret;
+
+    fp_offset = IO_SPACE_SPARSE_ENCODING(fp) & ~PAGE_MASK;
+    lp_offset = PAGE_ALIGN(IO_SPACE_SPARSE_ENCODING(lp));
+
+    for (off = fp_offset; off <= lp_offset; off += PAGE_SIZE)
+        __assign_domain_page(d, IO_PORTS_PADDR + off,
+                             ia64_iobase + off, ASSIGN_nocache);
+
+    return 0;
+}
+
+int
+ioports_deny_access(struct domain *d, unsigned long fp, unsigned long lp)
+{
+    int ret;
+    struct mm_struct *mm = &d->arch.mm;
+    unsigned long off;
+    unsigned long fp_offset;
+    unsigned long lp_offset;
+
+    ret = rangeset_remove_range(d->arch.ioport_caps, fp, lp);
+    if (ret != 0)
+        return ret;
+
+    fp_offset = IO_SPACE_SPARSE_ENCODING(fp) & ~PAGE_MASK;
+    lp_offset = PAGE_ALIGN(IO_SPACE_SPARSE_ENCODING(lp));
+
+    for (off = fp_offset; off <= lp_offset; off += PAGE_SIZE) {
+        unsigned long mpaddr = IO_PORTS_PADDR + off;
+        volatile pte_t *pte;
+        pte_t old_pte;
+
+        pte = lookup_noalloc_domain_pte_none(d, mpaddr);
+        BUG_ON(pte == NULL);
+        BUG_ON(pte_none(*pte));
+
+        // clear pte
+        old_pte = ptep_get_and_clear(mm, mpaddr, pte);
+    }
+    domain_flush_vtlb_all();
+    return 0;
 }
 
 #ifdef CONFIG_XEN_IA64_DOM0_VP
diff -r 14f8c17c9808 -r 199d53efd029 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Thu Jul 27 09:47:59 2006 -0600
+++ b/xen/include/asm-ia64/domain.h     Thu Jul 27 10:00:00 2006 -0600
@@ -196,6 +196,10 @@ struct arch_vcpu {
 #include <asm/uaccess.h> /* for KERNEL_DS */
 #include <asm/pgtable.h>
 
+/* Guest physical address of IO ports space.  */
+#define IO_PORTS_PADDR          0x00000ffffc000000UL
+#define IO_PORTS_SIZE           0x0000000004000000UL
+
 #endif /* __ASM_DOMAIN_H__ */
 
 /*
diff -r 14f8c17c9808 -r 199d53efd029 xen/include/asm-ia64/iocap.h
--- a/xen/include/asm-ia64/iocap.h      Thu Jul 27 09:47:59 2006 -0600
+++ b/xen/include/asm-ia64/iocap.h      Thu Jul 27 10:00:00 2006 -0600
@@ -7,10 +7,11 @@
 #ifndef __IA64_IOCAP_H__
 #define __IA64_IOCAP_H__
 
-#define ioports_permit_access(d, s, e)                  \
-    rangeset_add_range((d)->arch.ioport_caps, s, e)
-#define ioports_deny_access(d, s, e)                    \
-    rangeset_remove_range((d)->arch.ioport_caps, s, e)
+extern int ioports_permit_access(struct domain *d,
+                                 unsigned long s, unsigned long e);
+extern int ioports_deny_access(struct domain *d,
+                               unsigned long s, unsigned long e);
+
 #define ioports_access_permitted(d, s, e)               \
     rangeset_contains_range((d)->arch.ioport_caps, s, e)
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] IO ports for driver domains., Xen patchbot-unstable <=