diff --git a/zion/debug/debug.cpp b/zion/debug/debug.cpp index fdd52d5..440e7e9 100644 --- a/zion/debug/debug.cpp +++ b/zion/debug/debug.cpp @@ -1,6 +1,7 @@ #include "debug/debug.h" #include "common/port.h" +#include "scheduler/scheduler.h" #define COM1 0x3f8 @@ -73,7 +74,14 @@ void MemToStr(uint64_t u, char* str) { str[18] = '\0'; } -void dbgln_internal(const char* fmt, va_list args) { +void AddProcPrefix() { + if (gScheduler != nullptr) { + auto& t = gScheduler->CurrentThread(); + dbg("[%u.%u] ", t.pid(), t.tid()); + } +} + +void dbg_internal(const char* fmt, va_list args) { for (; *fmt != '\0'; fmt++) { if (*fmt != '%') { dbgputchar(*fmt); @@ -120,25 +128,34 @@ void dbgln_internal(const char* fmt, va_list args) { } } } - dbgputchar('\n'); } } // namespace -void dbgln(const char* fmt, ...) { +void dbg(const char* fmt, ...) { va_list arg; va_start(arg, fmt); - dbgln_internal(fmt, arg); + dbg_internal(fmt, arg); va_end(arg); } +void dbgln(const char* fmt, ...) { + AddProcPrefix(); + va_list arg; + va_start(arg, fmt); + dbg_internal(fmt, arg); + va_end(arg); + dbgputchar('\n'); +} + void panic(const char* fmt, ...) { asm volatile("cli"); + AddProcPrefix(); va_list arg; va_start(arg, fmt); - dbgln_internal(fmt, arg); + dbg_internal(fmt, arg); va_end(arg); - dbgln("PANIC"); + dbgln("\nPANIC"); while (1) ; } diff --git a/zion/debug/debug.h b/zion/debug/debug.h index 713908f..de65aca 100644 --- a/zion/debug/debug.h +++ b/zion/debug/debug.h @@ -2,5 +2,6 @@ #include +void dbg(const char* fmt, ...); void dbgln(const char* str, ...); void panic(const char* str, ...); diff --git a/zion/scheduler/thread.cpp b/zion/scheduler/thread.cpp index 6db84de..ab726d4 100644 --- a/zion/scheduler/thread.cpp +++ b/zion/scheduler/thread.cpp @@ -41,14 +41,14 @@ Thread::Thread(Process& proc, uint64_t tid, uint64_t entry) uint64_t Thread::pid() const { return process_.id(); } void Thread::Init() { - dbgln("[%u.%u] thread start.", pid(), id_); + dbgln("Thread start.", pid(), id_); uint64_t rsp = process_.vmm().AllocateUserStack(); SetRsp0(rsp0_start_); jump_user_space(rip_, rsp); } void Thread::Exit() { - dbgln("[%u.%u] Exiting", pid(), id_); + dbgln("Exiting", pid(), id_); state_ = FINISHED; process_.CheckState(); gScheduler->Yield(); diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index 965cbe5..39c0fef 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -73,7 +73,7 @@ extern "C" uint64_t SyscallHandler(uint64_t call_id, char* message) { panic("Returned from thread exit"); break; case Z_DEBUG_PRINT: - dbgln("[%u.%u] [Debug] %s", thread.pid(), thread.tid(), message); + dbgln("[Debug] %s", message); break; case Z_PROCESS_SPAWN: return ProcessSpawn(reinterpret_cast(message));