PERFORCE change 56927 for review
Robert Watson
rwatson at FreeBSD.org
Fri Jul 9 14:07:19 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=56927
Change 56927 by rwatson at 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) <<<
More information about the p4-projects
mailing list