]> Zhao Yanbai Git Server - minix.git/commitdiff
SMP - proc_ptr and bill_ptr initialization
authorTomas Hruby <tom@minix3.org>
Wed, 15 Sep 2010 14:10:24 +0000 (14:10 +0000)
committerTomas Hruby <tom@minix3.org>
Wed, 15 Sep 2010 14:10:24 +0000 (14:10 +0000)
- they should point somewhere

kernel/arch/i386/arch_smp.c
kernel/main.c
kernel/proc.c

index 7c72ca1248f3d61af2b8cac71b107d2e7d29f5ab..88b20a7ccddfd84b6686034088cb3a3190d2fb0f 100644 (file)
@@ -216,10 +216,8 @@ PRIVATE void ap_finish_booting(void)
        printf("CPU %d local APIC timer is ticking\n", cpu);
 
        /* FIXME assign CPU local idle structure */
-       get_cpulocal_var(proc_ptr) = proc_addr(IDLE);
-       get_cpulocal_var(bill_ptr) = proc_addr(IDLE);
-
-       BKL_UNLOCK();
+       get_cpulocal_var(proc_ptr) = get_cpulocal_var_ptr(idle_proc);
+       get_cpulocal_var(bill_ptr) = get_cpulocal_var_ptr(idle_proc);
 
        ap_boot_finished(cpu);
        spinlock_unlock(&boot_lock);
@@ -227,6 +225,9 @@ PRIVATE void ap_finish_booting(void)
        /* finish processor initialisation. */
        lapic_enable(cpu);
 
+       BKL_UNLOCK();
+       for(;;);
+
        switch_to_user();
        NOT_REACHABLE;
 }
index 730cc30aa7c71e81c5ccfaba4ca07e90bfdd78a1..d4dde5180a52c59a95b8bc350746caeedb56bfc8 100644 (file)
@@ -48,7 +48,10 @@ PUBLIC void bsp_finish_booting(void)
   /* MINIX is now ready. All boot image processes are on the ready queue.
    * Return to the assembly code to start running the current process. 
    */
-  get_cpulocal_var(bill_ptr) = proc_addr(IDLE);        /* it has to point somewhere */
+  
+  /* it should point somewhere */
+  get_cpulocal_var(bill_ptr) = get_cpulocal_var_ptr(idle_proc);
+  get_cpulocal_var(proc_ptr) = get_cpulocal_var_ptr(idle_proc);
   announce();                          /* print MINIX startup banner */
 
   /*
index 3ded1a3313ea82a0ad4bcf8821a29b46b561323e..3b934506f1236300c4639af21b57f53991847545 100644 (file)
@@ -150,6 +150,8 @@ PUBLIC void proc_init(void)
        for (i = 0; i < CONFIG_MAX_CPUS; i++) {
                struct proc * ip = get_cpu_var_ptr(i, idle_proc);
                ip->p_priv = &idle_priv;
+               /* must not let idle ever get scheduled */
+               ip->p_rts_flags |= RTS_PROC_STOP;
                set_idle_name(ip->p_name, i);
        }
 }