5 #define INFO_SIGNATURE 0x5754454E
 
   7 extern char _binary_realmode_bin_start[];
 
   8 extern int _binary_realmode_bin_size;
 
  13         unsigned long mem_lower, mem_upper;
 
  14         unsigned long boot_dev;
 
  16         unsigned long mod_cnt;
 
  17         struct mod_info *mods;
 
  30         unsigned int signature;
 
  34 void panic(const char *msg)
 
  38         puts("\nSystem halted\n");
 
  42 void c_start(unsigned int magic, struct mb_info *mbinfo)
 
  44         struct mod_info *mods = mbinfo->mods;
 
  45         unsigned short *grubptr = (unsigned short *)0x7CFE;
 
  49         void (*realmode)() = (void (*)()) 0x4000;
 
  52         puts("NetWatch loader\n");
 
  54         if (magic != 0x2BADB002)
 
  55                 panic("Bootloader was not multiboot compliant; cannot continue.");
 
  57         for (i = 0; i < mbinfo->mod_cnt; i++)
 
  59                 puts("Module found:\n");
 
  60                 puts("  Start: "); puthex(mods[i].mod_start); puts("\n");
 
  61                 puts("  Size: "); puthex(mods[i].mod_end - mods[i].mod_start); puts("\n");
 
  62                 puts("  Name: "); puts(mods[i].mod_string); puts("\n");
 
  65         if (mbinfo->mod_cnt != 1)
 
  66                 panic("Expected exactly one module; cannot continue.");
 
  68         puts("Current USB state is: "); puthex(pci_read16(0, 31, 2, 0xC0)); puts(" "); puthex(pci_read16(0, 31, 4, 0xC0)); puts("\n");
 
  69         puts("Current SMI state is: "); puthex(inl(0x830)); puts("\n");
 
  70         puts("Current SMRAMC state is: "); puthex(pci_read8(0, 0, 0, 0x70)); puts("\n");
 
  72         outl(0x830, inl(0x830) & ~0x1); /* turn off SMIs */
 
  74         /* Try really hard to shut up USB_LEGKEY. */
 
  75         pci_write16(0, 31, 2, 0xC0, pci_read16(0, 31, 2, 0xC0));
 
  76         pci_write16(0, 31, 2, 0xC0, 0);
 
  77         pci_write16(0, 31, 4, 0xC0, pci_read16(0, 31, 4, 0xC0));
 
  78         pci_write16(0, 31, 4, 0xC0, 0);
 
  81         /* Open the SMRAM aperture and load our ELF. */
 
  82         smram_state_t old_smramc = smram_save_state();
 
  84         if (smram_aseg_set_state(SMRAM_ASEG_OPEN) != 0)
 
  85                 panic("Opening SMRAM failed; cannot load ELF.");
 
  87         load_elf(mods[0].mod_start, mods[0].mod_end - mods[0].mod_start);
 
  89         struct info_section * info = (struct info_section *)0x10000;
 
  90         if (info->signature != INFO_SIGNATURE)
 
  92                 smram_restore_state(old_smramc);                /* Restore so that video ram is touchable again. */
 
  93                 panic("Info section signature mismatch.");
 
  97         smram_restore_state(old_smramc);
 
  99         puts("Waiting for a bit before returning to real mode...");
 
 100         for (i=0; i<0x500000; i++)
 
 102                 if ((i % 0x100000) == 0)
 
 108         puts("Now returning to real mode.\n");  
 
 109         memcpy(0x4000, _binary_realmode_bin_start, (int)&_binary_realmode_bin_size);
 
 110         realmode();     // goodbye!