]> Joshua Wise's Git repositories - netwatch.git/commitdiff
Merge branch 'master' of /storage/git/netwatch
authorJacob Potter <jdpotter@andrew.cmu.edu>
Sat, 13 Sep 2008 23:56:41 +0000 (19:56 -0400)
committerJacob Potter <jdpotter@andrew.cmu.edu>
Sat, 13 Sep 2008 23:56:41 +0000 (19:56 -0400)
grubload/multiboot_asm.S
grubload/multiboot_c.c
tools/Makefile
tools/port.c [new file with mode: 0644]

index 77eb4e08750b989c28dfcd9bcc4a835356fba5a2..1ee6ba29ebd288d823ab2fa0ad2cdc1bc02a3017 100644 (file)
@@ -16,6 +16,7 @@ multiboot_entry:
        call c_start
 hang:  jmp hang
 
+       .section .bss
        .align 4
 _stack:
        .space 16384
index 50aca06e665d2e2abb9a5f13fa845640cd9e45ac..890a003471db280f15a6941821a9d2c04e81b265 100644 (file)
@@ -31,9 +31,17 @@ struct info_section
        void (*firstrun)();
 };
 
-void c_start(unsigned int magic, struct mb_info *info)
+void panic(const char *msg)
 {
-       struct mod_info *mods = info->mods;
+       puts("PANIC: ");
+       puts(msg);
+       puts("\nSystem halted\n");
+       while(1) asm("hlt");
+}
+
+void c_start(unsigned int magic, struct mb_info *mbinfo)
+{
+       struct mod_info *mods = mbinfo->mods;
        unsigned short *grubptr = (unsigned short *)0x7CFE;
        unsigned char smramc;
        int i;
@@ -44,12 +52,9 @@ void c_start(unsigned int magic, struct mb_info *info)
        puts("NetWatch loader\n");
        
        if (magic != 0x2BADB002)
-       {
-               puts("Bootloader was not multiboot compliant; cannot continue.\n");
-               while(1) asm("hlt");
-       }
+               panic("Bootloader was not multiboot compliant; cannot continue.");
        
-       for (i = 0; i < info->mod_cnt; i++)
+       for (i = 0; i < mbinfo->mod_cnt; i++)
        {
                puts("Module found:\n");
                puts("  Start: "); puthex(mods[i].mod_start); puts("\n");
@@ -57,11 +62,8 @@ void c_start(unsigned int magic, struct mb_info *info)
                puts("  Name: "); puts(mods[i].mod_string); puts("\n");
        }
 
-       if (info->mod_cnt != 1)
-       {
-               puts("Expected exactly one module; cannot continue.\n");
-               while(1) asm("hlt");
-       }
+       if (mbinfo->mod_cnt != 1)
+               panic("Expected exactly one module; cannot continue.");
 
        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");
@@ -80,25 +82,20 @@ void c_start(unsigned int magic, struct mb_info *info)
        smram_state_t old_smramc = smram_save_state();
 
        if (smram_aseg_set_state(SMRAM_ASEG_OPEN) != 0)
+               panic("Opening SMRAM failed; cannot load ELF.");
+
+       load_elf(mods[0].mod_start, mods[0].mod_end - mods[0].mod_start);
+
+       struct info_section * info = (struct info_section *)0x10000;
+       if (info->signature != INFO_SIGNATURE)
        {
-               puts("Opening SMRAM failed; cannot load ELF.\n");
-       }
-       else
-       {
-               load_elf(mods[0].mod_start, mods[0].mod_end - mods[0].mod_start);
-
-               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);
-               }
+               smram_restore_state(old_smramc);                /* Restore so that video ram is touchable again. */
+               panic("Info section signature mismatch.");
        }
 
+       info->firstrun();
+       smram_restore_state(old_smramc);
+
        puts("Waiting for a bit before returning to real mode...");
        for (i=0; i<0x500000; i++)
        {
index 1cd4d812ef0b34cdc78a231996164d415504abff..7402d797f6adfd47640927cfcea6687aa9fc4347 100644 (file)
@@ -1,9 +1,17 @@
 CFLAGS=-I../include
 CC=gcc
-SMRAM_ICH2_OBJS=smram-linux-tool.o ../pci/pci-linux.o ../ich2/smram-ich2.o
+SMRAM_ICH2_OBJS=smram-linux-tool.o ../pci/pci-linux.o ../ich2/smram-ich2.noraw.o
+
+all: smram-ich2 port
+
+%.noraw.o: %.c
+       gcc $(CFLAGS) -c -o $@ $<
 
 smram-ich2: $(SMRAM_ICH2_OBJS)
-       gcc -o smram-ich2 $(SMRAM_ICH2_OBJS)
+       gcc $(CFLAGS) -o smram-ich2 $(SMRAM_ICH2_OBJS)
+
+port: port.o
+       gcc -o port port.o
 
 clean:
        rm -f $(SMRAM_ICH2_OBJS) smram-ich2
diff --git a/tools/port.c b/tools/port.c
new file mode 100644 (file)
index 0000000..c939913
--- /dev/null
@@ -0,0 +1,69 @@
+#include <sys/io.h>
+#include <string.h>
+
+int main(int argc, char **argv)
+{
+       unsigned int port;
+       unsigned char type = 'b';
+       unsigned int datum;
+       
+       if (iopl(3) < 0)
+       {
+               perror("iopl");
+               return 1;
+       }
+       
+       if ((argc < 2) || (argc > 4))
+       {
+       usage:
+               printf("usage: %s port [b|w|l [datum]]\n", argv[0]);
+               return 2;
+       }
+       
+       port = strtoul(argv[1], NULL, 0);
+       
+       if (argc > 2)
+               type = *argv[2];
+       
+       if (argc > 3)
+       {
+               datum = strtoul(argv[3], NULL, 0);
+               switch (type)
+               {
+               case 'b':
+                       datum &= 0xFF;
+                       outb(datum, port);
+                       printf("Wrote byte 0x%02x to port 0x%04x\n", datum, port);
+                       break;
+               case 'w':
+                       datum &= 0xFFFF;
+                       outw(datum, port);
+                       printf("Wrote word 0x%04x to port 0x%04x\n", datum, port);
+                       break;
+               case 'l':
+                       outb(datum, port);
+                       printf("Wrote long 0x%08x to port 0x%04x\n", datum, port);
+                       break;
+               default:
+                       goto usage;
+               }
+       } else {
+               switch(type)
+               {
+               case 'b':
+                       datum = inb(port);
+                       printf("Read byte 0x%02x from port 0x%04x\n", datum, port);
+                       break;
+               case 'w':
+                       datum = inw(port);
+                       printf("Read word 0x%04x from port 0x%04x\n", datum, port);
+                       break;
+               case 'l':
+                       datum = inl(port);
+                       printf("Read long 0x%08x from port 0x%04x\n", datum, port);
+                       break;
+               default:
+                       goto usage;
+               }
+       }
+}
This page took 0.031272 seconds and 4 git commands to generate.