PERFORCE change 33938 for review
John Baldwin
jhb at FreeBSD.org
Tue Jul 1 11:40:30 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=33938
Change 33938 by jhb at jhb_laptop on 2003/07/01 11:39:50
IFC @33935.
Affected files ...
.. //depot/projects/smpng/sys/alpha/alpha/busdma_machdep.c#18 integrate
.. //depot/projects/smpng/sys/alpha/alpha/machdep.c#58 integrate
.. //depot/projects/smpng/sys/alpha/alpha/pmap.c#47 integrate
.. //depot/projects/smpng/sys/alpha/alpha/support.s#7 integrate
.. //depot/projects/smpng/sys/alpha/include/bus.h#11 integrate
.. //depot/projects/smpng/sys/alpha/isa/isa_dma.c#4 integrate
.. //depot/projects/smpng/sys/alpha/mcbus/mcpcia.c#17 integrate
.. //depot/projects/smpng/sys/amd64/amd64/busdma_machdep.c#3 integrate
.. //depot/projects/smpng/sys/amd64/amd64/machdep.c#9 integrate
.. //depot/projects/smpng/sys/amd64/amd64/pmap.c#5 integrate
.. //depot/projects/smpng/sys/amd64/conf/GENERIC#6 integrate
.. //depot/projects/smpng/sys/amd64/include/bus_dma.h#5 integrate
.. //depot/projects/smpng/sys/boot/common/loader.8#24 integrate
.. //depot/projects/smpng/sys/boot/ficl/Makefile#6 integrate
.. //depot/projects/smpng/sys/boot/forth/loader.conf#19 integrate
.. //depot/projects/smpng/sys/boot/i386/btx/lib/Makefile#5 integrate
.. //depot/projects/smpng/sys/boot/i386/kgzldr/Makefile#9 integrate
.. //depot/projects/smpng/sys/boot/pc98/btx/lib/Makefile#4 integrate
.. //depot/projects/smpng/sys/boot/pc98/kgzldr/Makefile#7 integrate
.. //depot/projects/smpng/sys/compat/linux/linux_ioctl.c#28 integrate
.. //depot/projects/smpng/sys/conf/NOTES#47 integrate
.. //depot/projects/smpng/sys/conf/files#80 integrate
.. //depot/projects/smpng/sys/conf/files.powerpc#14 integrate
.. //depot/projects/smpng/sys/conf/files.sparc64#29 integrate
.. //depot/projects/smpng/sys/conf/options.i386#28 integrate
.. //depot/projects/smpng/sys/conf/options.pc98#29 integrate
.. //depot/projects/smpng/sys/conf/options.sparc64#7 integrate
.. //depot/projects/smpng/sys/dev/aac/aac.c#27 integrate
.. //depot/projects/smpng/sys/dev/aac/aac_pci.c#22 integrate
.. //depot/projects/smpng/sys/dev/acpica/acpi_ec.c#17 integrate
.. //depot/projects/smpng/sys/dev/acpica/acpi_pci.c#4 integrate
.. //depot/projects/smpng/sys/dev/advansys/adv_eisa.c#4 integrate
.. //depot/projects/smpng/sys/dev/advansys/adv_isa.c#4 integrate
.. //depot/projects/smpng/sys/dev/advansys/adv_pci.c#4 integrate
.. //depot/projects/smpng/sys/dev/advansys/advansys.c#7 integrate
.. //depot/projects/smpng/sys/dev/advansys/adw_pci.c#4 integrate
.. //depot/projects/smpng/sys/dev/advansys/adwcam.c#7 integrate
.. //depot/projects/smpng/sys/dev/aha/aha.c#9 integrate
.. //depot/projects/smpng/sys/dev/aha/aha_isa.c#4 integrate
.. //depot/projects/smpng/sys/dev/aha/aha_mca.c#4 integrate
.. //depot/projects/smpng/sys/dev/ahb/ahb.c#8 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/ahc_eisa.c#8 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/ahc_pci.c#10 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/ahd_pci.c#8 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.c#15 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.h#12 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.seq#10 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx_inline.h#10 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx_osm.h#9 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx_pci.c#12 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic7xxx_osm.h#10 integrate
.. //depot/projects/smpng/sys/dev/amd/amd.c#6 integrate
.. //depot/projects/smpng/sys/dev/amr/amr_pci.c#10 integrate
.. //depot/projects/smpng/sys/dev/an/if_an.c#31 integrate
.. //depot/projects/smpng/sys/dev/an/if_an_pci.c#13 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-dma.c#30 integrate
.. //depot/projects/smpng/sys/dev/ath/if_ath.c#2 integrate
.. //depot/projects/smpng/sys/dev/ath/if_ath_pci.c#2 integrate
.. //depot/projects/smpng/sys/dev/awi/awi.c#14 integrate
.. //depot/projects/smpng/sys/dev/awi/awi_wep.c#11 integrate
.. //depot/projects/smpng/sys/dev/awi/awi_wicfg.c#8 integrate
.. //depot/projects/smpng/sys/dev/awi/awivar.h#4 integrate
.. //depot/projects/smpng/sys/dev/awi/if_awi_pccard.c#7 integrate
.. //depot/projects/smpng/sys/dev/buslogic/bt.c#10 integrate
.. //depot/projects/smpng/sys/dev/buslogic/bt_eisa.c#5 integrate
.. //depot/projects/smpng/sys/dev/buslogic/bt_isa.c#4 integrate
.. //depot/projects/smpng/sys/dev/buslogic/bt_mca.c#4 integrate
.. //depot/projects/smpng/sys/dev/buslogic/bt_pci.c#4 integrate
.. //depot/projects/smpng/sys/dev/cardbus/cardbus.c#15 integrate
.. //depot/projects/smpng/sys/dev/ciss/ciss.c#17 integrate
.. //depot/projects/smpng/sys/dev/ct/ct_isa.c#6 integrate
.. //depot/projects/smpng/sys/dev/dpt/dpt_eisa.c#4 integrate
.. //depot/projects/smpng/sys/dev/dpt/dpt_isa.c#4 integrate
.. //depot/projects/smpng/sys/dev/dpt/dpt_pci.c#4 integrate
.. //depot/projects/smpng/sys/dev/dpt/dpt_scsi.c#8 integrate
.. //depot/projects/smpng/sys/dev/em/if_em.c#23 integrate
.. //depot/projects/smpng/sys/dev/en/midway.c#16 integrate
.. //depot/projects/smpng/sys/dev/fatm/if_fatm.c#2 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewire.c#20 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewirereg.h#10 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwdma.c#2 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwmem.c#10 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwohci.c#18 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwohci_pci.c#14 integrate
.. //depot/projects/smpng/sys/dev/firewire/sbp.c#20 integrate
.. //depot/projects/smpng/sys/dev/fxp/if_fxp.c#39 integrate
.. //depot/projects/smpng/sys/dev/gem/if_gem.c#14 integrate
.. //depot/projects/smpng/sys/dev/gem/if_gem_pci.c#9 integrate
.. //depot/projects/smpng/sys/dev/hatm/if_hatm.c#2 integrate
.. //depot/projects/smpng/sys/dev/hifn/hifn7751.c#9 integrate
.. //depot/projects/smpng/sys/dev/hme/if_hme.c#11 integrate
.. //depot/projects/smpng/sys/dev/hme/if_hme_pci.c#7 integrate
.. //depot/projects/smpng/sys/dev/ida/ida.c#11 integrate
.. //depot/projects/smpng/sys/dev/ida/ida_eisa.c#5 integrate
.. //depot/projects/smpng/sys/dev/ida/ida_pci.c#5 integrate
.. //depot/projects/smpng/sys/dev/iir/iir.c#7 integrate
.. //depot/projects/smpng/sys/dev/iir/iir_pci.c#7 integrate
.. //depot/projects/smpng/sys/dev/ips/ips.c#3 integrate
.. //depot/projects/smpng/sys/dev/ips/ips_commands.c#3 integrate
.. //depot/projects/smpng/sys/dev/ips/ips_disk.c#2 integrate
.. //depot/projects/smpng/sys/dev/ips/ips_ioctl.c#3 integrate
.. //depot/projects/smpng/sys/dev/ips/ips_pci.c#3 integrate
.. //depot/projects/smpng/sys/dev/isp/isp_pci.c#20 integrate
.. //depot/projects/smpng/sys/dev/isp/isp_sbus.c#5 integrate
.. //depot/projects/smpng/sys/dev/lnc/if_lnc_cbus.c#4 integrate
.. //depot/projects/smpng/sys/dev/lnc/if_lnc_isa.c#4 integrate
.. //depot/projects/smpng/sys/dev/lnc/if_lnc_pci.c#4 integrate
.. //depot/projects/smpng/sys/dev/mlx/mlx.c#10 integrate
.. //depot/projects/smpng/sys/dev/mlx/mlx_pci.c#4 integrate
.. //depot/projects/smpng/sys/dev/mly/mly.c#16 integrate
.. //depot/projects/smpng/sys/dev/mpt/mpt_pci.c#5 integrate
.. //depot/projects/smpng/sys/dev/pci/pci.c#28 integrate
.. //depot/projects/smpng/sys/dev/pci/pci_if.m#3 integrate
.. //depot/projects/smpng/sys/dev/pci/pci_private.h#7 integrate
.. //depot/projects/smpng/sys/dev/ray/if_ray.c#8 integrate
.. //depot/projects/smpng/sys/dev/sound/isa/ad1816.c#10 integrate
.. //depot/projects/smpng/sys/dev/sound/isa/ess.c#7 integrate
.. //depot/projects/smpng/sys/dev/sound/isa/mss.c#13 integrate
.. //depot/projects/smpng/sys/dev/sound/isa/sb16.c#9 integrate
.. //depot/projects/smpng/sys/dev/sound/isa/sb8.c#7 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/als4000.c#8 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/au88x0.c#2 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/aureal.c#5 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/cmi.c#14 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/cs4281.c#7 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/csapcm.c#4 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/ds1.c#9 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/emu10k1.c#12 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/es137x.c#7 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/fm801.c#8 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/ich.c#20 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/maestro.c#7 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/maestro3.c#13 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/solo.c#6 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/t4dwave.c#12 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/via8233.c#7 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/via82c686.c#12 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/vibes.c#7 integrate
.. //depot/projects/smpng/sys/dev/sound/usb/uaudio_pcm.c#3 integrate
.. //depot/projects/smpng/sys/dev/sym/sym_hipd.c#13 integrate
.. //depot/projects/smpng/sys/dev/trm/trm.c#9 integrate
.. //depot/projects/smpng/sys/dev/twe/twe_freebsd.c#15 integrate
.. //depot/projects/smpng/sys/dev/tx/if_tx.c#10 integrate
.. //depot/projects/smpng/sys/dev/ubsec/ubsec.c#13 integrate
.. //depot/projects/smpng/sys/dev/usb/umct.c#1 branch
.. //depot/projects/smpng/sys/dev/usb/usbdevs#34 integrate
.. //depot/projects/smpng/sys/dev/usb/usbdevs.h#35 integrate
.. //depot/projects/smpng/sys/dev/usb/usbdevs_data.h#35 integrate
.. //depot/projects/smpng/sys/dev/usb/uscanner.c#12 integrate
.. //depot/projects/smpng/sys/dev/vinum/vinumconfig.c#14 integrate
.. //depot/projects/smpng/sys/dev/wds/wd7000.c#4 integrate
.. //depot/projects/smpng/sys/dev/wi/if_wi.c#52 integrate
.. //depot/projects/smpng/sys/dev/wi/if_wi_pccard.c#18 integrate
.. //depot/projects/smpng/sys/dev/wi/if_wi_pci.c#13 integrate
.. //depot/projects/smpng/sys/dev/wi/if_wivar.h#14 integrate
.. //depot/projects/smpng/sys/fs/msdosfs/msdosfs_vfsops.c#19 integrate
.. //depot/projects/smpng/sys/i386/acpica/acpi_wakeup.c#17 integrate
.. //depot/projects/smpng/sys/i386/i386/busdma_machdep.c#20 integrate
.. //depot/projects/smpng/sys/i386/i386/genassym.c#24 integrate
.. //depot/projects/smpng/sys/i386/i386/machdep.c#61 integrate
.. //depot/projects/smpng/sys/i386/i386/mp_machdep.c#47 integrate
.. //depot/projects/smpng/sys/i386/i386/pmap.c#40 integrate
.. //depot/projects/smpng/sys/i386/i386/swtch.s#18 integrate
.. //depot/projects/smpng/sys/i386/include/bus_dma.h#7 integrate
.. //depot/projects/smpng/sys/i386/include/md_var.h#20 integrate
.. //depot/projects/smpng/sys/i386/include/pcpu.h#6 integrate
.. //depot/projects/smpng/sys/i4b/layer1/itjc/i4b_itjc_pci.c#9 integrate
.. //depot/projects/smpng/sys/ia64/ia64/busdma_machdep.c#17 integrate
.. //depot/projects/smpng/sys/ia64/ia64/machdep.c#59 integrate
.. //depot/projects/smpng/sys/ia64/ia64/pmap.c#48 integrate
.. //depot/projects/smpng/sys/ia64/ia64/vm_machdep.c#28 integrate
.. //depot/projects/smpng/sys/ia64/include/bus.h#11 integrate
.. //depot/projects/smpng/sys/ia64/isa/isa_dma.c#4 integrate
.. //depot/projects/smpng/sys/isa/psm.c#16 integrate
.. //depot/projects/smpng/sys/kern/init_sysent.c#30 integrate
.. //depot/projects/smpng/sys/kern/kern_intr.c#32 integrate
.. //depot/projects/smpng/sys/kern/kern_sig.c#71 integrate
.. //depot/projects/smpng/sys/kern/kern_synch.c#53 integrate
.. //depot/projects/smpng/sys/kern/kern_thread.c#38 integrate
.. //depot/projects/smpng/sys/kern/sched_ule.c#13 integrate
.. //depot/projects/smpng/sys/kern/subr_trap.c#55 integrate
.. //depot/projects/smpng/sys/kern/syscalls.c#30 integrate
.. //depot/projects/smpng/sys/kern/syscalls.master#29 integrate
.. //depot/projects/smpng/sys/kern/vfs_mount.c#16 integrate
.. //depot/projects/smpng/sys/modules/Makefile#56 integrate
.. //depot/projects/smpng/sys/modules/ath_hal/Makefile#2 integrate
.. //depot/projects/smpng/sys/modules/umct/Makefile#1 branch
.. //depot/projects/smpng/sys/modules/wlan/Makefile#2 integrate
.. //depot/projects/smpng/sys/net/if_ieee80211.h#5 delete
.. //depot/projects/smpng/sys/net/if_ieee80211subr.c#4 delete
.. //depot/projects/smpng/sys/net80211/ieee80211.c#2 integrate
.. //depot/projects/smpng/sys/net80211/ieee80211_ioctl.c#2 integrate
.. //depot/projects/smpng/sys/net80211/ieee80211_node.c#2 integrate
.. //depot/projects/smpng/sys/netinet/ip_dummynet.c#18 integrate
.. //depot/projects/smpng/sys/netinet/ip_fw2.c#15 integrate
.. //depot/projects/smpng/sys/netipsec/ipsec.c#5 integrate
.. //depot/projects/smpng/sys/netipsec/ipsec_output.c#6 integrate
.. //depot/projects/smpng/sys/netipsec/key.c#4 integrate
.. //depot/projects/smpng/sys/netipsec/xform_ah.c#3 integrate
.. //depot/projects/smpng/sys/netipsec/xform_esp.c#3 integrate
.. //depot/projects/smpng/sys/netipsec/xform_ipcomp.c#3 integrate
.. //depot/projects/smpng/sys/opencrypto/crypto.c#9 integrate
.. //depot/projects/smpng/sys/opencrypto/cryptodev.h#5 integrate
.. //depot/projects/smpng/sys/opencrypto/cryptosoft.c#4 integrate
.. //depot/projects/smpng/sys/pc98/i386/machdep.c#55 integrate
.. //depot/projects/smpng/sys/pci/if_rl.c#31 integrate
.. //depot/projects/smpng/sys/pci/if_sis.c#27 integrate
.. //depot/projects/smpng/sys/pci/if_xl.c#29 integrate
.. //depot/projects/smpng/sys/powerpc/include/bus.h#11 integrate
.. //depot/projects/smpng/sys/powerpc/powermac/grackle.c#1 branch
.. //depot/projects/smpng/sys/powerpc/powermac/gracklevar.h#1 branch
.. //depot/projects/smpng/sys/powerpc/powermac/hrowpic.c#1 branch
.. //depot/projects/smpng/sys/powerpc/powermac/hrowpicvar.h#1 branch
.. //depot/projects/smpng/sys/powerpc/powermac/macio.c#6 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/busdma_machdep.c#13 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/machdep.c#40 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/pmap.c#28 integrate
.. //depot/projects/smpng/sys/sparc64/conf/GENERIC#31 integrate
.. //depot/projects/smpng/sys/sparc64/conf/NOTES#3 integrate
.. //depot/projects/smpng/sys/sparc64/ebus/ebus.c#8 integrate
.. //depot/projects/smpng/sys/sparc64/include/bus.h#17 integrate
.. //depot/projects/smpng/sys/sparc64/include/ofw_bus.h#5 integrate
.. //depot/projects/smpng/sys/sparc64/isa/isa.c#8 integrate
.. //depot/projects/smpng/sys/sparc64/isa/ofw_isa.c#4 integrate
.. //depot/projects/smpng/sys/sparc64/isa/ofw_isa.h#2 integrate
.. //depot/projects/smpng/sys/sparc64/pci/apb.c#5 integrate
.. //depot/projects/smpng/sys/sparc64/pci/ofw_pci.c#11 integrate
.. //depot/projects/smpng/sys/sparc64/pci/ofw_pci.h#6 integrate
.. //depot/projects/smpng/sys/sparc64/pci/ofw_pci_if.m#2 integrate
.. //depot/projects/smpng/sys/sparc64/pci/ofw_pcib.c#1 branch
.. //depot/projects/smpng/sys/sparc64/pci/ofw_pcib_subr.c#1 branch
.. //depot/projects/smpng/sys/sparc64/pci/ofw_pcib_subr.h#1 branch
.. //depot/projects/smpng/sys/sparc64/pci/ofw_pcibus.c#1 branch
.. //depot/projects/smpng/sys/sparc64/pci/psycho.c#24 integrate
.. //depot/projects/smpng/sys/sparc64/pci/psychovar.h#9 integrate
.. //depot/projects/smpng/sys/sparc64/sbus/sbus.c#12 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/bus_machdep.c#18 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/iommu.c#18 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/machdep.c#52 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/ofw_bus.c#6 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/pmap.c#39 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/sparcbus_if.m#3 delete
.. //depot/projects/smpng/sys/sys/kse.h#11 integrate
.. //depot/projects/smpng/sys/sys/mount.h#22 integrate
.. //depot/projects/smpng/sys/sys/param.h#43 integrate
.. //depot/projects/smpng/sys/sys/proc.h#93 integrate
.. //depot/projects/smpng/sys/sys/smp.h#7 integrate
.. //depot/projects/smpng/sys/sys/syscall.h#30 integrate
.. //depot/projects/smpng/sys/sys/syscall.mk#30 integrate
.. //depot/projects/smpng/sys/sys/sysproto.h#32 integrate
.. //depot/projects/smpng/sys/vm/pmap.h#19 integrate
.. //depot/projects/smpng/sys/vm/vm_kern.c#15 integrate
.. //depot/projects/smpng/sys/vm/vm_map.c#39 integrate
.. //depot/projects/smpng/sys/vm/vm_map.h#19 integrate
.. //depot/projects/smpng/sys/vm/vm_page.c#39 integrate
.. //depot/projects/smpng/sys/vm/vm_pageout.c#33 integrate
Differences ...
==== //depot/projects/smpng/sys/alpha/alpha/busdma_machdep.c#18 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/busdma_machdep.c,v 1.39 2003/06/27 08:31:47 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/busdma_machdep.c,v 1.40 2003/07/01 15:51:50 scottl Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -64,6 +64,8 @@
int flags;
int ref_count;
int map_count;
+ bus_dma_lock_t *lockfunc;
+ void *lockfuncarg;
};
struct bounce_page {
@@ -94,7 +96,6 @@
vm_offset_t busaddress; /* address in bus space */
bus_dmamap_callback_t *callback;
void *callback_arg;
- struct mtx *callback_mtx;
void *sgmaphandle; /* handle into sgmap */
STAILQ_ENTRY(bus_dmamap) links;
};
@@ -129,6 +130,46 @@
return (retval);
}
+/*
+ * Convenience function for manipulating driver locks from busdma (during
+ * busdma_swi, for example). Drivers that don't provide their own locks
+ * should specify &Giant to dmat->lockfuncarg. Drivers that use their own
+ * non-mutex locking scheme don't have to use this at all.
+ */
+void
+busdma_lock_mutex(void *arg, bus_dma_lock_op_t op)
+{
+ struct mtx *dmtx;
+
+ dmtx = (struct mtx *)arg;
+ switch (op) {
+ case BUS_DMA_LOCK:
+ mtx_lock(dmtx);
+ break;
+ case BUS_DMA_UNLOCK:
+ mtx_unlock(dmtx);
+ break;
+ default:
+ panic("Unknown operation 0x%x for busdma_lock_mutex!", op);
+ }
+}
+
+/*
+ * dflt_lock should never get called. It gets put into the dma tag when
+ * lockfunc == NULL, which is only valid if the maps that are associated
+ * with the tag are meant to never be defered.
+ * XXX Should have a way to identify which driver is responsible here.
+ */
+static void
+dflt_lock(void *arg, bus_dma_lock_op_t op)
+{
+#ifdef INVARIANTS
+ panic("driver error: busdma dflt_lock called");
+#else
+ printf("DRIVER_ERROR: busdma dflt_lock called\n");
+#endif
+}
+
#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4
/*
* Allocate a device specific dma_tag.
@@ -138,7 +179,8 @@
bus_size_t boundary, bus_addr_t lowaddr,
bus_addr_t highaddr, bus_dma_filter_t *filter,
void *filterarg, bus_size_t maxsize, int nsegments,
- bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat)
+ bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
+ void *lockfuncarg, bus_dma_tag_t *dmat)
{
bus_dma_tag_t newtag;
int error = 0;
@@ -163,6 +205,13 @@
newtag->flags = flags;
newtag->ref_count = 1; /* Count ourself */
newtag->map_count = 0;
+ if (lockfunc != NULL) {
+ newtag->lockfunc = lockfunc;
+ newtag->lockfuncarg = lockfuncarg;
+ } else {
+ newtag->lockfunc = dflt_lock;
+ newtag->lockfuncarg = NULL;
+ }
/* Take into account any restrictions imposed by our parent tag */
if (parent != NULL) {
@@ -926,18 +975,18 @@
void
busdma_swi(void)
{
+ bus_dma_tag_t dmat;
struct bus_dmamap *map;
mtx_lock(&bounce_lock);
while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) {
STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links);
mtx_unlock(&bounce_lock);
- if (map->callback_mtx != NULL)
- mtx_lock(map->callback_mtx);
+ dmat = map->dmat;
+ (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK);
bus_dmamap_load(map->dmat, map, map->buf, map->buflen,
map->callback, map->callback_arg, /*flags*/0);
- if (map->callback_mtx != NULL)
- mtx_unlock(map->callback_mtx);
+ (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK);
mtx_lock(&bounce_lock);
}
mtx_unlock(&bounce_lock);
==== //depot/projects/smpng/sys/alpha/alpha/machdep.c#58 (text+ko) ====
@@ -88,7 +88,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/machdep.c,v 1.203 2003/06/10 16:50:43 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/machdep.c,v 1.204 2003/06/28 06:34:07 davidxu Exp $");
#include "opt_compat.h"
#include "opt_ddb.h"
@@ -1462,6 +1462,25 @@
}
/*
+ * Build siginfo_t for SA thread
+ */
+void
+thread_siginfo(int sig, u_long code, siginfo_t *si)
+{
+ struct proc *p;
+ struct thread *td;
+
+ td = curthread;
+ p = td->td_proc;
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+
+ bzero(si, sizeof(*si));
+ si->si_signo = sig;
+ si->si_code = code;
+ /* XXXKSE fill other fields */
+}
+
+/*
* System call to cleanup state after a signal
* has been taken. Reset signal mask and
* stack state from context left by sendsig (above).
==== //depot/projects/smpng/sys/alpha/alpha/pmap.c#47 (text+ko) ====
@@ -148,7 +148,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.126 2003/06/18 02:57:38 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.128 2003/06/29 21:20:02 alc Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -330,8 +330,6 @@
static void alpha_protection_init(void);
static void pmap_changebit(vm_page_t m, int bit, boolean_t setem);
-static vm_page_t pmap_enter_quick(pmap_t pmap, vm_offset_t va,
- vm_page_t m, vm_page_t mpte);
static int pmap_remove_pte(pmap_t pmap, pt_entry_t* ptq, vm_offset_t sva);
static void pmap_remove_page(struct pmap *pmap, vm_offset_t va);
static int pmap_remove_entry(struct pmap *pmap, vm_page_t m, vm_offset_t va);
@@ -1973,7 +1971,7 @@
* but is *MUCH* faster than pmap_enter...
*/
-static vm_page_t
+vm_page_t
pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
{
register pt_entry_t *pte;
@@ -2090,18 +2088,18 @@
if (pmap == NULL || object == NULL)
return;
-
+ VM_OBJECT_LOCK(object);
psize = alpha_btop(size);
if ((object->type != OBJT_VNODE) ||
((limit & MAP_PREFAULT_PARTIAL) && (psize > MAX_INIT_PT) &&
(object->resident_page_count > MAX_INIT_PT))) {
- return;
+ goto unlock_return;
}
if (psize + pindex > object->size) {
if (object->size < pindex)
- return;
+ goto unlock_return;
psize = object->size - pindex;
}
@@ -2141,8 +2139,10 @@
vm_page_deactivate(p);
vm_page_busy(p);
vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(object);
mpte = pmap_enter_quick(pmap,
addr + alpha_ptob(tmpidx), p, mpte);
+ VM_OBJECT_LOCK(object);
vm_page_lock_queues();
vm_page_wakeup(p);
}
@@ -2173,15 +2173,18 @@
vm_page_deactivate(p);
vm_page_busy(p);
vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(object);
mpte = pmap_enter_quick(pmap,
addr + alpha_ptob(tmpidx), p, mpte);
+ VM_OBJECT_LOCK(object);
vm_page_lock_queues();
vm_page_wakeup(p);
}
vm_page_unlock_queues();
}
}
- return;
+unlock_return:
+ VM_OBJECT_UNLOCK(object);
}
/*
==== //depot/projects/smpng/sys/alpha/alpha/support.s#7 (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/alpha/alpha/support.s,v 1.13 2003/04/04 17:29:54 des Exp $
+ * $FreeBSD: src/sys/alpha/alpha/support.s,v 1.14 2003/06/29 17:14:42 marcel Exp $
*/
/*
@@ -84,7 +84,27 @@
mov zero, v0
RET
END(suword)
-
+
+ LEAF(suword32, 2)
+ LDGP(pv)
+
+ ldiq t0, VM_MAXUSER_ADDRESS /* verify address validity */
+ cmpult a0, t0, t1
+ beq t1, fusufault
+
+ lda t0, fusufault /* trap faults */
+ ldq t2, PC_CURTHREAD(pcpup)
+ ldq t2, TD_PCB(t2)
+ stq t0, PCB_ONFAULT(t2)
+
+ stl a1, 0(a0) /* try the store */
+
+ stq zero, PCB_ONFAULT(t2) /* clean up */
+
+ mov zero, v0
+ RET
+ END(suword32)
+
LEAF(subyte, 1)
LDGP(pv)
@@ -130,6 +150,25 @@
RET
END(fuword)
+ LEAF(fuword32, 1)
+ LDGP(pv)
+
+ ldiq t0, VM_MAXUSER_ADDRESS /* verify address validity */
+ cmpult a0, t0, t1
+ beq t1, fusufault
+
+ lda t0, fusufault /* trap faults */
+ ldq t2, PC_CURTHREAD(pcpup)
+ ldq t2, TD_PCB(t2)
+ stq t0, PCB_ONFAULT(t2)
+
+ ldl v0, 0(a0) /* get the word containing our byte */
+
+ stq zero, PCB_ONFAULT(t2) /* clean up */
+
+ RET
+ END(fuword32)
+
LEAF(fubyte, 1)
LDGP(pv)
==== //depot/projects/smpng/sys/alpha/include/bus.h#11 (text+ko) ====
@@ -67,7 +67,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/* $FreeBSD: src/sys/alpha/include/bus.h,v 1.21 2003/05/30 20:40:32 hmp Exp $ */
+/* $FreeBSD: src/sys/alpha/include/bus.h,v 1.22 2003/07/01 15:51:50 scottl Exp $ */
#ifndef _ALPHA_BUS_H_
#define _ALPHA_BUS_H_
@@ -523,6 +523,17 @@
typedef int bus_dma_filter_t(void *, bus_addr_t);
/*
+ * A function that performs driver-specific syncronization on behalf of
+ * busdma.
+ */
+typedef enum {
+ BUS_DMA_LOCK = 0x01,
+ BUS_DMA_UNLOCK = 0x02,
+} bus_dma_lock_op_t;
+
+typedef void bus_dma_lock_t(void *, bus_dma_lock_op_t);
+
+/*
* Allocate a device specific dma_tag encapsulating the constraints of
* the parent tag in addition to other restrictions specified:
*
@@ -547,7 +558,8 @@
bus_size_t boundary, bus_addr_t lowaddr,
bus_addr_t highaddr, bus_dma_filter_t *filtfunc,
void *filtfuncarg, bus_size_t maxsize, int nsegments,
- bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat);
+ bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
+ void *lockfuncarg, bus_dma_tag_t *dmat);
int bus_dma_tag_destroy(bus_dma_tag_t dmat);
@@ -629,4 +641,9 @@
if ((dmamap) != NULL) \
_bus_dmamap_unload(dmat, dmamap)
+/*
+ * Generic helper function for manipulating mutexes.
+ */
+void busdma_lock_mutex(void *arg, bus_dma_lock_op_t op);
+
#endif /* _ALPHA_BUS_H_ */
==== //depot/projects/smpng/sys/alpha/isa/isa_dma.c#4 (text+ko) ====
@@ -48,11 +48,13 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/isa/isa_dma.c,v 1.8 2003/06/10 16:57:28 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/isa/isa_dma.c,v 1.9 2003/07/01 15:51:50 scottl Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
#include <sys/bus.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -131,6 +133,8 @@
/*maxsize*/bouncebufsize,
/*nsegments*/1, /*maxsegz*/0x3ffff,
/*flags*/BUS_DMA_ISA,
+ /*lockfunc*/busdma_lock_mutex,
+ /*lockarg*/&Giant,
&dma_tag[chan]) != 0) {
panic("isa_dmainit: unable to create dma tag\n");
}
==== //depot/projects/smpng/sys/alpha/mcbus/mcpcia.c#17 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/mcbus/mcpcia.c,v 1.25 2003/06/10 17:02:51 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/mcbus/mcpcia.c,v 1.26 2003/06/28 13:47:23 ticso Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -58,6 +58,7 @@
#include <alpha/mcbus/mcpciareg.h>
#include <alpha/mcbus/mcpciavar.h>
#include <alpha/pci/pcibus.h>
+#include <pci/pcireg.h>
#include <pci/pcivar.h>
#include "alphapci_if.h"
@@ -387,43 +388,49 @@
}
static int
-mcpcia_setup_intr(device_t dev, device_t child, struct resource *ir, int flags,
- driver_intr_t *intr, void *arg, void **cp)
+mcpcia_pci_route_interrupt(device_t bus, device_t dev, int pin)
{
- struct mcpcia_softc *sc = MCPCIA_SOFTC(dev);
- int slot, mid, gid, birq, irq, error, intpin, h;
-
- intpin = pci_get_intpin(child);
- if (intpin == 0) {
- /* No IRQ used */
- return (0);
- }
- if (intpin < 1 || intpin > 4) {
- /* Bad IRQ */
- return (ENXIO);
+ int irq, slot, mid;
+
+ /*
+ * Validate requested pin number.
+ */
+ if ((pin < 1) || (pin > 4)) {
+ printf("mcpcia_pci_route_interrupt: bad interrupt pin %d\n",
+ pin);
+ return(255);
}
- slot = pci_get_slot(child);
- mid = mcbus_get_mid(dev);
- gid = mcbus_get_gid(dev);
+ slot = pci_get_slot(dev);
+ mid = mcbus_get_mid(bus);
- if (slot == 0) {
- device_t bdev;
- /* bridged - get slot from grandparent */
- /* note that this is broken for all but the most trival case */
- bdev = device_get_parent(device_get_parent(child));
- slot = pci_get_slot(bdev);
- }
+#if 0
+ printf("mcpcia_pci_route_interrupt: called for slot=%d, pin=%d, mid=%d\n", slot, pin, mid);
+#endif
if (mid == 5 && slot == 1) {
irq = 16; /* MID 5, slot 1, is the internal NCR 53c810 */
} else if (slot >= 2 && slot <= 5) {
- irq = ((slot - 2) * 4) + (intpin - 1);
+ irq = ((slot - 2) * 4) + (pin - 1);
} else {
- device_printf(child, "weird slot number (%d); can't make irq\n",
+ printf("mcpcia_pci_route_interrupt: weird device number %d\n",
slot);
- return (ENXIO);
+ return (255);
}
+
+ return(irq);
+}
+
+static int
+mcpcia_setup_intr(device_t dev, device_t child, struct resource *ir, int flags,
+ driver_intr_t *intr, void *arg, void **cp)
+{
+ struct mcpcia_softc *sc = MCPCIA_SOFTC(dev);
+ int mid, birq, irq, error, h;
+
+ irq = ir->r_start;
+ mid = mcbus_get_mid(dev);
+
error = rman_activate_resource(ir);
if (error)
return error;
@@ -437,8 +444,8 @@
} else {
h = MCPCIA_VEC_PCI +
((mid - MCPCIA_PCI_MIDMIN) * MCPCIA_VECWIDTH_PER_MCPCIA) +
- (slot * MCPCIA_VECWIDTH_PER_SLOT) +
- ((intpin - 1) * MCPCIA_VECWIDTH_PER_INTPIN);
+ irq * MCPCIA_VECWIDTH_PER_INTPIN +
+ 2 * MCPCIA_VECWIDTH_PER_SLOT;
}
birq = irq + INTRCNT_KN300_IRQ;
error = alpha_setup_intr(device_get_nameunit(child), h,
@@ -449,8 +456,8 @@
mtx_lock_spin(&icu_lock);
mcpcia_enable_intr(sc, irq);
mtx_unlock_spin(&icu_lock);
- device_printf(child, "interrupting at IRQ 0x%x int%c (vec 0x%x)\n",
- irq, intpin - 1 + 'A' , h);
+ device_printf(child, "interrupting at IRQ 0x%x (vec 0x%x)\n",
+ irq , h);
return (0);
}
@@ -458,30 +465,9 @@
mcpcia_teardown_intr(device_t dev, device_t child, struct resource *i, void *c)
{
struct mcpcia_softc *sc = MCPCIA_SOFTC(dev);
- int slot, mid, intpin, irq;
- intpin = pci_get_intpin(child);
- if (intpin == 0) {
- /* No IRQ used */
- return (0);
- }
- if (intpin < 1 || intpin > 4) {
- /* Bad IRQ */
- return (ENXIO);
- }
-
- slot = pci_get_slot(child);
- mid = mcbus_get_mid(dev);
-
- if (mid == 5 && slot == 1) {
- irq = 16;
- } else if (slot >= 2 && slot <= 5) {
- irq = ((slot - 2) << 4) + (intpin - 1);
- } else {
- return (ENXIO);
- }
mtx_lock_spin(&icu_lock);
- mcpcia_disable_intr(sc, irq);
+ mcpcia_disable_intr(sc, i->r_start);
mtx_unlock_spin(&icu_lock);
alpha_teardown_intr(c);
return (rman_deactivate_resource(i));
@@ -554,6 +540,11 @@
u_int32_t *dp, data, rvp;
u_int64_t paddr;
+ if ((off == PCIR_INTLINE) && (sz == 1)) {
+ /* SRM left bad value; let intr_route fill them in later */
+ return ~0;
+ }
+
rvp = data = ~0;
/*
@@ -789,7 +780,7 @@
DEVMETHOD(pcib_maxslots, mcpcia_maxslots),
DEVMETHOD(pcib_read_config, mcpcia_read_config),
DEVMETHOD(pcib_write_config, mcpcia_write_config),
- DEVMETHOD(pcib_route_interrupt, alpha_pci_route_interrupt),
+ DEVMETHOD(pcib_route_interrupt, mcpcia_pci_route_interrupt),
{ 0, 0 }
};
==== //depot/projects/smpng/sys/amd64/amd64/busdma_machdep.c#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/amd64/busdma_machdep.c,v 1.45 2003/05/27 04:59:56 scottl Exp $
+ * $FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.48 2003/07/01 16:54:54 mux Exp $
*/
#include <sys/param.h>
@@ -62,6 +62,8 @@
int flags;
int ref_count;
int map_count;
+ bus_dma_lock_t *lockfunc;
+ void *lockfuncarg;
};
struct bounce_page {
@@ -135,6 +137,46 @@
return (retval);
}
+/*
+ * Convenience function for manipulating driver locks from busdma (during
+ * busdma_swi, for example). Drivers that don't provide their own locks
+ * should specify &Giant to dmat->lockfuncarg. Drivers that use their own
+ * non-mutex locking scheme don't have to use this at all.
+ */
+void
+busdma_lock_mutex(void *arg, bus_dma_lock_op_t op)
+{
+ struct mtx *dmtx;
+
+ dmtx = (struct mtx *)arg;
+ switch (op) {
+ case BUS_DMA_LOCK:
+ mtx_lock(dmtx);
+ break;
+ case BUS_DMA_UNLOCK:
+ mtx_unlock(dmtx);
+ break;
+ default:
+ panic("Unknown operation 0x%x for busdma_lock_mutex!", op);
+ }
+}
+
+/*
+ * dflt_lock should never get called. It gets put into the dma tag when
+ * lockfunc == NULL, which is only valid if the maps that are associated
+ * with the tag are meant to never be defered.
+ * XXX Should have a way to identify which driver is responsible here.
+ */
+static void
+dflt_lock(void *arg, bus_dma_lock_op_t op)
+{
+#ifdef INVARIANTS
+ panic("driver error: busdma dflt_lock called");
+#else
+ printf("DRIVER_ERROR: busdma dflt_lock called\n");
+#endif
+}
+
#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4
/*
* Allocate a device specific dma_tag.
@@ -144,7 +186,8 @@
bus_size_t boundary, bus_addr_t lowaddr,
bus_addr_t highaddr, bus_dma_filter_t *filter,
void *filterarg, bus_size_t maxsize, int nsegments,
- bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat)
+ bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
+ void *lockfuncarg, bus_dma_tag_t *dmat)
{
bus_dma_tag_t newtag;
int error = 0;
@@ -170,6 +213,13 @@
newtag->flags = flags;
newtag->ref_count = 1; /* Count ourself */
newtag->map_count = 0;
+ if (lockfunc != NULL) {
+ newtag->lockfunc = lockfunc;
+ newtag->lockfuncarg = lockfuncarg;
+ } else {
+ newtag->lockfunc = dflt_lock;
+ newtag->lockfuncarg = NULL;
+ }
/* Take into account any restrictions imposed by our parent tag */
if (parent != NULL) {
@@ -766,7 +816,7 @@
M_NOWAIT, 0ul,
dmat->lowaddr,
PAGE_SIZE,
- 0);
+ dmat->boundary);
mtx_unlock(&Giant);
if (bpage->vaddr == 0) {
free(bpage, M_DEVBUF);
@@ -861,14 +911,18 @@
void
busdma_swi(void)
{
+ bus_dma_tag_t dmat;
struct bus_dmamap *map;
mtx_lock(&bounce_lock);
while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) {
STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links);
mtx_unlock(&bounce_lock);
+ dmat = map->dmat;
+ (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK);
bus_dmamap_load(map->dmat, map, map->buf, map->buflen,
map->callback, map->callback_arg, /*flags*/0);
+ (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK);
mtx_lock(&bounce_lock);
}
mtx_unlock(&bounce_lock);
==== //depot/projects/smpng/sys/amd64/amd64/machdep.c#9 (text+ko) ====
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
- * $FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.582 2003/05/31 07:00:08 peter Exp $
+ * $FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.583 2003/06/28 06:34:07 davidxu Exp $
*/
#include "opt_atalk.h"
@@ -300,6 +300,25 @@
}
/*
+ * Build siginfo_t for SA thread
+ */
+void
+thread_siginfo(int sig, u_long code, siginfo_t *si)
+{
+ struct proc *p;
+ struct thread *td;
+
+ td = curthread;
+ p = td->td_proc;
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+
+ bzero(si, sizeof(*si));
+ si->si_signo = sig;
+ si->si_code = code;
+ /* XXXKSE fill other fields */
+}
+
+/*
* System call to cleanup state after a signal
* has been taken. Reset signal mask and
* stack state from context left by sendsig (above).
==== //depot/projects/smpng/sys/amd64/amd64/pmap.c#5 (text+ko) ====
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.417 2003/06/26 01:04:31 peter Exp $
+ * $FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.418 2003/06/29 21:20:03 alc Exp $
*/
/*-
* Copyright (c) 2003 Networks Associates Technology, Inc.
@@ -208,8 +208,6 @@
static void amd64_protection_init(void);
static __inline void pmap_changebit(vm_page_t m, int bit, boolean_t setem);
-static vm_page_t pmap_enter_quick(pmap_t pmap, vm_offset_t va,
- vm_page_t m, vm_page_t mpte);
static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva);
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list