Author: bonefish Date: 2010-02-20 15:00:56 +0100 (Sat, 20 Feb 2010) New Revision: 35535 Changeset: http://dev.haiku-os.org/changeset/35535/haiku Modified: haiku/trunk/src/system/kernel/debug/debug.cpp Log: * Pass the panic() format and args through to kernel_debugger_loop(), so that the message doesn't get truncated. * No longer print the "PANIC:" prefix when entering the kernel debugger via kernel_debugger(). Modified: haiku/trunk/src/system/kernel/debug/debug.cpp =================================================================== --- haiku/trunk/src/system/kernel/debug/debug.cpp 2010-02-20 13:19:41 UTC (rev 35534) +++ haiku/trunk/src/system/kernel/debug/debug.cpp 2010-02-20 14:00:56 UTC (rev 35535) @@ -683,8 +683,17 @@ } +static inline void +kprintf_args(const char* format, va_list args) +{ + if (sDebugOutputFilter != NULL) + sDebugOutputFilter->Print(format, args); +} + + static void -kernel_debugger_loop(const char* message, int32 cpu) +kernel_debugger_loop(const char* messagePrefix, const char* message, + va_list args, int32 cpu) { int32 previousCPU = sDebuggerOnCPU; sDebuggerOnCPU = cpu; @@ -693,9 +702,15 @@ sCurrentKernelDebuggerMessage = message; - if (message) - kprintf("PANIC: %s\n", message); + if (messagePrefix != NULL || message != NULL) { + if (messagePrefix != NULL) + kprintf("%s", messagePrefix); + if (message) + kprintf_args(message, args); + kprintf("\n"); + } + kprintf("Welcome to Kernel Debugging Land...\n"); // Set a few temporary debug variables and print on which CPU and in which @@ -869,7 +884,8 @@ static void -kernel_debugger_internal(const char* message, int32 cpu) +kernel_debugger_internal(const char* messagePrefix, const char* message, + va_list args, int32 cpu) { while (true) { if (sHandOverKDLToCPU == cpu) { @@ -878,7 +894,7 @@ } else enter_kernel_debugger(cpu); - kernel_debugger_loop(message, cpu); + kernel_debugger_loop(messagePrefix, message, args, cpu); if (sHandOverKDLToCPU < 0) { exit_kernel_debugger(); @@ -1516,7 +1532,8 @@ if (returnIfHandedOver) break; - kernel_debugger_internal(NULL, cpu); + va_list dummy; + kernel_debugger_internal(NULL, NULL, dummy, cpu); } else smp_intercpu_int_handler(cpu); } @@ -1528,7 +1545,8 @@ void debug_double_fault(int32 cpu) { - kernel_debugger_internal("Double Fault!\n", cpu); + va_list dummy; + kernel_debugger_internal("Double Fault!", NULL, dummy, cpu); } @@ -1691,13 +1709,15 @@ panic(const char* format, ...) { va_list args; - char temp[128]; + va_start(args, format); - va_start(args, format); - vsnprintf(temp, sizeof(temp), format, args); + cpu_status state = disable_interrupts(); + + kernel_debugger_internal("PANIC: ", format, args, smp_get_current_cpu()); + + restore_interrupts(state); + va_end(args); - - kernel_debugger(temp); } @@ -1706,7 +1726,8 @@ { cpu_status state = disable_interrupts(); - kernel_debugger_internal(message, smp_get_current_cpu()); + va_list dummy; + kernel_debugger_internal(message, NULL, dummy, smp_get_current_cpu()); restore_interrupts(state); } @@ -1759,7 +1780,7 @@ if (sDebugOutputFilter != NULL) { va_list args; va_start(args, format); - sDebugOutputFilter->Print(format, args); + kprintf_args(format, args); va_end(args); } }