PERFORCE change 92361 for review

John Baldwin jhb at FreeBSD.org
Fri Feb 24 14:48:09 PST 2006


http://perforce.freebsd.org/chv.cgi?CH=92361

Change 92361 by jhb at jhb_slimer on 2006/02/24 22:47:50

	IFC @92359.

Affected files ...

.. //depot/projects/smpng/sys/conf/kmod.mk#56 integrate
.. //depot/projects/smpng/sys/dev/amr/amr_linux.c#2 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-all.h#44 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-chipset.c#64 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-queue.c#31 integrate
.. //depot/projects/smpng/sys/dev/fdc/fdc.c#22 integrate
.. //depot/projects/smpng/sys/dev/ic/z8530.h#3 integrate
.. //depot/projects/smpng/sys/dev/ppc/ppc.c#10 integrate
.. //depot/projects/smpng/sys/dev/puc/puc_ebus.c#7 integrate
.. //depot/projects/smpng/sys/dev/puc/puc_sbus.c#9 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/atiixp.c#5 integrate
.. //depot/projects/smpng/sys/dev/sound/pcm/feeder.c#15 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_bus.h#8 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_bus_ebus.c#10 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_core.c#11 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_dev_ns8250.c#10 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_dev_sab82532.c#8 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_dev_z8530.c#9 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_kbd_sun.c#7 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_tty.c#17 integrate
.. //depot/projects/smpng/sys/i386/include/mptable.h#4 integrate
.. //depot/projects/smpng/sys/kern/kern_condvar.c#42 integrate
.. //depot/projects/smpng/sys/kern/kern_sig.c#118 integrate
.. //depot/projects/smpng/sys/kern/kern_synch.c#98 integrate
.. //depot/projects/smpng/sys/kern/kern_timeout.c#30 integrate
.. //depot/projects/smpng/sys/kern/subr_sleepqueue.c#24 integrate
.. //depot/projects/smpng/sys/kern/vfs_subr.c#122 integrate
.. //depot/projects/smpng/sys/kern/vfs_syscalls.c#99 integrate
.. //depot/projects/smpng/sys/modules/Makefile#117 integrate
.. //depot/projects/smpng/sys/modules/if_ef/Makefile#5 integrate
.. //depot/projects/smpng/sys/modules/uart/Makefile#8 integrate
.. //depot/projects/smpng/sys/net/if_vlan.c#46 integrate
.. //depot/projects/smpng/sys/netinet/tcp_input.c#81 integrate
.. //depot/projects/smpng/sys/netinet/tcp_output.c#39 integrate
.. //depot/projects/smpng/sys/sys/serial.h#2 integrate

Differences ...

==== //depot/projects/smpng/sys/conf/kmod.mk#56 (text+ko) ====

@@ -1,5 +1,5 @@
 #	From: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
-# $FreeBSD: src/sys/conf/kmod.mk,v 1.205 2006/02/20 01:08:33 mlaier Exp $
+# $FreeBSD: src/sys/conf/kmod.mk,v 1.206 2006/02/24 01:49:36 marcel Exp $
 #
 # The include file <bsd.kmod.mk> handles building and installing loadable
 # kernel modules.
@@ -320,7 +320,7 @@
 	dev/pccard/card_if.m dev/pccard/power_if.m dev/pci/pci_if.m \
 	dev/pci/pcib_if.m dev/ppbus/ppbus_if.m dev/smbus/smbus_if.m \
 	dev/sound/pcm/ac97_if.m dev/sound/pcm/channel_if.m \
-	dev/sound/pcm/feeder_if.m dev/sound/pcm/mixer_if.m dev/uart/uart_if.m \
+	dev/sound/pcm/feeder_if.m dev/sound/pcm/mixer_if.m \
 	dev/usb/usb_if.m isa/isa_if.m \
 	kern/bus_if.m kern/cpufreq_if.m kern/device_if.m \
 	libkern/iconv_converter_if.m opencrypto/crypto_if.m \

==== //depot/projects/smpng/sys/dev/amr/amr_linux.c#2 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/amr/amr_linux.c,v 1.1 2006/01/24 21:13:49 ambrisko Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/amr/amr_linux.c,v 1.2 2006/02/23 18:05:38 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -170,13 +170,15 @@
 	devclass_t		devclass;
 	struct amr_softc	*sc;
 	struct amr_linux_ioctl	ali;
-	int			adapter;
+	int			adapter, error;
 
 	devclass = devclass_find("amr");
 	if (devclass == NULL)
 		return (ENOENT);
 
-	copyin((caddr_t)args->arg, &ali, sizeof(ali));
+	error = copyin((caddr_t)args->arg, &ali, sizeof(ali));
+	if (error)
+		return (error);
 	if (ali.ui.fcs.opcode == 0x82)
 		adapter = 0;
 	else

