Init serial port before using it for debug - also reinit after option rom.
authorKevin O'Connor <kevin@koconnor.net>
Sat, 21 Jun 2008 16:15:10 +0000 (12:15 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Sat, 21 Jun 2008 16:15:10 +0000 (12:15 -0400)
Apparently, some VGA option roms will enable serial irqs - this could
    cause problems with spurious irqs from debug messages.
Also, improve debugging of option roms that fail the checksum check.

src/boot.c
src/output.c
src/post.c
src/util.h

index 09d28e8a9ae43416be357ed65a1bd2e44bcbbc63..3ee957bf94e4f9fc64f4de1457cfa560521b8d52 100644 (file)
@@ -200,6 +200,7 @@ do_boot(u16 seq_nr)
 void VISIBLE16
 handle_18()
 {
+    debug_serial_setup();
     debug_enter(NULL, DEBUG_HDL_18);
     u16 seq = GET_EBDA(ipl.sequence) + 1;
     do_boot(seq);
@@ -209,6 +210,7 @@ handle_18()
 void VISIBLE16
 handle_19()
 {
+    debug_serial_setup();
     debug_enter(NULL, DEBUG_HDL_19);
     do_boot(0);
 }
index 054082facaddbd64b48bca4e038656ce4c602eca..dd647a26e63f4cb0e68ad71b28f79140b388efb3 100644 (file)
 #define DEBUG_PORT 0x03f8
 #define DEBUG_TIMEOUT 100000
 
+void
+debug_serial_setup()
+{
+    if (!CONFIG_DEBUG_SERIAL)
+        return;
+    // setup for serial logging: 8N1
+    u8 oldparam, newparam = 0x03;
+    oldparam = inb(DEBUG_PORT+3);
+    outb(newparam, DEBUG_PORT+3);
+    // Disable irqs
+    u8 oldier, newier = 0;
+    oldier = inb(DEBUG_PORT+1);
+    outb(newier, DEBUG_PORT+1);
+
+    if (oldparam != newparam || oldier != newier)
+        dprintf(1, "Changing serial settings was %x/%x now %x/%x\n"
+                , oldparam, oldier, newparam, newier);
+}
+
 static void
 debug_serial(char c)
 {
index ca1d2232b874f2dc07904e699112134336ae5e94..1b26e2b41158d84ccf10806727ebb4da1627527a 100644 (file)
@@ -156,6 +156,8 @@ callrom(u16 seg, u16 offset)
     br.cs = seg;
     br.ip = offset;
     call16(&br);
+
+    debug_serial_setup();
 }
 
 // Find and run any "option roms" found in the given address range.
@@ -168,8 +170,13 @@ rom_scan(u32 start, u32 end)
         if (*(u16*)rom != 0xaa55)
             continue;
         u32 len = rom[2] * 512;
-        if (checksum(rom, len) != 0)
+        u8 sum = checksum(rom, len);
+        if (sum != 0) {
+            dprintf(1, "Found option rom with bad checksum:"
+                    " loc=%p len=%d sum=%x\n"
+                    , rom, len, sum);
             continue;
+        }
         p = (u8*)(((u32)p + len) / 2048 * 2048);
         dprintf(1, "Running option rom at %p\n", rom+3);
         callrom(FARPTR_TO_SEG(rom), FARPTR_TO_OFFSET(rom + 3));
@@ -300,6 +307,7 @@ _start()
     init_dma();
     check_restart_status();
 
+    debug_serial_setup();
     dprintf(1, "Start bios\n");
 
     // Setup for .bss and .data sections
index ee42f6c29dba31bacdf89b8132d958d27b2de226..30c396aa943c518605955fd149cb46b35c04db9c 100644 (file)
@@ -92,6 +92,7 @@ void __call16_int(struct bregs *callregs, u16 offset)
 #endif
 
 // output.c
+void debug_serial_setup();
 void BX_PANIC(const char *fmt, ...)
     __attribute__ ((format (printf, 1, 2)))
     __attribute__ ((noreturn));