Date: Fri, 9 Jul 2004 21:07:17 GMT From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 56927 for review Message-ID: <200407092107.i69L7HUG092979@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=56927 Change 56927 by rwatson@rwatson_tislabs on 2004/07/09 21:06:46 Integrate netperf_socket from FreeBSD CVS HEAD. Netperf related changes: Drop locks around m_copym() in soreceive(). Remove spl's from do_sendfile(). Add socket locking around connect in nfs_connect(). In BPF, make callout non-MPSAFE unless debug_mpsafenet. In bridge, make callout non-MPSAFE unless debug_mpsafenet. Better support for disconnection in NFS client. if_xl and other interface locking efficiency improvement. Affected files ... .. //depot/projects/netperf_socket/sys/alpha/alpha/autoconf.c#2 integrate .. //depot/projects/netperf_socket/sys/alpha/alpha/pmap.c#10 integrate .. //depot/projects/netperf_socket/sys/alpha/include/pmap.h#7 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/autoconf.c#3 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/busdma_machdep.c#3 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/io_apic.c#4 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/machdep.c#8 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/mptable.c#4 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/nexus.c#5 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/pmap.c#18 integrate .. //depot/projects/netperf_socket/sys/amd64/include/apicvar.h#3 integrate .. //depot/projects/netperf_socket/sys/amd64/include/float.h#4 integrate .. //depot/projects/netperf_socket/sys/arm/arm/pmap.c#3 integrate .. //depot/projects/netperf_socket/sys/arm/arm/vm_machdep.c#3 integrate .. //depot/projects/netperf_socket/sys/boot/common/dev_net.c#2 integrate .. //depot/projects/netperf_socket/sys/boot/common/loader.8#6 integrate .. //depot/projects/netperf_socket/sys/boot/common/ufsread.c#2 integrate .. //depot/projects/netperf_socket/sys/boot/forth/loader.conf#8 integrate .. //depot/projects/netperf_socket/sys/boot/ofw/libofw/elf_freebsd.c#2 integrate .. //depot/projects/netperf_socket/sys/boot/ofw/libofw/ofw_copy.c#2 integrate .. //depot/projects/netperf_socket/sys/boot/ofw/libofw/openfirm.c#2 integrate .. //depot/projects/netperf_socket/sys/boot/powerpc/loader/Makefile#3 integrate .. //depot/projects/netperf_socket/sys/boot/powerpc/loader/ldscript.powerpc#1 branch .. //depot/projects/netperf_socket/sys/boot/powerpc/loader/start.c#2 integrate .. //depot/projects/netperf_socket/sys/coda/coda_subr.c#2 integrate .. //depot/projects/netperf_socket/sys/compat/linux/linux_socket.c#2 integrate .. //depot/projects/netperf_socket/sys/compat/ndis/ndis_var.h#7 integrate .. //depot/projects/netperf_socket/sys/compat/ndis/subr_ndis.c#11 integrate .. //depot/projects/netperf_socket/sys/conf/NOTES#26 integrate .. //depot/projects/netperf_socket/sys/conf/files#36 integrate .. //depot/projects/netperf_socket/sys/conf/files.alpha#5 integrate .. //depot/projects/netperf_socket/sys/conf/files.amd64#10 integrate .. //depot/projects/netperf_socket/sys/conf/files.i386#19 integrate .. //depot/projects/netperf_socket/sys/conf/files.pc98#11 integrate .. //depot/projects/netperf_socket/sys/conf/options#18 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/addr.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/atmapi.h#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_conn.c#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_data.c#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_dump.c#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_port.c#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_sig.c#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_user.c#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/ccatm.h#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/ccpriv.h#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/unisap.c#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/unisap.h#1 branch .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/genfiles#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/misc/straddr.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/misc/unimsg_common.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/geniec.awk#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/genieh.awk#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/genmsgc.awk#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/genmsgh.awk#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/ie.def#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/msg.def#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/parseie.awk#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/parsemsg.awk#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/priv.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/privmsg.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/traffic.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/uni_config.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/uni_hdr.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/uni_ie.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/unimsglib.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/uniprint.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/unistruct.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/saal_sscfu.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/saal_sscop.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscfu.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscfudef.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscfupriv.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscop.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscopdef.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscoppriv.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/genmsgcpyc.awk#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/genmsgcpyh.awk#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_call.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_coord.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_party.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_print.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_reset.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_uni.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_verify.c#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/uni.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/unidef.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/unimkmsg.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/unipriv.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/unisig.h#2 integrate .. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/unimsg.h#2 integrate .. //depot/projects/netperf_socket/sys/dev/acpica/acpi_pcib_acpi.c#7 integrate .. //depot/projects/netperf_socket/sys/dev/fdc/fdc.c#4 integrate .. //depot/projects/netperf_socket/sys/dev/fdc/fdc_isa.c#1 branch .. //depot/projects/netperf_socket/sys/dev/fdc/fdc_pccard.c#1 branch .. //depot/projects/netperf_socket/sys/dev/fdc/fdcvar.h#1 branch .. //depot/projects/netperf_socket/sys/dev/hifn/hifn7751.c#5 integrate .. //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndis.c#14 integrate .. //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndisvar.h#6 integrate .. //depot/projects/netperf_socket/sys/dev/nmdm/nmdm.c#9 integrate .. //depot/projects/netperf_socket/sys/dev/pcf/pcfvar.h#2 integrate .. //depot/projects/netperf_socket/sys/dev/ppbus/if_plip.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/ppbus/lpt.c#5 integrate .. //depot/projects/netperf_socket/sys/dev/ppbus/pcfclock.c#6 integrate .. //depot/projects/netperf_socket/sys/dev/ppbus/ppi.c#5 integrate .. //depot/projects/netperf_socket/sys/dev/ppbus/pps.c#5 integrate .. //depot/projects/netperf_socket/sys/dev/ppbus/vpo.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/re/if_re.c#11 integrate .. //depot/projects/netperf_socket/sys/dev/sound/pci/via82c686.c#4 integrate .. //depot/projects/netperf_socket/sys/dev/usb/usbdevs#17 integrate .. //depot/projects/netperf_socket/sys/fs/msdosfs/msdosfs_fileno.c#1 branch .. //depot/projects/netperf_socket/sys/fs/msdosfs/msdosfs_vfsops.c#5 integrate .. //depot/projects/netperf_socket/sys/fs/msdosfs/msdosfs_vnops.c#3 integrate .. //depot/projects/netperf_socket/sys/fs/msdosfs/msdosfsmount.h#4 integrate .. //depot/projects/netperf_socket/sys/fs/pseudofs/pseudofs_vnops.c#3 integrate .. //depot/projects/netperf_socket/sys/geom/concat/g_concat.c#9 integrate .. //depot/projects/netperf_socket/sys/geom/concat/g_concat.h#7 integrate .. //depot/projects/netperf_socket/sys/geom/geom_event.c#4 integrate .. //depot/projects/netperf_socket/sys/geom/geom_int.h#3 integrate .. //depot/projects/netperf_socket/sys/geom/geom_slice.c#5 integrate .. //depot/projects/netperf_socket/sys/geom/geom_subr.c#6 integrate .. //depot/projects/netperf_socket/sys/geom/label/g_label.c#2 integrate .. //depot/projects/netperf_socket/sys/geom/label/g_label.h#2 integrate .. //depot/projects/netperf_socket/sys/geom/stripe/g_stripe.c#3 integrate .. //depot/projects/netperf_socket/sys/geom/stripe/g_stripe.h#2 integrate .. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum.c#5 integrate .. //depot/projects/netperf_socket/sys/gnu/ext2fs/ext2_vfsops.c#6 integrate .. //depot/projects/netperf_socket/sys/i386/acpica/acpi_wakeup.c#4 integrate .. //depot/projects/netperf_socket/sys/i386/i386/autoconf.c#3 integrate .. //depot/projects/netperf_socket/sys/i386/i386/busdma_machdep.c#3 integrate .. //depot/projects/netperf_socket/sys/i386/i386/elan-mmcr.c#9 integrate .. //depot/projects/netperf_socket/sys/i386/i386/locore.s#3 integrate .. //depot/projects/netperf_socket/sys/i386/i386/nexus.c#5 integrate .. //depot/projects/netperf_socket/sys/i386/i386/pmap.c#16 integrate .. //depot/projects/netperf_socket/sys/i386/isa/isa.c#4 integrate .. //depot/projects/netperf_socket/sys/i386/isa/isa.h#3 integrate .. //depot/projects/netperf_socket/sys/i386/isa/isa_dma.c#3 integrate .. //depot/projects/netperf_socket/sys/i386/linux/linux_ptrace.c#2 integrate .. //depot/projects/netperf_socket/sys/i386/pci/pci_cfgreg.c#4 integrate .. //depot/projects/netperf_socket/sys/i4b/driver/i4b_ing.c#4 integrate .. //depot/projects/netperf_socket/sys/ia64/ia64/autoconf.c#2 integrate .. //depot/projects/netperf_socket/sys/ia64/ia64/pmap.c#10 integrate .. //depot/projects/netperf_socket/sys/ia64/ia64/trap.c#5 integrate .. //depot/projects/netperf_socket/sys/isa/orm.c#3 integrate .. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_lookup.c#3 integrate .. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_node.c#4 integrate .. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_rrip.c#4 integrate .. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_rrip.h#3 integrate .. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_vfsops.c#5 integrate .. //depot/projects/netperf_socket/sys/kern/kern_event.c#5 integrate .. //depot/projects/netperf_socket/sys/kern/sched_ule.c#12 integrate .. //depot/projects/netperf_socket/sys/kern/subr_sbuf.c#3 integrate .. //depot/projects/netperf_socket/sys/kern/subr_witness.c#6 integrate .. //depot/projects/netperf_socket/sys/kern/sysv_shm.c#5 integrate .. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#27 integrate .. //depot/projects/netperf_socket/sys/kern/uipc_syscalls.c#22 integrate .. //depot/projects/netperf_socket/sys/kern/vfs_bio.c#7 integrate .. //depot/projects/netperf_socket/sys/kern/vfs_default.c#4 integrate .. //depot/projects/netperf_socket/sys/kern/vfs_init.c#4 integrate .. //depot/projects/netperf_socket/sys/kern/vfs_mount.c#9 integrate .. //depot/projects/netperf_socket/sys/kern/vfs_subr.c#12 integrate .. //depot/projects/netperf_socket/sys/modules/de/Makefile#2 integrate .. //depot/projects/netperf_socket/sys/modules/fdc/Makefile#4 integrate .. //depot/projects/netperf_socket/sys/modules/msdosfs/Makefile#2 integrate .. //depot/projects/netperf_socket/sys/modules/netgraph/Makefile#6 integrate .. //depot/projects/netperf_socket/sys/modules/nfs4client/Makefile#2 integrate .. //depot/projects/netperf_socket/sys/modules/nfsclient/Makefile#2 integrate .. //depot/projects/netperf_socket/sys/net/bpf.c#8 integrate .. //depot/projects/netperf_socket/sys/net/bridge.c#8 integrate .. //depot/projects/netperf_socket/sys/net/if_disc.c#5 integrate .. //depot/projects/netperf_socket/sys/net/if_ethersubr.c#18 integrate .. //depot/projects/netperf_socket/sys/net/if_faith.c#7 integrate .. //depot/projects/netperf_socket/sys/net/if_gif.c#7 integrate .. //depot/projects/netperf_socket/sys/net/if_gre.c#7 integrate .. //depot/projects/netperf_socket/sys/net/if_vlan.c#9 integrate .. //depot/projects/netperf_socket/sys/net/rtsock.c#10 integrate .. //depot/projects/netperf_socket/sys/netgraph/ng_async.c#3 integrate .. //depot/projects/netperf_socket/sys/netgraph/ng_eiface.c#5 integrate .. //depot/projects/netperf_socket/sys/netgraph/ng_fec.c#5 integrate .. //depot/projects/netperf_socket/sys/netgraph/ng_gif_demux.c#3 integrate .. //depot/projects/netperf_socket/sys/netgraph/ng_iface.c#6 integrate .. //depot/projects/netperf_socket/sys/netgraph/ng_sppp.c#4 integrate .. //depot/projects/netperf_socket/sys/netinet/ip_input.c#15 integrate .. //depot/projects/netperf_socket/sys/nfs4client/nfs4_vfsops.c#5 integrate .. //depot/projects/netperf_socket/sys/nfsclient/bootp_subr.c#5 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs.h#7 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs_bio.c#8 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs_socket.c#9 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs_subs.c#9 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs_vfsops.c#6 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs_vnops.c#5 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfsmount.h#3 integrate .. //depot/projects/netperf_socket/sys/nfsserver/nfs_srvcache.c#6 integrate .. //depot/projects/netperf_socket/sys/pc98/conf/NOTES#14 integrate .. //depot/projects/netperf_socket/sys/pc98/pc98/fd.c#9 integrate .. //depot/projects/netperf_socket/sys/pc98/pc98/fdc_cbus.c#1 branch .. //depot/projects/netperf_socket/sys/pc98/pc98/fdcvar.h#1 branch .. //depot/projects/netperf_socket/sys/pc98/pc98/isa_dma.c#3 integrate .. //depot/projects/netperf_socket/sys/pc98/pc98/pc98.h#3 integrate .. //depot/projects/netperf_socket/sys/pci/if_dc.c#9 integrate .. //depot/projects/netperf_socket/sys/pci/if_de.c#8 integrate .. //depot/projects/netperf_socket/sys/pci/if_devar.h#2 integrate .. //depot/projects/netperf_socket/sys/pci/if_rl.c#13 integrate .. //depot/projects/netperf_socket/sys/pci/if_rlreg.h#4 integrate .. //depot/projects/netperf_socket/sys/pci/if_sf.c#8 integrate .. //depot/projects/netperf_socket/sys/pci/if_ti.c#8 integrate .. //depot/projects/netperf_socket/sys/pci/if_vr.c#10 integrate .. //depot/projects/netperf_socket/sys/pci/if_vrreg.h#3 integrate .. //depot/projects/netperf_socket/sys/pci/if_xl.c#10 integrate .. //depot/projects/netperf_socket/sys/pci/if_xlreg.h#2 integrate .. //depot/projects/netperf_socket/sys/powerpc/include/stdarg.h#2 integrate .. //depot/projects/netperf_socket/sys/powerpc/ofw/ofw_syscons.c#3 integrate .. //depot/projects/netperf_socket/sys/powerpc/ofw/ofw_syscons.h#3 integrate .. //depot/projects/netperf_socket/sys/powerpc/powerpc/pmap.c#9 integrate .. //depot/projects/netperf_socket/sys/powerpc/powerpc/trap.c#3 integrate .. //depot/projects/netperf_socket/sys/sparc64/ebus/ebus.c#7 integrate .. //depot/projects/netperf_socket/sys/sparc64/fhc/fhc.c#3 integrate .. //depot/projects/netperf_socket/sys/sparc64/pci/psycho.c#6 integrate .. //depot/projects/netperf_socket/sys/sparc64/sbus/sbus.c#6 integrate .. //depot/projects/netperf_socket/sys/sparc64/sparc64/iommu.c#7 integrate .. //depot/projects/netperf_socket/sys/sparc64/sparc64/nexus.c#6 integrate .. //depot/projects/netperf_socket/sys/sys/event.h#2 integrate .. //depot/projects/netperf_socket/sys/sys/mount.h#9 integrate .. //depot/projects/netperf_socket/sys/sys/param.h#16 integrate .. //depot/projects/netperf_socket/sys/sys/sbuf.h#2 integrate .. //depot/projects/netperf_socket/sys/sys/vnode.h#7 integrate .. //depot/projects/netperf_socket/sys/ufs/ffs/ffs_snapshot.c#6 integrate .. //depot/projects/netperf_socket/sys/ufs/ffs/ffs_vfsops.c#6 integrate .. //depot/projects/netperf_socket/sys/ufs/ufs/ufs_quota.c#3 integrate .. //depot/projects/netperf_socket/sys/vm/swap_pager.c#6 integrate .. //depot/projects/netperf_socket/sys/vm/uma_core.c#8 integrate .. //depot/projects/netperf_socket/sys/vm/vm_map.h#6 integrate Differences ... ==== //depot/projects/netperf_socket/sys/alpha/alpha/autoconf.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/alpha/alpha/autoconf.c,v 1.57 2003/08/22 07:20:25 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/alpha/autoconf.c,v 1.59 2004/07/08 22:35:33 brian Exp $"); #include "opt_bootp.h" #include "opt_isa.h" ==== //depot/projects/netperf_socket/sys/alpha/alpha/pmap.c#10 (text+ko) ==== @@ -148,7 +148,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.150 2004/06/15 19:28:39 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.154 2004/07/08 07:44:55 alc Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -520,6 +520,7 @@ /* * Initialize the kernel pmap (which is statically allocated). */ + PMAP_LOCK_INIT(kernel_pmap); kernel_pmap->pm_lev1 = Lev1map; kernel_pmap->pm_active = ~0; kernel_pmap->pm_asn[alpha_pal_whami()].asn = 0; @@ -741,10 +742,8 @@ * Extract the physical page address associated * with the given map/virtual_address pair. */ -vm_offset_t -pmap_extract(pmap, va) - register pmap_t pmap; - vm_offset_t va; +vm_paddr_t +pmap_extract(pmap_t pmap, vm_offset_t va) { pt_entry_t* pte = pmap_lev3pte(pmap, va); if (pte) @@ -988,6 +987,7 @@ { int i; + PMAP_LOCK_INIT(pmap); pmap->pm_lev1 = Lev1map; pmap->pm_ptphint = NULL; pmap->pm_active = 0; @@ -1012,6 +1012,8 @@ vm_page_t lev1pg; int i; + PMAP_LOCK_INIT(pmap); + /* * allocate object for the ptes */ @@ -1294,6 +1296,7 @@ mtx_lock_spin(&allpmaps_lock); LIST_REMOVE(pmap, pm_list); mtx_unlock_spin(&allpmaps_lock); + PMAP_LOCK_DESTROY(pmap); } /* @@ -1618,6 +1621,7 @@ s = splvm(); while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { + PMAP_LOCK(pv->pv_pmap); pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va); pv->pv_pmap->pm_stats.resident_count--; @@ -1647,6 +1651,7 @@ 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_UNLOCK(pv->pv_pmap); free_pv_entry(pv); } @@ -1681,6 +1686,7 @@ if ((sva & PAGE_MASK) || (eva & PAGE_MASK)) panic("pmap_protect: unaligned addresses"); + PMAP_LOCK(pmap); while (sva < eva) { /* @@ -1731,6 +1737,7 @@ sva += PAGE_SIZE; } + PMAP_UNLOCK(pmap); } /* @@ -2033,6 +2040,7 @@ if (pmap == NULL) return; + PMAP_LOCK(pmap); pte = pmap_lev3pte(pmap, va); if (wired && !pmap_pte_w(pte)) @@ -2045,6 +2053,7 @@ * invalidate TLB. */ pmap_pte_set_w(pte, wired); + PMAP_UNLOCK(pmap); } @@ -2186,6 +2195,7 @@ #endif s = splvm(); + PMAP_LOCK(pmap); for(pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) { @@ -2232,6 +2242,7 @@ } splx(s); pmap_invalidate_all(pmap); + PMAP_UNLOCK(pmap); } /* @@ -2273,6 +2284,7 @@ } #endif + PMAP_LOCK(pv->pv_pmap); pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va); changed = 0; @@ -2288,6 +2300,7 @@ } if (changed) pmap_invalidate_page(pv->pv_pmap, pv->pv_va); + PMAP_UNLOCK(pv->pv_pmap); } if (!setem && bit == (PG_UWE|PG_KWE)) vm_page_flag_clear(m, PG_WRITEABLE); @@ -2340,6 +2353,7 @@ */ count = 0; 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_FOR)) { @@ -2347,6 +2361,7 @@ *pte |= PG_FOR | PG_FOE; pmap_invalidate_page(pv->pv_pmap, pv->pv_va); } + PMAP_UNLOCK(pv->pv_pmap); } return count; @@ -2416,12 +2431,14 @@ * Loop over current mappings setting PG_FOW where needed. */ 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)) { *pte |= PG_FOW; pmap_invalidate_page(pv->pv_pmap, pv->pv_va); } + PMAP_UNLOCK(pv->pv_pmap); } } @@ -2443,12 +2460,14 @@ * Loop over current mappings setting PG_FOR and PG_FOE where needed. */ 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_FOR | PG_FOE))) { *pte |= (PG_FOR | PG_FOE); pmap_invalidate_page(pv->pv_pmap, pv->pv_va); } + PMAP_UNLOCK(pv->pv_pmap); } } @@ -2461,9 +2480,8 @@ void pmap_emulate_reference(struct vmspace *vm, vm_offset_t v, int user, int write) { + pmap_t pmap; pt_entry_t faultoff, *pte; - vm_offset_t pa; - int user_addr; /* * Convert process and virtual address to physical address. @@ -2471,12 +2489,14 @@ if (v >= VM_MIN_KERNEL_ADDRESS) { if (user) panic("pmap_emulate_reference: user ref to kernel"); + pmap = kernel_pmap; + PMAP_LOCK(pmap); pte = vtopte(v); - user_addr = 0; } else { KASSERT(vm != NULL, ("pmap_emulate_reference: bad vmspace")); - pte = pmap_lev3pte(vm->vm_map.pmap, v); - user_addr = 1; + pmap = &vm->vm_pmap; + PMAP_LOCK(pmap); + pte = pmap_lev3pte(pmap, v); } #ifdef DEBUG /* These checks are more expensive */ if (!pmap_pte_v(pte)) @@ -2501,11 +2521,9 @@ #endif /* Other diagnostics? */ #endif - pa = pmap_pte_pa(pte); - KASSERT((*pte & PG_MANAGED) != 0, ("pmap_emulate_reference(%p, 0x%lx, %d, %d): pa 0x%lx not managed", - curthread, v, user, write, pa)); + curthread, v, user, write, pmap_pte_pa(pte))); /* * Twiddle the appropriate bits to reflect the reference @@ -2523,6 +2541,7 @@ *pte = (*pte & ~faultoff); ALPHA_TBIS(v); + PMAP_UNLOCK(pmap); } /* ==== //depot/projects/netperf_socket/sys/alpha/include/pmap.h#7 (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 * from: i386 pmap.h,v 1.54 1997/11/20 19:30:35 bde Exp - * $FreeBSD: src/sys/alpha/include/pmap.h,v 1.31 2004/06/23 08:06:52 alc Exp $ + * $FreeBSD: src/sys/alpha/include/pmap.h,v 1.32 2004/07/05 16:59:56 alc Exp $ */ #ifndef _MACHINE_PMAP_H_ @@ -95,6 +95,8 @@ #ifndef LOCORE #include <sys/queue.h> +#include <sys/_lock.h> +#include <sys/_mutex.h> typedef alpha_pt_entry_t pt_entry_t; @@ -165,6 +167,7 @@ #define ASNGEN_MASK ((1 << ASNGEN_BITS) - 1) struct pmap { + struct mtx pm_mtx; pt_entry_t *pm_lev1; /* KVA of lev0map */ vm_object_t pm_pteobj; /* Container for pte's */ TAILQ_HEAD(,pv_entry) pm_pvlist; /* list of mappings in pmap */ @@ -183,6 +186,17 @@ #ifdef _KERNEL extern struct pmap kernel_pmap_store; #define kernel_pmap (&kernel_pmap_store) + +#define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx) +#define PMAP_LOCK_ASSERT(pmap, type) \ + mtx_assert(&(pmap)->pm_mtx, (type)) +#define PMAP_LOCK_DESTROY(pmap) mtx_destroy(&(pmap)->pm_mtx) +#define PMAP_LOCK_INIT(pmap) mtx_init(&(pmap)->pm_mtx, "pmap", \ + NULL, MTX_DEF) +#define PMAP_LOCKED(pmap) mtx_owned(&(pmap)->pm_mtx) +#define PMAP_MTX(pmap) (&(pmap)->pm_mtx) +#define PMAP_TRYLOCK(pmap) mtx_trylock(&(pmap)->pm_mtx) +#define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) #endif /* ==== //depot/projects/netperf_socket/sys/amd64/amd64/autoconf.c#3 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/autoconf.c,v 1.178 2004/04/05 21:25:51 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/autoconf.c,v 1.180 2004/07/08 22:35:33 brian Exp $"); /* * Setup the system to run on the current machine. ==== //depot/projects/netperf_socket/sys/amd64/amd64/busdma_machdep.c#3 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.55 2004/03/13 15:42:59 scottl Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.56 2004/07/08 01:28:33 peter Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -38,6 +38,7 @@ #include <sys/mutex.h> #include <sys/mbuf.h> #include <sys/uio.h> +#include <sys/sysctl.h> #include <vm/vm.h> #include <vm/vm_page.h> @@ -84,8 +85,24 @@ static int reserved_bpages; static int active_bpages; static int total_bpages; +static int total_bounced; +static int total_deferred; static bus_addr_t bounce_lowaddr = BUS_SPACE_MAXADDR; +SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD, 0, "Busdma parameters"); +SYSCTL_INT(_hw_busdma, OID_AUTO, free_bpages, CTLFLAG_RD, &free_bpages, 0, + "Free bounce pages"); +SYSCTL_INT(_hw_busdma, OID_AUTO, reserved_bpages, CTLFLAG_RD, &reserved_bpages, + 0, "Reserved bounce pages"); +SYSCTL_INT(_hw_busdma, OID_AUTO, active_bpages, CTLFLAG_RD, &active_bpages, 0, + "Active bounce pages"); +SYSCTL_INT(_hw_busdma, OID_AUTO, total_bpages, CTLFLAG_RD, &total_bpages, 0, + "Total bounce pages"); +SYSCTL_INT(_hw_busdma, OID_AUTO, total_bounced, CTLFLAG_RD, &total_bounced, 0, + "Total bounce requests"); +SYSCTL_INT(_hw_busdma, OID_AUTO, total_deferred, CTLFLAG_RD, &total_deferred, 0, + "Total bounce requests that were deferred"); + struct bus_dmamap { struct bp_list bpages; int pagesneeded; @@ -109,7 +126,8 @@ static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, bus_size_t size); static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); -static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); +static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr, + bus_size_t len); /* * Return true if a match is made. @@ -120,14 +138,18 @@ * to check for a match, if there is no filter callback then assume a match. */ static __inline int -run_filter(bus_dma_tag_t dmat, bus_addr_t paddr) +run_filter(bus_dma_tag_t dmat, bus_addr_t paddr, bus_size_t len) { + bus_size_t bndy; int retval; retval = 0; + bndy = dmat->boundary; + do { - if (paddr > dmat->lowaddr - && paddr <= dmat->highaddr + if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr) + || ((paddr & (dmat->alignment - 1)) != 0) + || ((paddr & bndy) != ((paddr + len) & bndy))) && (dmat->filter == NULL || (*dmat->filter)(dmat->filterarg, paddr) != 0)) retval = 1; @@ -188,6 +210,10 @@ bus_dma_tag_t newtag; int error = 0; + /* Basic sanity checking */ + if (boundary != 0 && boundary < maxsegsz) + maxsegsz = boundary; + /* Return a NULL tag on failure */ *dmat = NULL; @@ -322,7 +348,13 @@ return (ENOMEM); } - if (dmat->lowaddr < ptoa((vm_paddr_t)Maxmem)) { + /* + * Bouncing might be required if the driver asks for an active + * exclusion region, a data alignment that is stricter than 1, and/or + * an active address boundary. + */ + if (dmat->lowaddr < ptoa((vm_paddr_t)Maxmem) + || dmat->alignment > 1 || dmat->boundary > 0) { /* Must bounce */ int maxpages; @@ -340,8 +372,7 @@ */ maxpages = MIN(MAX_BPAGES, Maxmem - atop(dmat->lowaddr)); if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0 - || (dmat->map_count > 0 - && total_bpages < maxpages)) { + || (dmat->map_count > 0 && total_bpages < maxpages)) { int pages; if (dmat->lowaddr > bounce_lowaddr) { @@ -426,6 +457,7 @@ * XXX Use Contigmalloc until it is merged into this facility * and handles multi-seg allocations. Nobody is doing * multi-seg allocations yet though. + * XXX Certain AGP hardware does. */ *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, mflags, 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, @@ -492,8 +524,9 @@ else pmap = NULL; - if (dmat->lowaddr < ptoa((vm_paddr_t)Maxmem) && - map->pagesneeded == 0) { + if ((dmat->lowaddr < ptoa((vm_paddr_t)Maxmem) + || dmat->boundary > 0 || dmat->alignment > 1) + && map->pagesneeded == 0) { vm_offset_t vendaddr; /* @@ -505,7 +538,7 @@ while (vaddr < vendaddr) { paddr = pmap_kextract(vaddr); - if (run_filter(dmat, paddr) != 0) { + if (run_filter(dmat, paddr, 0) != 0) { needbounce = 1; map->pagesneeded++; } @@ -566,7 +599,7 @@ sgsize = (baddr - curaddr); } - if (map->pagesneeded != 0 && run_filter(dmat, curaddr)) + if (map->pagesneeded != 0 && run_filter(dmat, curaddr, sgsize)) curaddr = add_bounce_page(dmat, map, vaddr, sgsize); /* @@ -763,6 +796,8 @@ * want to add support for invalidating * the caches on broken hardware */ + total_bounced++; + if (op & BUS_DMASYNC_PREWRITE) { while (bpage != NULL) { bcopy((void *)bpage->datavaddr, @@ -901,6 +936,7 @@ STAILQ_INSERT_TAIL(&bounce_map_callbacklist, map, links); busdma_swi_pending = 1; + total_deferred++; swi_sched(vm_ih, 0); } } ==== //depot/projects/netperf_socket/sys/amd64/amd64/io_apic.c#4 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/io_apic.c,v 1.9 2004/06/03 20:25:05 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/io_apic.c,v 1.10 2004/07/08 01:42:49 peter Exp $"); #include "opt_atpic.h" #include "opt_isa.h" @@ -100,6 +100,7 @@ u_int io_edgetrigger:1; u_int io_masked:1; int io_dest:5; + int io_bus:4; }; struct ioapic { @@ -115,6 +116,8 @@ static u_int ioapic_read(volatile ioapic_t *apic, int reg); static void ioapic_write(volatile ioapic_t *apic, int reg, u_int val); +static const char *ioapic_bus_string(int bus_type); +static void ioapic_print_vector(struct ioapic_intsrc *intpin); static void ioapic_enable_source(struct intsrc *isrc); static void ioapic_disable_source(struct intsrc *isrc); static void ioapic_eoi_source(struct intsrc *isrc); @@ -163,6 +166,45 @@ apic->iowin = val; } +static const char * +ioapic_bus_string(int bus_type) +{ + + switch (bus_type) { + case APIC_BUS_ISA: + return ("ISA"); + case APIC_BUS_EISA: + return ("EISA"); + case APIC_BUS_PCI: + return ("PCI"); + default: + return ("unknown"); + } +} + +static void +ioapic_print_vector(struct ioapic_intsrc *intpin) +{ + + switch (intpin->io_vector) { + case VECTOR_DISABLED: + printf("disabled"); + break; + case VECTOR_EXTINT: + printf("ExtINT"); + break; + case VECTOR_NMI: + printf("NMI"); + break; + case VECTOR_SMI: + printf("SMI"); + break; + default: + printf("%s IRQ %u", ioapic_bus_string(intpin->io_bus), + intpin->io_vector); + } +} + static void ioapic_enable_source(struct intsrc *isrc) { @@ -299,10 +341,7 @@ if (bootverbose) { printf("ioapic%u: routing intpin %u (", io->io_id, intpin->io_intpin); - if (intpin->io_vector == VECTOR_EXTINT) - printf("ExtINT"); - else - printf("IRQ %u", intpin->io_vector); + ioapic_print_vector(intpin); printf(") to cluster %u\n", intpin->io_dest); } ioapic_program_intpin(intpin); @@ -365,32 +404,39 @@ { struct ioapic_intsrc *intpin = (struct ioapic_intsrc *)isrc; struct ioapic *io = (struct ioapic *)isrc->is_pic; + int changed; KASSERT(!(trig == INTR_TRIGGER_CONFORM || pol == INTR_POLARITY_CONFORM), ("%s: Conforming trigger or polarity\n", __func__)); /* - * For now we ignore any requests but do output any changes that - * would be made to the console it bootverbose is enabled. The only - * known causes of these messages so far is a bug in acpi(4) that - * causes the ISA IRQs used for PCI interrupts in PIC mode to be - * set to level/low when they aren't being used. There are possibly - * legitimate requests, so at some point when the acpi(4) driver is - * fixed this code can be changed to actually change the intpin as - * requested. + * EISA interrupts always use active high polarity, so don't allow + * them to be set to active low. + * + * XXX: Should we write to the ELCR if the trigger mode changes for + * an EISA IRQ? */ - if (!bootverbose) - return (0); - if (intpin->io_edgetrigger != (trig == INTR_TRIGGER_EDGE)) - printf( - "ioapic%u: Request to change trigger for pin %u to %s ignored\n", - io->io_id, intpin->io_intpin, trig == INTR_TRIGGER_EDGE ? - "edge" : "level"); - if (intpin->io_activehi != (pol == INTR_POLARITY_HIGH)) - printf( - "ioapic%u: Request to change polarity for pin %u to %s ignored\n", - io->io_id, intpin->io_intpin, pol == INTR_POLARITY_HIGH ? - "high" : "low"); + if (intpin->io_bus == APIC_BUS_EISA) + pol = INTR_POLARITY_HIGH; + changed = 0; + if (intpin->io_edgetrigger != (trig == INTR_TRIGGER_EDGE)) { + if (bootverbose) + printf("ioapic%u: Changing trigger for pin %u to %s\n", + io->io_id, intpin->io_intpin, + trig == INTR_TRIGGER_EDGE ? "edge" : "level"); + intpin->io_edgetrigger = (trig == INTR_TRIGGER_EDGE); + changed++; + } + if (intpin->io_activehi != (pol == INTR_POLARITY_HIGH)) { + if (bootverbose) + printf("ioapic%u: Changing polarity for pin %u to %s\n", + io->io_id, intpin->io_intpin, + pol == INTR_POLARITY_HIGH ? "high" : "low"); + intpin->io_activehi = (pol == INTR_POLARITY_HIGH); + changed++; + } + if (changed) + ioapic_program_intpin(intpin); return (0); } @@ -491,44 +537,36 @@ intpin->io_vector = intbase + i; /* - * Assume that pin 0 on the first IO APIC is an ExtINT pin by - * default. Assume that intpins 1-15 are ISA interrupts and - * use suitable defaults for those. Assume that all other - * intpins are PCI interrupts. Enable the ExtINT pin if - * mixed mode is available and active but mask all other pins. + * Assume that pin 0 on the first I/O APIC is an ExtINT pin + * and that pins 1-15 are ISA interrupts. Assume that all + * other pins are PCI interrupts. */ - if (intpin->io_vector == 0) { + if (intpin->io_vector == 0) + ioapic_set_extint(io, i); + else if (intpin->io_vector < IOAPIC_ISA_INTS) { + intpin->io_bus = APIC_BUS_ISA; intpin->io_activehi = 1; intpin->io_edgetrigger = 1; - intpin->io_vector = VECTOR_EXTINT; - if (mixed_mode_enabled && mixed_mode_active) - intpin->io_masked = 0; - else - intpin->io_masked = 1; - } else if (intpin->io_vector < IOAPIC_ISA_INTS) { - intpin->io_activehi = 1; - intpin->io_edgetrigger = 1; intpin->io_masked = 1; } else { + intpin->io_bus = APIC_BUS_PCI; intpin->io_activehi = 0; intpin->io_edgetrigger = 0; intpin->io_masked = 1; } /* - * Start off without a logical cluster destination until - * the pin is enabled. + * Route interrupts to the BSP by default using physical + * addressing. Vectored interrupts get readdressed using + * logical IDs to CPU clusters when they are enabled. */ intpin->io_dest = DEST_NONE; - if (bootverbose) { + if (bootverbose && intpin->io_vector != VECTOR_DISABLED) { printf("ioapic%u: intpin %d -> ", io->io_id, i); - if (intpin->io_vector == VECTOR_EXTINT) - printf("ExtINT"); - else - printf("irq %u", intpin->io_vector); - printf(" (%s, active%s)\n", intpin->io_edgetrigger ? - "edge" : "level", intpin->io_activehi ? "hi" : - "lo"); + ioapic_print_vector(intpin); + printf(" (%s, %s)\n", intpin->io_edgetrigger ? + "edge" : "level", intpin->io_activehi ? "high" : + "low"); } value = ioapic_read(apic, IOAPIC_REDTBL_LO(i)); ioapic_write(apic, IOAPIC_REDTBL_LO(i), value | IOART_INTMSET); @@ -583,6 +621,25 @@ } int +ioapic_set_bus(void *cookie, u_int pin, int bus_type) +{ + struct ioapic *io; + + if (bus_type < 0 || bus_type > APIC_BUS_MAX) + return (EINVAL); + io = (struct ioapic *)cookie; + if (pin >= io->io_numintr) + return (EINVAL); + if (io->io_pins[pin].io_vector >= NUM_IO_INTS) + return (EINVAL); + io->io_pins[pin].io_bus = bus_type; + if (bootverbose) + printf("ioapic%u: intpin %d bus %s\n", io->io_id, pin, + ioapic_bus_string(bus_type)); + return (0); +} + +int ioapic_set_nmi(void *cookie, u_int pin) { struct ioapic *io; @@ -590,8 +647,11 @@ io = (struct ioapic *)cookie; if (pin >= io->io_numintr) return (EINVAL); + if (io->io_pins[pin].io_vector == VECTOR_NMI) + return (0); if (io->io_pins[pin].io_vector >= NUM_IO_INTS) return (EINVAL); + io->io_pins[pin].io_bus = APIC_BUS_UNKNOWN; io->io_pins[pin].io_vector = VECTOR_NMI; io->io_pins[pin].io_masked = 0; io->io_pins[pin].io_edgetrigger = 1; @@ -610,8 +670,11 @@ io = (struct ioapic *)cookie; if (pin >= io->io_numintr) return (EINVAL); + if (io->io_pins[pin].io_vector == VECTOR_SMI) + return (0); if (io->io_pins[pin].io_vector >= NUM_IO_INTS) return (EINVAL); + io->io_pins[pin].io_bus = APIC_BUS_UNKNOWN; io->io_pins[pin].io_vector = VECTOR_SMI; io->io_pins[pin].io_masked = 0; io->io_pins[pin].io_edgetrigger = 1; @@ -630,10 +693,18 @@ io = (struct ioapic *)cookie; if (pin >= io->io_numintr) return (EINVAL); + if (io->io_pins[pin].io_vector == VECTOR_EXTINT) + return (0); if (io->io_pins[pin].io_vector >= NUM_IO_INTS) return (EINVAL); + io->io_pins[pin].io_bus = APIC_BUS_UNKNOWN; io->io_pins[pin].io_vector = VECTOR_EXTINT; - io->io_pins[pin].io_masked = 0; + + /* Enable this pin if mixed mode is available and active. */ + if (mixed_mode_enabled && mixed_mode_active) + io->io_pins[pin].io_masked = 0; + else + io->io_pins[pin].io_masked = 1; io->io_pins[pin].io_edgetrigger = 1; io->io_pins[pin].io_activehi = 1; if (bootverbose) >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200407092107.i69L7HUG092979>