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