==== //depot/projects/smpng/sys/dev/ata/ata-all.h#44 (text+ko) ====

@@ -23,7 +23,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/dev/ata/ata-all.h,v 1.113 2006/02/09 20:54:42 sos Exp $
+ * $FreeBSD: src/sys/dev/ata/ata-all.h,v 1.114 2006/02/23 20:15:22 sos Exp $
  */
 
 /* ATA register defines */
@@ -338,6 +338,7 @@
 /* structure used to queue an ATA/ATAPI request */
 struct ata_request {
     device_t                    dev;            /* device handle */
+    device_t                    parent;         /* channel handle */
     union {
 	struct {
 	    u_int8_t            command;        /* command reg */

==== //depot/projects/smpng/sys/dev/ata/ata-chipset.c#64 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.159 2006/02/16 17:09:24 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.160 2006/02/23 18:52:15 sos Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -4075,7 +4075,6 @@
     /* setup the usual register normal pci style */
     if (ata_pci_allocate(dev))
 	return ENXIO;
-    ata_pci_allocate(dev);
 
     if (ctlr->chip->cfg2 & SIIINTR)
 	ch->hw.status = ata_cmd_status;

==== //depot/projects/smpng/sys/dev/ata/ata-queue.c#31 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-queue.c,v 1.55 2006/01/18 13:10:17 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-queue.c,v 1.56 2006/02/23 20:15:22 sos Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -55,6 +55,7 @@
 
     /* mark request as virgin (this might be a ATA_R_REQUEUE) */
     request->result = request->status = request->error = 0;
+    request->parent = device_get_parent(request->dev);
     callout_init_mtx(&request->callout, &ch->state_mtx, CALLOUT_RETURNUNLOCKED);
 
     if (!request->callback && !(request->flags & ATA_R_REQUEUE))
@@ -218,7 +219,7 @@
 void
 ata_finish(struct ata_request *request)
 {
-    struct ata_channel *ch = device_get_softc(device_get_parent(request->dev));
+    struct ata_channel *ch = device_get_softc(request->parent);
 
     /*
      * if in ATA_STALL_QUEUE state or request has ATA_R_DIRECT flags set
@@ -247,7 +248,7 @@
 ata_completed(void *context, int dummy)
 {
     struct ata_request *request = (struct ata_request *)context;
-    struct ata_channel *ch = device_get_softc(device_get_parent(request->dev));
+    struct ata_channel *ch = device_get_softc(request->parent);
     struct ata_device *atadev = device_get_softc(request->dev);
     struct ata_composite *composite;
 
@@ -466,7 +467,7 @@
 void
 ata_timeout(struct ata_request *request)
 {
-    struct ata_channel *ch = device_get_softc(device_get_parent(request->dev));
+    struct ata_channel *ch = device_get_softc(request->parent);
 
     //request->flags |= ATA_R_DEBUG;
     ATA_DEBUG_RQ(request, "timeout");
@@ -479,7 +480,6 @@
      */
     if (ch->state == ATA_ACTIVE) {
 	request->flags |= ATA_R_TIMEOUT;
-	ch->running = NULL;
 	mtx_unlock(&ch->state_mtx);
 	ATA_LOCKING(ch->dev, ATA_LF_UNLOCK);
 	ata_finish(request);
@@ -493,34 +493,43 @@
 ata_fail_requests(device_t dev)
 {
     struct ata_channel *ch = device_get_softc(device_get_parent(dev));
-    struct ata_request *request;
+    struct ata_request *request, *tmp;
+    TAILQ_HEAD(, ata_request) fail_requests;
+    TAILQ_INIT(&fail_requests);
 
-    /* do we have any outstanding request to care about ?*/
+    /* grap all channel locks to avoid races */
+    mtx_lock(&ch->queue_mtx);
     mtx_lock(&ch->state_mtx);
+
+    /* do we have any running request to care about ? */
     if ((request = ch->running) && (!dev || request->dev == dev)) {
 	callout_stop(&request->callout);
 	ch->running = NULL;
-    }
-    else
-	request = NULL;
-    mtx_unlock(&ch->state_mtx);
-    if (request)  {
+	ch->state = ATA_IDLE;
 	request->result = ENXIO;
-	ata_finish(request);
+	TAILQ_INSERT_TAIL(&fail_requests, request, chain);
     }
 
     /* fail all requests queued on this channel for device dev if !NULL */
-    mtx_lock(&ch->queue_mtx);
-    while ((request = TAILQ_FIRST(&ch->ata_queue))) {
+    TAILQ_FOREACH_SAFE(request, &ch->ata_queue, chain, tmp) {
 	if (!dev || request->dev == dev) {
 	    TAILQ_REMOVE(&ch->ata_queue, request, chain);
-	    mtx_unlock(&ch->queue_mtx);
 	    request->result = ENXIO;
-	    ata_finish(request);
-	    mtx_lock(&ch->queue_mtx);
+	    TAILQ_INSERT_TAIL(&fail_requests, request, chain);
 	}
     }
+
+    mtx_unlock(&ch->state_mtx);
     mtx_unlock(&ch->queue_mtx);
+   
+    /* finish up all requests collected above */
+    TAILQ_FOREACH_SAFE(request, &fail_requests, chain, tmp) {
+        TAILQ_REMOVE(&fail_requests, request, chain);
+        ata_finish(request);
+    }
+
+    /* we might have work for the other device on this channel */
+    ata_start(ch->dev);
 }
 
 static u_int64_t

==== //depot/projects/smpng/sys/dev/fdc/fdc.c#22 (text+ko) ====

@@ -51,7 +51,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc.c,v 1.308 2005/08/30 23:12:18 rodrigc Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc.c,v 1.309 2006/02/23 19:11:16 jhb Exp $");
 
 #include "opt_fdc.h"
 

==== //depot/projects/smpng/sys/dev/ic/z8530.h#3 (text+ko) ====

@@ -23,7 +23,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/dev/ic/z8530.h,v 1.3 2005/01/06 01:42:44 imp Exp $
+ * $FreeBSD: src/sys/dev/ic/z8530.h,v 1.4 2006/02/24 02:03:35 marcel Exp $
  */
 
 #ifndef _DEV_IC_Z8530_H_
@@ -34,9 +34,12 @@
  * Channel B data:	1
  * Channel A control:	2
  * Channel A data:	3
- *
- * We expect a seperate subregion for each channel.
  */
+
+/* The following apply when using a device-scoped bus handle */
+#define	CHAN_A		2
+#define	CHAN_B		0
+
 #define	REG_CTRL	0
 #define	REG_DATA	1
 
@@ -69,7 +72,7 @@
 #define	RR_BCL		6	/* Byte Count Low. */
 #define	RR_BCH		7	/* Byte Count High. */
 #define	RR_RB		8	/* Receive Buffer. */
-#define	RR_RPC		9	/* Receive Parameters and Contro. */
+#define	RR_RPC		9	/* Receive Parameters and Control. */
 #define	RR_MSB		10	/* Miscellaneous Status Bits. */
 #define	RR_MCB1		11	/* Miscellaneous Control Bits (part 1). */
 #define	RR_TCL		12	/* BRG Time Constant Low. */

==== //depot/projects/smpng/sys/dev/ppc/ppc.c#10 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ppc/ppc.c,v 1.48 2006/02/22 18:16:25 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ppc/ppc.c,v 1.49 2006/02/22 21:47:04 jhb Exp $");
 
 #include "opt_ppc.h"
 

==== //depot/projects/smpng/sys/dev/puc/puc_ebus.c#7 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/puc/puc_ebus.c,v 1.6 2005/08/07 13:37:25 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/puc/puc_ebus.c,v 1.7 2006/02/24 02:06:57 marcel Exp $");
 
 #include "opt_puc.h"
 
@@ -54,7 +54,7 @@
 	cmpt = ofw_bus_get_compat(dev);
 	if (!strcmp(nm, "se") || (cmpt != NULL && !strcmp(cmpt, "sab82532"))) {
 		device_set_desc(dev, "Siemens SAB 82532 dual channel SCC");
-		return (0);
+		return (BUS_PROBE_LOW_PRIORITY);
 	}
 	return (ENXIO);
 }

==== //depot/projects/smpng/sys/dev/puc/puc_sbus.c#9 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/puc/puc_sbus.c,v 1.8 2005/02/26 00:25:43 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/puc/puc_sbus.c,v 1.9 2006/02/24 02:06:57 marcel Exp $");
 
 #include "opt_puc.h"
 
@@ -53,7 +53,7 @@
 	nm = ofw_bus_get_name(dev);
 	if (!strcmp(nm, "zs")) {
 		device_set_desc(dev, "Zilog Z8530 dual channel SCC");
-		return (0);
+		return (BUS_PROBE_LOW_PRIORITY);
 	}
 	return (ENXIO);
 }

==== //depot/projects/smpng/sys/dev/sound/pci/atiixp.c#5 (text+ko) ====

@@ -63,7 +63,7 @@
 
 #include <dev/sound/pci/atiixp.h>
 
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/atiixp.c,v 1.4 2006/02/18 10:24:48 ariff Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/atiixp.c,v 1.5 2006/02/24 09:29:32 ariff Exp $");
 
 
 struct atiixp_dma_op {
@@ -614,7 +614,7 @@
 	}
 #endif
 
-	return (retry > 0) ? ptr & ~align : 0;
+	return (retry > 0) ? ptr : 0;
 }
 
 static struct pcmchan_caps *

==== //depot/projects/smpng/sys/dev/sound/pcm/feeder.c#15 (text+ko) ====

@@ -28,7 +28,7 @@
 
 #include "feeder_if.h"
 
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/feeder.c,v 1.36 2006/01/29 01:32:37 ariff Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/feeder.c,v 1.37 2006/02/23 19:23:55 jhb Exp $");
 
 MALLOC_DEFINE(M_FEEDER, "feeder", "pcm feeder");
 
@@ -385,10 +385,8 @@
 		}
 	} else if (best2 == 0)
 		return best1;
-	else if (best1 == 0)
+	else
 		return best2;
-
-	return best1;
 }
 
 u_int32_t

