PERFORCE change 82488 for review
Robert Watson
rwatson at FreeBSD.org
Wed Aug 24 05:13:00 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=82488
Change 82488 by rwatson at rwatson_zoo on 2005/08/24 05:12:18
Integrate netsmp branch:
padlock
ata fixen
if_my lock fixage
mpsafe device node changets
if_el locking
bpf lockdown, write filters
if_addr_mtx merge, fixes
if_bridge locking fixes
addrsel_lock now uses an sx lock also
inpcb locking fix in raw_ip6.c
raw_ip6 locking fix
if_dc locking fixage
if_sf locking fixage
if_xl locking fixage
Affected files ...
.. //depot/projects/netsmp/src/sys/alpha/include/_limits.h#2 integrate
.. //depot/projects/netsmp/src/sys/alpha/include/signal.h#2 integrate
.. //depot/projects/netsmp/src/sys/amd64/amd64/mp_machdep.c#3 integrate
.. //depot/projects/netsmp/src/sys/amd64/amd64/pmap.c#4 integrate
.. //depot/projects/netsmp/src/sys/amd64/include/_limits.h#2 integrate
.. //depot/projects/netsmp/src/sys/amd64/include/atomic.h#3 integrate
.. //depot/projects/netsmp/src/sys/amd64/include/signal.h#2 integrate
.. //depot/projects/netsmp/src/sys/arm/include/_limits.h#2 integrate
.. //depot/projects/netsmp/src/sys/arm/include/signal.h#2 integrate
.. //depot/projects/netsmp/src/sys/boot/common/loader.8#2 integrate
.. //depot/projects/netsmp/src/sys/boot/forth/loader.conf#4 integrate
.. //depot/projects/netsmp/src/sys/boot/forth/loader.conf.5#2 integrate
.. //depot/projects/netsmp/src/sys/boot/i386/boot2/boot2.c#3 integrate
.. //depot/projects/netsmp/src/sys/boot/i386/boot2/lib.h#2 integrate
.. //depot/projects/netsmp/src/sys/boot/i386/boot2/sio.S#2 integrate
.. //depot/projects/netsmp/src/sys/boot/i386/libi386/comconsole.c#2 integrate
.. //depot/projects/netsmp/src/sys/boot/sparc64/loader/metadata.c#2 integrate
.. //depot/projects/netsmp/src/sys/conf/files.i386#2 integrate
.. //depot/projects/netsmp/src/sys/conf/newvers.sh#2 integrate
.. //depot/projects/netsmp/src/sys/crypto/rijndael/rijndael-alg-fst.c#2 integrate
.. //depot/projects/netsmp/src/sys/crypto/via/padlock.c#1 branch
.. //depot/projects/netsmp/src/sys/dev/acpica/acpi_thermal.c#3 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-all.c#3 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-all.h#3 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-chipset.c#4 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-disk.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-lowlevel.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-pci.h#4 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/atapi-cd.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/firewire/if_fwip.c#5 integrate
.. //depot/projects/netsmp/src/sys/dev/fxp/if_fxp.c#8 integrate
.. //depot/projects/netsmp/src/sys/dev/hme/if_hme.c#7 integrate
.. //depot/projects/netsmp/src/sys/dev/hwpmc/hwpmc_amd.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/hwpmc/hwpmc_mod.c#3 integrate
.. //depot/projects/netsmp/src/sys/dev/hwpmc/hwpmc_x86.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ipw/if_ipw.c#7 integrate
.. //depot/projects/netsmp/src/sys/dev/iwi/if_iwi.c#5 integrate
.. //depot/projects/netsmp/src/sys/dev/iwi/if_iwireg.h#2 integrate
.. //depot/projects/netsmp/src/sys/dev/iwi/if_iwivar.h#2 integrate
.. //depot/projects/netsmp/src/sys/dev/md/md.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/my/if_my.c#7 integrate
.. //depot/projects/netsmp/src/sys/dev/my/if_myreg.h#3 integrate
.. //depot/projects/netsmp/src/sys/dev/ral/if_ral.c#6 integrate
.. //depot/projects/netsmp/src/sys/dev/ral/if_ral_pccard.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/re/if_re.c#7 integrate
.. //depot/projects/netsmp/src/sys/dev/sn/if_sn.c#6 integrate
.. //depot/projects/netsmp/src/sys/dev/sn/if_sn_pccard.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/sn/if_snvar.h#2 integrate
.. //depot/projects/netsmp/src/sys/dev/uart/uart_cpu_sparc64.c#3 integrate
.. //depot/projects/netsmp/src/sys/dev/usb/if_ural.c#6 integrate
.. //depot/projects/netsmp/src/sys/dev/usb/uhub.c#2 integrate
.. //depot/projects/netsmp/src/sys/fs/devfs/devfs.h#2 integrate
.. //depot/projects/netsmp/src/sys/fs/devfs/devfs_devs.c#2 integrate
.. //depot/projects/netsmp/src/sys/fs/devfs/devfs_int.h#1 branch
.. //depot/projects/netsmp/src/sys/fs/devfs/devfs_rule.c#2 integrate
.. //depot/projects/netsmp/src/sys/fs/devfs/devfs_vfsops.c#3 integrate
.. //depot/projects/netsmp/src/sys/fs/devfs/devfs_vnops.c#4 integrate
.. //depot/projects/netsmp/src/sys/geom/eli/g_eli.c#3 integrate
.. //depot/projects/netsmp/src/sys/geom/eli/g_eli.h#3 integrate
.. //depot/projects/netsmp/src/sys/geom/eli/g_eli_ctl.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/geom_ctl.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/label/g_label.c#3 integrate
.. //depot/projects/netsmp/src/sys/geom/label/g_label_ext2fs.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/label/g_label_reiserfs.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/stripe/g_stripe.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/stripe/g_stripe.h#2 integrate
.. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_drive.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_plex.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_rm.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_var.h#2 integrate
.. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_volume.c#2 integrate
.. //depot/projects/netsmp/src/sys/i386/acpica/acpi_wakeup.c#2 integrate
.. //depot/projects/netsmp/src/sys/i386/i386/mp_machdep.c#2 integrate
.. //depot/projects/netsmp/src/sys/i386/i386/pmap.c#5 integrate
.. //depot/projects/netsmp/src/sys/i386/i386/swtch.s#2 integrate
.. //depot/projects/netsmp/src/sys/i386/include/_limits.h#2 integrate
.. //depot/projects/netsmp/src/sys/i386/include/signal.h#2 integrate
.. //depot/projects/netsmp/src/sys/i386/isa/if_el.c#4 integrate
.. //depot/projects/netsmp/src/sys/ia64/ia64/elf_machdep.c#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/include/_limits.h#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/include/signal.h#2 integrate
.. //depot/projects/netsmp/src/sys/kern/kern_conf.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/kern_cpu.c#3 integrate
.. //depot/projects/netsmp/src/sys/kern/kern_kse.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/kern_mib.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/sched_ule.c#4 integrate
.. //depot/projects/netsmp/src/sys/kern/sys_process.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/vfs_default.c#3 integrate
.. //depot/projects/netsmp/src/sys/kern/vfs_lookup.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/vfs_subr.c#6 integrate
.. //depot/projects/netsmp/src/sys/modules/Makefile#2 integrate
.. //depot/projects/netsmp/src/sys/modules/padlock/Makefile#1 branch
.. //depot/projects/netsmp/src/sys/modules/procfs/Makefile#3 integrate
.. //depot/projects/netsmp/src/sys/net/bpf.c#4 integrate
.. //depot/projects/netsmp/src/sys/net/bpf.h#2 integrate
.. //depot/projects/netsmp/src/sys/net/bpfdesc.h#3 integrate
.. //depot/projects/netsmp/src/sys/net/bridgestp.c#4 integrate
.. //depot/projects/netsmp/src/sys/net/if.c#13 integrate
.. //depot/projects/netsmp/src/sys/net/if_bridge.c#7 integrate
.. //depot/projects/netsmp/src/sys/net/if_ethersubr.c#7 integrate
.. //depot/projects/netsmp/src/sys/net/if_vlan.c#7 integrate
.. //depot/projects/netsmp/src/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c#2 integrate
.. //depot/projects/netsmp/src/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.h#2 integrate
.. //depot/projects/netsmp/src/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c#3 integrate
.. //depot/projects/netsmp/src/sys/netgraph/ng_base.c#3 integrate
.. //depot/projects/netsmp/src/sys/netinet/in.c#7 integrate
.. //depot/projects/netsmp/src/sys/netinet/in.h#2 integrate
.. //depot/projects/netsmp/src/sys/netinet/in_pcb.h#2 integrate
.. //depot/projects/netsmp/src/sys/netinet/ip_fastfwd.c#5 integrate
.. //depot/projects/netsmp/src/sys/netinet/ip_fw2.c#4 integrate
.. //depot/projects/netsmp/src/sys/netinet/ip_icmp.c#2 integrate
.. //depot/projects/netsmp/src/sys/netinet/ip_output.c#7 integrate
.. //depot/projects/netsmp/src/sys/netinet/raw_ip.c#2 integrate
.. //depot/projects/netsmp/src/sys/netinet/tcp.h#2 integrate
.. //depot/projects/netsmp/src/sys/netinet/tcp_input.c#2 integrate
.. //depot/projects/netsmp/src/sys/netinet/tcp_sack.c#2 integrate
.. //depot/projects/netsmp/src/sys/netinet/tcp_usrreq.c#3 integrate
.. //depot/projects/netsmp/src/sys/netinet/udp_usrreq.c#2 integrate
.. //depot/projects/netsmp/src/sys/netinet6/in6_src.c#4 integrate
.. //depot/projects/netsmp/src/sys/netinet6/raw_ip6.c#4 integrate
.. //depot/projects/netsmp/src/sys/netkey/key.c#3 integrate
.. //depot/projects/netsmp/src/sys/opencrypto/cryptodev.c#2 integrate
.. //depot/projects/netsmp/src/sys/opencrypto/xform.c#2 integrate
.. //depot/projects/netsmp/src/sys/pci/if_dc.c#7 integrate
.. //depot/projects/netsmp/src/sys/pci/if_de.c#9 integrate
.. //depot/projects/netsmp/src/sys/pci/if_devar.h#4 integrate
.. //depot/projects/netsmp/src/sys/pci/if_pcn.c#8 integrate
.. //depot/projects/netsmp/src/sys/pci/if_sf.c#7 integrate
.. //depot/projects/netsmp/src/sys/pci/if_sfreg.h#3 integrate
.. //depot/projects/netsmp/src/sys/pci/if_ste.c#6 integrate
.. //depot/projects/netsmp/src/sys/pci/if_stereg.h#2 integrate
.. //depot/projects/netsmp/src/sys/pci/if_xl.c#7 integrate
.. //depot/projects/netsmp/src/sys/pci/if_xlreg.h#2 integrate
.. //depot/projects/netsmp/src/sys/powerpc/include/_limits.h#2 integrate
.. //depot/projects/netsmp/src/sys/powerpc/include/signal.h#2 integrate
.. //depot/projects/netsmp/src/sys/powerpc/ofw/ofw_syscons.c#2 integrate
.. //depot/projects/netsmp/src/sys/sparc64/conf/GENERIC#2 integrate
.. //depot/projects/netsmp/src/sys/sparc64/include/_limits.h#2 integrate
.. //depot/projects/netsmp/src/sys/sparc64/include/signal.h#2 integrate
.. //depot/projects/netsmp/src/sys/sys/conf.h#3 integrate
.. //depot/projects/netsmp/src/sys/sys/malloc.h#2 integrate
.. //depot/projects/netsmp/src/sys/sys/signal.h#2 integrate
.. //depot/projects/netsmp/src/sys/sys/systm.h#2 integrate
.. //depot/projects/netsmp/src/sys/ufs/ffs/ffs_softdep.c#3 integrate
.. //depot/projects/netsmp/src/sys/ufs/ffs/ffs_vfsops.c#3 integrate
.. //depot/projects/netsmp/src/sys/ufs/ufs/ufs_dirhash.c#2 integrate
Differences ...
==== //depot/projects/netsmp/src/sys/alpha/include/_limits.h#2 (text+ko) ====
@@ -28,7 +28,7 @@
*
* @(#)limits.h 8.3 (Berkeley) 1/4/94
* From: NetBSD: limits.h,v 1.3 1997/04/06 08:47:31 cgd Exp
- * $FreeBSD: src/sys/alpha/include/_limits.h,v 1.16 2005/01/05 20:05:50 imp Exp $
+ * $FreeBSD: src/sys/alpha/include/_limits.h,v 1.17 2005/08/20 16:44:40 stefanf Exp $
*/
#ifndef _MACHINE__LIMITS_H_
@@ -87,4 +87,10 @@
#define __LONG_BIT 64
#define __WORD_BIT 32
+/*
+ * Minimum signal stack size. The current signal frame
+ * for Alpha is 808 bytes large.
+ */
+#define __MINSIGSTKSZ (1024 * 4)
+
#endif /* !_MACHINE__LIMITS_H_ */
==== //depot/projects/netsmp/src/sys/alpha/include/signal.h#2 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/alpha/include/signal.h,v 1.12 2005/01/05 20:05:50 imp Exp $ */
+/* $FreeBSD: src/sys/alpha/include/signal.h,v 1.13 2005/08/20 16:44:40 stefanf Exp $ */
/* From: NetBSD: signal.h,v 1.3 1997/04/06 08:47:43 cgd Exp */
/*-
@@ -36,14 +36,6 @@
typedef long sig_atomic_t;
-#if __XSI_VISIBLE
-/*
- * Minimum signal stack size. The current signal frame
- * for Alpha is 808 bytes large.
- */
-#define MINSIGSTKSZ (1024 * 4)
-#endif
-
/*
* Only the kernel should need these old type definitions.
*/
==== //depot/projects/netsmp/src/sys/amd64/amd64/mp_machdep.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/mp_machdep.c,v 1.261 2005/07/21 21:46:09 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/mp_machdep.c,v 1.262 2005/08/19 22:10:19 pjd Exp $");
#include "opt_cpu.h"
#include "opt_kdb.h"
@@ -812,58 +812,6 @@
ia32_pause();
}
-/*
- * This is about as magic as it gets. fortune(1) has got similar code
- * for reversing bits in a word. Who thinks up this stuff??
- *
- * Yes, it does appear to be consistently faster than:
- * while (i = ffs(m)) {
- * m >>= i;
- * bits++;
- * }
- * and
- * while (lsb = (m & -m)) { // This is magic too
- * m &= ~lsb; // or: m ^= lsb
- * bits++;
- * }
- * Both of these latter forms do some very strange things on gcc-3.1 with
- * -mcpu=pentiumpro and/or -march=pentiumpro and/or -O or -O2.
- * There is probably an SSE or MMX popcnt instruction.
- *
- * I wonder if this should be in libkern?
- *
- * XXX Stop the presses! Another one:
- * static __inline u_int32_t
- * popcnt1(u_int32_t v)
- * {
- * v -= ((v >> 1) & 0x55555555);
- * v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
- * v = (v + (v >> 4)) & 0x0F0F0F0F;
- * return (v * 0x01010101) >> 24;
- * }
- * The downside is that it has a multiply. With a pentium3 with
- * -mcpu=pentiumpro and -march=pentiumpro then gcc-3.1 will use
- * an imull, and in that case it is faster. In most other cases
- * it appears slightly slower.
- *
- * Another variant (also from fortune):
- * #define BITCOUNT(x) (((BX_(x)+(BX_(x)>>4)) & 0x0F0F0F0F) % 255)
- * #define BX_(x) ((x) - (((x)>>1)&0x77777777) \
- * - (((x)>>2)&0x33333333) \
- * - (((x)>>3)&0x11111111))
- */
-static __inline u_int32_t
-popcnt(u_int32_t m)
-{
-
- m = (m & 0x55555555) + ((m & 0xaaaaaaaa) >> 1);
- m = (m & 0x33333333) + ((m & 0xcccccccc) >> 2);
- m = (m & 0x0f0f0f0f) + ((m & 0xf0f0f0f0) >> 4);
- m = (m & 0x00ff00ff) + ((m & 0xff00ff00) >> 8);
- m = (m & 0x0000ffff) + ((m & 0xffff0000) >> 16);
- return m;
-}
-
static void
smp_targeted_tlb_shootdown(u_int mask, u_int vector, vm_offset_t addr1, vm_offset_t addr2)
{
@@ -878,7 +826,7 @@
mask &= ~PCPU_GET(cpumask);
if (mask == 0)
return;
- ncpu = popcnt(mask);
+ ncpu = bitcount32(mask);
if (ncpu > othercpus) {
/* XXX this should be a panic offence */
printf("SMP: tlb shootdown to %d other cpus (only have %d)\n",
==== //depot/projects/netsmp/src/sys/amd64/amd64/pmap.c#4 (text+ko) ====
@@ -75,7 +75,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.520 2005/08/11 23:38:01 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.525 2005/08/22 20:02:40 alc Exp $");
/*
* Manages physical address maps.
@@ -205,7 +205,7 @@
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 void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde);
static void 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 m);
@@ -288,16 +288,34 @@
/* Return a pointer to the PDP slot that corresponds to a VA */
static __inline pdp_entry_t *
+pmap_pml4e_to_pdpe(pml4_entry_t *pml4e, vm_offset_t va)
+{
+ pdp_entry_t *pdpe;
+
+ pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & PG_FRAME);
+ return (&pdpe[pmap_pdpe_index(va)]);
+}
+
+/* Return a pointer to the PDP slot that corresponds to a VA */
+static __inline pdp_entry_t *
pmap_pdpe(pmap_t pmap, vm_offset_t va)
{
pml4_entry_t *pml4e;
- pdp_entry_t *pdpe;
pml4e = pmap_pml4e(pmap, va);
if (pml4e == NULL || (*pml4e & PG_V) == 0)
return NULL;
- pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & PG_FRAME);
- return (&pdpe[pmap_pdpe_index(va)]);
+ return (pmap_pml4e_to_pdpe(pml4e, va));
+}
+
+/* Return a pointer to the PD slot that corresponds to a VA */
+static __inline pd_entry_t *
+pmap_pdpe_to_pde(pdp_entry_t *pdpe, vm_offset_t va)
+{
+ pd_entry_t *pde;
+
+ pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME);
+ return (&pde[pmap_pde_index(va)]);
}
/* Return a pointer to the PD slot that corresponds to a VA */
@@ -305,13 +323,11 @@
pmap_pde(pmap_t pmap, vm_offset_t va)
{
pdp_entry_t *pdpe;
- pd_entry_t *pde;
pdpe = pmap_pdpe(pmap, va);
if (pdpe == NULL || (*pdpe & PG_V) == 0)
return NULL;
- pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME);
- return (&pde[pmap_pde_index(va)]);
+ return (pmap_pdpe_to_pde(pdpe, va));
}
/* Return a pointer to the PT slot that corresponds to a VA */
@@ -786,7 +802,9 @@
pde = *pdep;
if (pde) {
if ((pde & PG_PS) != 0) {
- rtval = (pde & ~PDRMASK) | (va & PDRMASK);
+ KASSERT((pde & PG_FRAME & PDRMASK) == 0,
+ ("pmap_extract: bad pde"));
+ rtval = (pde & PG_FRAME) | (va & PDRMASK);
PMAP_UNLOCK(pmap);
return rtval;
}
@@ -819,7 +837,9 @@
if (pdep != NULL && (pde = *pdep)) {
if (pde & PG_PS) {
if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) {
- m = PHYS_TO_VM_PAGE((pde & ~PDRMASK) |
+ KASSERT((pde & PG_FRAME & PDRMASK) == 0,
+ ("pmap_extract_and_hold: bad pde"));
+ m = PHYS_TO_VM_PAGE((pde & PG_FRAME) |
(va & PDRMASK));
vm_page_hold(m);
}
@@ -1510,16 +1530,17 @@
* Remove a single page from a process address space
*/
static void
-pmap_remove_page(pmap_t pmap, vm_offset_t va)
+pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde)
{
- pd_entry_t ptepde;
pt_entry_t *pte;
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
- pte = pmap_pte_pde(pmap, va, &ptepde);
- if (pte == NULL || (*pte & PG_V) == 0)
+ if ((*pde & PG_V) == 0)
+ return;
+ pte = pmap_pde_to_pte(pde, va);
+ if ((*pte & PG_V) == 0)
return;
- pmap_remove_pte(pmap, pte, va, ptepde);
+ pmap_remove_pte(pmap, pte, va, *pde);
pmap_invalidate_page(pmap, va);
}
@@ -1558,7 +1579,7 @@
if (sva + PAGE_SIZE == eva) {
pde = pmap_pde(pmap, sva);
if (pde && (*pde & PG_PS) == 0) {
- pmap_remove_page(pmap, sva);
+ pmap_remove_page(pmap, sva, pde);
goto out;
}
}
@@ -1569,13 +1590,13 @@
break;
pml4e = pmap_pml4e(pmap, sva);
- if (pml4e == 0) {
+ if ((*pml4e & PG_V) == 0) {
va_next = (sva + NBPML4) & ~PML4MASK;
continue;
}
- pdpe = pmap_pdpe(pmap, sva);
- if (pdpe == 0) {
+ pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
+ if ((*pdpe & PG_V) == 0) {
va_next = (sva + NBPDP) & ~PDPMASK;
continue;
}
@@ -1585,9 +1606,7 @@
*/
va_next = (sva + NBPDR) & ~PDRMASK;
- pde = pmap_pde(pmap, sva);
- if (pde == 0)
- continue;
+ pde = pmap_pdpe_to_pde(pdpe, sva);
ptpaddr = *pde;
/*
@@ -1724,22 +1743,20 @@
for (; sva < eva; sva = va_next) {
pml4e = pmap_pml4e(pmap, sva);
- if (pml4e == 0) {
+ if ((*pml4e & PG_V) == 0) {
va_next = (sva + NBPML4) & ~PML4MASK;
continue;
}
- pdpe = pmap_pdpe(pmap, sva);
- if (pdpe == 0) {
+ pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
+ if ((*pdpe & PG_V) == 0) {
va_next = (sva + NBPDP) & ~PDPMASK;
continue;
}
va_next = (sva + NBPDR) & ~PDRMASK;
- pde = pmap_pde(pmap, sva);
- if (pde == NULL)
- continue;
+ pde = pmap_pdpe_to_pde(pdpe, sva);
ptpaddr = *pde;
/*
@@ -1820,7 +1837,6 @@
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, om;
@@ -1855,7 +1871,7 @@
}
#endif
- pte = pmap_pte_pde(pmap, va, &ptepde);
+ pte = pmap_pte(pmap, va);
/*
* Page Directory table entry not valid, we need a new PT page
@@ -1915,23 +1931,23 @@
* handle validating new mapping.
*/
if (opa) {
- int err;
if (origpte & PG_W)
pmap->pm_stats.wired_count--;
if (origpte & PG_MANAGED) {
om = PHYS_TO_VM_PAGE(opa);
pmap_remove_entry(pmap, om, va);
}
- err = pmap_unuse_pt(pmap, va, ptepde);
- if (err)
- panic("pmap_enter: pte vanished, va: 0x%lx", va);
+ if (mpte != NULL) {
+ mpte->wire_count--;
+ KASSERT(mpte->wire_count > 0,
+ ("pmap_enter: missing reference to page table page,"
+ " va: 0x%lx", va));
+ }
} else
pmap->pm_stats.resident_count++;
/*
- * Enter on the PV list if part of our managed memory. Note that we
- * raise IPL while manipulating pv_table since pmap_enter can be
- * called at interrupt time.
+ * Enter on the PV list if part of our managed memory.
*/
if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
pmap_insert_entry(pmap, va, m);
@@ -2264,24 +2280,21 @@
break;
pml4e = pmap_pml4e(src_pmap, addr);
- if (pml4e == 0) {
+ if ((*pml4e & PG_V) == 0) {
va_next = (addr + NBPML4) & ~PML4MASK;
continue;
}
- pdpe = pmap_pdpe(src_pmap, addr);
- if (pdpe == 0) {
+ pdpe = pmap_pml4e_to_pdpe(pml4e, addr);
+ if ((*pdpe & PG_V) == 0) {
va_next = (addr + NBPDP) & ~PDPMASK;
continue;
}
va_next = (addr + NBPDR) & ~PDRMASK;
- pde = pmap_pde(src_pmap, addr);
- if (pde)
- srcptepaddr = *pde;
- else
- continue;
+ pde = pmap_pdpe_to_pde(pdpe, addr);
+ srcptepaddr = *pde;
if (srcptepaddr == 0)
continue;
==== //depot/projects/netsmp/src/sys/amd64/include/_limits.h#2 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)limits.h 8.3 (Berkeley) 1/4/94
- * $FreeBSD: src/sys/amd64/include/_limits.h,v 1.10 2005/01/05 20:17:20 imp Exp $
+ * $FreeBSD: src/sys/amd64/include/_limits.h,v 1.11 2005/08/20 16:44:40 stefanf Exp $
*/
#ifndef _MACHINE__LIMITS_H_
@@ -83,4 +83,10 @@
#define __LONG_BIT 64
#define __WORD_BIT 32
+/*
+ * Minimum signal stack size. The current signal frame
+ * for i386 is 408 bytes large.
+ */
+#define __MINSIGSTKSZ (512 * 4)
+
#endif /* !_MACHINE__LIMITS_H_ */
==== //depot/projects/netsmp/src/sys/amd64/include/atomic.h#3 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/amd64/include/atomic.h,v 1.36 2005/07/21 22:35:02 peter Exp $
+ * $FreeBSD: src/sys/amd64/include/atomic.h,v 1.37 2005/08/18 14:36:47 jhb Exp $
*/
#ifndef _MACHINE_ATOMIC_H_
#define _MACHINE_ATOMIC_H_
@@ -371,6 +371,26 @@
#define atomic_cmpset_rel_32 atomic_cmpset_rel_int
#define atomic_readandclear_32 atomic_readandclear_int
+/* Operations on 64-bit quad words. */
+#define atomic_set_64 atomic_set_long
+#define atomic_set_acq_64 atomic_set_acq_long
+#define atomic_set_rel_64 atomic_set_rel_long
+#define atomic_clear_64 atomic_clear_long
+#define atomic_clear_acq_64 atomic_clear_acq_long
+#define atomic_clear_rel_64 atomic_clear_rel_long
+#define atomic_add_64 atomic_add_long
+#define atomic_add_acq_64 atomic_add_acq_long
+#define atomic_add_rel_64 atomic_add_rel_long
+#define atomic_subtract_64 atomic_subtract_long
+#define atomic_subtract_acq_64 atomic_subtract_acq_long
+#define atomic_subtract_rel_64 atomic_subtract_rel_long
+#define atomic_load_acq_64 atomic_load_acq_long
+#define atomic_store_rel_64 atomic_store_rel_long
+#define atomic_cmpset_64 atomic_cmpset_long
+#define atomic_cmpset_acq_64 atomic_cmpset_acq_long
+#define atomic_cmpset_rel_64 atomic_cmpset_rel_long
+#define atomic_readandclear_64 atomic_readandclear_long
+
/* Operations on pointers. */
#define atomic_set_ptr atomic_set_long
#define atomic_set_acq_ptr atomic_set_acq_long
==== //depot/projects/netsmp/src/sys/amd64/include/signal.h#2 (text+ko) ====
@@ -28,7 +28,7 @@
* SUCH DAMAGE.
*
* @(#)signal.h 8.1 (Berkeley) 6/11/93
- * $FreeBSD: src/sys/amd64/include/signal.h,v 1.28 2005/01/05 20:17:20 imp Exp $
+ * $FreeBSD: src/sys/amd64/include/signal.h,v 1.29 2005/08/20 16:44:40 stefanf Exp $
*/
#ifndef _MACHINE_SIGNAL_H_
@@ -43,14 +43,6 @@
typedef long sig_atomic_t;
-#if __XSI_VISIBLE
-/*
- * Minimum signal stack size. The current signal frame
- * for i386 is 408 bytes large.
- */
-#define MINSIGSTKSZ (512 * 4)
-#endif
-
#if __BSD_VISIBLE
#include <machine/trap.h> /* codes for SIGILL, SIGFPE */
==== //depot/projects/netsmp/src/sys/arm/include/_limits.h#2 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)limits.h 8.3 (Berkeley) 1/4/94
- * $FreeBSD: src/sys/arm/include/_limits.h,v 1.8 2005/01/05 21:58:48 imp Exp $
+ * $FreeBSD: src/sys/arm/include/_limits.h,v 1.9 2005/08/20 16:44:40 stefanf Exp $
*/
#ifndef _MACHINE__LIMITS_H_
@@ -94,4 +94,7 @@
#endif
#define __WORD_BIT 32
+/* Minimum signal stack size. */
+#define __MINSIGSTKSZ (1024 * 4)
+
#endif /* !_MACHINE__LIMITS_H_ */
==== //depot/projects/netsmp/src/sys/arm/include/signal.h#2 (text+ko) ====
@@ -29,7 +29,7 @@
* @(#)signal.h 8.1 (Berkeley) 6/11/93
* from: FreeBSD: src/sys/i386/include/signal.h,v 1.13 2000/11/09
* from: FreeBSD: src/sys/sparc64/include/signal.h,v 1.6 2001/09/30 18:52:17
- * $FreeBSD: src/sys/arm/include/signal.h,v 1.6 2005/01/05 21:58:48 imp Exp $
+ * $FreeBSD: src/sys/arm/include/signal.h,v 1.7 2005/08/20 16:44:40 stefanf Exp $
*/
#ifndef _MACHINE_SIGNAL_H_
@@ -39,10 +39,6 @@
typedef long sig_atomic_t;
-#if __XSI_VISIBLE
-#define MINSIGSTKSZ (1024 * 4)
-#endif
-
#if __BSD_VISIBLE
struct sigcontext {
==== //depot/projects/netsmp/src/sys/boot/common/loader.8#2 (text+ko) ====
@@ -22,9 +22,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: src/sys/boot/common/loader.8,v 1.82 2005/06/14 08:49:14 ru Exp $
+.\" $FreeBSD: src/sys/boot/common/loader.8,v 1.83 2005/08/18 01:39:43 iedowse Exp $
.\"
-.Dd May 27, 2005
+.Dd August 18, 2005
.Dt LOADER 8
.Os
.Sh NAME
@@ -392,6 +392,19 @@
List of semicolon-separated search path for bootable kernels.
The default is
.Dq Li kernel .
+.It Va comconsole_speed
+Defines the speed of the serial console (i386 and amd64 only).
+If the previous boot stage indicated that a serial console is in use
+then this variable is initialized to the current speed of the console
+serial port.
+Otherwise it is set to 9600 unless this was overridden using the
+.Va BOOT_COMCONSOLE_SPEED
+variable when
+.Nm
+was compiled.
+Changes to the
+.Va comconsole_speed
+variable take effect immediately.
.It Va console
Defines the current console or consoles.
Multiple consoles may be specified.
==== //depot/projects/netsmp/src/sys/boot/forth/loader.conf#4 (text+ko) ====
@@ -6,7 +6,7 @@
#
# All arguments must be in double quotes.
#
-# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.98 2005/08/07 09:41:53 krion Exp $
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.99 2005/08/18 01:39:43 iedowse Exp $
##############################################################
### Basic configuration options ############################
@@ -47,6 +47,7 @@
# allowed to interrupt autoboot process and
# escape to the loader prompt
#beastie_disable="NO" # Turn the beastie boot menu on and off
+#comconsole_speed="9600" # Set the current serial console speed
#console="vidconsole" # A comma separated list of console(s)
#currdev="disk1s1a" # Set the current device
module_path="/boot/modules" # Set the module search path
==== //depot/projects/netsmp/src/sys/boot/forth/loader.conf.5#2 (text+ko) ====
@@ -22,8 +22,8 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: src/sys/boot/forth/loader.conf.5,v 1.23 2004/11/07 17:01:08 krion Exp $
-.Dd November 7, 2004
+.\" $FreeBSD: src/sys/boot/forth/loader.conf.5,v 1.24 2005/08/18 01:39:43 iedowse Exp $
+.Dd August 18, 2005
.Dt LOADER.CONF 5
.Os
.Sh NAME
@@ -164,6 +164,18 @@
.Pq Dq Pa /boot/splash.bmp
Name of the bitmap to be loaded.
Any other name can be used.
+.It Va comconsole_speed
+.Po Dq 9600
+or the value of the
+.Va BOOT_COMCONSOLE_SPEED
+variable when
+.Xr loader 8
+was compiled
+.Pc .
+Sets the speed of the serial console.
+If the previous boot loader stage specified that a serial console
+is in use then the default speed is determined from the current
+serial port speed setting.
.It Va console
.Pq Dq vidconsole
.Dq comconsole
==== //depot/projects/netsmp/src/sys/boot/i386/boot2/boot2.c#3 (text+ko) ====
@@ -14,7 +14,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/i386/boot2/boot2.c,v 1.73 2005/08/06 00:33:42 ssouhlal Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/i386/boot2/boot2.c,v 1.74 2005/08/18 00:42:45 iedowse Exp $");
#include <sys/param.h>
#include <sys/disklabel.h>
@@ -63,7 +63,6 @@
#define RBX_NOINTR 0x1c /* -n */
/* 0x1d is reserved for log2(RB_MULTIPLE) and is just misnamed here. */
#define RBX_DUAL 0x1d /* -D */
-#define RBX_PROBEKBD 0x1e /* -P */
/* 0x1f is reserved for log2(RB_BOOTINFO). */
/* pass: -a, -s, -r, -d, -c, -v, -h, -C, -g, -m, -p, -D */
@@ -91,7 +90,7 @@
extern uint32_t _end;
-static const char optstr[NOPT] = "DhaCgmnPprsv";
+static const char optstr[NOPT] = "DhaCgmnprsv"; /* Also 'P', 'S' */
static const unsigned char flags[NOPT] = {
RBX_DUAL,
RBX_SERIAL,
@@ -100,7 +99,6 @@
RBX_GDB,
RBX_MUTE,
RBX_NOINTR,
- RBX_PROBEKBD,
RBX_PAUSE,
RBX_DFLTROOT,
RBX_SINGLE,
@@ -122,6 +120,7 @@
static char cmd[512];
static char kname[1024];
static uint32_t opts;
+static int comspeed = SIOSPD;
static struct bootinfo bootinfo;
static uint8_t ioctrl = IO_KEYBOARD;
@@ -390,34 +389,48 @@
parse()
{
char *arg = cmd;
- char *p, *q;
+ char *ep, *p, *q;
+ const char *cp;
unsigned int drv;
- int c, i;
+ int c, i, j;
while ((c = *arg++)) {
if (c == ' ' || c == '\t' || c == '\n')
continue;
for (p = arg; *p && *p != '\n' && *p != ' ' && *p != '\t'; p++);
+ ep = p;
if (*p)
*p++ = 0;
if (c == '-') {
while ((c = *arg++)) {
+ if (c == 'P') {
+ if (*(uint8_t *)PTOV(0x496) & 0x10) {
+ cp = "yes";
+ } else {
+ opts |= 1 << RBX_DUAL | 1 << RBX_SERIAL;
+ cp = "no";
+ }
+ printf("Keyboard: %s\n", cp);
+ continue;
+ } else if (c == 'S') {
+ j = 0;
+ while ((unsigned int)(i = *arg++ - '0') <= 9)
+ j = j * 10 + i;
+ if (j > 0 && i == -'0') {
+ comspeed = j;
+ break;
+ }
+ /* Fall through to error below ('S' not in optstr[]). */
+ }
for (i = 0; c != optstr[i]; i++)
if (i == NOPT - 1)
return -1;
opts ^= 1 << flags[i];
}
- if (opts & 1 << RBX_PROBEKBD) {
- i = *(uint8_t *)PTOV(0x496) & 0x10;
- printf("Keyboard: %s\n", i ? "yes" : "no");
- if (!i)
- opts |= 1 << RBX_DUAL | 1 << RBX_SERIAL;
- opts &= ~(1 << RBX_PROBEKBD);
- }
ioctrl = opts & 1 << RBX_DUAL ? (IO_SERIAL|IO_KEYBOARD) :
opts & 1 << RBX_SERIAL ? IO_SERIAL : IO_KEYBOARD;
if (ioctrl & IO_SERIAL)
- sio_init();
+ sio_init(115200 / comspeed);
} else {
for (q = arg--; *q && *q != '('; q++);
if (*q) {
@@ -459,7 +472,7 @@
? DRV_HARD : 0) + drv;
dsk_meta = 0;
}
- if ((i = p - arg - !*(p - 1))) {
+ if ((i = ep - arg)) {
if ((size_t)i >= sizeof(kname))
return -1;
memcpy(kname, arg, i + 1);
==== //depot/projects/netsmp/src/sys/boot/i386/boot2/lib.h#2 (text+ko) ====
@@ -14,10 +14,10 @@
*/
/*
- * $FreeBSD: src/sys/boot/i386/boot2/lib.h,v 1.2 1999/08/28 00:40:02 peter Exp $
+ * $FreeBSD: src/sys/boot/i386/boot2/lib.h,v 1.3 2005/08/18 00:42:45 iedowse Exp $
*/
-void sio_init(void);
+void sio_init(int);
void sio_flush(void);
void sio_putc(int);
int sio_getc(void);
==== //depot/projects/netsmp/src/sys/boot/i386/boot2/sio.S#2 (text+ko) ====
@@ -12,12 +12,11 @@
* warranties of merchantability and fitness for a particular
* purpose.
*
- * $FreeBSD: src/sys/boot/i386/boot2/sio.S,v 1.9 2004/05/14 20:29:29 ru Exp $
+ * $FreeBSD: src/sys/boot/i386/boot2/sio.S,v 1.10 2005/08/18 00:42:45 iedowse Exp $
*/
.set SIO_PRT,SIOPRT # Base port
.set SIO_FMT,SIOFMT # 8N1
- .set SIO_DIV,(115200/SIOSPD) # 115200 / SPD
.globl sio_init
.globl sio_flush
@@ -25,14 +24,14 @@
.globl sio_getc
.globl sio_ischar
-/* void sio_init(void) */
+/* void sio_init(int div) */
sio_init: movw $SIO_PRT+0x3,%dx # Data format reg
movb $SIO_FMT|0x80,%al # Set format
outb %al,(%dx) # and DLAB
pushl %edx # Save
subb $0x3,%dl # Divisor latch reg
- movw $SIO_DIV,%ax # Set
+ movl 0x8(%esp),%eax # Set
outw %ax,(%dx) # BPS
popl %edx # Restore
movb $SIO_FMT,%al # Clear
@@ -41,6 +40,8 @@
movb $0x3,%al # Set RTS,
outb %al,(%dx) # DTR
incl %edx # Line status reg
+ call sio_flush
+ ret $0x4
/* void sio_flush(void) */
==== //depot/projects/netsmp/src/sys/boot/i386/libi386/comconsole.c#2 (text+ko) ====
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/i386/libi386/comconsole.c,v 1.10 2003/09/16 11:24:23 bde Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/i386/libi386/comconsole.c,v 1.11 2005/08/18 01:39:43 iedowse Exp $");
#include <stand.h>
#include <bootstrap.h>
@@ -35,6 +35,7 @@
#define COMC_FMT 0x3 /* 8N1 */
#define COMC_TXWAIT 0x40000 /* transmit timeout */
#define COMC_BPS(x) (115200 / (x)) /* speed to DLAB divisor */
+#define COMC_DIV2BPS(x) (115200 / (x)) /* DLAB divisor to speed */
#ifndef COMPORT
#define COMPORT 0x3f8
@@ -47,9 +48,15 @@
static int comc_init(int arg);
static void comc_putchar(int c);
static int comc_getchar(void);
+static int comc_getspeed(void);
static int comc_ischar(void);
+static int comc_parsespeed(const char *string);
+static void comc_setup(int speed);
+static int comc_speed_set(struct env_var *ev, int flags,
+ const void *value);
static int comc_started;
+static int comc_curspeed;
struct console comconsole = {
"comconsole",
@@ -65,8 +72,36 @@
static void
comc_probe(struct console *cp)
{
+ char speedbuf[16];
+ char *cons, *speedenv;
+ int speed;
+
/* XXX check the BIOS equipment list? */
cp->c_flags |= (C_PRESENTIN | C_PRESENTOUT);
+
+ if (comc_curspeed == 0) {
+ comc_curspeed = COMSPEED;
+ /*
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list