_M procs start up at _start/hart_entry for vcore0
[akaros.git] / kern / src / process.c
index a519689..a8be5c6 100644 (file)
@@ -25,6 +25,7 @@
 #include <slab.h>
 #include <sys/queue.h>
 #include <frontend.h>
+#include <monitor.h>
 
 /* Process Lists */
 struct proc_list proc_runnablelist = TAILQ_HEAD_INITIALIZER(proc_runnablelist);
@@ -182,14 +183,20 @@ void proc_init(void)
        pid_hash = create_hashtable(100, __generic_hash, __generic_eq);
        spin_unlock(&pid_hash_lock);
        schedule_init();
-       /* Init idle cores. Core 0 is the management core, and core 1 is
-     * dedicated to the NIC currently */
+       /* Init idle cores. Core 0 is the management core. */
        spin_lock(&idle_lock);
-       #ifdef __CONFIG_NETWORKING__
-       assert(num_cpus >= 2);
-       int reserved_cores = 2;
-       #else
        int reserved_cores = 1;
+       #ifdef __CONFIG_NETWORKING__
+       reserved_cores++; // Next core is dedicated to the NIC
+       assert(num_cpus >= reserved_cores);
+       #endif
+       #ifdef __CONFIG_APPSERVER__
+       #ifdef __CONFIG_DEDICATED_MONITOR__
+       reserved_cores++; // Next core dedicated to running the kernel monitor
+       assert(num_cpus >= reserved_cores);
+       // Need to subtract 1 from the reserved_cores # to get the cores index
+       send_kernel_message(reserved_cores-1, (amr_t)monitor, 0,0,0, KMSG_ROUTINE);
+       #endif
        #endif
        num_idlecores = num_cpus - reserved_cores;
        for (int i = 0; i < num_idlecores; i++)
@@ -410,15 +417,9 @@ void proc_run(struct proc *p)
                                if (is_mapped_vcore(p, core_id()))
                                        self_ipi_pending = TRUE;
                                // TODO: handle silly state (HSS)
-                               // set virtual core 0 to run the main context on transition
-                               if (p->env_flags & PROC_TRANSITION_TO_M) {
-                                       p->env_flags &= !PROC_TRANSITION_TO_M;
-                                       p->procinfo->vcoremap[0].tf_to_run = &p->env_tf;
-                               } else {
-                                       assert(!p->procinfo->vcoremap[0].tf_to_run);
-                               }
                                /* others should be zeroed after a previous use too. */
-                               for (int i = 1; i < p->procinfo->num_vcores; i++)
+                               // TODO: remove me
+                               for (int i = 0; i < p->procinfo->num_vcores; i++)
                                        assert(!p->procinfo->vcoremap[i].tf_to_run);
                                for (int i = 0; i < p->procinfo->num_vcores; i++)
                                        send_kernel_message(p->procinfo->vcoremap[i].pcoreid,
@@ -696,6 +697,9 @@ void do_notify(struct proc *p, uint32_t vcoreid, unsigned int notif,
                struct notif_event *ne)
 {
        assert(notif < MAX_NR_NOTIF);
+       if (ne)
+               assert(notif == ne->ne_type);
+
        struct notif_method *nm = &p->procdata->notif_methods[notif];
        struct preempt_data *vcpd = &p->procdata->vcore_preempt_data[vcoreid];
 
@@ -735,17 +739,21 @@ void do_notify(struct proc *p, uint32_t vcoreid, unsigned int notif,
  * just determines where the notif should be sent, other checks, etc.
  * Specifically, it handles the parameters of notif_methods.  If you happen to
  * notify yourself, make sure you process routine kmsgs. */
-void proc_notify(struct proc *p, unsigned int notif)
+void proc_notify(struct proc *p, unsigned int notif, struct notif_event *ne)
 {
        assert(notif < MAX_NR_NOTIF); // notifs start at 0
        struct notif_method *nm = &p->procdata->notif_methods[notif];
-       struct notif_event ne;
+       struct notif_event local_ne;
        
-       ne.ne_type = notif;
+       /* Caller can opt to not send an NE, in which case we use the notif */
+       if (!ne) {
+               ne = &local_ne;
+               ne->ne_type = notif;
+       }
 
        if (!(nm->flags & NOTIF_WANTED))
                return;
-       do_notify(p, nm->vcoreid, notif, &ne);
+       do_notify(p, nm->vcoreid, ne->ne_type, ne);
 }
 
 /* Global version of the helper, for sys_get_vcoreid (might phase that syscall