On PowerPC send output to both "/chosen/stdout" and "screen" nodes, unless

they point to the very same device. This should make loader usable on
some (all?) PowerMacs, where "/chosen/stdout" is disconneted from the
"screen" by the OF init process by default, except when user actually
has requested interaction with OF by holding ALT-CMD-O-F. Along with
rev 183168 this should provide a way to build bootable FreeBSD/ppc
installation or live CD that works OOB. Also, it should bring PowerMac
experience closer to that on other arches.

MFC after:	1 week
		(assiming re@ blessing)
This commit is contained in:
Maxim Sobolev 2008-09-19 11:00:14 +00:00
parent 873da6a7fa
commit d873f46379
2 changed files with 30 additions and 1 deletions

View File

@ -14,7 +14,7 @@ CFLAGS+= -I${.CURDIR}/../../common -I${.CURDIR}/../../.. -I.
CFLAGS+= -ffreestanding
.if ${MACHINE_ARCH} == "powerpc"
CFLAGS+= -msoft-float
CFLAGS+= -msoft-float -DPOWERMAC_SCREEN_HACK
.endif
.ifdef(BOOT_DISK_DEBUG)

View File

@ -42,6 +42,10 @@ int ofw_cons_poll(void);
static ihandle_t stdin;
static ihandle_t stdout;
#ifdef POWERMAC_SCREEN_HACK
static ihandle_t stdout1;
static int do_stdout1 = 0;
#endif
struct console ofwconsole = {
"ofw",
@ -57,9 +61,26 @@ struct console ofwconsole = {
static void
ofw_cons_probe(struct console *cp)
{
#ifdef POWERMAC_SCREEN_HACK
char path1[128], path2[128];
#endif
OF_getprop(chosen, "stdin", &stdin, sizeof(stdin));
OF_getprop(chosen, "stdout", &stdout, sizeof(stdout));
#ifdef POWERMAC_SCREEN_HACK
stdout1 = OF_open("screen");
if (stdout1 != -1) {
if (OF_instance_to_path(stdout, path1, sizeof(path1)) == -1)
path1[0] = '\0';
if (OF_instance_to_path(stdout1, path2, sizeof(path2)) == -1)
path2[0] = '\0';
if (strcmp(path1, path2) == 0) {
OF_close(stdout1);
} else {
do_stdout1 = 1;
}
}
#endif
cp->c_flags |= C_PRESENTIN|C_PRESENTOUT;
}
@ -77,10 +98,18 @@ ofw_cons_putchar(int c)
if (c == '\n') {
cbuf = '\r';
OF_write(stdout, &cbuf, 1);
#ifdef POWERMAC_SCREEN_HACK
if (do_stdout1 != 0)
OF_write(stdout1, &cbuf, 1);
#endif
}
cbuf = c;
OF_write(stdout, &cbuf, 1);
#ifdef POWERMAC_SCREEN_HACK
if (do_stdout1 != 0)
OF_write(stdout1, &cbuf, 1);
#endif
}
static int saved_char = -1;