diff options
| author | Miguel <m.i@gmx.at> | 2018-09-08 17:08:55 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-08 17:08:55 +0200 |
| commit | 9fde748acea83d775e367a64858414b674f05b13 (patch) | |
| tree | 0927b570c07c9ee469817a560b965c094c5d8145 /kernel/kernel.c | |
| parent | aa4b4c6c1918a51318709761873d1c5e248a831d (diff) | |
struggling with pic and lapic and smp...
Diffstat (limited to 'kernel/kernel.c')
| -rw-r--r-- | kernel/kernel.c | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c index 30949f8..17bf9b7 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -25,9 +25,13 @@ void kernel_main(uint32_t eax,uint32_t ebx) serial_init(); klog("FOOL-OS ver-%s (%s)",GIT_REVISION,__DATE__); - klog("Programmable Interval Timer (PIT) init ..."); - uint64_t unixtime=timer_init(); - klog("Unix Time = %u seconds)",unixtime); + // while(1); + + klog("Interrupt Vector Table (IVT) init ..."); + interrupts_init(0x08); + + klog("Setting up PIC"); + asm_pic_setup(); klog("Keyboard init ..."); keyboard_init(0); @@ -44,30 +48,19 @@ void kernel_main(uint32_t eax,uint32_t ebx) klog("Memory init ... "); uint32_t kernel_blocks=mem_init(info); - - klog("Ram Filesystem init ... "); - fs_mount(info); - - klog("Interrupt Vector Table (IVT) init ..."); - interrupts_init(0x08); - + klog("Symmetrical Multi Processing (SMP) init ... "); smp_processors procdata; -// if(!mp_find(&procdata))kpanic("No MP found!"); - if(!acpi_find(&procdata))kpanic("No ACPI found!"); + if(!acpi_find(&procdata)) + if(!mp_find(&procdata))kpanic("No ACPI and no MP found!"); - // Start the other Processors (before paging because apic addr etc..?) - //TODO: remap apic !!! Check commented out sleep ()!!! - klog("Symmetric Multi Processing (SMP) start ... "); - smp_log_procdata(&procdata); - smp_start_aps(&procdata); - + // searching for ACPI etc.. in physical mem has to be performed before that. klog("Vritual Memory / Paging init ... "); - pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr); - - klog("Peripheral Component Interconnet (PCI) init ... "); - pci_init(); + pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr,procdata.local_apic_address); + klog("Ram Filesystem init ... "); + fs_mount(info); + 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. @@ -78,6 +71,26 @@ void kernel_main(uint32_t eax,uint32_t ebx) uint32_t sstdout = syscall_open("term",0,0); // stdout 1 uint32_t sstderr = syscall_open("stderr",0,0); // stderr 2 - klog("Enable Interrupts & Start Scheduling ..."); + klog("Scheduler init ..."); scheduler_init(dir); + + klog("Symmetric Multi Processing (SMP) start ... "); + smp_start_aps(&procdata); + + klog("Programmable Interval Timer (PIT) init ..."); + uint64_t unixtime=timer_init(); + klog("Unix Time = %u seconds)",unixtime); + + klog("Setting Interrupt Flag on BSP ..."); + asm_smp_unlock(); + x86_sti(); // this will start processing hardware interrupts. + + // TODO : pray that this is reached BEFORE scheduler kicks in!? + + klog("Unlock application processors ... "); + + while(1){ // now just wait until our scheduler kicks in. +// klog("bsp"); + asm("hlt"); + } } |
