summaryrefslogtreecommitdiffstats
path: root/sys/boot
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2005-08-15 20:58:36 +0000
committermarius <marius@FreeBSD.org>2005-08-15 20:58:36 +0000
commit0ea9db01f0116d2402bd41fdc1ab32f3d0523d16 (patch)
tree52edde0321141847e46579c2e792b72042812d34 /sys/boot
parentaa637c968238f73cf1354effb76ef48d965be335 (diff)
downloadFreeBSD-src-0ea9db01f0116d2402bd41fdc1ab32f3d0523d16.zip
FreeBSD-src-0ea9db01f0116d2402bd41fdc1ab32f3d0523d16.tar.gz
- Change the code that determines whether to use a serial console and
which serial device to use in that case respectively to not rely on the OFW names of the input/output and stdin/stdout devices. Instead check whether input and output refers to the same device and is of type serial (uart(4) was already doing this) and for the fallback to a serial console in case a keyboard is the selected input device but unplugged do the same for stdin and stdout in case the input device is nonexistent (PS/2 and USB keyboards) or has a 'keyboard' property (RS232 keyboards). Additionally also check whether the OFW did a fallback to a serial console in the same way in case the output device is nonexistent. While at it save on some variables and for sys/boot/sparc64/loader/metadata.c move the code in question to a new function md_bootserial() so it can be kept in sync with uart_cpu_getdev_console() more easily. This fixes selecting a serial console and the appropriate device when using a device path for the 'input-device' and 'output-device' OFW environment variables instead of an alias for the serial device to use or when using a screen alias that additionally denotes a video mode (like e.g. 'screen:r1024x768x60') but no keyboard is plugged in (amongst others). It also makes the code select a serial console in case the OFW did the same due to a misconfiguration like both 'input-device' and 'output-device' set to 'keyboard' or to a nonexisting device (whether the OFW does a fallback to a serial console in case of a misconfiguration or one ends up with just no console at all highly depends on the OBP version however). - Reduce the size of buffers that only ever need to hold the string 'serial' accordingly. Double the size of buffers that may need to hold a device path as e.g. '/pci@8,700000/ebus@5/serial@1,400000:a' exceeds 32 chars. - Remove the package handle of the '/options' node from the argument list of uart_cpu_getdev_dbgport() as it's unused there and future use is also unlikely. MFC after: 1 week
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/sparc64/loader/metadata.c58
1 files changed, 41 insertions, 17 deletions
diff --git a/sys/boot/sparc64/loader/metadata.c b/sys/boot/sparc64/loader/metadata.c
index 0694b08..3fe7677 100644
--- a/sys/boot/sparc64/loader/metadata.c
+++ b/sys/boot/sparc64/loader/metadata.c
@@ -45,6 +45,8 @@ extern struct tlb_entry *itlb_store;
extern int dtlb_slot;
extern int itlb_slot;
+static int md_bootserial(void);
+
/*
* Return a 'boothowto' value corresponding to the kernel arguments in
* (kargs) and any relevant environment variables.
@@ -68,8 +70,6 @@ static struct
int
md_getboothowto(char *kargs)
{
- char buf[32], buf2[32];
- phandle_t options;
char *cp;
int howto;
int active;
@@ -126,25 +126,49 @@ md_getboothowto(char *kargs)
for (i = 0; howto_names[i].ev != NULL; i++)
if (getenv(howto_names[i].ev) != NULL)
howto |= howto_names[i].mask;
- options = OF_finddevice("/options");
- OF_getprop(options, "input-device", buf, sizeof(buf));
- OF_getprop(options, "output-device", buf2, sizeof(buf2));
- if (strncmp(buf, "tty", sizeof("tty") - 1) == 0 && strncmp(buf2, "tty",
- sizeof("tty") - 1) == 0)
+ if (md_bootserial() != -1)
howto |= RB_SERIAL;
- else if (strcmp(buf, "keyboard") == 0 && strcmp(buf2, "screen") == 0) {
- phandle_t chosen;
- ihandle_t stdin, stdout;
-
- chosen = OF_finddevice("/chosen");
- OF_getprop(chosen, "stdin", &stdin, sizeof(stdin));
- OF_getprop(chosen, "stdout", &stdout, sizeof(stdout));
- if (OF_instance_to_package(stdin) == OF_instance_to_package(stdout))
- howto |= RB_SERIAL;
- }
return(howto);
}
+static int
+md_bootserial(void)
+{
+ char buf[64];
+ ihandle_t inst;
+ phandle_t input;
+ phandle_t node;
+ phandle_t output;
+
+ if ((node = OF_finddevice("/options")) == -1)
+ return(-1);
+ if (OF_getprop(node, "input-device", buf, sizeof(buf)) == -1)
+ return(-1);
+ input = OF_finddevice(buf);
+ if (OF_getprop(node, "output-device", buf, sizeof(buf)) == -1)
+ return(-1);
+ output = OF_finddevice(buf);
+ if (input == -1 || output == -1 || OF_getproplen(input, "keyboard") >= 0) {
+ if ((node = OF_finddevice("/chosen")) == -1)
+ return(-1);
+ if (OF_getprop(node, "stdin", &inst, sizeof(inst)) == -1)
+ return(-1);
+ if ((input = OF_instance_to_package(inst)) == -1)
+ return(-1);
+ if (OF_getprop(node, "stdout", &inst, sizeof(inst)) == -1)
+ return(-1);
+ if ((output = OF_instance_to_package(inst)) == -1)
+ return(-1);
+ }
+ if (input != output)
+ return(-1);
+ if (OF_getprop(input, "device_type", buf, sizeof(buf)) == -1)
+ return(-1);
+ if (strcmp(buf, "serial") != 0)
+ return(-1);
+ return(0);
+}
+
/*
* Copy the environment into the load area starting at (addr).
* Each variable is formatted as <name>=<value>, with a single nul
OpenPOWER on IntegriCloud