Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Sep 2005 09:47:37 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 83530 for review
Message-ID:  <200509130947.j8D9lb8Q037633@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=83530

Change 83530 by rwatson@rwatson_zoo on 2005/09/13 09:47:19

	Integrate netsmp from FreeBSD CVS
	
	- Loop back fifofs fixes, merge fifofs comments.

Affected files ...

.. //depot/projects/netsmp/src/sys/boot/pc98/Makefile.inc#2 integrate
.. //depot/projects/netsmp/src/sys/boot/pc98/libpc98/comconsole.c#2 integrate
.. //depot/projects/netsmp/src/sys/fs/fifofs/fifo_vnops.c#9 integrate

Differences ...

==== //depot/projects/netsmp/src/sys/boot/pc98/Makefile.inc#2 (text+ko) ====

@@ -1,11 +1,12 @@
 # Common defines for all of /sys/boot/pc98/
 #
-# $FreeBSD: src/sys/boot/pc98/Makefile.inc,v 1.5 2004/02/09 16:01:44 nyan Exp $
+# $FreeBSD: src/sys/boot/pc98/Makefile.inc,v 1.6 2005/09/13 08:27:38 nyan Exp $
 
 BINDIR?=	/boot
 
 LOADER_ADDRESS?=0x100000
-CFLAGS+=	-ffreestanding -mpreferred-stack-boundary=2
+CFLAGS+=	-ffreestanding -mpreferred-stack-boundary=2 \
+		-mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3
 LDFLAGS+=	-nostdlib
 
 # BTX components

==== //depot/projects/netsmp/src/sys/boot/pc98/libpc98/comconsole.c#2 (text+ko) ====

@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/pc98/libpc98/comconsole.c,v 1.6 2005/05/08 14:17:28 nyan Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/pc98/libpc98/comconsole.c,v 1.7 2005/09/13 08:29:03 nyan Exp $");
 
 #include <stand.h>
 #include <bootstrap.h>
@@ -35,6 +35,7 @@
 #define COMC_FMT	0x3		/* 8N1 */
 #define COMC_TXWAIT	0x40000		/* transmit timeout */
 #define COMC_BPS(x)	(115200 / (x))	/* speed to DLAB divisor */
+#define COMC_DIV2BPS(x)	(115200 / (x))	/* DLAB divisor to speed */
 
 #ifndef	COMPORT
 #define COMPORT		0x238
@@ -47,9 +48,15 @@
 static int	comc_init(int arg);
 static void	comc_putchar(int c);
 static int	comc_getchar(void);
+static int	comc_getspeed(void);
 static int	comc_ischar(void);
+static int	comc_parsespeed(const char *string);
+static void	comc_setup(int speed);
+static int	comc_speed_set(struct env_var *ev, int flags,
+		    const void *value);
 
 static int	comc_started;
+static int	comc_curspeed;
 
 struct console comconsole = {
     "comconsole",
@@ -65,8 +72,36 @@
 static void
 comc_probe(struct console *cp)
 {
+    char speedbuf[16];
+    char *cons, *speedenv;
+    int speed;
+
     /* XXX check the BIOS equipment list? */
     cp->c_flags |= (C_PRESENTIN | C_PRESENTOUT);
+
+    if (comc_curspeed == 0) {
+	comc_curspeed = COMSPEED;
+	/*
+	 * Assume that the speed was set by an earlier boot loader if
+	 * comconsole is already the preferred console.
+	 */
+	cons = getenv("console");
+	if ((cons != NULL && strcmp(cons, comconsole.c_name) == 0) ||
+	    getenv("boot_multicons") != NULL) {
+		comc_curspeed = comc_getspeed();
+	}
+	speedenv = getenv("comconsole_speed");
+	if (speedenv != NULL) {
+	    speed = comc_parsespeed(speedenv);
+	    if (speed > 0)
+		comc_curspeed = speed;
+	}
+
+	sprintf(speedbuf, "%d", comc_curspeed);
+	unsetenv("comconsole_speed");
+	env_setenv("comconsole_speed", EV_VOLATILE, speedbuf, comc_speed_set,
+	    env_nounset);
+    }
 }
 
 static int
@@ -76,15 +111,7 @@
 	return 0;
     comc_started = 1;
 
-    outb(COMPORT + com_cfcr, CFCR_DLAB | COMC_FMT);
-    outb(COMPORT + com_dlbl, COMC_BPS(COMSPEED) & 0xff);
-    outb(COMPORT + com_dlbh, COMC_BPS(COMSPEED) >> 8);
-    outb(COMPORT + com_cfcr, COMC_FMT);
-    outb(COMPORT + com_mcr, MCR_RTS | MCR_DTR);
-
-    do
-        inb(COMPORT + com_data);
-    while (inb(COMPORT + com_lsr) & LSR_RXRDY);
+    comc_setup(comc_curspeed);
 
     return(0);
 }
