bootinfo.c revision 344378
1/*-
2 * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: stable/11/stand/userboot/userboot/bootinfo.c 344378 2019-02-20 19:19:24Z kevans $");
29
30#include <stand.h>
31#include <sys/param.h>
32#include <sys/reboot.h>
33#include <sys/boot.h>
34#include <sys/linker.h>
35
36#include "bootstrap.h"
37#include "libuserboot.h"
38
39int
40bi_getboothowto(char *kargs)
41{
42    char	*curpos, *next, *string;
43    int		howto;
44    int		vidconsole;
45
46    howto = boot_parse_cmdline(kargs);
47    howto |= boot_env_to_howto();
48
49    /* Enable selected consoles */
50    string = next = strdup(getenv("console"));
51    vidconsole = 0;
52    while (next != NULL) {
53	curpos = strsep(&next, " ,");
54	if (*curpos == '\0')
55		continue;
56	if (!strcmp(curpos, "vidconsole"))
57	    vidconsole = 1;
58	else if (!strcmp(curpos, "comconsole"))
59	    howto |= RB_SERIAL;
60	else if (!strcmp(curpos, "nullconsole"))
61	    howto |= RB_MUTE;
62    }
63
64    if (vidconsole && (howto & RB_SERIAL))
65	howto |= RB_MULTIPLE;
66
67    /*
68     * XXX: Note that until the kernel is ready to respect multiple consoles
69     * for the messages from /etc/rc, the first named console is the primary
70     * console
71     */
72    if (!strcmp(string, "vidconsole"))
73	howto &= ~RB_SERIAL;
74
75    free(string);
76
77    return(howto);
78}
79
80void
81bi_setboothowto(int howto)
82{
83
84    boot_howto_to_env(howto);
85}
86
87/*
88 * Copy the environment into the load area starting at (addr).
89 * Each variable is formatted as <name>=<value>, with a single nul
90 * separating each variable, and a double nul terminating the environment.
91 */
92vm_offset_t
93bi_copyenv(vm_offset_t addr)
94{
95    struct env_var	*ep;
96
97    /* traverse the environment */
98    for (ep = environ; ep != NULL; ep = ep->ev_next) {
99        CALLBACK(copyin, ep->ev_name, addr, strlen(ep->ev_name));
100	addr += strlen(ep->ev_name);
101	CALLBACK(copyin, "=", addr, 1);
102	addr++;
103	if (ep->ev_value != NULL) {
104            CALLBACK(copyin, ep->ev_value, addr, strlen(ep->ev_value));
105	    addr += strlen(ep->ev_value);
106	}
107	CALLBACK(copyin, "", addr, 1);
108	addr++;
109    }
110    CALLBACK(copyin, "", addr, 1);
111    addr++;
112    return(addr);
113}
114