==== //depot/projects/smpng/sys/dev/uart/uart_bus.h#8 (text+ko) ====

@@ -23,7 +23,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/dev/uart/uart_bus.h,v 1.9 2005/01/06 01:43:26 imp Exp $
+ * $FreeBSD: src/sys/dev/uart/uart_bus.h,v 1.11 2006/02/24 05:40:17 marcel Exp $
  */
 
 #ifndef _DEV_UART_BUS_H_
@@ -42,32 +42,12 @@
 #define	UART_FLUSH_RECEIVER	UART_DRAIN_RECEIVER
 #define	UART_FLUSH_TRANSMITTER	UART_DRAIN_TRANSMITTER
 
-/*
- * Interrupt sources (in priority order). See also uart_core.c
- * Note that the low order 16 bits are used to pass modem signals
- * from the hardware interrupt handler to the software interrupt
- * handler.
- */
-#define	UART_IPEND_OVERRUN	0x010000
-#define	UART_IPEND_BREAK	0x020000
-#define	UART_IPEND_RXREADY	0x040000
-#define	UART_IPEND_SIGCHG	0x080000
-#define	UART_IPEND_TXIDLE	0x100000
-
-#define	UART_IPEND_MASK		0x1f0000
-#define	UART_IPEND_SIGMASK	0x00ffff
-
 /* Received character status bits. */
 #define	UART_STAT_BREAK		0x0100
 #define	UART_STAT_FRAMERR	0x0200
 #define	UART_STAT_OVERRUN	0x0400
 #define	UART_STAT_PARERR	0x0800
 
