userboot_cons.c revision 268953
1/*-
2 * Copyright (c) 2011 Google, Inc.
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/10/sys/boot/userboot/userboot/userboot_cons.c 268953 2014-07-21 19:08:02Z jhb $");
29
30#include <stand.h>
31#include "bootstrap.h"
32#include "libuserboot.h"
33
34int console;
35
36static struct console *userboot_comconsp;
37
38static void userboot_cons_probe(struct console *cp);
39static int userboot_cons_init(int);
40static void userboot_comcons_probe(struct console *cp);
41static int userboot_comcons_init(int);
42static void userboot_cons_putchar(int);
43static int userboot_cons_getchar(void);
44static int userboot_cons_poll(void);
45
46struct console userboot_console = {
47	"userboot",
48	"userboot",
49	0,
50	userboot_cons_probe,
51	userboot_cons_init,
52	userboot_cons_putchar,
53	userboot_cons_getchar,
54	userboot_cons_poll,
55};
56
57/*
58 * Provide a simple alias to allow loader scripts to set the
59 * console to comconsole without resulting in an error
60 */
61struct console userboot_comconsole = {
62	"comconsole",
63	"comconsole",
64	0,
65	userboot_comcons_probe,
66	userboot_comcons_init,
67	userboot_cons_putchar,
68	userboot_cons_getchar,
69	userboot_cons_poll,
70};
71
72static void
73userboot_cons_probe(struct console *cp)
74{
75
76	cp->c_flags |= (C_PRESENTIN | C_PRESENTOUT);
77}
78
79static int
80userboot_cons_init(int arg)
81{
82
83	return (0);
84}
85
86static void
87userboot_comcons_probe(struct console *cp)
88{
89
90	/*
91	 * Save the console pointer so the comcons_init routine
92	 * can set the C_PRESENT* flags. They are not set
93	 * here to allow the existing userboot console to
94	 * be elected the default.
95	 */
96	userboot_comconsp = cp;
97}
98
99static int
100userboot_comcons_init(int arg)
101{
102
103	/*
104	 * Set the C_PRESENT* flags to allow the comconsole
105	 * to be selected as the active console
106	 */
107	userboot_comconsp->c_flags |= (C_PRESENTIN | C_PRESENTOUT);
108	return (0);
109}
110
111static void
112userboot_cons_putchar(int c)
113{
114
115        CALLBACK(putc, c);
116}
117
118static int
119userboot_cons_getchar()
120{
121
122	return (CALLBACK(getc));
123}
124
125static int
126userboot_cons_poll()
127{
128
129	return (CALLBACK(poll));
130}
131