PERFORCE change 57356 for review
Robert Watson
rwatson at FreeBSD.org
Wed Jul 14 13:47:42 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=57356
Change 57356 by rwatson at rwatson_tislabs on 2004/07/14 20:47:13
Integrate netperf_socket from FreeBSD CVS:
- Alpha pmap locking.
- More kdb cleanup, firewire.
- kldunloadf().
- vfs_root() takes a thread.
- KSE debugging related pieces.
- 4BSD preemption bug fix.
- If M_DONTWAIT in socket upcall, defer read to nfsd.
- The great floppy disk escapade continues.
- A variety of powerpc changes.
- UFS1 extattr fix.
Loop back rwatson_netperf locking:
- ng_eiface, ng_fec, ng_iface, ng_ppp, ng_pppoe, ng_tty global
locking.
Affected files ...
.. //depot/projects/netperf_socket/sys/alpha/alpha/pmap.c#11 integrate
.. //depot/projects/netperf_socket/sys/alpha/include/ptrace.h#3 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/machdep.c#11 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/pmap.c#19 integrate
.. //depot/projects/netperf_socket/sys/amd64/include/pmap.h#11 integrate
.. //depot/projects/netperf_socket/sys/arm/arm/db_interface.c#2 integrate
.. //depot/projects/netperf_socket/sys/arm/arm/db_trace.c#2 integrate
.. //depot/projects/netperf_socket/sys/arm/arm/machdep.c#2 integrate
.. //depot/projects/netperf_socket/sys/arm/arm/pmap.c#4 integrate
.. //depot/projects/netperf_socket/sys/arm/include/bus_memio.h#1 branch
.. //depot/projects/netperf_socket/sys/arm/include/bus_pio.h#1 branch
.. //depot/projects/netperf_socket/sys/arm/include/cpufunc.h#2 integrate
.. //depot/projects/netperf_socket/sys/arm/include/db_machdep.h#2 integrate
.. //depot/projects/netperf_socket/sys/arm/include/frame.h#2 integrate
.. //depot/projects/netperf_socket/sys/arm/include/kdb.h#1 branch
.. //depot/projects/netperf_socket/sys/arm/include/pcb.h#2 integrate
.. //depot/projects/netperf_socket/sys/arm/include/pmap.h#2 integrate
.. //depot/projects/netperf_socket/sys/arm/include/setjmp.h#2 integrate
.. //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_proto.h#7 integrate
.. //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_syscall.h#7 integrate
.. //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_syscalls.c#7 integrate
.. //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_sysent.c#7 integrate
.. //depot/projects/netperf_socket/sys/compat/freebsd32/syscalls.master#6 integrate
.. //depot/projects/netperf_socket/sys/conf/files#40 integrate
.. //depot/projects/netperf_socket/sys/conf/files.i386#21 integrate
.. //depot/projects/netperf_socket/sys/conf/files.powerpc#5 integrate
.. //depot/projects/netperf_socket/sys/contrib/dev/fla/COPYRIGHT#2 delete
.. //depot/projects/netperf_socket/sys/contrib/dev/fla/README#2 delete
.. //depot/projects/netperf_socket/sys/contrib/dev/fla/fla.c#4 delete
.. //depot/projects/netperf_socket/sys/contrib/dev/fla/i386/msysosak.o.uu#2 delete
.. //depot/projects/netperf_socket/sys/contrib/dev/fla/msysosak.h#2 delete
.. //depot/projects/netperf_socket/sys/contrib/dev/fla/patch.00#2 delete
.. //depot/projects/netperf_socket/sys/contrib/dev/fla/prep.fla.sh#2 delete
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi.c#31 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_battery.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_cmbat.c#6 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_pci.c#14 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpivar.h#18 integrate
.. //depot/projects/netperf_socket/sys/dev/aic7xxx/aic7770.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/dcons/dcons.c#8 integrate
.. //depot/projects/netperf_socket/sys/dev/digi/digi.c#12 integrate
.. //depot/projects/netperf_socket/sys/dev/fdc/fdc.c#5 integrate
.. //depot/projects/netperf_socket/sys/dev/fdc/fdc_isa.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/fdc/fdc_pccard.c#3 integrate
.. //depot/projects/netperf_socket/sys/dev/fdc/fdcvar.h#2 integrate
.. //depot/projects/netperf_socket/sys/dev/mpt/mpt_debug.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/snp/snp.c#6 integrate
.. //depot/projects/netperf_socket/sys/dev/syscons/scvidctl.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/usb/usbdevs#18 integrate
.. //depot/projects/netperf_socket/sys/fs/fdescfs/fdesc_vfsops.c#5 integrate
.. //depot/projects/netperf_socket/sys/fs/portalfs/portal_vfsops.c#4 integrate
.. //depot/projects/netperf_socket/sys/fs/smbfs/smbfs_vfsops.c#3 integrate
.. //depot/projects/netperf_socket/sys/geom/label/g_label.c#3 integrate
.. //depot/projects/netperf_socket/sys/geom/label/g_label.h#3 integrate
.. //depot/projects/netperf_socket/sys/geom/stripe/g_stripe.c#4 integrate
.. //depot/projects/netperf_socket/sys/i386/conf/NOTES#22 integrate
.. //depot/projects/netperf_socket/sys/i386/conf/OLDCARD#2 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/local_apic.c#4 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/machdep.c#10 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/pmap.c#17 integrate
.. //depot/projects/netperf_socket/sys/ia64/ia64/machdep.c#7 integrate
.. //depot/projects/netperf_socket/sys/ia64/ia64/pmap.c#11 integrate
.. //depot/projects/netperf_socket/sys/kern/init_sysent.c#10 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_descrip.c#11 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_event.c#6 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_exec.c#11 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_exit.c#15 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_fork.c#12 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_kse.c#5 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_linker.c#6 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_module.c#2 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_sig.c#14 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_thread.c#18 integrate
.. //depot/projects/netperf_socket/sys/kern/link_elf.c#4 integrate
.. //depot/projects/netperf_socket/sys/kern/link_elf_obj.c#6 integrate
.. //depot/projects/netperf_socket/sys/kern/sched_4bsd.c#8 integrate
.. //depot/projects/netperf_socket/sys/kern/sys_process.c#8 integrate
.. //depot/projects/netperf_socket/sys/kern/syscalls.c#10 integrate
.. //depot/projects/netperf_socket/sys/kern/syscalls.master#10 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#33 integrate
.. //depot/projects/netperf_socket/sys/kern/vfs_mount.c#12 integrate
.. //depot/projects/netperf_socket/sys/modules/dcons/Makefile#2 integrate
.. //depot/projects/netperf_socket/sys/modules/usb/Makefile#3 integrate
.. //depot/projects/netperf_socket/sys/net/if_sl.c#8 integrate
.. //depot/projects/netperf_socket/sys/net/if_var.h#16 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_eiface.c#6 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_fec.c#6 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_iface.c#7 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_ppp.c#4 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_pppoe.c#5 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_tty.c#5 integrate
.. //depot/projects/netperf_socket/sys/netinet/in_pcb.h#5 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_icmp.c#8 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfs_socket.c#11 integrate
.. //depot/projects/netperf_socket/sys/nfsserver/nfs_srvsock.c#7 integrate
.. //depot/projects/netperf_socket/sys/pc98/conf/GENERIC#8 integrate
.. //depot/projects/netperf_socket/sys/pc98/conf/NOTES#15 integrate
.. //depot/projects/netperf_socket/sys/pc98/i386/machdep.c#8 integrate
.. //depot/projects/netperf_socket/sys/pc98/pc98/clock.c#7 integrate
.. //depot/projects/netperf_socket/sys/pc98/pc98/fd.c#10 integrate
.. //depot/projects/netperf_socket/sys/pc98/pc98/fdc_cbus.c#2 integrate
.. //depot/projects/netperf_socket/sys/pc98/pc98/fdcvar.h#2 integrate
.. //depot/projects/netperf_socket/sys/powerpc/conf/GENERIC#4 integrate
.. //depot/projects/netperf_socket/sys/powerpc/include/cpufunc.h#2 integrate
.. //depot/projects/netperf_socket/sys/powerpc/include/db_machdep.h#2 integrate
.. //depot/projects/netperf_socket/sys/powerpc/include/kdb.h#1 branch
.. //depot/projects/netperf_socket/sys/powerpc/include/pcb.h#2 integrate
.. //depot/projects/netperf_socket/sys/powerpc/include/pcpu.h#3 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/db_interface.c#2 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/db_trace.c#2 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/genassym.c#4 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/locore.S#3 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/machdep.c#4 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/trap.c#4 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/trap_subr.S#3 integrate
.. //depot/projects/netperf_socket/sys/sparc64/sparc64/machdep.c#5 integrate
.. //depot/projects/netperf_socket/sys/sys/event.h#3 integrate
.. //depot/projects/netperf_socket/sys/sys/eventvar.h#2 integrate
.. //depot/projects/netperf_socket/sys/sys/kse.h#3 integrate
.. //depot/projects/netperf_socket/sys/sys/linker.h#3 integrate
.. //depot/projects/netperf_socket/sys/sys/module.h#2 integrate
.. //depot/projects/netperf_socket/sys/sys/proc.h#17 integrate
.. //depot/projects/netperf_socket/sys/sys/ptrace.h#4 integrate
.. //depot/projects/netperf_socket/sys/sys/signalvar.h#3 integrate
.. //depot/projects/netperf_socket/sys/sys/socketvar.h#22 integrate
.. //depot/projects/netperf_socket/sys/sys/syscall.h#10 integrate
.. //depot/projects/netperf_socket/sys/sys/syscall.mk#10 integrate
.. //depot/projects/netperf_socket/sys/sys/sysproto.h#10 integrate
.. //depot/projects/netperf_socket/sys/ufs/ffs/ffs_vfsops.c#8 integrate
Differences ...
==== //depot/projects/netperf_socket/sys/alpha/alpha/pmap.c#11 (text+ko) ====
@@ -148,7 +148,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.154 2004/07/08 07:44:55 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.157 2004/07/14 05:49:44 alc Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -745,11 +745,18 @@
vm_paddr_t
pmap_extract(pmap_t pmap, vm_offset_t va)
{
- pt_entry_t* pte = pmap_lev3pte(pmap, va);
- if (pte)
- return alpha_ptob(ALPHA_PTE_TO_PFN(*pte));
- else
- return 0;
+ pt_entry_t *pte;
+ vm_paddr_t pa;
+
+ pa = 0;
+ if (pmap == NULL)
+ return (pa);
+ PMAP_LOCK(pmap);
+ pte = pmap_lev3pte(pmap, va);
+ if (pte != NULL)
+ pa = alpha_ptob(ALPHA_PTE_TO_PFN(*pte));
+ PMAP_UNLOCK(pmap);
+ return (pa);
}
/*
@@ -1529,6 +1536,7 @@
{
register pt_entry_t *ptq;
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
ptq = pmap_lev3pte(pmap, va);
/*
@@ -1560,8 +1568,12 @@
if (pmap == NULL)
return;
+ /*
+ * Perform an unsynchronized read. This is, however, safe.
+ */
if (pmap->pm_stats.resident_count == 0)
return;
+ PMAP_LOCK(pmap);
/*
* special handling of removing one page. a very
@@ -1570,7 +1582,7 @@
*/
if (sva + PAGE_SIZE == eva) {
pmap_remove_page(pmap, sva);
- return;
+ goto out;
}
for (va = sva; va < eva; va = nva) {
@@ -1587,6 +1599,8 @@
pmap_remove_page(pmap, va);
nva = va + PAGE_SIZE;
}
+out:
+ PMAP_UNLOCK(pmap);
}
/*
@@ -2185,7 +2199,6 @@
pt_entry_t *pte, tpte;
vm_page_t m;
pv_entry_t pv, npv;
- int s;
#ifdef PMAP_REMOVE_PAGES_CURPROC_ONLY
if (!curthread || (pmap != vmspace_pmap(curthread->td_proc->p_vmspace))) {
@@ -2194,7 +2207,7 @@
}
#endif
- s = splvm();
+ vm_page_lock_queues();
PMAP_LOCK(pmap);
for(pv = TAILQ_FIRST(&pmap->pm_pvlist);
pv;
@@ -2228,6 +2241,10 @@
pv->pv_pmap->pm_stats.resident_count--;
+ if ((tpte & PG_FOW) == 0)
+ if (pmap_track_modified(pv->pv_va))
+ vm_page_dirty(m);
+
npv = TAILQ_NEXT(pv, pv_plist);
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
@@ -2240,9 +2257,9 @@
pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem);
free_pv_entry(pv);
}
- splx(s);
pmap_invalidate_all(pmap);
PMAP_UNLOCK(pmap);
+ vm_page_unlock_queues();
}
/*
@@ -2378,21 +2395,25 @@
{
pv_entry_t pv;
pt_entry_t *pte;
+ boolean_t rv;
+ rv = FALSE;
if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
- return FALSE;
+ return (rv);
/*
* A page is modified if any mapping has had its PG_FOW flag
* cleared.
*/
TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+ PMAP_LOCK(pv->pv_pmap);
pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va);
- if (!(*pte & PG_FOW))
- return 1;
+ rv = !(*pte & PG_FOW);
+ PMAP_UNLOCK(pv->pv_pmap);
+ if (rv)
+ break;
}
-
- return 0;
+ return (rv);
}
/*
@@ -2405,14 +2426,17 @@
pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
{
pt_entry_t *pte;
+ boolean_t rv;
- if (!pmap_pte_v(pmap_lev1pte(pmap, addr)) ||
- !pmap_pte_v(pmap_lev2pte(pmap, addr)))
- return (FALSE);
- pte = vtopte(addr);
- if (*pte)
- return (FALSE);
- return (TRUE);
+ rv = FALSE;
+ PMAP_LOCK(pmap);
+ if (pmap_pte_v(pmap_lev1pte(pmap, addr)) &&
+ pmap_pte_v(pmap_lev2pte(pmap, addr))) {
+ pte = vtopte(addr);
+ rv = *pte == 0;
+ }
+ PMAP_UNLOCK(pmap);
+ return (rv);
}
/*
@@ -2611,30 +2635,30 @@
pmap_t pmap;
vm_offset_t addr;
{
- pt_entry_t *pte;
+ pt_entry_t *ptep, pte;
int val = 0;
- pte = pmap_lev3pte(pmap, addr);
- if (pte == 0) {
- return 0;
- }
+ PMAP_LOCK(pmap);
+ ptep = pmap_lev3pte(pmap, addr);
+ pte = (ptep != NULL) ? *ptep : 0;
+ PMAP_UNLOCK(pmap);
- if (pmap_pte_v(pte)) {
+ if (pte & PG_V) {
vm_page_t m;
vm_offset_t pa;
val = MINCORE_INCORE;
- if ((*pte & PG_MANAGED) == 0)
+ if ((pte & PG_MANAGED) == 0)
return val;
- pa = pmap_pte_pa(pte);
+ pa = alpha_ptob(ALPHA_PTE_TO_PFN(pte));
m = PHYS_TO_VM_PAGE(pa);
/*
* Modified by us
*/
- if ((*pte & PG_FOW) == 0)
+ if ((pte & PG_FOW) == 0)
val |= MINCORE_MODIFIED|MINCORE_MODIFIED_OTHER;
else {
/*
@@ -2648,7 +2672,7 @@
/*
* Referenced by us
*/
- if ((*pte & (PG_FOR | PG_FOE)) == 0)
+ if ((pte & (PG_FOR | PG_FOE)) == 0)
val |= MINCORE_REFERENCED|MINCORE_REFERENCED_OTHER;
else {
/*
==== //depot/projects/netperf_socket/sys/alpha/include/ptrace.h#3 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)ptrace.h 8.1 (Berkeley) 6/11/93
- * $FreeBSD: src/sys/alpha/include/ptrace.h,v 1.11 2004/04/05 21:00:50 imp Exp $
+ * $FreeBSD: src/sys/alpha/include/ptrace.h,v 1.12 2004/07/13 16:11:04 kensmith Exp $
*/
#ifndef _MACHINE_PTRACE_H_
@@ -35,7 +35,6 @@
#ifdef _KERNEL
#define FIX_SSTEP(p) ptrace_clear_single_step(p)
-int ptrace_clear_single_step(struct thread *_p);
#endif
#endif
==== //depot/projects/netperf_socket/sys/amd64/amd64/machdep.c#11 (text+ko) ====
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.613 2004/07/10 22:39:17 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.614 2004/07/13 07:22:54 davidxu Exp $");
#include "opt_atalk.h"
#include "opt_atpic.h"
@@ -1303,6 +1303,13 @@
}
int
+ptrace_clear_single_step(struct thread *td)
+{
+ td->td_frame->tf_rflags &= ~PSL_T;
+ return (0);
+}
+
+int
fill_regs(struct thread *td, struct reg *regs)
{
struct pcb *pcb;
==== //depot/projects/netperf_socket/sys/amd64/amd64/pmap.c#19 (text+ko) ====
@@ -75,7 +75,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.482 2004/07/07 16:47:58 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.484 2004/07/14 07:13:33 peter Exp $");
/*
* Manages physical address maps.
@@ -207,17 +207,17 @@
static pv_entry_t get_pv_entry(void);
static void pmap_clear_ptes(vm_page_t m, int bit);
-static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva);
+static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq,
+ vm_offset_t sva, pd_entry_t ptepde);
static void pmap_remove_page(struct pmap *pmap, vm_offset_t va);
static int pmap_remove_entry(struct pmap *pmap, vm_page_t m,
- vm_offset_t va);
-static void pmap_insert_entry(pmap_t pmap, vm_offset_t va,
- vm_page_t mpte, vm_page_t m);
+ vm_offset_t va, pd_entry_t ptepde);
+static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va);
static vm_page_t _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex);
-static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t);
+static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t);
static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
@@ -334,12 +334,37 @@
}
+static __inline pt_entry_t *
+pmap_pte_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *ptepde)
+{
+ pd_entry_t *pde;
+ pt_entry_t *pte;
+
+ pde = pmap_pde(pmap, va);
+ if (pde == NULL || (*pde & PG_V) == 0)
+ return NULL;
+ *ptepde = *pde;
+ if ((*pde & PG_PS) != 0) /* compat with i386 pmap_pte() */
+ return ((pt_entry_t *)pde);
+ pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
+ return (&pte[pmap_pte_index(va)]);
+}
+
+
PMAP_INLINE pt_entry_t *
vtopte(vm_offset_t va)
{
u_int64_t mask = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT + NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
- return (PTmap + (amd64_btop(va) & mask));
+ return (PTmap + ((va >> PAGE_SHIFT) & mask));
+}
+
+static __inline pd_entry_t *
+vtopde(vm_offset_t va)
+{
+ u_int64_t mask = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
+
+ return (PDmap + ((va >> PDRSHIFT) & mask));
}
static u_int64_t
@@ -1034,12 +1059,16 @@
* conditionally free the page, and manage the hold/wire counts.
*/
static int
-pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t mpte)
+pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde)
{
+ vm_page_t mpte;
if (va >= VM_MAXUSER_ADDRESS)
return 0;
-
+/* XXX this should be an error, all cases should be caught now */
+ if (ptepde == 0)
+ ptepde = *pmap_pde(pmap, va);
+ mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
return pmap_unwire_pte_hold(pmap, va, mpte);
}
@@ -1437,7 +1466,7 @@
static int
-pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va)
+pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va, pd_entry_t ptepde)
{
pv_entry_t pv;
int rtval;
@@ -1458,7 +1487,7 @@
rtval = 0;
if (pv) {
- rtval = pmap_unuse_pt(pmap, va, pv->pv_ptem);
+ rtval = pmap_unuse_pt(pmap, va, ptepde);
TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
m->md.pv_list_count--;
if (TAILQ_FIRST(&m->md.pv_list) == NULL)
@@ -1476,14 +1505,13 @@
* (pmap, va).
*/
static void
-pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m)
+pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
{
pv_entry_t pv;
pv = get_pv_entry();
pv->pv_va = va;
pv->pv_pmap = pmap;
- pv->pv_ptem = mpte;
vm_page_lock_queues();
TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist);
@@ -1496,10 +1524,10 @@
* pmap_remove_pte: do the things to unmap a page in a process
*/
static int
-pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va)
+pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, pd_entry_t ptepde)
{
pt_entry_t oldpte;
- vm_page_t m, mpte;
+ vm_page_t m;
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
oldpte = pte_load_clear(ptq);
@@ -1527,10 +1555,9 @@
}
if (oldpte & PG_A)
vm_page_flag_set(m, PG_REFERENCED);
- return pmap_remove_entry(pmap, m, va);
+ return pmap_remove_entry(pmap, m, va, ptepde);
} else {
- mpte = PHYS_TO_VM_PAGE(*pmap_pde(pmap, va) & PG_FRAME);
- return pmap_unuse_pt(pmap, va, mpte);
+ return pmap_unuse_pt(pmap, va, ptepde);
}
}
@@ -1540,13 +1567,14 @@
static void
pmap_remove_page(pmap_t pmap, vm_offset_t va)
{
+ pd_entry_t ptepde;
pt_entry_t *pte;
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
- pte = pmap_pte(pmap, va);
+ pte = pmap_pte_pde(pmap, va, &ptepde);
if (pte == NULL || (*pte & PG_V) == 0)
return;
- pmap_remove_pte(pmap, pte, va);
+ pmap_remove_pte(pmap, pte, va, ptepde);
pmap_invalidate_page(pmap, va);
}
@@ -1649,7 +1677,7 @@
if (pte == NULL || *pte == 0)
continue;
anyvalid = 1;
- if (pmap_remove_pte(pmap, pte, sva))
+ if (pmap_remove_pte(pmap, pte, sva, ptpaddr))
break;
}
}
@@ -1677,6 +1705,7 @@
{
register pv_entry_t pv;
pt_entry_t *pte, tpte;
+ pd_entry_t ptepde;
#if defined(PMAP_DIAGNOSTIC)
/*
@@ -1691,7 +1720,7 @@
while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
PMAP_LOCK(pv->pv_pmap);
pv->pv_pmap->pm_stats.resident_count--;
- pte = pmap_pte(pv->pv_pmap, pv->pv_va);
+ pte = pmap_pte_pde(pv->pv_pmap, pv->pv_va, &ptepde);
tpte = pte_load_clear(pte);
if (tpte & PG_W)
pv->pv_pmap->pm_stats.wired_count--;
@@ -1716,7 +1745,7 @@
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
m->md.pv_list_count--;
- pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem);
+ pmap_unuse_pt(pv->pv_pmap, pv->pv_va, ptepde);
PMAP_UNLOCK(pv->pv_pmap);
free_pv_entry(pv);
}
@@ -1849,6 +1878,7 @@
vm_paddr_t pa;
register pt_entry_t *pte;
vm_paddr_t opa;
+ pd_entry_t ptepde;
pt_entry_t origpte, newpte;
vm_page_t mpte;
@@ -1882,7 +1912,7 @@
}
#endif
- pte = pmap_pte(pmap, va);
+ pte = pmap_pte_pde(pmap, va, &ptepde);
/*
* Page Directory table entry not valid, we need a new PT page
@@ -1948,7 +1978,7 @@
int err;
vm_page_lock_queues();
PMAP_LOCK(pmap);
- err = pmap_remove_pte(pmap, pte, va);
+ err = pmap_remove_pte(pmap, pte, va, ptepde);
PMAP_UNLOCK(pmap);
vm_page_unlock_queues();
if (err)
@@ -1962,7 +1992,7 @@
*/
if (pmap_initialized &&
(m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0) {
- pmap_insert_entry(pmap, va, mpte, m);
+ pmap_insert_entry(pmap, va, m);
pa |= PG_MANAGED;
}
@@ -2080,7 +2110,7 @@
* called at interrupt time.
*/
if ((m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0)
- pmap_insert_entry(pmap, va, mpte, m);
+ pmap_insert_entry(pmap, va, m);
/*
* Increment counters
@@ -2331,8 +2361,7 @@
m = PHYS_TO_VM_PAGE(ptetemp & PG_FRAME);
*dst_pte = ptetemp & ~(PG_M | PG_A);
dst_pmap->pm_stats.resident_count++;
- pmap_insert_entry(dst_pmap, addr,
- dstmpte, m);
+ pmap_insert_entry(dst_pmap, addr, m);
} else {
vm_page_lock_queues();
pmap_unwire_pte_hold(dst_pmap, addr, dstmpte);
@@ -2459,7 +2488,7 @@
return;
}
#endif
- mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+ vm_page_lock_queues();
PMAP_LOCK(pmap);
for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
@@ -2516,11 +2545,12 @@
if (TAILQ_EMPTY(&m->md.pv_list))
vm_page_flag_clear(m, PG_WRITEABLE);
- pmap_unuse_pt(pmap, pv->pv_va, pv->pv_ptem);
+ pmap_unuse_pt(pmap, pv->pv_va, *vtopde(pv->pv_va));
free_pv_entry(pv);
}
pmap_invalidate_all(pmap);
PMAP_UNLOCK(pmap);
+ vm_page_unlock_queues();
}
/*
==== //depot/projects/netperf_socket/sys/amd64/include/pmap.h#11 (text+ko) ====
@@ -39,7 +39,7 @@
*
* from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90
* from: @(#)pmap.h 7.4 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/amd64/include/pmap.h,v 1.120 2004/06/19 14:58:34 bde Exp $
+ * $FreeBSD: src/sys/amd64/include/pmap.h,v 1.121 2004/07/14 07:13:35 peter Exp $
*/
#ifndef _MACHINE_PMAP_H_
@@ -256,7 +256,6 @@
vm_offset_t pv_va; /* virtual address for mapping */
TAILQ_ENTRY(pv_entry) pv_list;
TAILQ_ENTRY(pv_entry) pv_plist;
- vm_page_t pv_ptem; /* VM page for pte */
} *pv_entry_t;
#ifdef _KERNEL
==== //depot/projects/netperf_socket/sys/arm/arm/db_interface.c#2 (text+ko) ====
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/db_interface.c,v 1.1 2004/05/14 11:46:42 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/db_interface.c,v 1.2 2004/07/12 21:25:01 cognet Exp $");
#include "opt_ddb.h"
#include <sys/param.h>
@@ -62,36 +62,33 @@
#include <ddb/db_sym.h>
#include <sys/cons.h>
-static int nil;
+static int nil = 0;
-db_regs_t ddb_regs;
int db_access_und_sp (struct db_variable *, db_expr_t *, int);
int db_access_abt_sp (struct db_variable *, db_expr_t *, int);
int db_access_irq_sp (struct db_variable *, db_expr_t *, int);
-u_int db_fetch_reg (int, db_regs_t *);
-int db_trapper __P((u_int, u_int, trapframe_t *, int));
-
+#define DB_OFFSET(x) (db_expr_t *)offsetof(struct trapframe, x)
struct db_variable db_regs[] = {
- { "spsr", (int *)&DDB_REGS->tf_spsr, FCN_NULL, },
- { "r0", (int *)&DDB_REGS->tf_r0, FCN_NULL, },
- { "r1", (int *)&DDB_REGS->tf_r1, FCN_NULL, },
- { "r2", (int *)&DDB_REGS->tf_r2, FCN_NULL, },
- { "r3", (int *)&DDB_REGS->tf_r3, FCN_NULL, },
- { "r4", (int *)&DDB_REGS->tf_r4, FCN_NULL, },
- { "r5", (int *)&DDB_REGS->tf_r5, FCN_NULL, },
- { "r6", (int *)&DDB_REGS->tf_r6, FCN_NULL, },
- { "r7", (int *)&DDB_REGS->tf_r7, FCN_NULL, },
- { "r8", (int *)&DDB_REGS->tf_r8, FCN_NULL, },
- { "r9", (int *)&DDB_REGS->tf_r9, FCN_NULL, },
- { "r10", (int *)&DDB_REGS->tf_r10, FCN_NULL, },
- { "r11", (int *)&DDB_REGS->tf_r11, FCN_NULL, },
- { "r12", (int *)&DDB_REGS->tf_r12, FCN_NULL, },
- { "usr_sp", (int *)&DDB_REGS->tf_usr_sp, FCN_NULL, },
- { "usr_lr", (int *)&DDB_REGS->tf_usr_lr, FCN_NULL, },
- { "svc_sp", (int *)&DDB_REGS->tf_svc_sp, FCN_NULL, },
- { "svc_lr", (int *)&DDB_REGS->tf_svc_lr, FCN_NULL, },
- { "pc", (int *)&DDB_REGS->tf_pc, FCN_NULL, },
+ { "spsr", DB_OFFSET(tf_spsr), FCN_NULL, },
+ { "r0", DB_OFFSET(tf_r0), FCN_NULL, },
+ { "r1", DB_OFFSET(tf_r1), FCN_NULL, },
+ { "r2", DB_OFFSET(tf_r2), FCN_NULL, },
+ { "r3", DB_OFFSET(tf_r3), FCN_NULL, },
+ { "r4", DB_OFFSET(tf_r4), FCN_NULL, },
+ { "r5", DB_OFFSET(tf_r5), FCN_NULL, },
+ { "r6", DB_OFFSET(tf_r6), FCN_NULL, },
+ { "r7", DB_OFFSET(tf_r7), FCN_NULL, },
+ { "r8", DB_OFFSET(tf_r8), FCN_NULL, },
+ { "r9", DB_OFFSET(tf_r9), FCN_NULL, },
+ { "r10", DB_OFFSET(tf_r10), FCN_NULL, },
+ { "r11", DB_OFFSET(tf_r11), FCN_NULL, },
+ { "r12", DB_OFFSET(tf_r12), FCN_NULL, },
+ { "usr_sp", DB_OFFSET(tf_usr_sp), FCN_NULL, },
+ { "usr_lr", DB_OFFSET(tf_usr_lr), FCN_NULL, },
+ { "svc_sp", DB_OFFSET(tf_svc_sp), FCN_NULL, },
+ { "svc_lr", DB_OFFSET(tf_svc_lr), FCN_NULL, },
+ { "pc", DB_OFFSET(tf_pc), FCN_NULL, },
{ "und_sp", &nil, db_access_und_sp, },
{ "abt_sp", &nil, db_access_abt_sp, },
{ "irq_sp", &nil, db_access_irq_sp, },
@@ -99,8 +96,6 @@
struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]);
-int db_active = 0;
-
int
db_access_und_sp(struct db_variable *vp, db_expr_t *valp, int rw)
{
@@ -128,39 +123,6 @@
return(0);
}
-#ifdef DDB
-/*
- * kdb_trap - field a TRACE or BPT trap
- */
-int
-kdb_trap(int type, db_regs_t *regs)
-{
- int s;
-
- switch (type) {
- case T_BREAKPOINT: /* breakpoint */
- case -1: /* keyboard interrupt */
- break;
- default:
- break;
- }
-
- /* Should switch to kdb`s own stack here. */
-
- ddb_regs = *regs;
-
- s = splhigh();
- db_active++;
- db_trap(type, 0/*code*/);
- db_active--;
- splx(s);
-
- *regs = ddb_regs;
-
- return (1);
-}
-#endif
-
void
db_show_mdpcpu(struct pcpu *pc)
{
@@ -188,7 +150,7 @@
/*
* Read bytes from kernel address space for debugger.
*/
-void
+int
db_read_bytes(addr, size, data)
vm_offset_t addr;
size_t size;
@@ -198,32 +160,33 @@
if (db_validate_address((u_int)src)) {
db_printf("address %p is invalid\n", src);
- return;
+ return (-1);
}
if (size == 4 && (addr & 3) == 0 && ((uintptr_t)data & 3) == 0) {
*((int*)data) = *((int*)src);
- return;
+ return (0);
}
if (size == 2 && (addr & 1) == 0 && ((uintptr_t)data & 1) == 0) {
*((short*)data) = *((short*)src);
- return;
+ return (0);
}
while (size-- > 0) {
if (db_validate_address((u_int)src)) {
db_printf("address %p is invalid\n", src);
- return;
+ return (-1);
}
*data++ = *src++;
}
+ return (0);
}
/*
* Write bytes to kernel address space for debugger.
*/
-void
+int
db_write_bytes(vm_offset_t addr, size_t size, char *data)
{
char *dst;
@@ -231,13 +194,13 @@
/* If any part is in kernel text, use db_write_text() */
if (addr >= (vm_offset_t) btext && addr < (vm_offset_t) etext) {
- return;
+ return (-1);
}
dst = (char *)addr;
if (db_validate_address((u_int)dst)) {
db_printf("address %p is invalid\n", dst);
- return;
+ return (0);
}
if (size == 4 && (addr & 3) == 0 && ((uintptr_t)data & 3) == 0)
@@ -250,7 +213,7 @@
while (loop-- > 0) {
if (db_validate_address((u_int)dst)) {
db_printf("address %p is invalid\n", dst);
- return;
+ return (-1);
}
*dst++ = *data++;
}
@@ -262,73 +225,8 @@
/* In case the current page tables have been modified ... */
cpu_tlb_flushID();
cpu_cpwait();
-}
-
-#ifdef DDB
-void
-Debugger(const char *msg)
-{
- db_printf("Debugger(\"%s\")\n", msg);
- __asm(".word 0xe7ffffff");
-}
-
-int
-db_trapper(u_int addr, u_int inst, trapframe_t *frame, int fault_code)
-{
-
- if (fault_code == 0) {
- if ((inst & ~INSN_COND_MASK) == (BKPT_INST & ~INSN_COND_MASK))
- kdb_trap(T_BREAKPOINT, frame);
- else
- kdb_trap(-1, frame);
- } else
- return (1);
return (0);
}
-extern u_int end;
-
-#endif
-u_int
-db_fetch_reg(int reg, db_regs_t *db_regs)
-{
-
- switch (reg) {
- case 0:
- return (db_regs->tf_r0);
- case 1:
- return (db_regs->tf_r1);
- case 2:
- return (db_regs->tf_r2);
- case 3:
- return (db_regs->tf_r3);
- case 4:
- return (db_regs->tf_r4);
- case 5:
- return (db_regs->tf_r5);
- case 6:
- return (db_regs->tf_r6);
- case 7:
- return (db_regs->tf_r7);
- case 8:
- return (db_regs->tf_r8);
- case 9:
- return (db_regs->tf_r9);
- case 10:
- return (db_regs->tf_r10);
- case 11:
- return (db_regs->tf_r11);
- case 12:
- return (db_regs->tf_r12);
- case 13:
- return (db_regs->tf_svc_sp);
- case 14:
- return (db_regs->tf_svc_lr);
- case 15:
- return (db_regs->tf_pc);
- default:
- panic("db_fetch_reg: botch");
- }
-}
==== //depot/projects/netperf_socket/sys/arm/arm/db_trace.c#2 (text+ko) ====
@@ -30,12 +30,13 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/db_trace.c,v 1.1 2004/05/14 11:46:42 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/db_trace.c,v 1.2 2004/07/12 21:25:01 cognet Exp $");
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/user.h>
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list