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