| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: cninit.c,v 1.12 2020/07/17 02:05:44 uwe Exp $ */ | | 1 | /* $NetBSD: cninit.c,v 1.13 2020/07/17 02:16:57 uwe Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 1988 University of Utah. | | 4 | * Copyright (c) 1988 University of Utah. |
5 | * Copyright (c) 1990, 1993 | | 5 | * Copyright (c) 1990, 1993 |
6 | * The Regents of the University of California. All rights reserved. | | 6 | * The Regents of the University of California. All rights reserved. |
7 | * | | 7 | * |
8 | * This code is derived from software contributed to Berkeley by | | 8 | * This code is derived from software contributed to Berkeley by |
9 | * the Systems Programming Group of the University of Utah Computer | | 9 | * the Systems Programming Group of the University of Utah Computer |
10 | * Science Department. | | 10 | * Science Department. |
11 | * | | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | | 12 | * Redistribution and use in source and binary forms, with or without |
13 | * modification, are permitted provided that the following conditions | | 13 | * modification, are permitted provided that the following conditions |
14 | * are met: | | 14 | * are met: |
| @@ -29,69 +29,74 @@ | | | @@ -29,69 +29,74 @@ |
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | | 29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
34 | * SUCH DAMAGE. | | 34 | * SUCH DAMAGE. |
35 | * | | 35 | * |
36 | * from: Utah $Hdr: cons.c 1.7 92/01/21$ | | 36 | * from: Utah $Hdr: cons.c 1.7 92/01/21$ |
37 | * | | 37 | * |
38 | * @(#)cons.c 8.2 (Berkeley) 1/12/94 | | 38 | * @(#)cons.c 8.2 (Berkeley) 1/12/94 |
39 | */ | | 39 | */ |
40 | | | 40 | |
41 | #include <sys/cdefs.h> | | 41 | #include <sys/cdefs.h> |
42 | __KERNEL_RCSID(0, "$NetBSD: cninit.c,v 1.12 2020/07/17 02:05:44 uwe Exp $"); | | 42 | __KERNEL_RCSID(0, "$NetBSD: cninit.c,v 1.13 2020/07/17 02:16:57 uwe Exp $"); |
43 | | | 43 | |
44 | #include <sys/param.h> | | 44 | #include <sys/param.h> |
45 | #include <sys/proc.h> | | 45 | #include <sys/proc.h> |
46 | #include <sys/systm.h> | | 46 | #include <sys/systm.h> |
47 | #include <sys/buf.h> | | 47 | #include <sys/buf.h> |
48 | #include <sys/ioctl.h> | | 48 | #include <sys/ioctl.h> |
49 | #include <sys/tty.h> | | 49 | #include <sys/tty.h> |
50 | #include <sys/file.h> | | 50 | #include <sys/file.h> |
51 | #include <sys/conf.h> | | 51 | #include <sys/conf.h> |
52 | #include <sys/vnode.h> | | 52 | #include <sys/vnode.h> |
53 | | | 53 | |
54 | #include <dev/cons.h> | | 54 | #include <dev/cons.h> |
55 | | | 55 | |
56 | void | | 56 | void |
57 | cninit(void) | | 57 | cninit(void) |
58 | { | | 58 | { |
59 | struct consdev *cp; | | | |
60 | struct consdev *bestMatch; | | 59 | struct consdev *bestMatch; |
| | | 60 | struct consdev *cp; |
| | | 61 | |
| | | 62 | cn_tab = NULL; |
61 | | | 63 | |
62 | bestMatch = cn_tab = NULL; | | | |
63 | /* | | 64 | /* |
64 | * Collect information about all possible consoles | | 65 | * Collect information about all possible consoles |
65 | * and find the one with highest priority | | 66 | * and find the one with highest priority |
66 | */ | | 67 | */ |
| | | 68 | bestMatch = NULL; |
67 | for (cp = constab; cp->cn_probe; cp++) { | | 69 | for (cp = constab; cp->cn_probe; cp++) { |
68 | (*cp->cn_probe)(cp); | | 70 | (*cp->cn_probe)(cp); |
69 | if (cp->cn_pri > CN_DEAD && | | 71 | if (cp->cn_pri > CN_DEAD && |
70 | (bestMatch == NULL || cp->cn_pri > bestMatch->cn_pri)) { | | 72 | (bestMatch == NULL || cp->cn_pri > bestMatch->cn_pri)) { |
71 | bestMatch = cp; | | 73 | bestMatch = cp; |
72 | } | | 74 | } |
73 | } | | 75 | } |
74 | | | 76 | |
75 | /* | | 77 | /* |
76 | * No console, we can handle it | | 78 | * No console, we can handle it |
77 | */ | | 79 | */ |
78 | if (bestMatch == NULL) | | 80 | if (bestMatch == NULL) |
79 | return; | | 81 | return; |
80 | | | 82 | |
81 | /* | | 83 | /* |
82 | * Turn on console | | 84 | * Turn on console |
83 | */ | | 85 | */ |
84 | { | | 86 | { |
| | | 87 | /* XXX: can this ever be non-NULL? */ |
85 | struct consdev *old_cn_tab = cn_tab; | | 88 | struct consdev *old_cn_tab = cn_tab; |
86 | | | 89 | |
| | | 90 | /* cn_init may set cn_tab to self */ |
87 | (*bestMatch->cn_init)(bestMatch); | | 91 | (*bestMatch->cn_init)(bestMatch); |
| | | 92 | |
88 | /* | | 93 | /* |
89 | * Now let everyone know we have an active console they can | | 94 | * Now let everyone know we have an active console they can |
90 | * use for diagnostics. If we use cn_tab in the search loop | | 95 | * use for diagnostics. If we use cn_tab in the search loop |
91 | * then interrupts from the ethernet at boot may cause system | | 96 | * then interrupts from the ethernet at boot may cause system |
92 | * hang. | | 97 | * hang. |
93 | */ | | 98 | */ |
94 | if (cn_tab == old_cn_tab) | | 99 | if (cn_tab == old_cn_tab) /* if cn_init didn't, set it */ |
95 | cn_tab = bestMatch; | | 100 | cn_tab = bestMatch; |
96 | } | | 101 | } |
97 | } | | 102 | } |