summaryrefslogtreecommitdiff
path: root/kernel/smp.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-17 23:17:51 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-17 23:17:51 +0100
commit7e2da9a580fb42ebf46096364e511ef57bc05cd8 (patch)
tree110c6f71cda7a82b08b707009a37042c899a829d /kernel/smp.c
parentc8032c1bf3a951cbd7aaef8b9a03b12aabd1f691 (diff)
little cleanup
Diffstat (limited to 'kernel/smp.c')
-rw-r--r--kernel/smp.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/kernel/smp.c b/kernel/smp.c
index 46767ac..63b4087 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -3,12 +3,51 @@
#include "lib/logger/log.h"
#include "lib/int/stdint.h"
#include "smp.h"
+#include "mem.h"
+#include "spinlock.h"
#include "x86.h"
#define FOOLOS_APIC_SPUR_INT 0x00f0
#define FOOLOS_APIC_INT_COMMAND_LOW 0x0300
#define FOOLOS_APIC_INT_COMMAND_HIGH 0x0310
+// some multiprocessor shit that should move away TODO
+uint32_t c1,c2,c3;
+volatile uint8_t proc;
+uint32_t cpu_counter[SMP_MAX_PROC];
+
+void smp_main()
+{
+ /// TODO
+ /////// SYMMETRIC MULTIPROCESSING, APS get caought here, move it away ///
+ // catch the APs (Application Processors)
+// if(mp==1)
+ {
+ uint32_t ebp=pmmngr_alloc_block()+4095;
+
+ asm volatile("mov %0, %%ebp"::"r"(ebp));
+ asm volatile("mov %ebp, %esp");
+ asm volatile("jmp kernel_ap");
+ }
+
+ proc=c1=c2=c3=0;
+ for(int i=0;i<SMP_MAX_PROC;i++)cpu_counter[i]=0;
+}
+
+
+void kernel_ap()
+{
+ proc++;
+ uint8_t p=proc;
+ while(1)
+ {
+ cpu_counter[p]++;
+
+ lock_spin(0);
+ if(cpu_counter[p]%1000000==0)log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cpu[%d] %d",p,cpu_counter[p]);
+ lock_release(0);
+ }
+}
void smp_log_procdata(smp_processors *procdata)
{
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"---- smp -----");