-#define	UART_SIGMASK_DTE	(SER_DTR | SER_RTS)
-#define	UART_SIGMASK_DCE	(SER_DSR | SER_CTS | SER_DCD | SER_RI)
-#define	UART_SIGMASK_STATE	(UART_SIGMASK_DTE | UART_SIGMASK_DCE)
-#define	UART_SIGMASK_DELTA	(UART_SIGMASK_STATE << 8)
-
 #ifdef UART_PPS_ON_CTS
 #define	UART_SIG_DPPS		SER_DCTS
 #define	UART_SIG_PPS		SER_CTS

==== //depot/projects/smpng/sys/dev/uart/uart_bus_ebus.c#10 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_bus_ebus.c,v 1.9 2006/02/04 23:27:16 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_bus_ebus.c,v 1.10 2006/02/24 05:36:44 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -66,6 +66,7 @@
 	const char *nm, *cmpt;
 	struct uart_softc *sc;
 	struct uart_devinfo dummy;
+	int error;
 
 	sc = device_get_softc(dev);
 	sc->sc_class = NULL;
@@ -101,7 +102,8 @@
 	}
 	if (!strcmp(nm, "se") || !strcmp(cmpt, "sab82532")) {
 		sc->sc_class = &uart_sab82532_class;
-		return (uart_bus_probe(dev, 0, 0, 0, 1));
+		error = uart_bus_probe(dev, 0, 0, 0, 1);
+		return ((error <= 0) ? BUS_PROBE_GENERIC : error);
 	}
 
 	return (ENXIO);

==== //depot/projects/smpng/sys/dev/uart/uart_core.c#11 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_core.c,v 1.15 2006/02/22 18:16:26 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_core.c,v 1.17 2006/02/24 05:40:17 marcel Exp $");
 
 #ifndef KLD_MODULE
 #include "opt_comconsole.h"
@@ -90,7 +90,7 @@
 	}
 #endif
 	if (sc->sc_opened)
