Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/xen Make bus_space map machine addresses instead of...



details:   https://anonhg.NetBSD.org/src/rev/affba2209a2a
branches:  trunk
changeset: 565969:affba2209a2a
user:      cl <cl%NetBSD.org@localhost>
date:      Sat Apr 24 19:18:01 2004 +0000

description:
Make bus_space map machine addresses instead of physical addresses.

diffstat:

 sys/arch/xen/conf/files.xen  |    4 +-
 sys/arch/xen/i386/pmap.c     |  184 +++++++++++++++-
 sys/arch/xen/include/pmap.h  |    4 +-
 sys/arch/xen/x86/bus_space.c |  503 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 690 insertions(+), 5 deletions(-)

diffs (truncated from 748 to 300 lines):

diff -r 20de69e51e57 -r affba2209a2a sys/arch/xen/conf/files.xen
--- a/sys/arch/xen/conf/files.xen       Sat Apr 24 18:55:02 2004 +0000
+++ b/sys/arch/xen/conf/files.xen       Sat Apr 24 19:18:01 2004 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.xen,v 1.6 2004/04/24 18:24:14 cl Exp $
+#      $NetBSD: files.xen,v 1.7 2004/04/24 19:18:01 cl Exp $
 #      NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp 
 #      NetBSD: files.i386,v 1.254 2004/03/25 23:32:10 jmc Exp 
 
@@ -85,7 +85,7 @@
 define  mainbus { [apid = -1] }
 
 file   arch/x86/x86/bus_dma.c
-file   arch/x86/x86/bus_space.c
+file   arch/xen/x86/bus_space.c
 file   arch/x86/x86/cacheinfo.c
 file   arch/xen/x86/consinit.c
 file   arch/xen/x86/intr.c
