System call to change canonical mode

This commit is contained in:
Baptiste Wicht 2016-08-17 21:39:04 +02:00
parent 9111554089
commit b784bfa38c
5 changed files with 26 additions and 3 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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];

View File

@ -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();

View File

@ -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"