add chdir
[snitchaser:mainline.git] / src / arch / x86 / interp / utils.c
1 /* 
2  * xasm/debug.c
3  */
4
5 #include <xasm/syscall.h>
6 #include <xasm/vsprintf.h>
7 #include <xasm/utils.h>
8 #include <sys/mman.h>
9
10 static char fdprintf_buf[FDPRINTF_MAX];
11
12 int
13 vfdprintf(int fd, const char * fmt, va_list args)
14 {
15         int n = vsnprintf(fdprintf_buf, FDPRINTF_MAX, fmt, args);
16         INTERNAL_SYSCALL_int80(write, 3, fd, fdprintf_buf, n);
17         return n;
18 }
19
20 int
21 fdprintf(int fd, const char * fmt, ...)
22 {
23         int n;
24         va_list ap;
25         va_start(ap, fmt);
26         n = vfdprintf(fd, fmt, ap);
27         va_end(ap);
28         return n;
29 }
30
31 int
32 __xprintf(const char * fmt, ...)
33 {
34         va_list ap;
35         va_start(ap, fmt);
36         int n = vfdprintf(2, fmt, ap);
37         va_end(ap);
38         return n;
39         
40 }
41
42 void *
43 alloc_pages(int nr, bool_t exec)
44 {
45         void * p = (void*)INTERNAL_SYSCALL_int80(mmap2, 6,
46                         0,
47                         nr * PAGE_SIZE,
48                         PROT_READ | PROT_WRITE | (exec ? PROT_EXEC : 0),
49                         MAP_PRIVATE | MAP_ANONYMOUS,
50                         -1, 0);
51         assert((uint32_t)p < 0xc0000000);
52         return p;
53 }
54
55 void
56 free_pages(void * start, int nr)
57 {
58         int err;
59         start = (void*)(((uint32_t)start) & 0xfffff000);
60         err = INTERNAL_SYSCALL_int80(munmap, 2,
61                         start, nr * PAGE_SIZE);
62         assert(err == 0);
63         return;
64 }
65
66 // vim:ts=4:sw=4
67