diff -r 20de69e51e57 -r affba2209a2a sys/arch/xen/i386/pmap.c
--- a/sys/arch/xen/i386/pmap.c  Sat Apr 24 18:55:02 2004 +0000
+++ b/sys/arch/xen/i386/pmap.c  Sat Apr 24 19:18:01 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.c,v 1.3 2004/04/17 12:53:27 cl Exp $      */
+/*     $NetBSD: pmap.c,v 1.4 2004/04/24 19:18:01 cl Exp $      */
 /*     NetBSD: pmap.c,v 1.172 2004/04/12 13:17:46 yamt Exp     */
 
 /*
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.3 2004/04/17 12:53:27 cl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.4 2004/04/24 19:18:01 cl Exp $");
 
 #include "opt_cputype.h"
 #include "opt_user_ldt.h"
@@ -3627,6 +3627,186 @@
 }
 
 /*
+ * pmap_enter_ma: enter a mapping into a pmap
+ *
+ * => must be done "now" ... no lazy-evaluation
+ * => we set pmap => pv_head locking
+ */
+
+int
+pmap_enter_ma(pmap, va, pa, prot, flags)
+       struct pmap *pmap;
+       vaddr_t va;
+       paddr_t pa;
+       vm_prot_t prot;
+       int flags;
+{
+       pt_entry_t *ptes, opte, npte;
+       struct vm_page *ptp, *pg;
+       int error;
+       boolean_t wired = (flags & PMAP_WIRED) != 0;
+
+       XENPRINTK(("pmap_enter_ma(%p, %p, %p, %08x, %08x)\n",
+           pmap, (void *)va, (void *)pa, prot, flags));
+
+#ifdef DIAGNOSTIC
+       /* sanity check: totally out of range? */
+       if (va >= VM_MAX_KERNEL_ADDRESS)
+               panic("pmap_enter: too big");
+
+       if (va == (vaddr_t) PDP_BASE || va == (vaddr_t) APDP_BASE)
+               panic("pmap_enter: trying to map over PDP/APDP!");
+
+       /* sanity check: kernel PTPs should already have been pre-allocated */
+       if (va >= VM_MIN_KERNEL_ADDRESS &&
+           !pmap_valid_entry(pmap->pm_pdir[pdei(va)]))
+               panic("pmap_enter: missing kernel PTP!");
+#endif
+
+       npte = pa | protection_codes[prot] | PG_V;
+       /* XENPRINTK(("npte %p\n", npte)); */
+
+       if (wired)
+               npte |= PG_W;
+
+       if (va < VM_MAXUSER_ADDRESS)
+               npte |= PG_u;
+       else if (va < VM_MAX_ADDRESS)
+               npte |= (PG_u | PG_RW); /* XXXCDC: no longer needed? */
+       if (pmap == pmap_kernel())
+               npte |= pmap_pg_g;
+
+       /* get lock */
+       PMAP_MAP_TO_HEAD_LOCK();
+
+       ptes = pmap_map_ptes(pmap);             /* locks pmap */
+       if (pmap == pmap_kernel()) {
+               ptp = NULL;
+       } else {
+               ptp = pmap_get_ptp(pmap, pdei(va));
+               if (ptp == NULL) {
+                       if (flags & PMAP_CANFAIL) {
+                               error = ENOMEM;
+                               goto out;
+                       }
+                       panic("pmap_enter: get ptp failed");
+               }
+       }
+
+       /*
+        * Get first view on old PTE 
+        * on SMP the PTE might gain PG_U and PG_M flags
+        * before we zap it later
+        */
+       opte = ptes[x86_btop(va)];              /* old PTE */
+       XENPRINTK(("npte %p opte %p ptes %p idx %03x\n", 
+                     (void *)npte, (void *)opte, ptes, x86_btop(va)));
+
+       /*
+        * is there currently a valid mapping at our VA and does it
+        * map to the same PA as the one we want to map ?
+        */
+
+       if (pmap_valid_entry(opte) && ((opte & PG_FRAME) == pa)) {
+
+               /*
+                * first, calculate pm_stats updates.  resident count will not
+                * change since we are replacing/changing a valid mapping.
+                * wired count might change...
+                */
+               pmap->pm_stats.wired_count +=
+                   ((npte & PG_W) ? 1 : 0 - (opte & PG_W) ? 1 : 0);
+
+               XENPRINTK(("pmap update opte == pa"));
+               /* zap! */
+               PTE_ATOMIC_SET_MA(&ptes[x86_btop(va)], npte, opte);
+
+               /*
+                * Any change in the protection level that the CPU
+                * should know about ? 
+                */
+               if ((npte & PG_RW)
+                    || ((opte & (PG_M | PG_RW)) != (PG_M | PG_RW))) {
+                       XENPRINTK(("pmap update opte == pa, prot change"));
+                       /*
+                        * No need to flush the TLB.
+                        * Just add old PG_M, ... flags in new entry.
+                        */
+                       PTE_ATOMIC_SETBITS(&ptes[x86_btop(va)],
+                           opte & (PG_M | PG_U));
+                       goto out_ok;
+               }
+
+               /*
+                * Might be cached in the TLB as being writable
+                * if this is on the PVLIST, sync R/M bit
+                */
+               KDASSERT((opte & PG_PVLIST) == 0);
+               goto shootdown_now;
+       }
+
+       pg = PHYS_TO_VM_PAGE(pa);
+       XENPRINTK(("pg %p from %p, init %d\n", pg, (void *)pa,
+                     pmap_initialized));
+
+       /*
+        * is there currently a valid mapping at our VA?
+        */
+
+       if (pmap_valid_entry(opte)) {
+
+               /*
+                * changing PAs: we must remove the old one first
+                */
+
+               /*
+                * first, calculate pm_stats updates.  resident count will not
+                * change since we are replacing/changing a valid mapping.
+                * wired count might change...
+                */
+               pmap->pm_stats.wired_count +=
+                   ((npte & PG_W) ? 1 : 0 - (opte & PG_W) ? 1 : 0);
+
+               KDASSERT((opte & PG_PVLIST) == 0);
+       } else {        /* opte not valid */
+               pmap->pm_stats.resident_count++;
+               if (wired) 
+                       pmap->pm_stats.wired_count++;
+               if (ptp)
+                       ptp->wire_count++;
+       }
+
+       XENPRINTK(("pmap initial setup"));
+       PTE_ATOMIC_SET_MA(&ptes[x86_btop(va)], npte, opte); /* zap! */
+
+       /* Update page attributes if needed */
+       if ((opte & (PG_V | PG_U)) == (PG_V | PG_U)) {
+#if defined(MULTIPROCESSOR)
+               int32_t cpumask = 0;
+#endif
+shootdown_now:
+#if defined(MULTIPROCESSOR)
+               pmap_tlb_shootdown(pmap, va, opte, &cpumask);
+               pmap_tlb_shootnow(cpumask);
+#else
+               /* Don't bother deferring in the single CPU case. */
+               if (pmap_is_curpmap(pmap))
+                       pmap_update_pg(va);
+#endif
+       }
+
+out_ok:
+       error = 0;
+
+out:
+       pmap_unmap_ptes(pmap);
+       PMAP_MAP_TO_HEAD_UNLOCK();
+
+       XENPRINTK(("pmap_enter: %d\n", error));
+       return error;
+}
+
+/*
  * pmap_growkernel: increase usage of KVM space
  *
  * => we allocate new PTPs for the kernel and install them in all
diff -r 20de69e51e57 -r affba2209a2a sys/arch/xen/include/pmap.h
--- a/sys/arch/xen/include/pmap.h       Sat Apr 24 18:55:02 2004 +0000
+++ b/sys/arch/xen/include/pmap.h       Sat Apr 24 19:18:01 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.h,v 1.2 2004/04/10 23:47:24 cl Exp $      */
+/*     $NetBSD: pmap.h,v 1.3 2004/04/24 19:18:01 cl Exp $      */
 /*     NetBSD: pmap.h,v 1.79 2004/02/20 17:35:01 yamt Exp      */
 
 /*
@@ -352,6 +352,8 @@
 int            pmap_exec_fixup(struct vm_map *, struct trapframe *,
                    struct pcb *);
 void           pmap_load(void);
+int            pmap_enter_ma(struct pmap *, vaddr_t, paddr_t, vm_prot_t,
+                   int);
 
 vaddr_t reserve_dumppages(vaddr_t); /* XXX: not a pmap fn */
 
diff -r 20de69e51e57 -r affba2209a2a sys/arch/xen/x86/bus_space.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/xen/x86/bus_space.c      Sat Apr 24 19:18:01 2004 +0000
@@ -0,0 +1,503 @@
+/*     $NetBSD: bus_space.c,v 1.1 2004/04/24 19:18:01 cl Exp $ */
+/*     NetBSD: bus_space.c,v 1.2 2003/03/14 18:47:53 christos Exp      */
+
+/*-
+ * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace
+ * Simulation Facility, NASA Ames Research Center.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the NetBSD
+ *     Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: bus_space.c,v 1.1 2004/04/24 19:18:01 cl Exp $");
+
+#include "opt_xen.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+#include <sys/extent.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/bus.h>
+
+#include <dev/isa/isareg.h>



Home | Main Index | Thread Index | Old Index