From 347ee926fd09d7fb45025f2c4e4a4eeab83459c9 Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Mon, 1 Sep 2014 13:26:52 +0200 Subject: Added kernel_entry for APs --- kernel/kernel.c | 26 ++++++++++++++++++++++++-- kernel/mp.c | 2 ++ kernel/task.c | 4 ++-- kernel/vmem.c | 4 ++++ kernel/x86.c | 5 +++++ kernel/x86.h | 1 + 6 files changed, 38 insertions(+), 4 deletions(-) (limited to 'kernel') diff --git a/kernel/kernel.c b/kernel/kernel.c index 5a32c95..7bbfcce 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -21,9 +21,27 @@ uint32_t read_eip(); // this is the very heart of our operating system! // -void kernel_main(uint32_t initial_stack) +void kernel_main(uint32_t initial_stack, int mp) { + + // catch the APs (Application Processors) + if(mp==1) + { + uint16_t c3=0; + while(1) + { + + + c3++; + asm("cli"); + + PutString("cpu2: %03d", 200,560,0b1111100000000000, c3/100); + + asm("sti"); + } + } + // // We want to get output to the screen as fast as possible! // @@ -44,6 +62,7 @@ void kernel_main(uint32_t initial_stack) // our video memory // + uint32_t vesa_physbase=vesa_init(0x8300,0x8400,0x7200); @@ -53,6 +72,8 @@ void kernel_main(uint32_t initial_stack) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initial esp: 0x%08X",initial_stack); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp: %d",mp); + // // Initialize other processors // @@ -72,6 +93,7 @@ void kernel_main(uint32_t initial_stack) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"setting up PIC."); pic_setup(); + //while(1); // // Configuring the PIT timer. @@ -130,7 +152,7 @@ void kernel_main(uint32_t initial_stack) // Initialize Floppy Disk // - floppy_init(); + // floppy_init(); // diff --git a/kernel/mp.c b/kernel/mp.c index 5070b21..dd9fbd5 100644 --- a/kernel/mp.c +++ b/kernel/mp.c @@ -125,8 +125,10 @@ void show_mp_conf(mp_config *addr) //*reg=(6<<8)|(1<<14)|1; *reg=(5<<8)|(1<<14); // 101 INIT + /* uint16_t *startpos=0x7000; *startpos=0xfeeb; + */ sleep(10); diff --git a/kernel/task.c b/kernel/task.c index 1515c5b..a46ce88 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -16,7 +16,7 @@ void task_test1() c1++; asm("cli"); - PutString("task1: %03d", 0,560,0xffffff, c1/100); + PutString("cpu1 / task1: %03d", 0,560,0xffffff, c1/100); asm("sti"); } @@ -31,7 +31,7 @@ void task_test2() { c2++; asm("cli"); - PutString("task2: %03d", 0,580,0xffffff, c2/100); + PutString("cpu1 / task2: %03d", 0,580,0xffffff, c2/100); asm("sti"); } diff --git a/kernel/vmem.c b/kernel/vmem.c index b1ecfa1..8590579 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -253,11 +253,15 @@ void vmem_init(uint32_t vesa_physbase) pd_entry_set_frame (entry2, (physical_addr)table2); + + x86_set_pdbr(dir); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging..."); x86_paging_enable(); + x86_flush_tlb(0); + x86_flush_tlb(vesa_physbase); } diff --git a/kernel/x86.c b/kernel/x86.c index cc7c303..94f4f89 100644 --- a/kernel/x86.c +++ b/kernel/x86.c @@ -50,3 +50,8 @@ void x86_paging_enable() cr0 |= 0x80000000; asm volatile("mov %0, %%cr0":: "b"(cr0)); } + +x86_flush_tlb(uint32_t addr) +{ + asm volatile("invlpg (%0)" ::"r" (addr) : "memory"); +} diff --git a/kernel/x86.h b/kernel/x86.h index 3233124..434c28c 100644 --- a/kernel/x86.h +++ b/kernel/x86.h @@ -18,5 +18,6 @@ void x86_outl(int port, uint32_t data); uint32_t x86_inl(int port); void x86_set_pdbr(uint32_t addr); void x86_paging_enable(); +void x86_flush_tlb(void* m); #endif -- cgit v1.2.3