#include #include #include #include #include #include static char debug_printf_buffer[DEBUG_PRINTF_MAX]; static atomic_flag debug_printf_buffer_lock = ATOMIC_FLAG_INIT; static void debugconsole_printf_buffer_lock (void) { while (atomic_flag_test_and_set_explicit (&debug_printf_buffer_lock, memory_order_acquire)) { #if defined(__x86_64__) __asm__ volatile ("pause" ::: "memory"); #endif } } static void debugconsole_printf_buffer_unlock (void) { atomic_flag_clear_explicit (&debug_printf_buffer_lock, memory_order_release); } int debugconsole_print (const char* string, size_t len) { return device_do ("debugconsole", DEBUGCONSOLE_PUTSTR, (void*)string, (void*)&len, NULL, NULL); } void debug_printf (const char* fmt, ...) { va_list args; va_start (args, fmt); debugconsole_printf_buffer_lock (); int len = vsnprintf (debug_printf_buffer, DEBUG_PRINTF_MAX, fmt, args); va_end (args); debugconsole_print (debug_printf_buffer, len); debugconsole_printf_buffer_unlock (); }