xref: /illumos-gate/usr/src/boot/i386/libi386/bootinfo.c (revision 55fea89dcaa64928bed4327112404dcb3e07b79f)
1*22028508SToomas Soome /*-
2*22028508SToomas Soome  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
3*22028508SToomas Soome  * All rights reserved.
4*22028508SToomas Soome  *
5*22028508SToomas Soome  * Redistribution and use in source and binary forms, with or without
6*22028508SToomas Soome  * modification, are permitted provided that the following conditions
7*22028508SToomas Soome  * are met:
8*22028508SToomas Soome  * 1. Redistributions of source code must retain the above copyright
9*22028508SToomas Soome  *    notice, this list of conditions and the following disclaimer.
10*22028508SToomas Soome  * 2. Redistributions in binary form must reproduce the above copyright
11*22028508SToomas Soome  *    notice, this list of conditions and the following disclaimer in the
12*22028508SToomas Soome  *    documentation and/or other materials provided with the distribution.
13*22028508SToomas Soome  *
14*22028508SToomas Soome  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*22028508SToomas Soome  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*22028508SToomas Soome  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*22028508SToomas Soome  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*22028508SToomas Soome  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*22028508SToomas Soome  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*22028508SToomas Soome  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*22028508SToomas Soome  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*22028508SToomas Soome  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*22028508SToomas Soome  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*22028508SToomas Soome  * SUCH DAMAGE.
25*22028508SToomas Soome  */
26*22028508SToomas Soome 
27*22028508SToomas Soome #include <sys/cdefs.h>
28*22028508SToomas Soome 
29*22028508SToomas Soome #include <stand.h>
30*22028508SToomas Soome #include <sys/param.h>
31*22028508SToomas Soome #include <sys/reboot.h>
32*22028508SToomas Soome #include <sys/linker.h>
33*22028508SToomas Soome #include <sys/boot.h>
34*22028508SToomas Soome #include "bootstrap.h"
35*22028508SToomas Soome #include "libi386.h"
36*22028508SToomas Soome #include "btxv86.h"
37*22028508SToomas Soome 
38*22028508SToomas Soome int
bi_getboothowto(char * kargs)39*22028508SToomas Soome bi_getboothowto(char *kargs)
40*22028508SToomas Soome {
41*22028508SToomas Soome     char	*cp;
42*22028508SToomas Soome     char	*curpos, *next, *string;
43*22028508SToomas Soome     int		howto;
44*22028508SToomas Soome     int		active;
45*22028508SToomas Soome     int		i;
46*22028508SToomas Soome     int		vidconsole;
47*22028508SToomas Soome 
48*22028508SToomas Soome     /* Parse kargs */
49*22028508SToomas Soome     howto = 0;
50*22028508SToomas Soome     if (kargs  != NULL) {
51*22028508SToomas Soome 	cp = kargs;
52*22028508SToomas Soome 	active = 0;
53*22028508SToomas Soome 	while (*cp != 0) {
54*22028508SToomas Soome 	    if (!active && (*cp == '-')) {
55*22028508SToomas Soome 		active = 1;
56*22028508SToomas Soome 	    } else if (active)
57*22028508SToomas Soome 		switch (*cp) {
58*22028508SToomas Soome 		case 'a':
59*22028508SToomas Soome 		    howto |= RB_ASKNAME;
60*22028508SToomas Soome 		    break;
61*22028508SToomas Soome 		case 'C':
62*22028508SToomas Soome 		    howto |= RB_CDROM;
63*22028508SToomas Soome 		    break;
64*22028508SToomas Soome 		case 'd':
65*22028508SToomas Soome 		    howto |= RB_KDB;
66*22028508SToomas Soome 		    break;
67*22028508SToomas Soome 		case 'D':
68*22028508SToomas Soome 		    howto |= RB_MULTIPLE;
69*22028508SToomas Soome 		    break;
70*22028508SToomas Soome 		case 'm':
71*22028508SToomas Soome 		    howto |= RB_MUTE;
72*22028508SToomas Soome 		    break;
73*22028508SToomas Soome 		case 'g':
74*22028508SToomas Soome 		    howto |= RB_GDB;
75*22028508SToomas Soome 		    break;
76*22028508SToomas Soome 		case 'h':
77*22028508SToomas Soome 		    howto |= RB_SERIAL;
78*22028508SToomas Soome 		    break;
79*22028508SToomas Soome 		case 'p':
80*22028508SToomas Soome 		    howto |= RB_PAUSE;
81*22028508SToomas Soome 		    break;
82*22028508SToomas Soome 		case 'r':
83*22028508SToomas Soome 		    howto |= RB_DFLTROOT;
84*22028508SToomas Soome 		    break;
85*22028508SToomas Soome 		case 's':
86*22028508SToomas Soome 		    howto |= RB_SINGLE;
87*22028508SToomas Soome 		    break;
88*22028508SToomas Soome 		case 'v':
89*22028508SToomas Soome 		    howto |= RB_VERBOSE;
90*22028508SToomas Soome 		    break;
91*22028508SToomas Soome 		default:
92*22028508SToomas Soome 		    active = 0;
93*22028508SToomas Soome 		    break;
94*22028508SToomas Soome 		}
95*22028508SToomas Soome 	    cp++;
96*22028508SToomas Soome 	}
97*22028508SToomas Soome     }
98*22028508SToomas Soome     /* get equivalents from the environment */
99*22028508SToomas Soome     for (i = 0; howto_names[i].ev != NULL; i++)
100*22028508SToomas Soome 	if (getenv(howto_names[i].ev) != NULL)
101*22028508SToomas Soome 	    howto |= howto_names[i].mask;
102*22028508SToomas Soome 
103*22028508SToomas Soome     /* Enable selected consoles */
104*22028508SToomas Soome     string = next = strdup(getenv("console"));
105*22028508SToomas Soome     vidconsole = 0;
106*22028508SToomas Soome     while (next != NULL) {
107*22028508SToomas Soome 	curpos = strsep(&next, " ,");
108*22028508SToomas Soome 	if (*curpos == '\0')
109*22028508SToomas Soome 		continue;
110*22028508SToomas Soome 	if (!strcmp(curpos, "text"))
111*22028508SToomas Soome 	    vidconsole = 1;
112*22028508SToomas Soome 	else if (!strcmp(curpos, "ttya"))
113*22028508SToomas Soome 	    howto |= RB_SERIAL;
114*22028508SToomas Soome 	else if (!strcmp(curpos, "ttyb"))
115*22028508SToomas Soome 	    howto |= RB_SERIAL;
116*22028508SToomas Soome 	else if (!strcmp(curpos, "ttyc"))
117*22028508SToomas Soome 	    howto |= RB_SERIAL;
118*22028508SToomas Soome 	else if (!strcmp(curpos, "ttyd"))
119*22028508SToomas Soome 	    howto |= RB_SERIAL;
120*22028508SToomas Soome 	else if (!strcmp(curpos, "null"))
121*22028508SToomas Soome 	    howto |= RB_MUTE;
122*22028508SToomas Soome     }
123*22028508SToomas Soome 
124*22028508SToomas Soome     if (vidconsole && (howto & RB_SERIAL))
125*22028508SToomas Soome 	howto |= RB_MULTIPLE;
126*22028508SToomas Soome 
127*22028508SToomas Soome     /*
128*22028508SToomas Soome      * XXX: Note that until the kernel is ready to respect multiple consoles
129*22028508SToomas Soome      * for the boot messages, the first named console is the primary console
130*22028508SToomas Soome      */
131*22028508SToomas Soome     if (!strcmp(string, "text"))
132*22028508SToomas Soome 	howto &= ~RB_SERIAL;
133*22028508SToomas Soome 
134*22028508SToomas Soome     free(string);
135*22028508SToomas Soome 
136*22028508SToomas Soome     return(howto);
137*22028508SToomas Soome }
138*22028508SToomas Soome 
139*22028508SToomas Soome void
bi_setboothowto(int howto)140*22028508SToomas Soome bi_setboothowto(int howto)
141*22028508SToomas Soome {
142*22028508SToomas Soome     int		i;
143*22028508SToomas Soome 
144*22028508SToomas Soome     for (i = 0; howto_names[i].ev != NULL; i++)
145*22028508SToomas Soome 	if (howto & howto_names[i].mask)
146*22028508SToomas Soome 	    setenv(howto_names[i].ev, "YES", 1);
147*22028508SToomas Soome }
148*22028508SToomas Soome 
149*22028508SToomas Soome /*
150*22028508SToomas Soome  * Copy the environment into the load area starting at (addr).
151*22028508SToomas Soome  * Each variable is formatted as <name>=<value>, with a single nul
152*22028508SToomas Soome  * separating each variable, and a double nul terminating the environment.
153*22028508SToomas Soome  */
154*22028508SToomas Soome vm_offset_t
bi_copyenv(vm_offset_t addr)155*22028508SToomas Soome bi_copyenv(vm_offset_t addr)
156*22028508SToomas Soome {
157*22028508SToomas Soome     struct env_var	*ep;
158*22028508SToomas Soome 
159*22028508SToomas Soome     /* traverse the environment */
160*22028508SToomas Soome     for (ep = environ; ep != NULL; ep = ep->ev_next) {
161*22028508SToomas Soome 	i386_copyin(ep->ev_name, addr, strlen(ep->ev_name));
162*22028508SToomas Soome 	addr += strlen(ep->ev_name);
163*22028508SToomas Soome 	i386_copyin("=", addr, 1);
164*22028508SToomas Soome 	addr++;
165*22028508SToomas Soome 	if (ep->ev_value != NULL) {
166*22028508SToomas Soome 	    i386_copyin(ep->ev_value, addr, strlen(ep->ev_value));
167*22028508SToomas Soome 	    addr += strlen(ep->ev_value);
168*22028508SToomas Soome 	}
169*22028508SToomas Soome 	i386_copyin("", addr, 1);
170*22028508SToomas Soome 	addr++;
171*22028508SToomas Soome     }
172*22028508SToomas Soome     i386_copyin("", addr, 1);
173*22028508SToomas Soome     addr++;
174*22028508SToomas Soome     return(addr);
175*22028508SToomas Soome }
176