From 6ec174b0c8e7626d78ca1b2ce9f4ada7df936979 Mon Sep 17 00:00:00 2001 From: Amelia Coutard Date: Sun, 26 Mar 2023 04:08:35 +0200 Subject: [PATCH] Added printing of phys_ptrs and pointers --- kernel/src/interrupts.cpp | 6 +++--- kernel/src/paging.cpp | 2 +- kernel/src/ring3.cpp | 2 +- kernel/src/serial.cpp | 26 +++++++++++++++++++++++++- kernel/src/serial.hpp | 8 ++++++++ 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp index 5cea3c8..8377345 100644 --- a/kernel/src/interrupts.cpp +++ b/kernel/src/interrupts.cpp @@ -111,19 +111,19 @@ extern "C" void int_page_fault(std::uint32_t err_code, std::uint64_t vaddr) { if ( (0xFFFF'C000'0000'0000 <= vaddr && vaddr < 0xFFFF'C000'0801'0000) // process/port info ) { // Kernel memory - os::print("Allocating (Ring 0): {}\n", vaddr); + os::print("Allocating (Ring 0): {}\n", (void*)vaddr); os::paging::setup_page(PML4T, (void*)vaddr, true, false); return; } else if ( (0x0000'7FFF'FFFF'0000 <= vaddr && vaddr < 0x0000'8000'0000'0000) // stack ) { // Userspace memory - os::print("Allocating (Ring 3): {}\n", vaddr); + os::print("Allocating (Ring 3): {}\n", (void*)vaddr); os::paging::setup_page(*os::get_process(os::current_pid).PML4T, (void*)vaddr, true, true); return; } os::print("Interrupt: Page Fault.\n"); os::print("Err code: {}.\n", err_code); - os::print("Vaddr: {}.\n", vaddr); + os::print("Vaddr: {}.\n", (void*)vaddr); while (true) { os::hlt(); } } extern "C" void int_x87_floating_point_exception() { diff --git a/kernel/src/paging.cpp b/kernel/src/paging.cpp index c3af8d5..13ea990 100644 --- a/kernel/src/paging.cpp +++ b/kernel/src/paging.cpp @@ -112,7 +112,7 @@ os::paging::page_allocator_t::page_allocator_t(): begin(nullptr) {} void os::paging::page_allocator_t::print_all() const { for (auto it = begin; it != nullptr; it = it->next) { - os::print("{} -> {} ({})\n", it.get_phys_addr(), (it + it->size).get_phys_addr(), it->size); + os::print("{} -> {} ({})\n", it, it + it->size, it->size); } } diff --git a/kernel/src/ring3.cpp b/kernel/src/ring3.cpp index c0f58bd..7aee109 100644 --- a/kernel/src/ring3.cpp +++ b/kernel/src/ring3.cpp @@ -61,7 +61,7 @@ extern "C" void os::syscall_print_low_mmap() { } else { os::print("stack: "); } - os::print(" {} -> {} (0x{}B)\n", std::size_t(vaddr), paddr.get_phys_addr(), page_size_in_bytes); + os::print(" {} -> {} ({}B)\n", vaddr, paddr, page_size_in_bytes); } }); } diff --git a/kernel/src/serial.cpp b/kernel/src/serial.cpp index d02bc12..bd70246 100644 --- a/kernel/src/serial.cpp +++ b/kernel/src/serial.cpp @@ -60,9 +60,17 @@ void os::print_formatted(const char* format, const char* val) { } void os::print_formatted(const char* format, std::uint64_t val) { os::assert(format[0] == '}', "Format string unsupported. TODO."); + bool printed = false; + os::print("0x"); for (int i = 60; i >= 0; i -= 4) { const int v = (val >> i) & 0xF; - os::printc(v < 10 ? v + '0' : v - 10 + 'a'); + if (printed || v != 0) { + os::printc(v < 10 ? v + '0' : v - 10 + 'a'); + printed = true; + } + } + if (!printed) { + os::printc('0'); } } void os::print_formatted(const char* format, std::int64_t val) { @@ -75,3 +83,19 @@ void os::print_formatted(const char* format, std::int64_t val) { os::print_formatted(format, std::uint64_t(val)); } } +void os::print_formatted(const char* format, phys_ptr val) { + os::assert(format[0] == '}', "Format string unsupported. TODO."); + os::print("0x"); + for (int i = 60; i >= 0; i -= 4) { + const int v = (val.get_phys_addr() >> i) & 0xF; + os::printc(v < 10 ? v + '0' : v - 10 + 'a'); + } +} +void os::print_formatted(const char* format, const void* val) { + os::assert(format[0] == '}', "Format string unsupported. TODO."); + os::print("0x"); + for (int i = 60; i >= 0; i -= 4) { + const int v = (reinterpret_cast(val) >> i) & 0xF; + os::printc(v < 10 ? v + '0' : v - 10 + 'a'); + } +} diff --git a/kernel/src/serial.hpp b/kernel/src/serial.hpp index c64de07..56c4ef9 100644 --- a/kernel/src/serial.hpp +++ b/kernel/src/serial.hpp @@ -15,6 +15,8 @@ #include +#include "lib/phys_ptr.hpp" + namespace os { template @@ -33,6 +35,8 @@ void printc(char c); void print_formatted(const char* format, const char* val); void print_formatted(const char* format, std::uint64_t val); void print_formatted(const char* format, std::int64_t val); +void print_formatted(const char* format, phys_ptr val); +void print_formatted(const char* format, const void* val); template struct get_more_general_type_helper { using T = T_; @@ -44,6 +48,10 @@ template <> struct get_more_general_type_helper { using T = std:: template <> struct get_more_general_type_helper { using T = std::int64_t; }; template <> struct get_more_general_type_helper { using T = std::int64_t; }; template <> struct get_more_general_type_helper { using T = std::int64_t; }; +template <> struct get_more_general_type_helper { using T = const char*; }; +template <> struct get_more_general_type_helper { using T = const char*; }; +template struct get_more_general_type_helper> { using T = phys_ptr; }; +template struct get_more_general_type_helper { using T = const void*; }; template struct get_more_general_type_helper { using T = const char*; }; struct print_nth_helper { -- 2.47.0