From b784bfa38c5079b919b4121d151718404fecea27 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Wed, 17 Aug 2016 21:39:04 +0200 Subject: [PATCH] System call to change canonical mode --- kernel/include/terminal.hpp | 2 ++ kernel/src/system_calls.cpp | 7 +++++++ kernel/src/terminal.cpp | 11 ++++++++--- tlib/include/print.hpp | 1 + tlib/src/print.cpp | 8 ++++++++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/kernel/include/terminal.hpp b/kernel/include/terminal.hpp index faf64b9c..01c64764 100644 --- a/kernel/include/terminal.hpp +++ b/kernel/include/terminal.hpp @@ -45,6 +45,8 @@ struct virtual_terminal { */ size_t read_input_raw(); + void set_canonical(bool can); + virtual_terminal(){} virtual_terminal(const virtual_terminal& rhs) = delete; diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index 0ca2eab6..0142259b 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -45,6 +45,13 @@ void sc_get_input_raw(interrupt::syscall_regs* regs){ regs->rax = tty.read_input_raw(); } +void sc_set_canonical(interrupt::syscall_regs* regs){ + auto ttyid = scheduler::get_process(scheduler::get_pid()).tty; + auto& tty = stdio::get_terminal(ttyid); + + tty.set_canonical(regs->rbx); +} + void sc_sleep_ms(interrupt::syscall_regs* regs){ auto time = regs->rbx; diff --git a/kernel/src/terminal.cpp b/kernel/src/terminal.cpp index 24084ee5..f526135d 100644 --- a/kernel/src/terminal.cpp +++ b/kernel/src/terminal.cpp @@ -11,6 +11,7 @@ #include "keyboard.hpp" #include "console.hpp" #include "assert.hpp" +#include "logging.hpp" namespace { @@ -60,9 +61,7 @@ void stdio::virtual_terminal::send_input(char key){ if(qwertz_key == '\n'){ // Transfer current line to the canonical buffer while(!input_buffer.empty()){ - canonical_buffer.push(input_buffer.pop()); - } - + canonical_buffer.push(input_buffer.pop()); } if(!input_queue.empty()){ input_queue.wake_up(); } @@ -107,6 +106,12 @@ size_t stdio::virtual_terminal::read_input_raw(){ return raw_buffer.pop(); } +void stdio::virtual_terminal::set_canonical(bool can){ + logging::logf(logging::log_level::TRACE, "Switched terminal %u canonical mode from %u to %u\n", id, uint64_t(canonical), uint64_t(canonical)); + + canonical = can; +} + void stdio::init_terminals(){ for(size_t i = 0; i < MAX_TERMINALS; ++i){ auto& terminal = terminals[i]; diff --git a/tlib/include/print.hpp b/tlib/include/print.hpp index 5e3883fc..7cc1cfe7 100644 --- a/tlib/include/print.hpp +++ b/tlib/include/print.hpp @@ -34,6 +34,7 @@ void print_line(const char* s); void print_line(size_t v); void print_line(const std::string& s); +void set_canonical(bool can); size_t read_input(char* buffer, size_t max); size_t read_input_raw(); diff --git a/tlib/src/print.cpp b/tlib/src/print.cpp index 3dacd8fb..89f7cd58 100644 --- a/tlib/src/print.cpp +++ b/tlib/src/print.cpp @@ -55,6 +55,14 @@ void print(int64_t v){ print(std::to_string(v)); } +void set_canonical(bool can){ + size_t value = can; + asm volatile("mov rax, 11; mov rbx, %[value]; int 50;" + : + : [value] "g" (value) + : "rax", "rbx"); +} + size_t read_input(char* buffer, size_t max){ size_t value; asm volatile("mov rax, 3; mov rbx, %[buffer]; mov rcx, %[max]; int 50; mov %[read], rax"