The beginnings of a shell for launching user apps and taling over serial to a remote...
[akaros.git] / kern / src / manager.c
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * See LICENSE for details.
4  */
5
6 #ifdef __DEPUTY__
7 #pragma nodeputy
8 #endif
9
10 #include <arch/types.h>
11 #include <arch/apic.h>
12 #include <arch/smp.h>
13
14 #include <assert.h>
15 #include <manager.h>
16 #include <env.h>
17 #include <workqueue.h>
18 #include <syscall.h>
19
20 /* Helper handlers for smp_call to dispatch jobs to other cores */
21 static void work_env_run(void* data)
22 {
23         env_run((env_t*)data);
24 }
25
26 static void run_env_handler(trapframe_t *tf, void* data)
27 {
28         assert(data);
29         per_cpu_info[lapic_get_id()].delayed_work.func = work_env_run;
30         per_cpu_info[lapic_get_id()].delayed_work.data = data;
31 }
32
33 /*
34  * Currently, if you leave this function by way of env_run (process_workqueue
35  * that env_runs), you will never come back to where you left off, and the
36  * function will start from the top.  Hence the hack 'progress'.
37  */
38 void manager(void)
39 {
40         static uint8_t progress = 0;
41         env_t* env_batch[64]; // Fairly arbitrary, just the max I plan to use.
42         
43         if(progress == 0) {
44                 progress++;
45                 env_batch[0] = ENV_CREATE(parlib_matrix);
46                 env_run(env_batch[0]);
47         }
48         return;
49 }
50