@@ -112,3 +139,75 @@
 {
     return(inb(COMPORT + com_lsr) & LSR_RXRDY);
 }
+
+static int
+comc_speed_set(struct env_var *ev, int flags, const void *value)
+{
+    int speed;
+
+    if (value == NULL || (speed = comc_parsespeed(value)) <= 0) {
+	printf("Invalid speed\n");
+	return (CMD_ERROR);
+    }
+
+    if (comc_started && comc_curspeed != speed)
+	comc_setup(speed);
+
+    env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
+
+    return (CMD_OK);
+}
+
+static void
+comc_setup(int speed)
+{
+
+    comc_curspeed = speed;
+
+    outb(COMPORT + com_cfcr, CFCR_DLAB | COMC_FMT);
+    outb(COMPORT + com_dlbl, COMC_BPS(speed) & 0xff);
+    outb(COMPORT + com_dlbh, COMC_BPS(speed) >> 8);
+    outb(COMPORT + com_cfcr, COMC_FMT);
+    outb(COMPORT + com_mcr, MCR_RTS | MCR_DTR);
+
+    do
+        inb(COMPORT + com_data);
+    while (inb(COMPORT + com_lsr) & LSR_RXRDY);
+}
+
+static int
+comc_parsespeed(const char *speedstr)
+{
+    char *p;
+    int speed;
+
+    speed = strtol(speedstr, &p, 0);
+    if (p == speedstr || *p != '\0' || speed <= 0)
+	return (-1);
+
+    return (speed);
+}
+
+static int
+comc_getspeed(void)
+{
+	u_int	divisor;
+	u_char	dlbh;
+	u_char	dlbl;
+	u_char	cfcr;
+
+	cfcr = inb(COMPORT + com_cfcr);
+	outb(COMPORT + com_cfcr, CFCR_DLAB | cfcr);
+
+	dlbl = inb(COMPORT + com_dlbl);
+	dlbh = inb(COMPORT + com_dlbh);
+
+	outb(COMPORT + com_cfcr, cfcr);
+
+	divisor = dlbh << 8 | dlbl;
+
+	/* XXX there should be more sanity checking. */
+	if (divisor == 0)
+		return (COMSPEED);
+	return (COMC_DIV2BPS(divisor));
+}

==== //depot/projects/netsmp/src/sys/fs/fifofs/fifo_vnops.c#9 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)fifo_vnops.c	8.10 (Berkeley) 5/27/95
- * $FreeBSD: src/sys/fs/fifofs/fifo_vnops.c,v 1.120 2005/09/12 18:07:49 rwatson Exp $
+ * $FreeBSD: src/sys/fs/fifofs/fifo_vnops.c,v 1.122 2005/09/13 09:23:22 rwatson Exp $
  */
 
 #include <sys/param.h>
@@ -334,6 +334,12 @@
 	return (0);
 }
 
+/*
+ * Currently fifo_kqfilter() isn't reachable beause vop_kqfilter() is only
+ * called for open files, in which case the fifo code has redirected the
+ * caller to fifo_kqfilter_f() via the file descriptor operations vector.
+ * This implementation should be garbage collected.
+ */
 /* ARGSUSED */
 static int
 fifo_kqfilter(ap)
@@ -589,6 +595,12 @@
 	return (error);
 }
 
+/*
+ * Because fifos are now a file descriptor layer object, EVFILT_VNODE is not
+ * implemented.  Likely, fifo_kqfilter() should be removed, and
+ * fifo_kqfilter_f() should know how to forward the request to the underling
+ * vnode using f_vnode in the file descriptor here.
+ */
 static int
 fifo_kqfilter_f(struct file *fp, struct knote *kn)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509130947.j8D9lb8Q037633>