diff --git a/headers/os/kernel/OS.h b/headers/os/kernel/OS.h index d7648ac9aa..c3ccad50a8 100644 --- a/headers/os/kernel/OS.h +++ b/headers/os/kernel/OS.h @@ -362,6 +362,9 @@ extern int disable_debugger(int state); extern void debug_printf(const char *format, ...) __attribute__ ((format (__printf__, 1, 2))); extern void debug_vprintf(const char *format, va_list args); +extern void ktrace_printf(const char *format, ...) + __attribute__ ((format (__printf__, 1, 2))); +extern void ktrace_vprintf(const char *format, va_list args); /*-------------------------------------------------------------*/ diff --git a/headers/private/kernel/syscalls.h b/headers/private/kernel/syscalls.h index e140f5fee3..fa1560fb2d 100644 --- a/headers/private/kernel/syscalls.h +++ b/headers/private/kernel/syscalls.h @@ -300,6 +300,7 @@ extern status_t _kern_get_system_info(system_info *info, size_t size); /* Debug output */ extern void _kern_debug_output(const char *message); +extern void _kern_ktrace_output(const char *message); extern status_t _kern_frame_buffer_update(addr_t baseAddress, int32 width, int32 height, int32 depth, int32 bytesPerRow); diff --git a/headers/private/kernel/tracing.h b/headers/private/kernel/tracing.h index 4b5599160a..8b530dbaaf 100644 --- a/headers/private/kernel/tracing.h +++ b/headers/private/kernel/tracing.h @@ -87,6 +87,8 @@ char* alloc_tracing_buffer_strcpy(const char* source, size_t maxSize, bool user); status_t tracing_init(void); +void _user_ktrace_output(const char *message); + #ifdef __cplusplus } #endif diff --git a/src/system/kernel/debug/tracing.cpp b/src/system/kernel/debug/tracing.cpp index 06e6719ad8..7f43e761f8 100644 --- a/src/system/kernel/debug/tracing.cpp +++ b/src/system/kernel/debug/tracing.cpp @@ -317,6 +317,32 @@ AbstractTraceEntry::AddDump(TraceOutput& out) bool AbstractTraceEntry::sPrintTeamID = false; +// #pragma mark - + + +#if ENABLE_TRACING + +class UserTraceEntry : public AbstractTraceEntry { + public: + UserTraceEntry(const char* message) + { + fMessage = alloc_tracing_buffer_strcpy(message, 256, true); + + Initialized(); + } + + virtual void AddDump(TraceOutput& out) + { + out.Print("user: %s", fMessage); + } + + private: + char* fMessage; +}; + +#endif // ENABLE_TRACING + + // #pragma mark - trace filters @@ -1026,3 +1052,12 @@ tracing_init(void) return B_OK; } + +void +_user_ktrace_output(const char *message) +{ +#if ENABLE_TRACING + new(nothrow) UserTraceEntry(message); +#endif // ENABLE_TRACING +} + diff --git a/src/system/libroot/os/debug.c b/src/system/libroot/os/debug.c index 5a51248fd1..a5dc44f787 100644 --- a/src/system/libroot/os/debug.c +++ b/src/system/libroot/os/debug.c @@ -289,3 +289,23 @@ debug_vprintf(const char *format, va_list args) } +void +ktrace_printf(const char *format, ...) +{ + va_list list; + va_start(list, format); + + ktrace_vprintf(format, list); + + va_end(list); +} + + +void +ktrace_vprintf(const char *format, va_list args) +{ + char buffer[1024]; + vsnprintf(buffer, sizeof(buffer), format, args); + + _kern_ktrace_output(buffer); +}