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