Add some early serial console debugging support to the loader. This is all
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 26 Jun 2004 02:26:22 +0000 (02:26 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 26 Jun 2004 02:26:22 +0000 (02:26 +0000)
#ifdef'd out and has no impact on normal builds.

sys/boot/common/console.c
sys/boot/i386/libi386/biosmem.c
sys/boot/i386/loader/main.c
sys/boot/pc32/libi386/biosmem.c
sys/boot/pc32/loader/main.c

index 75736a8..34e6abc 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/boot/common/console.c,v 1.6 2003/08/25 23:30:41 obrien Exp $
- * $DragonFly: src/sys/boot/common/console.c,v 1.4 2004/06/25 05:37:57 dillon Exp $
+ * $DragonFly: src/sys/boot/common/console.c,v 1.5 2004/06/26 02:26:20 dillon Exp $
  */
 
 #include <stand.h>
@@ -123,11 +123,52 @@ ischar(void)
     return(0);
 }
 
+#ifdef COMCONSOLE_DEBUG
+
+static int
+isa_inb(int port)
+{
+    u_char      data;
+
+    if (__builtin_constant_p(port) &&
+        (((port) & 0xffff) < 0x100) &&
+        ((port) < 0x10000)) {
+        __asm __volatile("inb %1,%0" : "=a" (data) : "id" ((u_short)(port)));
+    } else {
+        __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port));
+    }
+    return(data);
+}
+
+static void
+isa_outb(int port, int value)
+{
+    u_char      al = value;
+
+    if (__builtin_constant_p(port) &&
+        (((port) & 0xffff) < 0x100) &&
+        ((port) < 0x10000)) {
+        __asm __volatile("outb %0,%1" : : "a" (al), "id" ((u_short)(port)));
+    } else {
+        __asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port));
+    }
+}
+
+#endif
+
 void
 putchar(int c)
 {
     int                cons;
     
+#ifdef COMCONSOLE_DEBUG
+    if ((consoles[1]->c_flags & C_ACTIVEOUT) == 0) {
+       while ((isa_inb(0x3f8+5) & 0x20) == 0)  /* wait tx ready */
+           ;
+       isa_outb(0x3f8, c);                             /* output */
+    }
+#endif
+
     /* Expand newlines */
     if (c == '\n')
        putchar('\r');
index beec4a8..029d14f 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/boot/i386/libi386/biosmem.c,v 1.7 2003/08/25 23:28:31 obrien Exp $
- * $DragonFly: src/sys/boot/i386/libi386/Attic/biosmem.c,v 1.3 2003/11/10 06:08:36 dillon Exp $
+ * $DragonFly: src/sys/boot/i386/libi386/Attic/biosmem.c,v 1.4 2004/06/26 02:26:22 dillon Exp $
  */
 /*
  * Obtain memory configuration information from the BIOS
@@ -34,7 +34,7 @@
 #include "btxv86.h"
 
 vm_offset_t    memtop;
-u_int32_t      bios_basemem, bios_extmem;
+u_int32_t      bios_basemem, bios_extmem, bios_howmem;
 
 #define SMAPSIG        0x534D4150
 
@@ -53,6 +53,9 @@ bios_getmem(void)
     /* Parse system memory map */
     v86.ebx = 0;
     do {
+#ifdef COMCONSOLE_DEBUG
+       printf("GET SMAP %d: ", v86.ebx);
+#endif
        v86.ctl = V86_FLAGS;
        v86.addr = 0x15;                /* int 0x15 function 0xe820*/
        v86.eax = 0xe820;
@@ -61,11 +64,19 @@ bios_getmem(void)
        v86.es = VTOPSEG(&smap);
        v86.edi = VTOPOFF(&smap);
        v86int();
+#ifdef COMCONSOLE_DEBUG
+       printf("RESULT: EFL=%04x EAX=%08x SMAPTYPE %d BASE %08x%08x LEN %08x%08x\n",
+               v86.efl, v86.eax, smap.type,
+               (int)(smap.base >> 32), (int)smap.base,
+               (int)(smap.length >> 32), (int)smap.length);
+#endif
        if ((v86.efl & 1) || (v86.eax != SMAPSIG))
            break;
        /* look for a low-memory segment that's large enough */
-       if ((smap.type == 1) && (smap.base == 0) && (smap.length >= (512 * 1024)))
+       if ((smap.type == 1) && (smap.base == 0) && (smap.length >= (512 * 1024))) {
            bios_basemem = smap.length;
+           bios_howmem = 1;
+       }
        /* look for the first segment in 'extended' memory */
        if ((smap.type == 1) && (smap.base == 0x100000)) {
            bios_extmem = smap.length;
@@ -79,6 +90,7 @@ bios_getmem(void)
        v86int();
        
        bios_basemem = (v86.eax & 0xffff) * 1024;
+       bios_howmem = 2;
     }
 
     /* Fall back through several compatibility functions for extended memory */
index 7ba252b..9e2dc40 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/boot/i386/loader/main.c,v 1.28 2003/08/25 23:28:32 obrien Exp $
- * $DragonFly: src/sys/boot/i386/loader/Attic/main.c,v 1.3 2003/11/10 06:08:36 dillon Exp $
+ * $DragonFly: src/sys/boot/i386/loader/Attic/main.c,v 1.4 2004/06/26 02:26:21 dillon Exp $
  */
 
 /*
@@ -72,32 +72,73 @@ extern      char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[];
 /* XXX debugging */
 extern char end[];
 
+#ifdef COMCONSOLE_DEBUG
+
+static void
+WDEBUG_INIT(void)
+{
+    isa_outb(0x3f8+3, 0x83);   /* DLAB + 8N1 */
+    isa_outb(0x3f8+0, (115200 / 9600) & 0xFF);
+    isa_outb(0x3f8+1, (115200 / 9600) >> 8);
+    isa_outb(0x3f8+3, 0x03);   /* 8N1 */
+    isa_outb(0x3f8+4, 0x03);   /* RTS+DTR */
+    isa_outb(0x3f8+2, 0x01);   /* FIFO_ENABLE */
+}
+
+static void
+WDEBUG(char c)
+{
+    isa_outb(0x3f8, c);
+}
+
+#else
+
+#define WDEBUG(x)
+#define WDEBUG_INIT()
+
+#endif
+
 int
 main(void)
 {
     int                        i;
 
+    WDEBUG_INIT();
+    WDEBUG('X');
+
     /* Pick up arguments */
     kargs = (void *)__args;
     initial_howto = kargs->howto;
     initial_bootdev = kargs->bootdev;
     initial_bootinfo = kargs->bootinfo ? (struct bootinfo *)PTOV(kargs->bootinfo) : NULL;
 
+#ifdef COMCONSOLE_DEBUG
+    printf("args at %p initial_howto = %08x bootdev = %08x bootinfo = %p\n", 
+       kargs, initial_howto, initial_bootdev, initial_bootinfo);
+#endif
+
     /* 
-     * Initialise the heap as early as possible.  Once this is done, malloc() is usable.
+     * Initialize the heap as early as possible.  Once this is done, 
+     * malloc() is usable.
      */
     bios_getmem();
+#if 0  /* FUTURE */
+    if (bios_basemem > 0x9f000)
+       bios_basemem = 0x9f000;
+#endif
 
     setheap((void *)end, (void *)bios_basemem);
 
     /* 
-     * XXX Chicken-and-egg problem; we want to have console output early, but some
-     * console attributes may depend on reading from eg. the boot device, which we
-     * can't do yet.
+     * XXX Chicken-and-egg problem; we want to have console output early, 
+     * but some console attributes may depend on reading from eg. the boot
+     * device, which we can't do yet.
      *
      * We can use printf() etc. once this is done.
      * If the previous boot stage has requested a serial console, prefer that.
      */
+    if (initial_howto & RB_VIDEO)
+       setenv("console", "vidconsole", 1);
     if (initial_howto & RB_SERIAL)
        setenv("console", "comconsole", 1);
     if (initial_howto & RB_MUTE)
@@ -126,10 +167,13 @@ main(void)
     /*
      * March through the device switch probing for things.
      */
-    for (i = 0; devsw[i] != NULL; i++)
+    for (i = 0; devsw[i] != NULL; i++) {
+       WDEBUG('M' + i);
        if (devsw[i]->dv_init != NULL)
            (devsw[i]->dv_init)();
-    printf("BIOS %dkB/%dkB available memory\n", bios_basemem / 1024, bios_extmem / 1024);
+       WDEBUG('M' + i);
+    }
+    printf("BIOS %dkB/%dkB (method %d) available memory\n", bios_basemem / 1024, bios_extmem / 1024, bios_howmem);
     if (initial_bootinfo != NULL) {
        initial_bootinfo->bi_basemem = bios_basemem / 1024;
        initial_bootinfo->bi_extmem = bios_extmem / 1024;
index 5b4e516..42b06d1 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/boot/i386/libi386/biosmem.c,v 1.7 2003/08/25 23:28:31 obrien Exp $
- * $DragonFly: src/sys/boot/pc32/libi386/biosmem.c,v 1.3 2003/11/10 06:08:36 dillon Exp $
+ * $DragonFly: src/sys/boot/pc32/libi386/biosmem.c,v 1.4 2004/06/26 02:26:22 dillon Exp $
  */
 /*
  * Obtain memory configuration information from the BIOS
@@ -34,7 +34,7 @@
 #include "btxv86.h"
 
 vm_offset_t    memtop;
-u_int32_t      bios_basemem, bios_extmem;
+u_int32_t      bios_basemem, bios_extmem, bios_howmem;
 
 #define SMAPSIG        0x534D4150
 
@@ -53,6 +53,9 @@ bios_getmem(void)
     /* Parse system memory map */
     v86.ebx = 0;
     do {
+#ifdef COMCONSOLE_DEBUG
+       printf("GET SMAP %d: ", v86.ebx);
+#endif
        v86.ctl = V86_FLAGS;
        v86.addr = 0x15;                /* int 0x15 function 0xe820*/
        v86.eax = 0xe820;
@@ -61,11 +64,19 @@ bios_getmem(void)
        v86.es = VTOPSEG(&smap);
        v86.edi = VTOPOFF(&smap);
        v86int();
+#ifdef COMCONSOLE_DEBUG
+       printf("RESULT: EFL=%04x EAX=%08x SMAPTYPE %d BASE %08x%08x LEN %08x%08x\n",
+               v86.efl, v86.eax, smap.type,
+               (int)(smap.base >> 32), (int)smap.base,
+               (int)(smap.length >> 32), (int)smap.length);
+#endif
        if ((v86.efl & 1) || (v86.eax != SMAPSIG))
            break;
        /* look for a low-memory segment that's large enough */
-       if ((smap.type == 1) && (smap.base == 0) && (smap.length >= (512 * 1024)))
+       if ((smap.type == 1) && (smap.base == 0) && (smap.length >= (512 * 1024))) {
            bios_basemem = smap.length;
+           bios_howmem = 1;
+       }
        /* look for the first segment in 'extended' memory */
        if ((smap.type == 1) && (smap.base == 0x100000)) {
            bios_extmem = smap.length;
@@ -79,6 +90,7 @@ bios_getmem(void)
        v86int();
        
        bios_basemem = (v86.eax & 0xffff) * 1024;
+       bios_howmem = 2;
     }
 
     /* Fall back through several compatibility functions for extended memory */
index 028dc58..4d0241a 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/boot/i386/loader/main.c,v 1.28 2003/08/25 23:28:32 obrien Exp $
- * $DragonFly: src/sys/boot/pc32/loader/main.c,v 1.3 2003/11/10 06:08:36 dillon Exp $
+ * $DragonFly: src/sys/boot/pc32/loader/main.c,v 1.4 2004/06/26 02:26:21 dillon Exp $
  */
 
 /*
@@ -72,32 +72,73 @@ extern      char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[];
 /* XXX debugging */
 extern char end[];
 
+#ifdef COMCONSOLE_DEBUG
+
+static void
+WDEBUG_INIT(void)
+{
+    isa_outb(0x3f8+3, 0x83);   /* DLAB + 8N1 */
+    isa_outb(0x3f8+0, (115200 / 9600) & 0xFF);
+    isa_outb(0x3f8+1, (115200 / 9600) >> 8);
+    isa_outb(0x3f8+3, 0x03);   /* 8N1 */
+    isa_outb(0x3f8+4, 0x03);   /* RTS+DTR */
+    isa_outb(0x3f8+2, 0x01);   /* FIFO_ENABLE */
+}
+
+static void
+WDEBUG(char c)
+{
+    isa_outb(0x3f8, c);
+}
+
+#else
+
+#define WDEBUG(x)
+#define WDEBUG_INIT()
+
+#endif
+
 int
 main(void)
 {
     int                        i;
 
+    WDEBUG_INIT();
+    WDEBUG('X');
+
     /* Pick up arguments */
     kargs = (void *)__args;
     initial_howto = kargs->howto;
     initial_bootdev = kargs->bootdev;
     initial_bootinfo = kargs->bootinfo ? (struct bootinfo *)PTOV(kargs->bootinfo) : NULL;
 
+#ifdef COMCONSOLE_DEBUG
+    printf("args at %p initial_howto = %08x bootdev = %08x bootinfo = %p\n", 
+       kargs, initial_howto, initial_bootdev, initial_bootinfo);
+#endif
+
     /* 
-     * Initialise the heap as early as possible.  Once this is done, malloc() is usable.
+     * Initialize the heap as early as possible.  Once this is done, 
+     * malloc() is usable.
      */
     bios_getmem();
+#if 0  /* FUTURE */
+    if (bios_basemem > 0x9f000)
+       bios_basemem = 0x9f000;
+#endif
 
     setheap((void *)end, (void *)bios_basemem);
 
     /* 
-     * XXX Chicken-and-egg problem; we want to have console output early, but some
-     * console attributes may depend on reading from eg. the boot device, which we
-     * can't do yet.
+     * XXX Chicken-and-egg problem; we want to have console output early, 
+     * but some console attributes may depend on reading from eg. the boot
+     * device, which we can't do yet.
      *
      * We can use printf() etc. once this is done.
      * If the previous boot stage has requested a serial console, prefer that.
      */
+    if (initial_howto & RB_VIDEO)
+       setenv("console", "vidconsole", 1);
     if (initial_howto & RB_SERIAL)
        setenv("console", "comconsole", 1);
     if (initial_howto & RB_MUTE)
@@ -126,10 +167,13 @@ main(void)
     /*
      * March through the device switch probing for things.
      */
-    for (i = 0; devsw[i] != NULL; i++)
+    for (i = 0; devsw[i] != NULL; i++) {
+       WDEBUG('M' + i);
        if (devsw[i]->dv_init != NULL)
            (devsw[i]->dv_init)();
-    printf("BIOS %dkB/%dkB available memory\n", bios_basemem / 1024, bios_extmem / 1024);
+       WDEBUG('M' + i);
+    }
+    printf("BIOS %dkB/%dkB (method %d) available memory\n", bios_basemem / 1024, bios_extmem / 1024, bios_howmem);
     if (initial_bootinfo != NULL) {
        initial_bootinfo->bi_basemem = bios_basemem / 1024;
        initial_bootinfo->bi_extmem = bios_extmem / 1024;