From af76d47f501b8a306d2ca7f1600efcc449f7021e Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 24 Sep 2016 17:16:45 +0200 Subject: [PATCH] Review print --- kernel/include/console.hpp | 29 ------- kernel/include/print.hpp | 46 +++++++++++ kernel/src/acpi.cpp | 2 +- kernel/src/assert.cpp | 2 +- kernel/src/console.cpp | 130 +++++------------------------- kernel/src/disks.cpp | 2 +- kernel/src/interrupts.cpp | 2 +- kernel/src/kalloc.cpp | 2 +- kernel/src/kernel.cpp | 1 + kernel/src/kernel_utils.cpp | 2 +- kernel/src/logging.cpp | 2 +- kernel/src/paging.cpp | 2 +- kernel/src/physical_allocator.cpp | 2 +- kernel/src/print.cpp | 114 ++++++++++++++++++++++++++ kernel/src/scheduler.cpp | 2 +- kernel/src/system_calls.cpp | 1 + kernel/src/terminal.cpp | 2 + kernel/src/thor.cpp | 2 +- kernel/src/thor_acpi.cpp | 2 +- 19 files changed, 195 insertions(+), 152 deletions(-) create mode 100644 kernel/include/print.hpp create mode 100644 kernel/src/print.cpp diff --git a/kernel/include/console.hpp b/kernel/include/console.hpp index 24b8ce81..9711cb89 100644 --- a/kernel/include/console.hpp +++ b/kernel/include/console.hpp @@ -34,33 +34,4 @@ void wipeout(); } // end of namespace console -void k_print(char key); -void k_print(const char* string); -void k_print(const char* string, uint64_t end); - -void k_print(const std::string& s); - -void k_print(uint8_t number); -void k_print(uint16_t number); -void k_print(uint32_t number); -void k_print(uint64_t number); - -void k_print(int8_t number); -void k_print(int16_t number); -void k_print(int32_t number); -void k_print(int64_t number); - -template -typename std::enable_if_t<(sizeof...(Arguments) == 0)> k_print_line(const Arguments&... args){ - k_print('\n'); -} - -template -typename std::enable_if_t<(sizeof...(Arguments) > 0)> k_print_line(const Arguments&... args){ - k_print(args...); - k_print('\n'); -} - -#include "printf_dec.hpp" - #endif diff --git a/kernel/include/print.hpp b/kernel/include/print.hpp new file mode 100644 index 00000000..e38899eb --- /dev/null +++ b/kernel/include/print.hpp @@ -0,0 +1,46 @@ +//======================================================================= +// Copyright Baptiste Wicht 2013-2016. +// Distributed under the terms of the MIT License. +// (See accompanying file LICENSE or copy at +// http://www.opensource.org/licenses/MIT) +//======================================================================= + +#ifndef PRINT_H +#define PRINT_H + +#include + +#include +#include +#include + +void k_print(char key); +void k_print(const char* string); +void k_print(const char* string, uint64_t end); + +void k_print(const std::string& s); + +void k_print(uint8_t number); +void k_print(uint16_t number); +void k_print(uint32_t number); +void k_print(uint64_t number); + +void k_print(int8_t number); +void k_print(int16_t number); +void k_print(int32_t number); +void k_print(int64_t number); + +template +typename std::enable_if_t<(sizeof...(Arguments) == 0)> k_print_line(const Arguments&... args){ + k_print('\n'); +} + +template +typename std::enable_if_t<(sizeof...(Arguments) > 0)> k_print_line(const Arguments&... args){ + k_print(args...); + k_print('\n'); +} + +#include "printf_dec.hpp" + +#endif diff --git a/kernel/src/acpi.cpp b/kernel/src/acpi.cpp index f04f5466..bb53bbbf 100644 --- a/kernel/src/acpi.cpp +++ b/kernel/src/acpi.cpp @@ -10,7 +10,7 @@ #include "kernel_utils.hpp" #include "timer.hpp" #include "paging.hpp" -#include "console.hpp" +#include "print.hpp" #include "logging.hpp" #include "scheduler.hpp" #include "arch.hpp" diff --git a/kernel/src/assert.cpp b/kernel/src/assert.cpp index 91a6e958..004dc4c9 100644 --- a/kernel/src/assert.cpp +++ b/kernel/src/assert.cpp @@ -6,7 +6,7 @@ //======================================================================= #include "assert.hpp" -#include "console.hpp" +#include "print.hpp" #include "kernel.hpp" #include "logging.hpp" diff --git a/kernel/src/console.cpp b/kernel/src/console.cpp index 65611cbf..0536aa42 100644 --- a/kernel/src/console.cpp +++ b/kernel/src/console.cpp @@ -50,38 +50,6 @@ void print_char(size_t line, size_t column, char c){ volatile size_t current_line = 0; volatile size_t current_column = 0; -template -void print_unsigned(D number){ - if(number == 0){ - k_print('0'); - return; - } - - char buffer[B]; - int i = 0; - - while(number != 0){ - buffer[i++] = '0' + number % 10; - number /= 10; - } - - --i; - - for(; i >= 0; --i){ - k_print(buffer[i]); - } -} - -template -void print_signed(D number){ - if(number < 0){ - k_print('-'); - print_unsigned(static_cast(-1 * number)); - } else { - print_unsigned(static_cast(number)); - } -} - void next_line(){ ++current_line; @@ -178,84 +146,24 @@ void console::wipeout(){ current_column = 0; } -void k_print(uint8_t number){ - print_unsigned<3>(number); -} +//void k_print(char key){ + //if(key == '\n'){ + //next_line(); + //} else if(key == '\r'){ + //// Ignore \r for now + //} else if(key == '\b'){ + //--current_column; + //k_print(' '); + //--current_column; + //} else if(key == '\t'){ + //k_print(" "); + //} else { + //print_char(current_line, current_column, key); -void k_print(uint16_t number){ - print_unsigned<5>(number); -} + //++current_column; -void k_print(uint32_t number){ - print_unsigned<10>(number); -} - -void k_print(uint64_t number){ - print_unsigned<20>(number); -} - -void k_print(int8_t number){ - print_signed<3,uint8_t>(number); -} - -void k_print(int16_t number){ - print_signed<5,uint16_t>(number); -} - -void k_print(int32_t number){ - print_signed<10,uint32_t>(number); -} - -void k_print(int64_t number){ - print_signed<20,uint64_t,int64_t>(number); -} - -void k_print(char key){ - if(key == '\n'){ - next_line(); - } else if(key == '\r'){ - // Ignore \r for now - } else if(key == '\b'){ - --current_column; - k_print(' '); - --current_column; - } else if(key == '\t'){ - k_print(" "); - } else { - print_char(current_line, current_column, key); - - ++current_column; - - if(current_column == console::get_columns()){ - next_line(); - } - } -} - -void k_print(const char* str){ - for(uint64_t i = 0; str[i] != 0; ++i){ - k_print(str[i]); - } -} - -void k_print(const std::string& s){ - for(auto c : s){ - k_print(c); - } -} - -void k_print(const char* str, uint64_t end){ - for(uint64_t i = 0; i < end && str[i] != 0; ++i){ - k_print(str[i]); - } -} - -#include "printf_def.hpp" - -void __printf(const std::string& str){ - k_print(str); -} - -void __printf_raw(const char* str){ - k_print(str); -} + //if(current_column == console::get_columns()){ + //next_line(); + //} + //} +//} diff --git a/kernel/src/disks.cpp b/kernel/src/disks.cpp index 33c70c21..849bf37c 100644 --- a/kernel/src/disks.cpp +++ b/kernel/src/disks.cpp @@ -11,7 +11,7 @@ #include "disks.hpp" #include "thor.hpp" -#include "console.hpp" +#include "print.hpp" #include "logging.hpp" // The disks implementation diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp index d01c2588..76594e99 100644 --- a/kernel/src/interrupts.cpp +++ b/kernel/src/interrupts.cpp @@ -8,7 +8,7 @@ #include #include "interrupts.hpp" -#include "console.hpp" +#include "print.hpp" #include "kernel_utils.hpp" #include "gdt.hpp" #include "scheduler.hpp" diff --git a/kernel/src/kalloc.cpp b/kernel/src/kalloc.cpp index 97474157..71da18c4 100644 --- a/kernel/src/kalloc.cpp +++ b/kernel/src/kalloc.cpp @@ -6,7 +6,7 @@ //======================================================================= #include "kalloc.hpp" -#include "console.hpp" +#include "print.hpp" #include "physical_allocator.hpp" #include "paging.hpp" #include "e820.hpp" diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index 84cf00c8..2f80a9b1 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -22,6 +22,7 @@ #include "arch.hpp" #include "vesa.hpp" #include "console.hpp" +#include "print.hpp" #include "gdt.hpp" #include "stdio.hpp" #include "scheduler.hpp" diff --git a/kernel/src/kernel_utils.cpp b/kernel/src/kernel_utils.cpp index 793669d7..7f2d9c79 100644 --- a/kernel/src/kernel_utils.cpp +++ b/kernel/src/kernel_utils.cpp @@ -6,7 +6,7 @@ //======================================================================= #include "kernel_utils.hpp" -#include "console.hpp" +#include "print.hpp" void print_stack(const char* s, size_t check){ printf("%s stack: %u (16B-a:%u) \n", s, check, static_cast(check % 16)); diff --git a/kernel/src/logging.cpp b/kernel/src/logging.cpp index a88e3eff..00592b01 100644 --- a/kernel/src/logging.cpp +++ b/kernel/src/logging.cpp @@ -11,7 +11,7 @@ #include "logging.hpp" #include "assert.hpp" -#include "console.hpp" +#include "print.hpp" #include "virtual_debug.hpp" #include "early_memory.hpp" #include "vfs/vfs.hpp" diff --git a/kernel/src/paging.cpp b/kernel/src/paging.cpp index 653ef700..ee51b2b3 100644 --- a/kernel/src/paging.cpp +++ b/kernel/src/paging.cpp @@ -12,7 +12,7 @@ #include "paging.hpp" #include "kernel.hpp" #include "physical_allocator.hpp" -#include "console.hpp" +#include "print.hpp" #include "assert.hpp" #include "process.hpp" #include "physical_pointer.hpp" diff --git a/kernel/src/physical_allocator.cpp b/kernel/src/physical_allocator.cpp index ab1f3caf..a3674e79 100644 --- a/kernel/src/physical_allocator.cpp +++ b/kernel/src/physical_allocator.cpp @@ -17,7 +17,7 @@ //For problems during boot #include "kernel.hpp" -#include "console.hpp" +#include "print.hpp" namespace { diff --git a/kernel/src/print.cpp b/kernel/src/print.cpp new file mode 100644 index 00000000..75a37218 --- /dev/null +++ b/kernel/src/print.cpp @@ -0,0 +1,114 @@ +//======================================================================= +// Copyright Baptiste Wicht 2013-2016. +// Distributed under the terms of the MIT License. +// (See accompanying file LICENSE or copy at +// http://www.opensource.org/licenses/MIT) +//======================================================================= + +#include + +#include +#include + +#include "print.hpp" +#include "stdio.hpp" + +namespace { + +template +void print_unsigned(D number){ + if(number == 0){ + k_print('0'); + return; + } + + char buffer[B]; + int i = 0; + + while(number != 0){ + buffer[i++] = '0' + number % 10; + number /= 10; + } + + --i; + + for(; i >= 0; --i){ + k_print(buffer[i]); + } +} + +template +void print_signed(D number){ + if(number < 0){ + k_print('-'); + print_unsigned(static_cast(-1 * number)); + } else { + print_unsigned(static_cast(number)); + } +} + +} // end of anonymous namespace + +void k_print(uint8_t number){ + print_unsigned<3>(number); +} + +void k_print(uint16_t number){ + print_unsigned<5>(number); +} + +void k_print(uint32_t number){ + print_unsigned<10>(number); +} + +void k_print(uint64_t number){ + print_unsigned<20>(number); +} + +void k_print(int8_t number){ + print_signed<3,uint8_t>(number); +} + +void k_print(int16_t number){ + print_signed<5,uint16_t>(number); +} + +void k_print(int32_t number){ + print_signed<10,uint32_t>(number); +} + +void k_print(int64_t number){ + print_signed<20,uint64_t,int64_t>(number); +} + +void k_print(char key){ + stdio::get_active_terminal().print(key); +} + +void k_print(const char* str){ + for(uint64_t i = 0; str[i] != 0; ++i){ + k_print(str[i]); + } +} + +void k_print(const std::string& s){ + for(auto c : s){ + k_print(c); + } +} + +void k_print(const char* str, uint64_t end){ + for(uint64_t i = 0; i < end && str[i] != 0; ++i){ + k_print(str[i]); + } +} + +#include "printf_def.hpp" + +void __printf(const std::string& str){ + k_print(str); +} + +void __printf_raw(const char* str){ + k_print(str); +} diff --git a/kernel/src/scheduler.cpp b/kernel/src/scheduler.cpp index 9dda31ef..2ba1d983 100644 --- a/kernel/src/scheduler.cpp +++ b/kernel/src/scheduler.cpp @@ -22,7 +22,7 @@ #include "gdt.hpp" #include "stdio.hpp" #include "disks.hpp" -#include "console.hpp" +#include "print.hpp" #include "physical_allocator.hpp" #include "virtual_allocator.hpp" #include "physical_pointer.hpp" diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index 45962277..1cca7865 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -7,6 +7,7 @@ #include "system_calls.hpp" #include "console.hpp" +#include "print.hpp" #include "scheduler.hpp" #include "timer.hpp" #include "drivers/keyboard.hpp" diff --git a/kernel/src/terminal.cpp b/kernel/src/terminal.cpp index fb887bd8..e226dbad 100644 --- a/kernel/src/terminal.cpp +++ b/kernel/src/terminal.cpp @@ -15,6 +15,8 @@ #include "logging.hpp" #include "scheduler.hpp" +#include "print.hpp" + void stdio::virtual_terminal::print(char key){ //TODO If it is not the active terminal, buffer it k_print(key); diff --git a/kernel/src/thor.cpp b/kernel/src/thor.cpp index bc6eab66..9cbe2a4a 100644 --- a/kernel/src/thor.cpp +++ b/kernel/src/thor.cpp @@ -9,7 +9,7 @@ #include "kalloc.hpp" #include "scheduler.hpp" #include "logging.hpp" -#include "console.hpp" +#include "print.hpp" void* operator new(uint64_t size){ return kalloc::k_malloc(size); diff --git a/kernel/src/thor_acpi.cpp b/kernel/src/thor_acpi.cpp index 4002fdc2..9d560cf6 100644 --- a/kernel/src/thor_acpi.cpp +++ b/kernel/src/thor_acpi.cpp @@ -16,7 +16,7 @@ #include "acpica.hpp" #include "kalloc.hpp" -#include "console.hpp" +#include "print.hpp" #include "scheduler.hpp" #include "virtual_allocator.hpp" #include "paging.hpp"