-		atomic_set_32(&sc->sc_ttypend, UART_IPEND_BREAK);
+		atomic_set_32(&sc->sc_ttypend, SER_INT_BREAK);
 }
 
 /*
@@ -116,7 +116,7 @@
 		UART_RECEIVE(sc);
 		if (uart_rx_put(sc, UART_STAT_OVERRUN))
 			sc->sc_rxbuf[sc->sc_rxput] = UART_STAT_OVERRUN;
-		atomic_set_32(&sc->sc_ttypend, UART_IPEND_RXREADY);
+		atomic_set_32(&sc->sc_ttypend, SER_INT_RXREADY);
 	}
 	UART_FLUSH(sc, UART_FLUSH_RECEIVER);
 }
@@ -142,7 +142,7 @@
 	}
 #endif
 	if (sc->sc_opened)
-		atomic_set_32(&sc->sc_ttypend, UART_IPEND_RXREADY);
+		atomic_set_32(&sc->sc_ttypend, SER_INT_RXREADY);
 	else
 		sc->sc_rxput = sc->sc_rxget;	/* Ignore received data. */
 }
@@ -171,9 +171,9 @@
 
 	do {
 		old = sc->sc_ttypend;
-		new = old & ~UART_SIGMASK_STATE;
-		new |= sig & UART_IPEND_SIGMASK;
-		new |= UART_IPEND_SIGCHG;
+		new = old & ~SER_MASK_STATE;
+		new |= sig & SER_INT_SIGMASK;
+		new |= SER_INT_SIGCHG;
 	} while (!atomic_cmpset_32(&sc->sc_ttypend, old, new));
 }
 
@@ -185,7 +185,7 @@
 {
 	if (sc->sc_txbusy) {
 		sc->sc_txbusy = 0;
-		atomic_set_32(&sc->sc_ttypend, UART_IPEND_TXIDLE);
+		atomic_set_32(&sc->sc_ttypend, SER_INT_TXIDLE);
 	}
 }
 
@@ -202,15 +202,15 @@
 		ipend = UART_IPEND(sc);
 		if (ipend == 0)
 			break;
-		if (ipend & UART_IPEND_OVERRUN)
+		if (ipend & SER_INT_OVERRUN)
 			uart_intr_overrun(sc);
-		if (ipend & UART_IPEND_BREAK)
+		if (ipend & SER_INT_BREAK)
 			uart_intr_break(sc);
-		if (ipend & UART_IPEND_RXREADY)
+		if (ipend & SER_INT_RXREADY)
 			uart_intr_rxready(sc);
-		if (ipend & UART_IPEND_SIGCHG)
+		if (ipend & SER_INT_SIGCHG)
 			uart_intr_sigchg(sc);
-		if (ipend & UART_IPEND_TXIDLE)
+		if (ipend & SER_INT_TXIDLE)
 			uart_intr_txidle(sc);
 	} while (1);
 

==== //depot/projects/smpng/sys/dev/uart/uart_dev_ns8250.c#10 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.14 2005/01/06 01:43:26 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.16 2006/02/24 05:40:17 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -460,7 +460,7 @@
 		SIGCHG(msr & MSR_CTS, sig, SER_CTS, SER_DCTS);
 		SIGCHG(msr & MSR_DCD, sig, SER_DCD, SER_DDCD);
 		SIGCHG(msr & MSR_RI,  sig, SER_RI,  SER_DRI);
-		new = sig & ~UART_SIGMASK_DELTA;
+		new = sig & ~SER_MASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	return (sig);
 }
@@ -556,17 +556,17 @@
 		lsr = uart_getreg(bas, REG_LSR);
 		mtx_unlock_spin(&sc->sc_hwmtx);
 		if (lsr & LSR_OE)
-			ipend |= UART_IPEND_OVERRUN;
+			ipend |= SER_INT_OVERRUN;
 		if (lsr & LSR_BI)
-			ipend |= UART_IPEND_BREAK;
+			ipend |= SER_INT_BREAK;
 		if (lsr & LSR_RXRDY)
-			ipend |= UART_IPEND_RXREADY;
+			ipend |= SER_INT_RXREADY;
 	} else {
 		mtx_unlock_spin(&sc->sc_hwmtx);
 		if (iir & IIR_TXRDY)
-			ipend |= UART_IPEND_TXIDLE;
+			ipend |= SER_INT_TXIDLE;
 		else
-			ipend |= UART_IPEND_SIGCHG;
+			ipend |= SER_INT_SIGCHG;
 	}
 	return ((sc->sc_leaving) ? 0 : ipend);
 }

==== //depot/projects/smpng/sys/dev/uart/uart_dev_sab82532.c#8 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_sab82532.c,v 1.10 2005/01/30 22:14:30 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_sab82532.c,v 1.12 2006/02/24 05:40:17 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -470,7 +470,7 @@
 		}
 		SIGCHG(pvr, sig, SER_DSR, SER_DDSR);
 		mtx_unlock_spin(&sc->sc_hwmtx);
-		new = sig & ~UART_SIGMASK_DELTA;
+		new = sig & ~SER_MASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	return (sig);
 }
