diff --git a/headers/private/kernel/debug.h b/headers/private/kernel/debug.h index c0e959c751..1b748de624 100644 --- a/headers/private/kernel/debug.h +++ b/headers/private/kernel/debug.h @@ -161,6 +161,7 @@ extern status_t debug_get_next_demangled_argument(uint32* _cookie, extern struct thread* debug_set_debugged_thread(struct thread* thread); extern struct thread* debug_get_debugged_thread(); +extern status_t _user_kernel_debugger(const char *message); extern void _user_debug_output(const char *userString); #ifdef __cplusplus diff --git a/headers/private/system/syscalls.h b/headers/private/system/syscalls.h index 9662391bd1..d83764594b 100644 --- a/headers/private/system/syscalls.h +++ b/headers/private/system/syscalls.h @@ -420,6 +420,7 @@ extern status_t _kern_get_port_message_info_etc(port_id port, bigtime_t timeout); // debug support functions +extern status_t _kern_kernel_debugger(const char *message); extern void _kern_debugger(const char *message); extern int _kern_disable_debugger(int state); diff --git a/src/system/kernel/debug/debug.cpp b/src/system/kernel/debug/debug.cpp index 3d90281400..30f799508d 100644 --- a/src/system/kernel/debug/debug.cpp +++ b/src/system/kernel/debug/debug.cpp @@ -1660,6 +1660,27 @@ debug_get_debugged_thread() // userland syscalls +status_t +_user_kernel_debugger(const char *userMessage) +{ + if (geteuid() != 0) + return B_NOT_ALLOWED; + + char message[512]; + strcpy(message, "USER: "); + size_t len = strlen(message); + + if (userMessage == NULL || !IS_USER_ADDRESS(userMessage) + || user_strlcpy(message + len, userMessage, sizeof(message) - len) + < 0) { + return B_BAD_ADDRESS; + } + + kernel_debugger(message); + return B_OK; +} + + void _user_debug_output(const char* userString) {