Page MenuHomeFreeBSD

D16463.diff
No OneTemporary

D16463.diff

Index: head/stand/efi/loader/bootinfo.c
===================================================================
--- head/stand/efi/loader/bootinfo.c
+++ head/stand/efi/loader/bootinfo.c
@@ -82,10 +82,13 @@
howto |= RB_SERIAL;
if (strcmp(console, "nullconsole") == 0)
howto |= RB_MUTE;
- if (strcmp(console, "efi") == 0) {
+#if defined(__i386__) || defined(__amd64__)
+ if (strcmp(console, "efi") == 0 &&
+ getenv("efi_8250_uid") != NULL &&
+ getenv("hw.uart.console") == NULL) {
/*
- * If we found a com port and com speed, we need to tell
- * the kernel where the serial port is, and how
+ * If we found a 8250 com port and com speed, we need to
+ * tell the kernel where the serial port is, and how
* fast. Ideally, we'd get the port from ACPI, but that
* isn't running in the loader. Do the next best thing
* by allowing it to be set by a loader.conf variable,
@@ -93,24 +96,31 @@
* comconsole_port if not. PCI support is needed, but
* for that we'd ideally refactor the
* libi386/comconsole.c code to have identical behavior.
+ * We only try to set the port for cases where we saw
+ * the Serial(x) node when parsing, otherwise
+ * specialized hardware that has Uart nodes will have a
+ * bogus address set.
+ * But if someone specifically setup hw.uart.console,
+ * don't override that.
*/
+ speed = -1;
+ port = -1;
tmp = getenv("efi_com_speed");
- if (tmp != NULL) {
+ if (tmp != NULL)
speed = strtol(tmp, NULL, 0);
- tmp = getenv("efi_com_port");
- if (tmp == NULL)
- tmp = getenv("comconsole_port");
- /* XXX fallback to EFI variable set in rc.d? */
- if (tmp != NULL)
- port = strtol(tmp, NULL, 0);
- else
- port = 0x3f8;
+ tmp = getenv("efi_com_port");
+ if (tmp == NULL)
+ tmp = getenv("comconsole_port");
+ if (tmp != NULL)
+ port = strtol(tmp, NULL, 0);
+ if (speed != -1 && port != -1) {
snprintf(buf, sizeof(buf), "io:%d,br:%d", port,
speed);
env_setenv("hw.uart.console", EV_VOLATILE, buf,
NULL, NULL);
}
}
+#endif
}
return (howto);
Index: head/stand/efi/loader/main.c
===================================================================
--- head/stand/efi/loader/main.c
+++ head/stand/efi/loader/main.c
@@ -644,6 +644,15 @@
return (howto);
}
+static void
+setenv_int(const char *key, int val)
+{
+ char buf[20];
+
+ snprintf(buf, sizeof(buf), "%d", val);
+ setenv(key, buf, 1);
+}
+
/*
* Parse ConOut (the list of consoles active) and see if we can find a
* serial port and/or a video port. It would be nice to also walk the
@@ -675,15 +684,15 @@
DevicePathSubType(node) == ACPI_DP) {
/* Check for Serial node */
acpi = (void *)node;
- if (EISA_ID_TO_NUM(acpi->HID) == 0x501)
+ if (EISA_ID_TO_NUM(acpi->HID) == 0x501) {
+ setenv_int("efi_8250_uid", acpi->UID);
com_seen = ++seen;
+ }
} else if (DevicePathType(node) == MESSAGING_DEVICE_PATH &&
DevicePathSubType(node) == MSG_UART_DP) {
- char bd[16];
uart = (void *)node;
- snprintf(bd, sizeof(bd), "%d", uart->BaudRate);
- setenv("efi_com_speed", bd, 1);
+ setenv_int("efi_com_speed", uart->BaudRate);
} else if (DevicePathType(node) == ACPI_DEVICE_PATH &&
DevicePathSubType(node) == ACPI_ADR_DP) {
/* Check for AcpiAdr() Node for video */

File Metadata

Mime Type
text/plain
Expires
Wed, Mar 11, 11:53 PM (10 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29536837
Default Alt Text
D16463.diff (3 KB)

Event Timeline