diff --git a/kernel-src/sys/syscalls/print.c b/kernel-src/sys/syscalls/print.c index c274fb32..311233af 100644 --- a/kernel-src/sys/syscalls/print.c +++ b/kernel-src/sys/syscalls/print.c @@ -2,24 +2,40 @@ #include #include #include +#include +#include syscallret_t syscall_print(context_t *context, char *message) { syscallret_t ret = { - .ret = 0, - .errno = 0 + .ret = -1 }; - static mutex_t mutex; - static bool initialized = false; + static MUTEX_DEFINE(mutex); - if (initialized == false) { - MUTEX_INIT(&mutex); - initialized = true; - } + size_t len; + ret.errno = usercopy_strlen(message, &len); + if (ret.errno) + return ret; + + len = min(len, 1023); + + char msg[1024]; + ret.errno = usercopy_fromuser(msg, message, len); + if (ret.errno) + return ret; + + msg[len] = '\0'; + + char prefix[100]; + snprintf(prefix, 100, "pid %d tid %d: ", current_thread()->proc->pid, current_thread()->tid); MUTEX_ACQUIRE(&mutex); - arch_e9_puts(message); + arch_e9_puts(prefix); + arch_e9_puts(msg); arch_e9_putc('\n'); MUTEX_RELEASE(&mutex); + + ret.errno = 0; + ret.ret = 0; return ret; }