1199767f8SToomas Soome /*-
2199767f8SToomas Soome  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
3199767f8SToomas Soome  * All rights reserved.
4199767f8SToomas Soome  *
5199767f8SToomas Soome  * Redistribution and use in source and binary forms, with or without
6199767f8SToomas Soome  * modification, are permitted provided that the following conditions
7199767f8SToomas Soome  * are met:
8199767f8SToomas Soome  * 1. Redistributions of source code must retain the above copyright
9199767f8SToomas Soome  *    notice, this list of conditions and the following disclaimer.
10199767f8SToomas Soome  * 2. Redistributions in binary form must reproduce the above copyright
11199767f8SToomas Soome  *    notice, this list of conditions and the following disclaimer in the
12199767f8SToomas Soome  *    documentation and/or other materials provided with the distribution.
13199767f8SToomas Soome  *
14199767f8SToomas Soome  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15199767f8SToomas Soome  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16199767f8SToomas Soome  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17199767f8SToomas Soome  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18199767f8SToomas Soome  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19199767f8SToomas Soome  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20199767f8SToomas Soome  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21199767f8SToomas Soome  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22199767f8SToomas Soome  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23199767f8SToomas Soome  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24199767f8SToomas Soome  * SUCH DAMAGE.
25199767f8SToomas Soome  */
26199767f8SToomas Soome 
27199767f8SToomas Soome #include <sys/cdefs.h>
28199767f8SToomas Soome 
29199767f8SToomas Soome #include <stand.h>
30199767f8SToomas Soome #include <sys/param.h>
31199767f8SToomas Soome #include <sys/reboot.h>
32199767f8SToomas Soome #include <sys/linker.h>
33199767f8SToomas Soome #include <sys/boot.h>
34199767f8SToomas Soome #include "bootstrap.h"
35199767f8SToomas Soome #include "libi386.h"
36199767f8SToomas Soome #include "btxv86.h"
37199767f8SToomas Soome 
38199767f8SToomas Soome int
bi_getboothowto(char * kargs)39199767f8SToomas Soome bi_getboothowto(char *kargs)
40199767f8SToomas Soome {
41199767f8SToomas Soome     char	*cp;
42199767f8SToomas Soome     char	*curpos, *next, *string;
43199767f8SToomas Soome     int		howto;
44199767f8SToomas Soome     int		active;
45199767f8SToomas Soome     int		i;
46199767f8SToomas Soome     int		vidconsole;
47199767f8SToomas Soome 
48199767f8SToomas Soome     /* Parse kargs */
49199767f8SToomas Soome     howto = 0;
50199767f8SToomas Soome     if (kargs  != NULL) {
51199767f8SToomas Soome 	cp = kargs;
52199767f8SToomas Soome 	active = 0;
53199767f8SToomas Soome 	while (*cp != 0) {
54199767f8SToomas Soome 	    if (!active && (*cp == '-')) {
55199767f8SToomas Soome 		active = 1;
56199767f8SToomas Soome 	    } else if (active)
57199767f8SToomas Soome 		switch (*cp) {
58199767f8SToomas Soome 		case 'a':
59199767f8SToomas Soome 		    howto |= RB_ASKNAME;
60199767f8SToomas Soome 		    break;
61199767f8SToomas Soome 		case 'C':
62199767f8SToomas Soome 		    howto |= RB_CDROM;
63199767f8SToomas Soome 		    break;
64199767f8SToomas Soome 		case 'd':
65199767f8SToomas Soome 		    howto |= RB_KDB;
66199767f8SToomas Soome 		    break;
67199767f8SToomas Soome 		case 'D':
68199767f8SToomas Soome 		    howto |= RB_MULTIPLE;
69199767f8SToomas Soome 		    break;
70199767f8SToomas Soome 		case 'm':
71199767f8SToomas Soome 		    howto |= RB_MUTE;
72199767f8SToomas Soome 		    break;
73199767f8SToomas Soome 		case 'g':
74199767f8SToomas Soome 		    howto |= RB_GDB;
75199767f8SToomas Soome 		    break;
76199767f8SToomas Soome 		case 'h':
77199767f8SToomas Soome 		    howto |= RB_SERIAL;
78199767f8SToomas Soome 		    break;
79199767f8SToomas Soome 		case 'p':
80199767f8SToomas Soome 		    howto |= RB_PAUSE;
81199767f8SToomas Soome 		    break;
82199767f8SToomas Soome 		case 'r':
83199767f8SToomas Soome 		    howto |= RB_DFLTROOT;
84199767f8SToomas Soome 		    break;
85199767f8SToomas Soome 		case 's':
86199767f8SToomas Soome 		    howto |= RB_SINGLE;
87199767f8SToomas Soome 		    break;
88199767f8SToomas Soome 		case 'v':
89199767f8SToomas Soome 		    howto |= RB_VERBOSE;
90199767f8SToomas Soome 		    break;
91199767f8SToomas Soome 		default:
92199767f8SToomas Soome 		    active = 0;
93199767f8SToomas Soome 		    break;
94199767f8SToomas Soome 		}
95199767f8SToomas Soome 	    cp++;
96199767f8SToomas Soome 	}
97199767f8SToomas Soome     }
98199767f8SToomas Soome     /* get equivalents from the environment */
99199767f8SToomas Soome     for (i = 0; howto_names[i].ev != NULL; i++)
100199767f8SToomas Soome 	if (getenv(howto_names[i].ev) != NULL)
101199767f8SToomas Soome 	    howto |= howto_names[i].mask;
102199767f8SToomas Soome 
103199767f8SToomas Soome     /* Enable selected consoles */
104199767f8SToomas Soome     string = next = strdup(getenv("console"));
105199767f8SToomas Soome     vidconsole = 0;
106199767f8SToomas Soome     while (next != NULL) {
107199767f8SToomas Soome 	curpos = strsep(&next, " ,");
108199767f8SToomas Soome 	if (*curpos == '\0')
109199767f8SToomas Soome 		continue;
110199767f8SToomas Soome 	if (!strcmp(curpos, "text"))
111199767f8SToomas Soome 	    vidconsole = 1;
112199767f8SToomas Soome 	else if (!strcmp(curpos, "ttya"))
113199767f8SToomas Soome 	    howto |= RB_SERIAL;
114199767f8SToomas Soome 	else if (!strcmp(curpos, "ttyb"))
115199767f8SToomas Soome 	    howto |= RB_SERIAL;
116199767f8SToomas Soome 	else if (!strcmp(curpos, "ttyc"))
117199767f8SToomas Soome 	    howto |= RB_SERIAL;
118199767f8SToomas Soome 	else if (!strcmp(curpos, "ttyd"))
119199767f8SToomas Soome 	    howto |= RB_SERIAL;
120199767f8SToomas Soome 	else if (!strcmp(curpos, "null"))
121199767f8SToomas Soome 	    howto |= RB_MUTE;
122199767f8SToomas Soome     }
123199767f8SToomas Soome 
124199767f8SToomas Soome     if (vidconsole && (howto & RB_SERIAL))
125199767f8SToomas Soome 	howto |= RB_MULTIPLE;
126199767f8SToomas Soome 
127199767f8SToomas Soome     /*
128199767f8SToomas Soome      * XXX: Note that until the kernel is ready to respect multiple consoles
129199767f8SToomas Soome      * for the boot messages, the first named console is the primary console
130199767f8SToomas Soome      */
131199767f8SToomas Soome     if (!strcmp(string, "text"))
132199767f8SToomas Soome 	howto &= ~RB_SERIAL;
133199767f8SToomas Soome 
134199767f8SToomas Soome     free(string);
135199767f8SToomas Soome 
136199767f8SToomas Soome     return(howto);
137199767f8SToomas Soome }
138199767f8SToomas Soome 
139199767f8SToomas Soome void
bi_setboothowto(int howto)140199767f8SToomas Soome bi_setboothowto(int howto)
141199767f8SToomas Soome {
142199767f8SToomas Soome     int		i;
143199767f8SToomas Soome 
144199767f8SToomas Soome     for (i = 0; howto_names[i].ev != NULL; i++)
145199767f8SToomas Soome 	if (howto & howto_names[i].mask)
146199767f8SToomas Soome 	    setenv(howto_names[i].ev, "YES", 1);
147199767f8SToomas Soome }
148199767f8SToomas Soome 
149199767f8SToomas Soome /*
150199767f8SToomas Soome  * Copy the environment into the load area starting at (addr).
151199767f8SToomas Soome  * Each variable is formatted as <name>=<value>, with a single nul
152199767f8SToomas Soome  * separating each variable, and a double nul terminating the environment.
153199767f8SToomas Soome  */
154199767f8SToomas Soome vm_offset_t
bi_copyenv(vm_offset_t addr)155199767f8SToomas Soome bi_copyenv(vm_offset_t addr)
156199767f8SToomas Soome {
157199767f8SToomas Soome     struct env_var	*ep;
158*55fea89dSDan Cross 
159199767f8SToomas Soome     /* traverse the environment */
160199767f8SToomas Soome     for (ep = environ; ep != NULL; ep = ep->ev_next) {
161199767f8SToomas Soome 	i386_copyin(ep->ev_name, addr, strlen(ep->ev_name));
162199767f8SToomas Soome 	addr += strlen(ep->ev_name);
163199767f8SToomas Soome 	i386_copyin("=", addr, 1);
164199767f8SToomas Soome 	addr++;
165199767f8SToomas Soome 	if (ep->ev_value != NULL) {
166199767f8SToomas Soome 	    i386_copyin(ep->ev_value, addr, strlen(ep->ev_value));
167199767f8SToomas Soome 	    addr += strlen(ep->ev_value);
168199767f8SToomas Soome 	}
169199767f8SToomas Soome 	i386_copyin("", addr, 1);
170199767f8SToomas Soome 	addr++;
171199767f8SToomas Soome     }
172199767f8SToomas Soome     i386_copyin("", addr, 1);
173199767f8SToomas Soome     addr++;
174199767f8SToomas Soome     return(addr);
175199767f8SToomas Soome }
176