parlib: Add __uth_sync_swap and __uth_sync_is_empty
[akaros.git] / user / parlib / panic.c
1 #include <parlib/arch/arch.h>
2 #include <parlib/stdio.h>
3 #include <parlib/assert.h>
4 #include <parlib/ros_debug.h>
5 #include <stdarg.h>
6 #include <stdlib.h>
7
8 static void __attribute__((constructor)) parlib_stdio_init(void)
9 {
10         /* This isn't ideal, since it might affect some stdout streams where our
11          * parent tried to do something else.  Note that isatty() always returns
12          * TRUE, due to how we fake tcgetattr(), and that doesn't affect whatever
13          * our shells are doing to set us up. */
14         setlinebuf(stdout);
15 }
16
17 static void __attribute__((noreturn)) fatal_backtrace(void)
18 {
19         /* This will cause the kernel to print out a backtrace to the console.
20          * Short of reading /proc/self/maps or other stuff, userspace would have a
21          * hard time backtracing itself. */
22         breakpoint();
23         abort();
24 }
25
26 void _panic(const char *file, int line, const char *fmt, ...)
27 {
28         char buf[128];
29         int ret = 0;
30         va_list ap;
31
32         va_start(ap, fmt);
33         ret += snprintf(buf + ret, sizeof(buf) - ret,
34                         "[user] panic: PID %d, vcore %d, %s:%d: ",
35                         getpid(), vcore_id(), __FILE__, __LINE__);
36         /* ignore errors (ret < 0) by setting ret to be at least 0 */
37         ret = MAX(ret, 0);
38         ret += vsnprintf(buf + ret, sizeof(buf) - ret, fmt, ap);
39         ret = MAX(ret, 0);
40         ret += snprintf(buf + ret, sizeof(buf) - ret, "\n");
41         ret = MAX(ret, 0);
42         write(2, buf, ret);
43         fatal_backtrace();
44 }
45
46 void _assert_failed(const char *file, int line, const char *msg)
47 {
48         fprintf(stderr, "[user] %s:%d, vcore %d, Assertion failed: %s\n", file,
49                 line, vcore_id(), msg);
50         fatal_backtrace();
51 }