summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-09-01 13:26:52 +0200
committerMichal Idziorek <m.i@gmx.at>2014-09-01 13:26:52 +0200
commit347ee926fd09d7fb45025f2c4e4a4eeab83459c9 (patch)
tree8d082bcaebe7579fe4fa73dd6eead7c00bb051fd /kernel
parenta9682cac5f14f8d04c87d206cf1d8367e77a61e1 (diff)
Added kernel_entry for APs
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel.c26
-rw-r--r--kernel/mp.c2
-rw-r--r--kernel/task.c4
-rw-r--r--kernel/vmem.c4
-rw-r--r--kernel/x86.c5
-rw-r--r--kernel/x86.h1
6 files changed, 38 insertions, 4 deletions
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