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