#include "kernel.h" #include "serial.h" #include "asm_pic.h" #include "multiboot.h" #include "acpi.h" #include "gdt.h" #include "interrupts.h" #include "mem.h" #include "vmem.h" //-- clean below headers --// #include "apic.h" #include "kernel/scheduler.h" #include "driver/timer.h" #include "driver/keyboard.h" #include "driver/mouse.h" #include "syscalls.h" #include "fifo.h" #include "asm_smp.h" #include "asm_x86.h" #include "ringbuffer.h" #include "driver/screen.h" #include "smp.h" #include "fs/fs.h" #include "fs/elf.h" #include "kmalloc.h" #include "driver/vesa.h" #include "asm_pit.h" /* F00L 0S Entry point (called directly from asm/multiboot.asm */ void kernel_main(uint32_t eax,uint32_t ebx) { // -- COM1 -- // serial_init(); klog("Communication Port (COM1) initialized."); // -- PR & VERSION BANNER -- // klog("======================================"); klog("F00L- 0S / The Fool's Operating System"); klog("(C) 2018 / Michal Idziorek (m.i@gmx.at)"); klog("Compiled on: %s at %s",__DATE__,__TIME__); klog("Version: git-commit: %s",GIT_REVISION); klog("======================================"); // -- DISABLE LEGACY PIC -- // klog("Remapping & Disabling Programmable Interrupt Controller (PIC) ..."); fixme("io_wait & spurious interrupts"); asm_pic_setup(); // -- GET CONFIGS -- // klog("Read Multiboot Structures ..."); multiboot_information *cfg_multiboot; cfg_multiboot=multiboot_read(eax, ebx,false); elf_multiboot_read(cfg_multiboot); // just show kernel section headers klog("Read Advanced Power Configuration Interface (ACPI) Structures ..."); acpi_information cfg_acpi; bool acpi_found=acpi_fill(&cfg_acpi); fixme("Try to read (legacy) multiprocessor mp strucutres as well (see: xxx/mp.c)"); if(!acpi_found) kpanic("We Currently rely on ACPI Structures Sorry!"); // -- GDT -- // klog("Global Descriptor Table (GDT) init ..."); gdt_init(); // -- IVT -- // klog("Interrupt Vector Table (IVT) init ..."); interrupts_init(0x08); interrupts_install(); fixme("register interrupt callback funcs (instead hardcoded dispatcher)"); // -- MEMORY MANAGEMENT -- // klog("Memory init ... "); mem_init(cfg_multiboot); klog("Vritual Memory / Paging init ... "); fixme("do not disable anymore on context switching!"); fixme("write convenneint management funcs as: mapCPU, mapKErnel, map USerspace.."); fixme("move stack and guard with empty pages!"); vmem_init(cfg_multiboot,&cfg_acpi); struct pdirectory_struct *dir=vmem_kernel_dir(); x86_set_page_directory(dir); x86_paging_enable(); // -- APIC -- // klog("Advanced Programmable Interrupt Controller (APIC) config ..."); apic_init(&cfg_acpi); ioapic_config(); apic_enable(); apic_init_timer(3);// freq in HZ // -- RAM IMAGE -- // klog("Ram Filesystem init ... "); fs_mount(cfg_multiboot); // -- VESA -- // fixme("tell terminal syscall somehow if we are vga or textmode"); klog("Video Electronics Standards Association (VESA) init ... "); // TODO check if text or fb? uint32_t addr=kballoc(1); fs_content("/binfont.bin",addr,0x100); // copy font (0x100 bytes) to memory. vesa_init(cfg_multiboot->vbe_control_info,cfg_multiboot->vbe_mode_info,addr); // -- STDIN/STDOUT -- // klog("stdin/stdout init ..."); uint32_t sstderr = syscall_open("stderr",0,0); // stderr 2 uint32_t sstdin = syscall_open("stdin",0,0); // stdin 0 uint32_t sstdout; if(cfg_multiboot->framebuffer_type==2) // EGA-standard text mode { sstdout = syscall_open("term",0,0); // stdout 1 } else { sstdout = syscall_open("xterm",0,0); // stdout 1 } klog("Keyboard init ..."); keyboard_init(0); klog("Mouse init ..."); mouse_init(); klog("Symmetric Multi Processing (SMP) start ... "); smp_start_aps(&cfg_acpi); klog("Programmable Interval Timer (PIT) init ..."); uint64_t unixtime=timer_init(); klog("Unix Time = %u seconds",unixtime); klog("Unlock application processors ... "); asm_smp_unlock(); //PutFont('X', 100,200, 0x00ffff,0xff00ff); // TODO temporary! klog("Enable Interrupts ... "); x86_sti(); // this will start processing hardware interrupts // now just wait until our scheduler kicks in. while(1){ syscall_write(sstdout,"dupa",4); asm("hlt"); } }