Massive reorganizing and making all the makefiles consistent.
[akaros.git] / kern / src / printf.c
1 // Simple implementation of cprintf console output for the kernel,
2 // based on printfmt() and the kernel console's cputchar().
3
4 #ifdef __DEPUTY__
5 #pragma nodeputy
6 #endif
7
8 #include <inc/types.h>
9 #include <inc/stdio.h>
10 #include <inc/stdarg.h>
11
12 #include <kern/atomic.h>
13
14 uint32_t output_lock = 0;
15
16 static void putch(int ch, int **cnt)
17 {
18         cputchar(ch);
19         **cnt = **cnt + 1;
20 }
21
22 int vcprintf(const char *fmt, va_list ap)
23 {
24         int cnt = 0;
25         int *cntp = &cnt;
26
27         // lock all output.  this will catch any printfs at line granularity
28         spin_lock_irqsave(&output_lock);
29         vprintfmt((void*)putch, (void**)&cntp, fmt, ap);
30         spin_unlock_irqsave(&output_lock);
31
32         return cnt;
33 }
34
35 int cprintf(const char *fmt, ...)
36 {
37         va_list ap;
38         int cnt;
39
40         va_start(ap, fmt);
41         cnt = vcprintf(fmt, ap);
42         va_end(ap);
43
44         return cnt;
45 }