#include #include "vga.h" #include "fat.h" #include "ide.h" #include "panic.h" #include "serial.h" #include "util.h" #include "mem.h" #include "pci.h" #include "boot.h" #include "vesa.h" char nbuf[11]; #define SOTL(field) field = (void *)((*((uint16_t *)(&field) + 1) << 16) + *(uint16_t *)(&field)); __attribute__ ((noreturn)) void main() { SOTL(VESA_INFO->oem) SOTL(VESA_INFO->modes) SOTL(VESA_INFO->vendor) SOTL(VESA_INFO->pname) SOTL(VESA_INFO->prev) init_mmap(); init_vesa(); init_serial(); vga_blank(); vga_printsz("Portland v0.0.11\n\n"); //list vesa modes? pci_init(); u16_dec(n_pci_devices, nbuf); vga_printsz(nbuf); vga_printsz(" PCI device(s) found:\n"); for (uint16_t n = 0; n < n_pci_devices; ++n) { struct pci_device *pd = nth_pci_device(n); u16_hex(pd->number, nbuf); vga_printsz(" "); vga_printsz(nbuf); vga_printsz(": "); u16_hex(pd->id_vendor, nbuf); nbuf[4] = '.'; u16_hex(pd->id_device, nbuf + 5); vga_printsz(nbuf); u8_hex(pd->class, nbuf); nbuf[2] = '.'; u8_hex(pd->subclass, nbuf + 3); nbuf[5] = '.'; u8_hex(pd->iface, nbuf + 6); vga_printsz(" ("); vga_printsz(nbuf); vga_printsz(")\n"); } vga_printch('\n'); init_fat(); init_ide(); u8_dec(n_drives, nbuf); vga_printsz(nbuf); vga_printsz(" drive(s) found:\n"); for (uint8_t n = 0; n < n_drives; ++n) { struct drive *d = drives + n; u8_dec(n, nbuf); vga_printsz(" sd"); vga_printsz(nbuf); vga_printsz(" ("); vga_printsz(d->drive_type); vga_printsz("): "); vga_printsz(d->fs_type); vga_printsz(", "); u32_dec(d->n_sectors / 2, nbuf); vga_printsz(nbuf); if (d->n_sectors % 2) vga_printsz(".5"); vga_printsz("k, "); uint32_t free_sectors = d->get_free_sectors(d); u32_dec(free_sectors / 2, nbuf); vga_printsz(nbuf); if (d->n_sectors % 2) vga_printsz(".5"); vga_printsz("k free.\n"); } vga_printch('\n'); u32_dec(pages_left * 4, nbuf); vga_printsz(nbuf); vga_printsz("k dynamic memory free.\n\n"); vga_printsz("Loading init process."); vga_printsz("\n\nTODO: load and switch to init process"); while (1) asm ("hlt"); }