Added stubs for additional newlib system calls
[akaros.git] / user / parlib / src / parlibmain.c
1 // Called from entry.S to get us going.
2
3 #include <parlib.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <debug.h>
7 #include <hart.h>
8
9 // call static destructors.
10 void parlib_dtors()
11 {
12         typedef void (*dtor)(void);
13         extern char __DTOR_LIST__[],__DTOR_END__[];
14         int ndtor = ((unsigned int)(__DTOR_END__ - __DTOR_LIST__))/sizeof(void*);
15
16         // make sure only one thread actually runs the dtors
17         static int already_done = 0;
18         if(hart_swap(&already_done,1) == 1)
19                 return;
20
21         for(int i = 0; i < ndtor; i++)
22                 ((dtor*)__DTOR_LIST__)[i]();
23 }
24
25 // call static constructors.
26 void parlib_ctors()
27 {
28         typedef void (*ctor)(void);
29         extern char __CTOR_LIST__[],__CTOR_END__[];
30         int nctor = ((unsigned int)(__CTOR_END__ - __CTOR_LIST__))/sizeof(void*);
31
32         for(int i = 0; i < nctor; i++)
33                 ((ctor*)__CTOR_LIST__)[nctor-i-1]();
34 }
35
36 void parlibmain()
37 {
38         // call static destructors
39         parlib_ctors();
40
41         // call static destructors on exit
42         atexit(&parlib_dtors);
43
44         // call user main routine
45         extern int main(int argc, char * NTS * COUNT(argc) NT argv);
46         int r = main(procinfo.argc, procinfo.argv);
47
48         // exit gracefully
49         exit(r);
50 }