parlib: Set line buffering for stdout
[akaros.git] / user / parlib / panic.c
1 #include <parlib/arch/arch.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <parlib/assert.h>
5 #include <stdlib.h>
6 #include <parlib/ros_debug.h>
7
8 char *argv0;
9
10 static void __attribute__((constructor)) parlib_stdio_init(void)
11 {
12         /* This isn't ideal, since it might affect some stdout streams where our
13          * parent tried to do something else.  Note that isatty() always returns
14          * TRUE, due to how we fake tcgetattr(), and that doesn't affect whatever
15          * our shells are doing to set us up. */
16         setlinebuf(stdout);
17 }
18
19 /*
20  * Panic is called on unresolvable fatal errors.
21  * It prints "panic: <message>", then causes a breakpoint exception,
22  * which causes ROS to enter the ROS kernel monitor.
23  */
24 void
25 _panic(const char *file, int line, const char *fmt,...)
26 {
27         va_list ap;
28
29         va_start(ap, fmt);
30
31         // Print the panic message
32         if (argv0)
33                 printf("%s: ", argv0);
34         printf("user panic at %s:%d: ", file, line);
35         vprintf(fmt, ap);
36         printf("\n");
37
38         // Cause a breakpoint exception
39         while (1)
40                 breakpoint();
41 }
42
43 void _assert_failed(const char *file, int line, const char *msg)
44 {
45         printf("[user] %s:%d, vcore %d, Assertion failed: %s\n", file, line,
46                vcore_id(), msg);
47         abort();
48 }