]> Zhao Yanbai Git Server - minix.git/commitdiff
SMP - The slave CPUs turn paging on
authorTomas Hruby <tom@minix3.org>
Wed, 15 Sep 2010 14:10:07 +0000 (14:10 +0000)
committerTomas Hruby <tom@minix3.org>
Wed, 15 Sep 2010 14:10:07 +0000 (14:10 +0000)
- APs wait until BSP turns paging on, it is not possible to safely
  execute any code on APs until we can turn paging on as well as it
  must be done synchronously everywhere

- APs turn paging on but do not continue and wait

kernel/arch/i386/apic.c
kernel/arch/i386/arch_smp.c
kernel/arch/i386/include/arch_proto.h
kernel/main.c

index 8bc855b2ad84c4a44ce087b3e779bb178b1c5350..ed6f48e03814176fd627348a53036b7beabcf348 100644 (file)
@@ -835,7 +835,7 @@ PUBLIC void apic_idt_init(const int reset)
        }
 
 #ifdef CONFIG_APIC_DEBUG
-       if (cpu_is_bsp(cpuid))
+       if (is_bsp)
                printf("APIC debugging is enabled\n");
        lapic_set_dummy_handlers();
 #endif
index ce6009aaa5bc2021eaf64f843619d362ed5ab30c..b10abbaa9868ef3911e65e64af6e95d720ab250a 100644 (file)
@@ -190,6 +190,12 @@ PRIVATE void ap_finish_booting(void)
        while(!i386_paging_enabled)
                arch_pause();
 
+       /*
+        * we must load some page tables befre we turn paging on. As VM is
+        * always present we use those
+        */
+       segmentation2paging(proc_addr(VM_PROC_NR));
+
        BKL_LOCK();
        printf("CPU %d is running\n", cpu);
        BKL_UNLOCK();
index 54658754c1deec6f990bcf556b3f70a5e2998822..189d879ce832191371f6d671b48d198e88997159 100644 (file)
@@ -54,6 +54,7 @@ _PROTOTYPE( void kernel_call_entry, (void) );
 _PROTOTYPE( void level0_call, (void) );
 
 /* memory.c */
+_PROTOTYPE( void segmentation2paging, (struct proc * current));
 _PROTOTYPE( void i386_freepde, (int pde));
 _PROTOTYPE( void getcr3val, (void));
 
index a870e44663a68e0759491889e84ba13b95f6260c..043926341c65bf96c7f21ba48ea052efd0fb9907 100644 (file)
@@ -285,8 +285,14 @@ PUBLIC int main(void)
   } else if (config_no_smp) {
          BOOT_VERBOSE(printf("SMP disabled, using legacy PIC\n"));
          smp_single_cpu_fallback();
-  } else
+  } else {
          smp_init();
+         /*
+          * if smp_init() returns it means that it failed and we try to finish
+          * single CPU booting
+          */
+         bsp_finish_booting();
+  }
 #else
   /* 
    * if configured for a single CPU, we are already on the kernel stack which we