Another round at reorganization
[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 <arch/types.h>
9 #include <stdio.h>
10 #include <stdarg.h>
11 #include <atomic.h>
12
13 uint32_t output_lock = 0;
14
15 static void putch(int ch, int **cnt)
16 {
17         cputchar(ch);
18         **cnt = **cnt + 1;
19 }
20
21 int vcprintf(const char *fmt, va_list ap)
22 {
23         int cnt = 0;
24         int *cntp = &cnt;
25
26         // lock all output.  this will catch any printfs at line granularity
27         spin_lock_irqsave(&output_lock);
28         vprintfmt((void*)putch, (void**)&cntp, fmt, ap);
29         spin_unlock_irqsave(&output_lock);
30
31         return cnt;
32 }
33
34 int cprintf(const char *fmt, ...)
35 {
36         va_list ap;
37         int cnt;
38
39         va_start(ap, fmt);
40         cnt = vcprintf(fmt, ap);
41         va_end(ap);
42
43         return cnt;
44 }