@@ -546,15 +546,15 @@
 
 	ipend = 0;
 	if (isr1 & SAB_ISR1_BRKT)
-		ipend |= UART_IPEND_BREAK;
+		ipend |= SER_INT_BREAK;
 	if (isr0 & SAB_ISR0_RFO)
-		ipend |= UART_IPEND_OVERRUN;
+		ipend |= SER_INT_OVERRUN;
 	if (isr0 & (SAB_ISR0_TCD|SAB_ISR0_RPF))
-		ipend |= UART_IPEND_RXREADY;
+		ipend |= SER_INT_RXREADY;
 	if ((isr0 & SAB_ISR0_CDSC) || (isr1 & SAB_ISR1_CSC))
-		ipend |= UART_IPEND_SIGCHG;
+		ipend |= SER_INT_SIGCHG;
 	if (isr1 & SAB_ISR1_ALLS)
-		ipend |= UART_IPEND_TXIDLE;
+		ipend |= SER_INT_TXIDLE;
 
 	return (ipend);
 }

==== //depot/projects/smpng/sys/dev/uart/uart_dev_z8530.c#9 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_z8530.c,v 1.12 2005/04/27 21:57:51 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_z8530.c,v 1.14 2006/02/24 05:40:17 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -305,7 +305,7 @@
 		z8530->tpc = z8530_setup(bas, 9600, 8, 1, UART_PARITY_NONE);
 		z8530->tpc &= ~(TPC_DTR|TPC_RTS);
 	}
-	z8530->txidle = 1;	/* Report UART_IPEND_TXIDLE. */
+	z8530->txidle = 1;	/* Report SER_INT_TXIDLE. */
 
 	sc->sc_rxfifosz = 3;
 	sc->sc_txfifosz = 1;
@@ -354,7 +354,7 @@
 		SIGCHG(bes & BES_CTS, sig, SER_CTS, SER_DCTS);
 		SIGCHG(bes & BES_DCD, sig, SER_DCD, SER_DDCD);
 		SIGCHG(bes & BES_SYNC, sig, SER_DSR, SER_DDSR);
-		new = sig & ~UART_SIGMASK_DELTA;
+		new = sig & ~SER_MASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	return (sig);
 }
@@ -418,14 +418,14 @@
 	}
 
 	if (ip & IP_RIA)
-		ipend |= UART_IPEND_RXREADY;
+		ipend |= SER_INT_RXREADY;
 
 	if (ip & IP_TIA) {
 		uart_setreg(bas, REG_CTRL, CR_RSTTXI);
 		uart_barrier(bas);
 		if (z8530->txidle) {
-			ipend |= UART_IPEND_TXIDLE;
-			z8530->txidle = 0;	/* Mask UART_IPEND_TXIDLE. */
+			ipend |= SER_INT_TXIDLE;
+			z8530->txidle = 0;	/* Mask SER_INT_TXIDLE. */
 		}
 	}
 
@@ -434,18 +434,18 @@
 		uart_barrier(bas);
 		bes = uart_getmreg(bas, RR_BES);
 		if (bes & BES_BRK)
-			ipend |= UART_IPEND_BREAK;
+			ipend |= SER_INT_BREAK;
 		sig = sc->sc_hwsig;
 		SIGCHG(bes & BES_CTS, sig, SER_CTS, SER_DCTS);
 		SIGCHG(bes & BES_DCD, sig, SER_DCD, SER_DDCD);
 		SIGCHG(bes & BES_SYNC, sig, SER_DSR, SER_DDSR);
-		if (sig & UART_SIGMASK_DELTA)
-			ipend |= UART_IPEND_SIGCHG;
+		if (sig & SER_MASK_DELTA)
+			ipend |= SER_INT_SIGCHG;
 		src = uart_getmreg(bas, RR_SRC);
 		if (src & SRC_OVR) {
 			uart_setreg(bas, REG_CTRL, CR_RSTERR);
 			uart_barrier(bas);
-			ipend |= UART_IPEND_OVERRUN;
+			ipend |= SER_INT_OVERRUN;
 		}
 	}
 
@@ -586,7 +586,7 @@
 	uart_setreg(bas, REG_DATA, sc->sc_txbuf[0]);
 	uart_barrier(bas);
 	sc->sc_txbusy = 1;
-	z8530->txidle = 1;	/* Report UART_IPEND_TXIDLE again. */
+	z8530->txidle = 1;	/* Report SER_INT_TXIDLE again. */
 	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }

==== //depot/projects/smpng/sys/dev/uart/uart_kbd_sun.c#7 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_kbd_sun.c,v 1.6 2005/10/25 19:48:46 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_kbd_sun.c,v 1.7 2006/02/24 02:42:26 marcel Exp $");
 
 #include "opt_kbd.h"
 
