kernel - Update loader.conf documentation and add sio comconsole unit specifier
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 15 Dec 2011 01:12:51 +0000 (17:12 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 15 Dec 2011 01:12:51 +0000 (17:12 -0800)
* Update the loader.conf documentation to describe how the boot loader and
  kernel can use a serial port and baud rate other than the default for
  comconsole.

  Also describe how to recompile the boot loader.

  Describe how IPMI can be tied into the boot loader and kernel via
  the built-in fake serial port in the BMC (often COM2).

* Add a kenv feature to allow the sioN.flags to be specified in loader.conf.
  This allows the comconsole to be moved to e.g. sio1 without having
  to recompile the kernel.

share/man/man5/loader.conf.5
sys/kern/subr_bus.c

index f814ad6..f4f81d3 100644 (file)
@@ -167,6 +167,28 @@ selects the video console, and
 .Dq nullconsole
 selects a mute console
 (useful for systems with neither a video console nor a serial port).
+.Pp
+When using a comconsole the kernel defaults to allowing a console on sio0.
+To change this to sio1 you must specify
+.Va sio0.flags=0
+and
+.Va sio1.flags=0x10
+in addition to setting the console to the comconsole.
+.Pp
+If you want the boot code to be available on COM2 at 57600 baud instead
+of COM1, for example, you must set the variables
+.Va BOOT_COMCONSOLE_PORT=0x2f8
+and
+.Va BOOT_COMCONSOLE_SPEED=57600
+in
+.Pa /etc/make.conf
+and recompile and install the boot code at
+.Pa /usr/src/sys/boot ,
+then install the bootcode to the partition via
+.Xr disklabel 8 .
+.Pp
+Note that in comconsole mode the kernel will pick up the baud rate
+from the boot loader, so no kernel recompile is needed.
 .It Va fred_disable
 .Pq Dq NO
 Shows a monochrome version of Fred, the official
@@ -218,6 +240,19 @@ If set to
 the vesa module will be loaded, enabling bitmaps above VGA resolution to
 be displayed.
 .El
+.Sh IPMI
+Generally speaking machines with IPMI capabilities are capable of
+redirecting the BIOS POST to a fake serial port controlled by the BMC.
+It is then possible to use
+.Xr ipmitool 1
+from pkgsrc to access the console.
+DragonFly kernels adjust the video mode in a way that the BMC cannot usually
+redirect, so your best bet is to set the boot loader AND the kernel up to
+use a serial port via the
+.Va console=comconsole
+feature described above.
+Often the IPMI controller, called the BMC, is not sitting on COM1 so
+DragonFly's default console parameters and baud rate will not work.
 .Sh FILES
 .Bl -tag -width ".Pa /boot/defaults/dloader.menu" -compact
 .It Pa /boot/defaults/dloader.menu
index f0f244c..b9c3fdf 100644 (file)
@@ -1900,12 +1900,31 @@ resource_find(const char *name, int unit, const char *resname,
        return(ENOENT);
 }
 
+static int
+resource_kenv(const char *name, int unit, const char *resname, long *result)
+{
+       const char *env;
+       char buf[64];
+
+       ksnprintf(buf, sizeof(buf), "%s%d.%s", name, unit, resname);
+       if ((env = kgetenv(buf)) != NULL) {
+               *result = strtol(env, NULL, 0);
+               return(0);
+       }
+       return (ENOENT);
+}
+
 int
 resource_int_value(const char *name, int unit, const char *resname, int *result)
 {
-       int error;
        struct config_resource *res;
+       long kvalue = 0;
+       int error;
 
+       if (resource_kenv(name, unit, resname, &kvalue) == 0) {
+               *result = (int)kvalue;
+               return 0;
+       }
        if ((error = resource_find(name, unit, resname, &res)) != 0)
                return(error);
        if (res->type != RES_INT)
@@ -1918,9 +1937,14 @@ int
 resource_long_value(const char *name, int unit, const char *resname,
                    long *result)
 {
-       int error;
        struct config_resource *res;
+       long kvalue;
+       int error;
 
+       if (resource_kenv(name, unit, resname, &kvalue) == 0) {
+               *result = (long)kvalue;
+               return 0;
+       }
        if ((error = resource_find(name, unit, resname, &res)) != 0)
                return(error);
        if (res->type != RES_LONG)