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);
}