Branch data Line data Source code
1 : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2 : : /* 3 : : * Console Log routines 4 : : * Wraps libc and console lower level functions 5 : : * does fancy-schmancy things like timestamps and priorities 6 : : * Doesn't make waffles. 7 : : * 8 : : * Copyright 2013-2018 IBM Corp. 9 : : */ 10 : : 11 : : #include "skiboot.h" 12 : : #include "unistd.h" 13 : : #include "stdio.h" 14 : : #include "console.h" 15 : : #include "timebase.h" 16 : : #include <debug_descriptor.h> 17 : : 18 : 13 : static int vprlog(int log_level, const char *fmt, va_list ap) 19 : : { 20 : : int count; 21 : : char buffer[320]; 22 : 13 : bool flush_to_drivers = true; 23 : 13 : unsigned long tb = mftb(); 24 : : 25 : : /* It's safe to return 0 when we "did" something here 26 : : * as only printf cares about how much we wrote, and 27 : : * if you change log_level to below PR_PRINTF then you 28 : : * get everything you deserve. 29 : : * By default, only PR_DEBUG and higher are stored in memory. 30 : : * PR_TRACE and PR_INSANE are for those having a bad day. 31 : : */ 32 : 13 : if (log_level > (debug_descriptor.console_log_levels >> 4)) 33 : 2 : return 0; 34 : : 35 : 11 : count = snprintf(buffer, sizeof(buffer), "[%5lu.%09lu,%d] ", 36 : : tb_to_secs(tb), tb_remaining_nsecs(tb), log_level); 37 : 11 : count+= vsnprintf(buffer+count, sizeof(buffer)-count, fmt, ap); 38 : : 39 : 11 : if (log_level > (debug_descriptor.console_log_levels & 0x0f)) 40 : 2 : flush_to_drivers = false; 41 : : 42 : 11 : console_write(flush_to_drivers, buffer, count); 43 : : 44 : 11 : return count; 45 : : } 46 : : 47 : : /* we don't return anything as what on earth are we going to do 48 : : * if we actually fail to print a log message? Print a log message about it? 49 : : * Callers shouldn't care, prlog and friends should do something generically 50 : : * sane in such crazy situations. 51 : : */ 52 : 10 : void _prlog(int log_level, const char* fmt, ...) 53 : : { 54 : : va_list ap; 55 : : 56 : 10 : va_start(ap, fmt); 57 : 10 : vprlog(log_level, fmt, ap); 58 : 10 : va_end(ap); 59 : 10 : } 60 : : 61 : 2 : int _printf(const char* fmt, ...) 62 : : { 63 : : int count; 64 : : va_list ap; 65 : : 66 : 3 : va_start(ap, fmt); 67 : 3 : count = vprlog(PR_PRINTF, fmt, ap); 68 : 3 : va_end(ap); 69 : : 70 : 3 : return count; 71 : : }