#include #include "serial.h" #include "panic.h" #include "paging.h" #include "boot.h" #include "util.h" #include "fat.h" #include "ide.h" #include "idt.h" #include "pmap.h" #include "task.h" #include "pci.h" #include "log.h" #include "elf.h" void reset_tree(); void tree(struct drive *d); void _start_user_mode() __attribute__ ((noreturn)); __attribute__ ((noreturn)) void main() { char nbuf[11]; init_pagemap(); init_paging(); init_tasks(); init_serial(); init_log(); logsz("Portland v0.0.11\n\n"); //list vesa modes? pci_init(); u16_dec(n_pci_devices, nbuf); logsz(nbuf); logsz(" 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); logsz(" "); logsz(nbuf); logsz(": "); u16_hex(pd->id_vendor, nbuf); nbuf[4] = '.'; u16_hex(pd->id_device, nbuf + 5); logsz(nbuf); u8_hex(pd->class, nbuf); nbuf[2] = '.'; u8_hex(pd->subclass, nbuf + 3); nbuf[5] = '.'; u8_hex(pd->iface, nbuf + 6); logsz(" ("); logsz(nbuf); logsz(")\n"); } logch('\n'); init_fat(); //other fs drivers init_drives(); init_ide(); //other drive drivers u8_dec(n_drives, nbuf); logsz(nbuf); logsz(" drive(s) found:\n"); for (uint8_t n = 0; n < n_drives; ++n) { struct drive *d = drives + n; u8_dec(n, nbuf); logsz(" sd"); logsz(nbuf); logsz(" ("); logsz(d->drive_type); logsz(", "); u32_dec(d->n_sectors / 2, nbuf); logsz(nbuf); if (d->n_sectors % 2) logsz(".5"); logsz("k): "); logsz(d->fs_type); uint32_t free_sectors = d->get_free_sectors(d); if (free_sectors != -1) { u32_dec(free_sectors / 2, nbuf); logsz(", "); logsz(nbuf); if (free_sectors % 2) logsz(".5"); logsz("k free"); } logsz(".\n"); } logch('\n'); for (uint8_t n = 0; n < n_drives; ++n) { if (drives[n].get_free_sectors(drives + n) == -1) continue; u32_dec(n, nbuf); logsz("sd"); logsz(nbuf); logsz(" tree:\n"); reset_tree(); tree(drives + n); logch('\n'); } if (!try_elf_run(drives, "BIN/INIT.ELF")) panic("Failed to load init program."); if (BOOT_INFO->support_flags & BIS_PAE) logsz("Processor supports PAE (but Portland OS does not yet).\n\n"); else logsz("Processor does not support PAE.\n\n"); u32_dec(kernel_pages_left * 4, nbuf); logsz(nbuf); logsz("k / "); u32_dec(max_kernel_pages * 4, nbuf); logsz(nbuf); logsz("k kernel heap free.\n"); u32_dec(user_pages_left * 4, nbuf); logsz(nbuf); logsz("k / "); u32_dec(max_user_pages * 4, nbuf); logsz(nbuf); logsz("k user memory free.\n"); //while (1) // asm ("hlt"); init_idt(); _start_user_mode(); }