@@ -274,10 +274,10 @@
 		return;
 
 	pend = atomic_readandclear_32(&sc->sc_uart->sc_ttypend);
-	if (!(pend & UART_IPEND_MASK))
+	if (!(pend & SER_INT_MASK))
 		return;
 
-	if (pend & UART_IPEND_RXREADY) {
+	if (pend & SER_INT_RXREADY) {
 		if (KBD_IS_ACTIVE(&sc->sc_kbd) && KBD_IS_BUSY(&sc->sc_kbd)) {
 			sc->sc_kbd.kb_callback.kc_func(&sc->sc_kbd,
 			    KBDIO_KEYINPUT, sc->sc_kbd.kb_callback.kc_arg);

==== //depot/projects/smpng/sys/dev/uart/uart_tty.c#17 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_tty.c,v 1.25 2005/10/26 15:52:16 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_tty.c,v 1.26 2006/02/24 02:42:26 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -307,12 +307,12 @@
 		return;
 
 	pend = atomic_readandclear_32(&sc->sc_ttypend);
-	if (!(pend & UART_IPEND_MASK))
+	if (!(pend & SER_INT_MASK))
 		return;
 
 	tp = sc->sc_u.u_tty.tp;
 
-	if (pend & UART_IPEND_RXREADY) {
+	if (pend & SER_INT_RXREADY) {
 		while (!uart_rx_empty(sc) && !(tp->t_state & TS_TBLOCK)) {
 			xc = uart_rx_get(sc);
 			c = xc & 0xff;
@@ -324,13 +324,13 @@
 		}
 	}
 
-	if (pend & UART_IPEND_BREAK) {
+	if (pend & SER_INT_BREAK) {
 		if (tp != NULL && !(tp->t_iflag & IGNBRK))
 			ttyld_rint(tp, 0);
 	}
 
-	if (pend & UART_IPEND_SIGCHG) {
-		sig = pend & UART_IPEND_SIGMASK;
+	if (pend & SER_INT_SIGCHG) {
+		sig = pend & SER_INT_SIGMASK;
 		if (sig & SER_DDCD)
 			ttyld_modem(tp, sig & SER_DCD);
 		if ((sig & SER_DCTS) && (tp->t_cflag & CCTS_OFLOW) &&
@@ -343,7 +343,7 @@
 		}
 	}
 
-	if (pend & UART_IPEND_TXIDLE) {
+	if (pend & SER_INT_TXIDLE) {
 		tp->t_state &= ~TS_BUSY;
 		ttyld_start(tp);
 	}

==== //depot/projects/smpng/sys/i386/include/mptable.h#4 (text+ko) ====

@@ -22,7 +22,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/include/mptable.h,v 1.222 2005/01/06 22:18:15 imp Exp $
+ * $FreeBSD: src/sys/i386/include/mptable.h,v 1.223 2006/02/22 21:38:33 sam Exp $
  */
 
 #ifndef __MACHINE_MPTABLE_H__
@@ -139,7 +139,8 @@
 	char    name[16];
 }       basetable_entry;
 
+#ifdef _KERNEL
 int	mptable_pci_probe_table(int bus);
 int	mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin);
-
+#endif
 #endif /* !__MACHINE_MPTABLE_H__ */

==== //depot/projects/smpng/sys/kern/kern_condvar.c#42 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_condvar.c,v 1.54 2006/02/15 23:52:00 davidxu Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_condvar.c,v 1.55 2006/02/23 00:13:58 davidxu Exp $");
 
 #include "opt_ktrace.h"
 
@@ -192,18 +192,6 @@
 
 	sleepq_lock(cvp);
 
-	/*
-	 * Don't bother sleeping if we are exiting and not the exiting
-	 * thread or if our thread is marked as interrupted.
-	 */
-	mtx_lock_spin(&sched_lock);
-	rval = thread_sleep_check(td);
-	mtx_unlock_spin(&sched_lock);
-	if (rval != 0) {
-		sleepq_release(cvp);
-		return (rval);
-	}
-
 	cvp->cv_waiters++;
 	DROP_GIANT();
 	mtx_unlock(mp);
@@ -315,18 +303,6 @@
 
 	sleepq_lock(cvp);
 
-	/*
-	 * Don't bother sleeping if we are exiting and not the exiting
-	 * thread or if our thread is marked as interrupted.
-	 */
-	mtx_lock_spin(&sched_lock);
-	rval = thread_sleep_check(td);
-	mtx_unlock_spin(&sched_lock);
-	if (rval != 0) {
-		sleepq_release(cvp);
-		return (rval);
-	}
-
 	cvp->cv_waiters++;
 	DROP_GIANT();
 	mtx_unlock(mp);

==== //depot/projects/smpng/sys/kern/kern_sig.c#118 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_sig.c,v 1.323 2006/02/15 23:52:00 davidxu Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_sig.c,v 1.325 2006/02/23 09:24:19 davidxu Exp $");
 
 #include "opt_compat.h"
 #include "opt_ktrace.h"
@@ -1189,35 +1189,40 @@
 		}
 	}
 
-again:
+restart:
 	for (i = 1; i <= _SIG_MAXSIG; ++i) {
 		if (!SIGISMEMBER(waitset, i))
 			continue;
-		if (SIGISMEMBER(td->td_sigqueue.sq_signals, i)) {
-			SIGFILLSET(td->td_sigmask);
-			SIG_CANTMASK(td->td_sigmask);
-			SIGDELSET(td->td_sigmask, i);
-			mtx_lock(&ps->ps_mtx);
-			sig = cursig(td);
-			i = 0;
-			mtx_unlock(&ps->ps_mtx);
-		} else if (SIGISMEMBER(p->p_sigqueue.sq_signals, i)) {
-			if (p->p_flag & P_SA) {
-				p->p_flag |= P_SIGEVENT;
-				wakeup(&p->p_siglist);
-			}
-			sigqueue_move(&p->p_sigqueue, &td->td_sigqueue, i);
-			SIGFILLSET(td->td_sigmask);
-			SIG_CANTMASK(td->td_sigmask);
-			SIGDELSET(td->td_sigmask, i);
-			mtx_lock(&ps->ps_mtx);
-			sig = cursig(td);
-			i = 0;
-			mtx_unlock(&ps->ps_mtx);
+		if (!SIGISMEMBER(td->td_sigqueue.sq_signals, i)) {
+			if (SIGISMEMBER(p->p_sigqueue.sq_signals, i)) {
+				if (p->p_flag & P_SA) {
+					p->p_flag |= P_SIGEVENT;
+					wakeup(&p->p_siglist);
+				}
+				sigqueue_move(&p->p_sigqueue,
+					&td->td_sigqueue, i);
+			} else
+				continue;
 		}
+
+		SIGFILLSET(td->td_sigmask);
+		SIG_CANTMASK(td->td_sigmask);
+		SIGDELSET(td->td_sigmask, i);
+		mtx_lock(&ps->ps_mtx);
+		sig = cursig(td);
+		mtx_unlock(&ps->ps_mtx);
 		if (sig)
 			goto out;
+		else {
+			/*
+			 * Because cursig() may have stopped current thread,
+			 * after it is resumed, things may have already been 
+			 * changed, it should rescan any pending signals.
+			 */
+			goto restart;
+		}
 	}
+
 	if (error)
 		goto out;
 
@@ -1255,30 +1260,37 @@
 			error = 0;
 		}
 	}
-	goto again;
+	goto restart;
 
 out:
+	td->td_sigmask = savedmask;
+	signotify(td);
 	if (sig) {
-		sig_t action;
-
 		ksiginfo_init(ksi);
 		sigqueue_get(&td->td_sigqueue, sig, ksi);
 		ksi->ksi_signo = sig;
 		if (ksi->ksi_code == SI_TIMER)
 			itimer_accept(p, ksi->ksi_timerid, ksi);
 		error = 0;
-		mtx_lock(&ps->ps_mtx);
-		action = ps->ps_sigact[_SIG_IDX(sig)];
-		mtx_unlock(&ps->ps_mtx);
+
 #ifdef KTRACE
-		if (KTRPOINT(td, KTR_PSIG))
+		if (KTRPOINT(td, KTR_PSIG)) {
+			sig_t action;
+
+			mtx_lock(&ps->ps_mtx);
+			action = ps->ps_sigact[_SIG_IDX(sig)];
+			mtx_unlock(&ps->ps_mtx);
 			ktrpsig(sig, action, &td->td_sigmask, 0);
+		}
 #endif
 		_STOPEVENT(p, S_SIG, sig);
 
+		if (sig == SIGKILL) {
+			p->p_code = ksi->ksi_code;
+			p->p_sig = sig;
+			sigexit(td, sig);
+		}
 	}
-	td->td_sigmask = savedmask;
-	signotify(td);
 	PROC_UNLOCK(p);
 	return (error);
 }
@@ -2673,13 +2685,12 @@
 void
 thread_stopped(struct proc *p)
 {
-	struct proc *p1 = curthread->td_proc;
 	int n;
 
 	PROC_LOCK_ASSERT(p, MA_OWNED);
 	mtx_assert(&sched_lock, MA_OWNED);
 	n = p->p_suspcount;
-	if (p == p1)
+	if (p == curproc)
 		n++;
 	if ((p->p_flag & P_STOPPED_SIG) && (n == p->p_numthreads)) {

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list