unsigned char *bp;
 
        outb(0x80, 0x41);
-       char * pagedir = pt_setup(0xA0000, 0x1FF80000, 0x80000);
-       outb(0x80, 0x43);
-       set_cr3((int)pagedir);
-       outb(0x80, 0xA5);
-
-       /* Turn paging on */
+       if (!entry_initialized)
+               pt_setup(0xA0000, 0x1FF80000, 0x80000);
+               
+       /* Enable paging. */
+       outb(0x80, 0x42);
+       set_cr3(0x1FF80000);
        set_cr0(get_cr0() | CR0_PG);
-       serial_init();
-       serial_tx('A');
-       outb(0x80, 0xAA);
-
        
+       outb(0x80, 0x43);
        if (!entry_initialized) {
-               serial_tx('B');
-               outb(0x80, 0xAB);
+               extern void __firstrun_start();
+               
+               /* If needed, copy in data. */
                for (bp = (void *)0x200000; (void *)bp < (void *)&_bss; bp++)
                        *bp = *(bp + 0x100000);
                for (bp = (void *)&_bss; (void *)bp < (void *)&_bssend; bp++)
                        *bp = 0;
+               serial_init();
+               dolog("Paging enabled.");
+               __firstrun_start();     /* Now initialize BSS, etc. */
+               
+               entry_initialized = 1;
        }
 
-       outb(0x80, 0xAC);
-       ps_switch_stack(smi_entry, 0x2FF000);
+       outb(0x80, 0x44);
+       ps_switch_stack(smi_entry, 0x270000);
        outb(0x80, 0xFA);
 }
 
 #include <minilib.h>
 #include <smi.h>
 #include <pci-bother.h>
+#include <serial.h>
 #include "../net/net.h"
 #include "vga-overlay.h"
 
        strblit(statstr, 0, 0);
        outb(0x80, 0x4B);
        
+       serial_init();
+       dolog("wee!");
+       
        /*
        eth_poll();
        */
                outl(0x840, 0x0100);
        }
 
-/*
+
        smi_poll();
-       
+/*     
        pci_bother_all();
  */
        outl(0xCF8, pcisave);
 
 
 void __firstrun_start() {
+       smram_state_t smram;
+       
+       smram = smram_save_state();
+       smram_tseg_set_state(SMRAM_TSEG_OPEN);
        smi_disable();
        outb(0x80, 0x41);
 
 
        prodptr = (prodptr + 1) % LOGLEN;
        while (*s)
                serial_tx(*(s++));
+       serial_tx('\r');
+       serial_tx('\n');
        if (flush_imm)
                outlog();
 }
 
 void dologf(const char *fmt, ...)
 {
+       char *s;
+       va_list va;
+       
+       va_start(va, fmt);
+       vsnprintf(logents[prodptr], 40, fmt, va);
+       s = logents[prodptr];
+       while (*s)
+               serial_tx(*(s++));
+       serial_tx('\r');
+       serial_tx('\n');
+       va_end(va);
+       prodptr = (prodptr + 1) % LOGLEN;
+       if (flush_imm)
+               outlog();
 }
 void (*outputf)(const char *s, ...) = dologf;
 
 
 
 void serial_tx(unsigned char c)
 {
-       while (!(_inb(SER_LSR) & SER_LSR_THR_EMPTY))
+       int i = 100000;
+       
+       while (!(_inb(SER_LSR) & SER_LSR_THR_EMPTY) && (i--))
                ;
        _outb(SER_THR, c);
 }