From b64f06a33fc10f92f2dd77c94e67cfaeeff6b980 Mon Sep 17 00:00:00 2001 From: marcel Date: Sun, 4 Apr 2004 05:06:26 +0000 Subject: To quote submitter: "... uart_cpu_sparc64.c currently only looks at /options if ttyX is the selected console. However, there's one case where it should additionally look at /chosen. If "keyboard" is the selected input- device and "screen" the output-device (both via /options) but the keyboard is unplugged, OF automatically switches to ttya for the console. It even prints a line telling so on "screen". Solaris respects this behaviour and uses ttya as the console in this case and people probably expect FreeBSD to do the same (it's also very handy to temporarily switch consoles)..." Submitted by: Marius Strobl Has no doubt the change is correct: marcel --- sys/dev/uart/uart_cpu_sparc64.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) (limited to 'sys/dev') diff --git a/sys/dev/uart/uart_cpu_sparc64.c b/sys/dev/uart/uart_cpu_sparc64.c index a429441..df89a2e 100644 --- a/sys/dev/uart/uart_cpu_sparc64.c +++ b/sys/dev/uart/uart_cpu_sparc64.c @@ -71,13 +71,14 @@ uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) /* * Get the address of the UART that is selected as the console, if the * console is an UART of course. Note that we enforce that both stdin and - * stdout are selected. For weird configurations, use ofw_console(4). + * stdout are selected. * Note that the currently active console (i.e. /chosen/stdout and * /chosen/stdin) may not be the same as the device selected in the * environment (ie /options/output-device and /options/input-device) because - * the user may have changed the environment. In that case I would assume - * that the user expects that FreeBSD uses the new console setting. There's - * no choice, really. + * keyboard and screen were selected but the keyboard was unplugged or the + * user has changed the environment. In the latter case I would assume that + * the user expects that FreeBSD uses the new console setting. + * For weirder configurations, use ofw_console(4). */ static phandle_t uart_cpu_getdev_console(phandle_t options, char *dev, size_t devsz) @@ -89,13 +90,28 @@ uart_cpu_getdev_console(phandle_t options, char *dev, size_t devsz) return (-1); if ((input = OF_finddevice(dev)) == -1) return (-1); - if (OF_getprop(input, "device_type", buf, sizeof(buf)) == -1) + if (OF_getprop(options, "output-device", buf, sizeof(buf)) == -1) return (-1); - if (strcmp(buf, "serial") != 0) + if (!strcmp(dev, "keyboard") && !strcmp(buf, "screen")) { + phandle_t chosen; + ihandle_t stdin, stdout; + + if ((chosen = OF_finddevice("/chosen")) == -1) + return (-1); + if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) == -1) + return (-1); + if ((input = OF_instance_to_package(stdin)) == -1) + return (-1); + if (OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) == -1) + return (-1); + if (OF_instance_to_package(stdout) != input) + return (-1); + snprintf(dev, devsz, "ttya"); + } else if (OF_finddevice(buf) != input) return (-1); - if (OF_getprop(options, "output-device", buf, sizeof(buf)) == -1) + if (OF_getprop(input, "device_type", buf, sizeof(buf)) == -1) return (-1); - if (OF_finddevice(buf) != input) + if (strcmp(buf, "serial") != 0) return (-1); return (input); } -- cgit v1.1