From 2cd81f7652138f423ae5ff92f03fe33fb48e8f42 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Thu, 18 Aug 2016 21:17:47 +0200 Subject: [PATCH] Userspace logging --- kernel/src/system_calls.cpp | 9 +++++++++ kernel/src/terminal.cpp | 2 ++ tlib/include/tlib/print.hpp | 2 ++ tlib/src/print.cpp | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index 300c5a6c..a903ed58 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -31,6 +31,11 @@ void sc_print_string(interrupt::syscall_regs* regs){ k_print(reinterpret_cast(regs->rbx)); } +void sc_log_string(interrupt::syscall_regs* regs){ + auto m = reinterpret_cast(regs->rbx); + logging::logf(logging::log_level::USER, "%s\n", m); +} + void sc_get_input(interrupt::syscall_regs* regs){ auto ttyid = scheduler::get_process(scheduler::get_pid()).tty; auto& tty = stdio::get_terminal(ttyid); @@ -336,6 +341,10 @@ void system_call_entry(interrupt::syscall_regs* regs){ sc_print_string(regs); break; + case 2: + sc_log_string(regs); + break; + case 4: sc_sleep_ms(regs); break; diff --git a/kernel/src/terminal.cpp b/kernel/src/terminal.cpp index 87cc7596..bfdee67b 100644 --- a/kernel/src/terminal.cpp +++ b/kernel/src/terminal.cpp @@ -80,6 +80,8 @@ void stdio::virtual_terminal::send_input(char key){ if(!input_queue.empty()){ input_queue.wake_up(); } + + thor_assert(!raw_buffer.full(), "raw buffer is full!"); } } diff --git a/tlib/include/tlib/print.hpp b/tlib/include/tlib/print.hpp index 501ff4e5..5817d672 100644 --- a/tlib/include/tlib/print.hpp +++ b/tlib/include/tlib/print.hpp @@ -50,4 +50,6 @@ size_t get_rows(); #include "printf_dec.hpp" +void user_logf(const char* s, ...); + #endif diff --git a/tlib/src/print.cpp b/tlib/src/print.cpp index 63136045..a308843c 100644 --- a/tlib/src/print.cpp +++ b/tlib/src/print.cpp @@ -23,6 +23,13 @@ void print(const char* s){ : "rax", "rbx"); } +void log(const char* s){ + asm volatile("mov rax, 2; mov rbx, %[s]; int 50" + : //No outputs + : [s] "g" (reinterpret_cast(s)) + : "rax", "rbx"); +} + void print(uint8_t v){ print(std::to_string(v)); } @@ -156,3 +163,14 @@ void __printf(const std::string& formatted){ void __printf_raw(const char* formatted){ print(formatted); } + +void user_logf(const char* s, ...){ + va_list va; + va_start(va, s); + + char buffer[512]; + vsprintf_raw(buffer, 512, s, va); + log(buffer); + + va_end(va); +}