Sun Dec 8 13:09:28 2019 UTC ()
Pull up following revision(s) (requested by nonaka in ticket #502):
	sys/arch/x86/x86/hyperv.c: revision 1.5
	sys/arch/x86/include/genfb_machdep.h: revision 1.4
	sys/arch/x86/x86/genfb_machdep.c: revision 1.15
Prevent panic when attaching genfb if using a serial console with Hyper-V Gen.2.


(martin)
diff -r1.3 -r1.3.60.1 src/sys/arch/x86/include/genfb_machdep.h
diff -r1.13 -r1.13.2.1 src/sys/arch/x86/x86/genfb_machdep.c
diff -r1.4 -r1.4.4.1 src/sys/arch/x86/x86/hyperv.c

cvs diff -r1.3 -r1.3.60.1 src/sys/arch/x86/include/genfb_machdep.h (expand / switch to unified diff)

--- src/sys/arch/x86/include/genfb_machdep.h 2011/02/09 13:24:23 1.3
+++ src/sys/arch/x86/include/genfb_machdep.h 2019/12/08 13:09:28 1.3.60.1
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: genfb_machdep.h,v 1.3 2011/02/09 13:24:23 jmcneill Exp $ */ 1/* $NetBSD: genfb_machdep.h,v 1.3.60.1 2019/12/08 13:09:28 martin Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca> 4 * Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca>
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -19,19 +19,20 @@ @@ -19,19 +19,20 @@
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29#ifndef _X86_GENFB_MACHDEP_H 29#ifndef _X86_GENFB_MACHDEP_H
30#define _X86_GENFB_MACHDEP_H 30#define _X86_GENFB_MACHDEP_H
31 31
 32int x86_genfb_init(void);
32int x86_genfb_cnattach(void); 33int x86_genfb_cnattach(void);
33void x86_genfb_mtrr_init(uint64_t, uint32_t); 34void x86_genfb_mtrr_init(uint64_t, uint32_t);
34void x86_genfb_set_console_dev(device_t); 35void x86_genfb_set_console_dev(device_t);
35void x86_genfb_ddb_trap_callback(int); 36void x86_genfb_ddb_trap_callback(int);
36 37
37#endif /* !_X86_GENFB_MACHDEP_H */ 38#endif /* !_X86_GENFB_MACHDEP_H */

cvs diff -r1.13 -r1.13.2.1 src/sys/arch/x86/x86/genfb_machdep.c (expand / switch to unified diff)

--- src/sys/arch/x86/x86/genfb_machdep.c 2019/05/19 07:43:17 1.13
+++ src/sys/arch/x86/x86/genfb_machdep.c 2019/12/08 13:09:28 1.13.2.1
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: genfb_machdep.c,v 1.13 2019/05/19 07:43:17 mlelstv Exp $ */ 1/* $NetBSD: genfb_machdep.c,v 1.13.2.1 2019/12/08 13:09:28 martin Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca> 4 * Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca>
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -21,27 +21,27 @@ @@ -21,27 +21,27 @@
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29/* 29/*
30 * Early attach support for raster consoles 30 * Early attach support for raster consoles
31 */ 31 */
32 32
33#include <sys/cdefs.h> 33#include <sys/cdefs.h>
34__KERNEL_RCSID(0, "$NetBSD: genfb_machdep.c,v 1.13 2019/05/19 07:43:17 mlelstv Exp $"); 34__KERNEL_RCSID(0, "$NetBSD: genfb_machdep.c,v 1.13.2.1 2019/12/08 13:09:28 martin Exp $");
35 35
36#include "opt_mtrr.h" 36#include "opt_mtrr.h"
37 37
38#include <sys/param.h> 38#include <sys/param.h>
39#include <sys/conf.h> 39#include <sys/conf.h>
40#include <sys/device.h> 40#include <sys/device.h>
41#include <sys/ioctl.h> 41#include <sys/ioctl.h>
42#include <sys/kernel.h> 42#include <sys/kernel.h>
43#include <sys/kmem.h> 43#include <sys/kmem.h>
44#include <sys/lwp.h> 44#include <sys/lwp.h>
45 45
46#include <sys/bus.h> 46#include <sys/bus.h>
47#include <machine/bootinfo.h> 47#include <machine/bootinfo.h>
@@ -126,43 +126,39 @@ x86_genfb_mtrr_init(uint64_t physaddr, u @@ -126,43 +126,39 @@ x86_genfb_mtrr_init(uint64_t physaddr, u
126 error = mtrr_set(&mtrr, &n, curlwp->l_proc, MTRR_GETSET_KERNEL); 126 error = mtrr_set(&mtrr, &n, curlwp->l_proc, MTRR_GETSET_KERNEL);
127 if (n != 0) 127 if (n != 0)
128 mtrr_commit(); 128 mtrr_commit();
129 KERNEL_UNLOCK_ONE(NULL); 129 KERNEL_UNLOCK_ONE(NULL);
130 130
131 aprint_debug("%s: mtrr_set returned %d\n", __func__, error); 131 aprint_debug("%s: mtrr_set returned %d\n", __func__, error);
132#else 132#else
133 aprint_debug("%s: kernel lacks MTRR option\n", __func__); 133 aprint_debug("%s: kernel lacks MTRR option\n", __func__);
134#endif 134#endif
135#endif 135#endif
136} 136}
137 137
138int 138int
139x86_genfb_cnattach(void) 139x86_genfb_init(void)
140{ 140{
141 static int ncalls = 0; 141 static int inited, attached;
142 struct rasops_info *ri = &x86_genfb_console_screen.scr_ri; 142 struct rasops_info *ri = &x86_genfb_console_screen.scr_ri;
143 const struct btinfo_framebuffer *fbinfo; 143 const struct btinfo_framebuffer *fbinfo;
144 bus_space_tag_t t = x86_bus_space_mem; 144 bus_space_tag_t t = x86_bus_space_mem;
145 bus_space_handle_t h; 145 bus_space_handle_t h;
146 void *bits; 146 void *bits;
147 long defattr; 
148 int err; 147 int err;
149 148
150 /* XXX jmcneill 149 if (inited)
151 * Defer console initialization until UVM is initialized 150 return attached;
152 */ 151 inited = 1;
153 ++ncalls; 
154 if (ncalls < 3) 
155 return -1; 
156 152
157 memset(&x86_genfb_console_screen, 0, sizeof(x86_genfb_console_screen)); 153 memset(&x86_genfb_console_screen, 0, sizeof(x86_genfb_console_screen));
158 154
159 fbinfo = lookup_bootinfo(BTINFO_FRAMEBUFFER); 155 fbinfo = lookup_bootinfo(BTINFO_FRAMEBUFFER);
160 if (fbinfo == NULL || fbinfo->physaddr == 0) 156 if (fbinfo == NULL || fbinfo->physaddr == 0)
161 return 0; 157 return 0;
162 158
163 err = _x86_memio_map(t, (bus_addr_t)fbinfo->physaddr, 159 err = _x86_memio_map(t, (bus_addr_t)fbinfo->physaddr,
164 fbinfo->height * fbinfo->stride, 160 fbinfo->height * fbinfo->stride,
165 BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE, &h); 161 BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE, &h);
166 if (err) { 162 if (err) {
167 aprint_error("x86_genfb_cnattach: couldn't map framebuffer\n"); 163 aprint_error("x86_genfb_cnattach: couldn't map framebuffer\n");
168 return 0; 164 return 0;
@@ -196,25 +192,52 @@ x86_genfb_cnattach(void) @@ -196,25 +192,52 @@ x86_genfb_cnattach(void)
196 } else 192 } else
197 ri->ri_bits = bits; 193 ri->ri_bits = bits;
198 ri->ri_flg = RI_CENTER | RI_FULLCLEAR | RI_CLEAR; 194 ri->ri_flg = RI_CENTER | RI_FULLCLEAR | RI_CLEAR;
199 rasops_init(ri, ri->ri_height / 8, ri->ri_width / 8); 195 rasops_init(ri, ri->ri_height / 8, ri->ri_width / 8);
200 ri->ri_caps = WSSCREEN_WSCOLORS; 196 ri->ri_caps = WSSCREEN_WSCOLORS;
201 rasops_reconfig(ri, ri->ri_height / ri->ri_font->fontheight, 197 rasops_reconfig(ri, ri->ri_height / ri->ri_font->fontheight,
202 ri->ri_width / ri->ri_font->fontwidth); 198 ri->ri_width / ri->ri_font->fontwidth);
203 199
204 x86_genfb_stdscreen.nrows = ri->ri_rows; 200 x86_genfb_stdscreen.nrows = ri->ri_rows;
205 x86_genfb_stdscreen.ncols = ri->ri_cols; 201 x86_genfb_stdscreen.ncols = ri->ri_cols;
206 x86_genfb_stdscreen.textops = &ri->ri_ops; 202 x86_genfb_stdscreen.textops = &ri->ri_ops;
207 x86_genfb_stdscreen.capabilities = ri->ri_caps; 203 x86_genfb_stdscreen.capabilities = ri->ri_caps;
208 204
 205 attached = 1;
 206 return 1;
 207}
 208
 209int
 210x86_genfb_cnattach(void)
 211{
 212 static int ncalls = 0;
 213 struct rasops_info *ri = &x86_genfb_console_screen.scr_ri;
 214 long defattr;
 215
 216 /* XXX jmcneill
 217 * Defer console initialization until UVM is initialized
 218 */
 219 ++ncalls;
 220 if (ncalls < 3)
 221 return -1;
 222
 223 if (!x86_genfb_init())
 224 return 0;
 225
209 ri->ri_ops.allocattr(ri, 0, 0, 0, &defattr); 226 ri->ri_ops.allocattr(ri, 0, 0, 0, &defattr);
210 wsdisplay_preattach(&x86_genfb_stdscreen, ri, 0, 0, defattr); 227 wsdisplay_preattach(&x86_genfb_stdscreen, ri, 0, 0, defattr);
211 228
212 return 1; 229 return 1;
213} 230}
214#else /* NWSDISPLAY > 0 && NGENFB > 0 */ 231#else /* NWSDISPLAY > 0 && NGENFB > 0 */
215int 232int
 233x86_genfb_init(void)
 234{
 235 return 0;
 236}
 237
 238int
216x86_genfb_cnattach(void) 239x86_genfb_cnattach(void)
217{ 240{
218 return 0; 241 return 0;
219} 242}
220#endif 243#endif

cvs diff -r1.4 -r1.4.4.1 src/sys/arch/x86/x86/hyperv.c (expand / switch to unified diff)

--- src/sys/arch/x86/x86/hyperv.c 2019/06/03 09:51:04 1.4
+++ src/sys/arch/x86/x86/hyperv.c 2019/12/08 13:09:28 1.4.4.1
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: hyperv.c,v 1.4 2019/06/03 09:51:04 nonaka Exp $ */ 1/* $NetBSD: hyperv.c,v 1.4.4.1 2019/12/08 13:09:28 martin Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2009-2012,2016-2017 Microsoft Corp. 4 * Copyright (c) 2009-2012,2016-2017 Microsoft Corp.
5 * Copyright (c) 2012 NetApp Inc. 5 * Copyright (c) 2012 NetApp Inc.
6 * Copyright (c) 2012 Citrix Inc. 6 * Copyright (c) 2012 Citrix Inc.
7 * All rights reserved. 7 * All rights reserved.
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions 10 * modification, are permitted provided that the following conditions
11 * are met: 11 * are met:
12 * 1. Redistributions of source code must retain the above copyright 12 * 1. Redistributions of source code must retain the above copyright
13 * notice unmodified, this list of conditions, and the following 13 * notice unmodified, this list of conditions, and the following
14 * disclaimer. 14 * disclaimer.
@@ -23,27 +23,27 @@ @@ -23,27 +23,27 @@
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31/** 31/**
32 * Implements low-level interactions with Hyper-V/Azuree 32 * Implements low-level interactions with Hyper-V/Azuree
33 */ 33 */
34#include <sys/cdefs.h> 34#include <sys/cdefs.h>
35#ifdef __KERNEL_RCSID 35#ifdef __KERNEL_RCSID
36__KERNEL_RCSID(0, "$NetBSD: hyperv.c,v 1.4 2019/06/03 09:51:04 nonaka Exp $"); 36__KERNEL_RCSID(0, "$NetBSD: hyperv.c,v 1.4.4.1 2019/12/08 13:09:28 martin Exp $");
37#endif 37#endif
38#ifdef __FBSDID 38#ifdef __FBSDID
39__FBSDID("$FreeBSD: head/sys/dev/hyperv/vmbus/hyperv.c 331757 2018-03-30 02:25:12Z emaste $"); 39__FBSDID("$FreeBSD: head/sys/dev/hyperv/vmbus/hyperv.c 331757 2018-03-30 02:25:12Z emaste $");
40#endif 40#endif
41 41
42#ifdef _KERNEL_OPT 42#ifdef _KERNEL_OPT
43#include "lapic.h" 43#include "lapic.h"
44#include "genfb.h" 44#include "genfb.h"
45#include "opt_ddb.h" 45#include "opt_ddb.h"
46#include "vmbus.h" 46#include "vmbus.h"
47#include "wsdisplay.h" 47#include "wsdisplay.h"
48#endif 48#endif
49 49
@@ -60,27 +60,27 @@ __FBSDID("$FreeBSD: head/sys/dev/hyperv/ @@ -60,27 +60,27 @@ __FBSDID("$FreeBSD: head/sys/dev/hyperv/
60#include <sys/timetc.h> 60#include <sys/timetc.h>
61 61
62#include <uvm/uvm_extern.h> 62#include <uvm/uvm_extern.h>
63 63
64#include <machine/autoconf.h> 64#include <machine/autoconf.h>
65#include <machine/bootinfo.h> 65#include <machine/bootinfo.h>
66#include <machine/cpufunc.h> 66#include <machine/cpufunc.h>
67#include <machine/cputypes.h> 67#include <machine/cputypes.h>
68#include <machine/cpuvar.h> 68#include <machine/cpuvar.h>
69#include <machine/cpu_counter.h> 69#include <machine/cpu_counter.h>
70#include <x86/efi.h> 70#include <x86/efi.h>
71 71
72#include <dev/wsfb/genfbvar.h> 72#include <dev/wsfb/genfbvar.h>
73#include <arch/x86/include/genfb_machdep.h> 73#include <x86/genfb_machdep.h>
74 74
75#include <x86/x86/hypervreg.h> 75#include <x86/x86/hypervreg.h>
76#include <x86/x86/hypervvar.h> 76#include <x86/x86/hypervvar.h>
77#include <dev/hyperv/vmbusvar.h> 77#include <dev/hyperv/vmbusvar.h>
78#include <dev/hyperv/genfb_vmbusvar.h> 78#include <dev/hyperv/genfb_vmbusvar.h>
79 79
80#ifdef DDB 80#ifdef DDB
81#include <machine/db_machdep.h> 81#include <machine/db_machdep.h>
82#include <ddb/db_sym.h> 82#include <ddb/db_sym.h>
83#include <ddb/db_extern.h> 83#include <ddb/db_extern.h>
84#endif 84#endif
85 85
86struct hyperv_softc { 86struct hyperv_softc {
@@ -1093,26 +1093,29 @@ populate_fbinfo(device_t dev, prop_dicti @@ -1093,26 +1093,29 @@ populate_fbinfo(device_t dev, prop_dicti
1093device_t 1093device_t
1094device_hyperv_register(device_t dev, void *aux) 1094device_hyperv_register(device_t dev, void *aux)
1095{ 1095{
1096#if NVMBUS > 0 1096#if NVMBUS > 0
1097 device_t parent = device_parent(dev); 1097 device_t parent = device_parent(dev);
1098 1098
1099 if (parent && device_is_a(parent, "vmbus") && !x86_found_console) { 1099 if (parent && device_is_a(parent, "vmbus") && !x86_found_console) {
1100 struct vmbus_attach_args *aa = aux; 1100 struct vmbus_attach_args *aa = aux;
1101 1101
1102 if (memcmp(aa->aa_type, &hyperv_guid_video, 1102 if (memcmp(aa->aa_type, &hyperv_guid_video,
1103 sizeof(*aa->aa_type)) == 0) { 1103 sizeof(*aa->aa_type)) == 0) {
1104 prop_dictionary_t dict = device_properties(dev); 1104 prop_dictionary_t dict = device_properties(dev);
1105 1105
 1106 /* Initialize genfb for serial console */
 1107 x86_genfb_init();
 1108
1106 /* 1109 /*
1107 * framebuffer drivers other than genfb can work 1110 * framebuffer drivers other than genfb can work
1108 * without the address property 1111 * without the address property
1109 */ 1112 */
1110 populate_fbinfo(dev, dict); 1113 populate_fbinfo(dev, dict);
1111 1114
1112#if 1 && NWSDISPLAY > 0 && NGENFB > 0 1115#if 1 && NWSDISPLAY > 0 && NGENFB > 0
1113 /* XXX */ 1116 /* XXX */
1114 if (device_is_a(dev, "genfb")) { 1117 if (device_is_a(dev, "genfb")) {
1115 prop_dictionary_set_bool(dict, "is_console", 1118 prop_dictionary_set_bool(dict, "is_console",
1116 genfb_is_console()); 1119 genfb_is_console());
1117 } else 1120 } else
1118#endif 1121#endif