Implemented syscall dispatch table
[akaros.git] / user / parlib / src / newlib_backend.c
1 #include <hart.h>
2 #include <parlib.h>
3 #include <unistd.h>
4 #include <newlib_backend.h>
5
6 /* sbrk()
7  * Increase program data space. 
8  * As malloc and related functions depend on this, it is 
9  * useful to have a working implementation. 
10  * The following suffices for a standalone system; it exploits the 
11  * symbol _end automatically defined by the GNU linker.
12  */
13 void* sbrk(ptrdiff_t incr) 
14 {
15         debug_in_out("SBRK\n");
16         debug_in_out("\tincr: %d\n", incr);     
17
18         extern char (SNT RO _end)[];
19         static void* heap_end = NULL;
20
21         static hart_lock_t sbrk_lock = HART_LOCK_INIT;
22         hart_lock_lock(&sbrk_lock);
23         if (heap_end == NULL)
24                 heap_end = (void*)_end;
25
26         uint8_t* prev_heap_end; 
27         prev_heap_end = heap_end;
28         if (sys_brk(heap_end + incr) != heap_end + incr) {
29                 debug_in_out("\tsys_brk(%p+%d) failed\n",heap_end,incr);
30                 hart_lock_unlock(&sbrk_lock);
31                 errno = ENOMEM;
32                 return (void*CT(1))TC(-1);
33         }
34      
35         heap_end += incr;
36         hart_lock_unlock(&sbrk_lock);
37         debug_in_out("\treturning: %u\n", prev_heap_end);
38         return (void*) prev_heap_end;
39 }