aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/core/console-log.c
diff options
context:
space:
mode:
Diffstat (limited to 'roms/skiboot/core/console-log.c')
-rw-r--r--roms/skiboot/core/console-log.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/roms/skiboot/core/console-log.c b/roms/skiboot/core/console-log.c
new file mode 100644
index 000000000..21a1442bd
--- /dev/null
+++ b/roms/skiboot/core/console-log.c
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+/*
+ * Console Log routines
+ * Wraps libc and console lower level functions
+ * does fancy-schmancy things like timestamps and priorities
+ * Doesn't make waffles.
+ *
+ * Copyright 2013-2018 IBM Corp.
+ */
+
+#include "skiboot.h"
+#include "unistd.h"
+#include "stdio.h"
+#include "console.h"
+#include "timebase.h"
+#include <debug_descriptor.h>
+
+static int vprlog(int log_level, const char *fmt, va_list ap)
+{
+ int count;
+ char buffer[320];
+ bool flush_to_drivers = true;
+ unsigned long tb = mftb();
+
+ /* It's safe to return 0 when we "did" something here
+ * as only printf cares about how much we wrote, and
+ * if you change log_level to below PR_PRINTF then you
+ * get everything you deserve.
+ * By default, only PR_DEBUG and higher are stored in memory.
+ * PR_TRACE and PR_INSANE are for those having a bad day.
+ */
+ if (log_level > (debug_descriptor.console_log_levels >> 4))
+ return 0;
+
+ count = snprintf(buffer, sizeof(buffer), "[%5lu.%09lu,%d] ",
+ tb_to_secs(tb), tb_remaining_nsecs(tb), log_level);
+ count+= vsnprintf(buffer+count, sizeof(buffer)-count, fmt, ap);
+
+ if (log_level > (debug_descriptor.console_log_levels & 0x0f))
+ flush_to_drivers = false;
+
+ console_write(flush_to_drivers, buffer, count);
+
+ return count;
+}
+
+/* we don't return anything as what on earth are we going to do
+ * if we actually fail to print a log message? Print a log message about it?
+ * Callers shouldn't care, prlog and friends should do something generically
+ * sane in such crazy situations.
+ */
+void _prlog(int log_level, const char* fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vprlog(log_level, fmt, ap);
+ va_end(ap);
+}
+
+int _printf(const char* fmt, ...)
+{
+ int count;
+ va_list ap;
+
+ va_start(ap, fmt);
+ count = vprlog(PR_PRINTF, fmt, ap);
+ va_end(ap);
+
+ return count;
+}