summaryrefslogtreecommitdiff
path: root/kernel/smp.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-06 01:58:10 +0200
committerMiguel <m.i@gmx.at>2018-09-06 01:58:10 +0200
commitef4943053475cd8bf341c42dd0b538bc630b92a3 (patch)
treeb7f59c937797a0ce0603af9ef46a194d4a64ef22 /kernel/smp.c
parentf67ad595650954195ef064a8b91038dbd0e16842 (diff)
working on smp
Diffstat (limited to 'kernel/smp.c')
-rw-r--r--kernel/smp.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/kernel/smp.c b/kernel/smp.c
index 4aff013..ea926ca 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -20,29 +20,40 @@ volatile uint8_t proc;
uint32_t cpu_counter[SMP_MAX_PROC];
uint32_t local_apic_addr;
+extern uint32_t LLOCK;
void smp_main()
{
+ uint32_t ebp=kballoc(1);
+ asm volatile("mov %0, %%ebp"::"r"(ebp));
+ asm volatile("mov %ebp, %esp");
+ asm volatile("jmp kernel_ap");
+}
-// klog("local apic_addr:0x%08X",local_apic_addr);
+void kernel_ap()
+{
+ LLOCK=0;
- // // uint32_t *reg=local_apic_addr+FOOLOS_APIC_ID;
- //klog("local apic id: 0x%08X",(*reg));
+ uint32_t *reg;
+ reg=local_apic_addr+FOOLOS_APIC_ID;
+ klog("smp local apic id: %d",(*reg));
// // // *reg=local_apic_addr+FOOLOS_APIC_SPUR_INT;
// // // *reg|=0x100;//0xffffffff; // all bits 1 and interrupt 255
// *reg=0;//xffffffff; // all bits 1 and interrupt 255
int_install();
-
+
x86_sti();
-
-
- while(1)__asm__("hlt");
+ while(1){
+ klog("%d",*reg);
+ for(int i=0;i<1000000000;i++);
+ }
// switch_to_user_mode();
// int x=1/0;
+ /*
while(1);
@@ -54,10 +65,11 @@ void smp_main()
proc=c1=c2=c3=0;
for(int i=0;i<SMP_MAX_PROC;i++)cpu_counter[i]=0;
+ */
}
-void kernel_ap()
+void kernel_ap_old()
{
proc++;
uint8_t p=proc;