Userspace atomics library
[akaros.git] / user / roslib / src / libmain.c
1 // Called from entry.S to get us going.
2 // entry.S already took care of defining envs, pages, vpd, and vpt.
3 #ifdef __DEPUTY__
4 #pragma nodeputy
5 #endif
6
7 #include <lib.h>
8 #include <ros/syscall.h>
9
10 extern int main(int argc, char **argv);
11
12 volatile env_t *env;
13 char *binaryname = "(PROGRAM NAME UNKNOWN)";
14 syscall_front_ring_t sysfrontring;
15 syscall_desc_pool_t syscall_desc_pool;
16 async_desc_pool_t async_desc_pool;
17 timer_pool_t timer_pool;
18
19 // This is meant to be PER USER THREAD!!! (TODO (benh))
20 async_desc_t* current_async_desc;
21
22 void
23 libmain(int argc, char **argv)
24 {
25         // set env to point at our env structure in envs[].
26         // TODO: for now, the kernel just copies our env struct to the beginning of
27         // procinfo.  When we figure out what we want there, change this.
28         env = (env_t*)procinfo; 
29
30         // Set up the front ring for the general syscall ring
31         // TODO: Reorganize these global variables
32         FRONT_RING_INIT(&sysfrontring, (syscall_sring_t*)procdata, PGSIZE);
33         POOL_INIT(&syscall_desc_pool, MAX_SYSCALLS);
34         POOL_INIT(&async_desc_pool, MAX_ASYNCCALLS);
35
36         // Setup the timer pool 
37         // TODO: ifdef measurement?
38         POOL_INIT(&timer_pool, MAX_TIMERS);
39         train_timing();
40
41         // save the name of the program so that panic() can use it
42         if (argc > 0)
43                 binaryname = argv[0];
44
45         // call user main routine
46         main(argc, argv);
47
48         // exit gracefully
49         exit();
50 }