summaryrefslogtreecommitdiff
path: root/kernel/kernel.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-08 17:08:55 +0200
committerMiguel <m.i@gmx.at>2018-09-08 17:08:55 +0200
commit9fde748acea83d775e367a64858414b674f05b13 (patch)
tree0927b570c07c9ee469817a560b965c094c5d8145 /kernel/kernel.c
parentaa4b4c6c1918a51318709761873d1c5e248a831d (diff)
struggling with pic and lapic and smp...
Diffstat (limited to 'kernel/kernel.c')
-rw-r--r--kernel/kernel.c59
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");
+ }
}