Author: avg
Date: Sun Nov  4 13:32:26 2012
New Revision: 242558
URL: http://svn.freebsd.org/changeset/base/242558

Log:
  MFC r241299: boot/console: handle consoles that fail to probe

Modified:
  stable/8/sys/boot/common/bootstrap.h
  stable/8/sys/boot/common/console.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/boot/   (props changed)

Modified: stable/8/sys/boot/common/bootstrap.h
==============================================================================
--- stable/8/sys/boot/common/bootstrap.h        Sun Nov  4 13:32:16 2012        
(r242557)
+++ stable/8/sys/boot/common/bootstrap.h        Sun Nov  4 13:32:26 2012        
(r242558)
@@ -109,10 +109,10 @@ struct console 
     const char *c_name;
     const char *c_desc;
     int                c_flags;
-#define C_PRESENTIN    (1<<0)
-#define C_PRESENTOUT   (1<<1)
-#define C_ACTIVEIN     (1<<2)
-#define C_ACTIVEOUT    (1<<3)
+#define C_PRESENTIN    (1<<0)      /* console can provide input */
+#define C_PRESENTOUT   (1<<1)      /* console can provide output */
+#define C_ACTIVEIN     (1<<2)      /* user wants input from console */
+#define C_ACTIVEOUT    (1<<3)      /* user wants output to console */
     void       (* c_probe)(struct console *cp);        /* set c_flags to match 
hardware */
     int                (* c_init)(int arg);                    /* reinit XXX 
may need more args */
     void       (* c_out)(int c);                       /* emit c */

Modified: stable/8/sys/boot/common/console.c
==============================================================================
--- stable/8/sys/boot/common/console.c  Sun Nov  4 13:32:16 2012        
(r242557)
+++ stable/8/sys/boot/common/console.c  Sun Nov  4 13:32:26 2012        
(r242558)
@@ -100,11 +100,12 @@ getchar(void)
 {
     int                cons;
     int                rv;
-    
+
     /* Loop forever polling all active consoles */
     for(;;)
        for (cons = 0; consoles[cons] != NULL; cons++)
-           if ((consoles[cons]->c_flags & C_ACTIVEIN) && 
+           if ((consoles[cons]->c_flags & (C_PRESENTIN | C_ACTIVEIN)) ==
+               (C_PRESENTIN | C_ACTIVEIN) &&
                ((rv = consoles[cons]->c_in()) != -1))
                return(rv);
 }
@@ -115,7 +116,8 @@ ischar(void)
     int                cons;
 
     for (cons = 0; consoles[cons] != NULL; cons++)
-       if ((consoles[cons]->c_flags & C_ACTIVEIN) && 
+       if ((consoles[cons]->c_flags & (C_PRESENTIN | C_ACTIVEIN)) ==
+           (C_PRESENTIN | C_ACTIVEIN) &&
            (consoles[cons]->c_ready() != 0))
                return(1);
     return(0);
@@ -125,13 +127,14 @@ void
 putchar(int c)
 {
     int                cons;
-    
+
     /* Expand newlines */
     if (c == '\n')
        putchar('\r');
-    
+
     for (cons = 0; consoles[cons] != NULL; cons++)
-       if (consoles[cons]->c_flags & C_ACTIVEOUT)
+       if ((consoles[cons]->c_flags & (C_PRESENTOUT | C_ACTIVEOUT)) ==
+           (C_PRESENTOUT | C_ACTIVEOUT))
            consoles[cons]->c_out(c);
 }
 
@@ -220,6 +223,10 @@ cons_change(const char *string)
        if (cons >= 0) {
            consoles[cons]->c_flags |= C_ACTIVEIN | C_ACTIVEOUT;
            consoles[cons]->c_init(0);
+           if ((consoles[cons]->c_flags & (C_PRESENTIN | C_PRESENTOUT)) !=
+               (C_PRESENTIN | C_PRESENTOUT))
+               printf("console %s failed to initialize\n",
+                   consoles[cons]->c_name);
        }
     }
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to