CC=gcc
CFLAGS=-I../include -I../include/raw -nostdlib -nostdinc -fno-builtin -D__RAW__
-OBJS=counter.o ../pci/pci-raw.o ../lib/minilib.o ../lib/console.o
+OBJS=counter.o firstrun.o ../pci/pci-raw.o ../lib/minilib.o ../lib/console.o
all: aseg.elf
-aseg.bin: aseg.asm
- nasm -o aseg.bin aseg.asm
-
-aseg.o: aseg.bin
- objcopy -I binary -B i386 -O elf32-i386 aseg.bin aseg.o
-
aseg.elf: aseg.lds aseg.o $(OBJS)
ld -o aseg.elf -T aseg.lds $(OBJS)
clean:
rm -f $(OBJS) aseg.elf aseg.bin aseg.o
+
+
+%.o: %.asm
+ nasm -o $@.bin $<
+ objcopy -I binary -B i386 -O elf32-i386 $@.bin $@
+ rm -f $@.bin
. = ALIGN(0x10);
_stacktop = .;
}
+
+ . = 0x10000;
+ .info : {
+ _start = .;
+ LONG(0x5754454E);
+ LONG(__firstrun_start);
+ }
}
--- /dev/null
+#include <io.h>
+
+void __firstrun_start() {
+/*
+ puts("Current USB state is: ");
+ puthex(pci_read16(0, 31, 2, 0xC0));
+ puts(" ");
+ puthex(pci_read16(0, 31, 4, 0xC0));
+ puts("\n");
+ puts("Current SMI state is: ");
+ puthex(inl(0x830));
+ puts("\n");
+ puts("Current SMRAMC state is: ");
+ puthex(pci_read8(0, 0, 0, 0x70));
+ puts("\n");
+*/
+
+ /* Try really hard to shut up USB_LEGKEY. */
+ pci_write16(0, 31, 2, 0xC0, pci_read16(0, 31, 2, 0xC0));
+ pci_write16(0, 31, 2, 0xC0, 0);
+ pci_write16(0, 31, 4, 0xC0, pci_read16(0, 31, 4, 0xC0));
+ pci_write16(0, 31, 4, 0xC0, 0);
+
+ /* Turn on the SMIs we want */
+ outb(0x830, inb(0x830) | 0x41);
+}
+
#include <io.h>
#include <smram.h>
+#define INFO_SIGNATURE 0x5754454E
+
extern char _binary_realmode_bin_start[];
extern int _binary_realmode_bin_size;
void *reserved;
};
+struct info_section
+{
+ unsigned int signature;
+ void (*firstrun)();
+};
+
void c_start(unsigned int magic, struct mb_info *info)
{
- struct mod_info *mods = mods;
+ struct mod_info *mods = info->mods;
unsigned short *grubptr = (unsigned short *)0x7CFE;
unsigned char smramc;
int i;
else
{
load_elf(mods[0].mod_start, mods[0].mod_end - mods[0].mod_start);
- smram_restore_state(old_smramc);
+
+ struct info_section * info = (struct info_section *)0x10000;
+ if (info->signature != INFO_SIGNATURE)
+ {
+ smram_restore_state(old_smramc);
+ puts("Info section signature mismatch.\n");
+ }
+ else {
+ info->firstrun();
+ smram_restore_state(old_smramc);
+ }
}
- outb(0x830, inb(0x830) | 0x41); /* turn on the SMIs we want */
-
puts("Waiting for a bit before returning to real mode...");
for (i=0; i<0x500000; i++)
{