#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(); }