]> git.ameliathe1st.gay Git - voyage-au-centre-des-fichiers.git/commitdiff
Added syscall to show userspace vmemory, to make debugging the kernel easier
authorAmelia Coutard <eliottulio.coutard@gmail.com>
Mon, 6 Mar 2023 19:14:57 +0000 (20:14 +0100)
committerAmelia Coutard <eliottulio.coutard@gmail.com>
Mon, 6 Mar 2023 19:14:57 +0000 (20:14 +0100)
kernel/src/ring3.S
kernel/src/ring3.cpp
kernel/src/ring3.hpp
test_module/src/test.S
test_module/src/test.cpp

index 527fe1b1a1db96f70509b158800e8ff803a8932d..2b6a7831feb55319dbdf2bc27c754113d7cf0fce 100644 (file)
@@ -44,4 +44,5 @@ incorrect_syscall:
 syscalls_call_table:
        .quad syscall_print
        .quad syscall_println
-.set syscall_n, 2
+       .quad syscall_print_low_mmap
+.set syscall_n, 3
index 9cddf88c8b4811d5aeec2d59bdf7999ebe6d674b..589e38ef168e76cacc7f6f93c85b4881adaf3c49 100644 (file)
@@ -14,6 +14,7 @@
 #include "ring3.hpp"
 #include "utils.hpp"
 #include "serial.hpp"
+#include "paging.hpp"
 
 void os::set_ring0_stack(os::tss& tss, std::uint64_t stack) {
        tss.rsp0 = stack;
@@ -33,15 +34,31 @@ void os::enable_syscalls() {
        os::set_msr(0xC0000084, 0x00000000); // syscall flag mask, we don't want to change the flags for now.
 }
 
-extern "C" void syscall_print(char v) {
+extern "C" void os::syscall_print(char v) {
        os::printc(v);
 }
 
-extern "C" void syscall_println(char v) {
+extern "C" void os::syscall_println(char v) {
        os::printc(v);
        os::printc('\n');
 }
 
-extern "C" void syscall_rax_error_handler() {
+extern "C" os::paging::PML4T PML4T;
+extern "C" void os::syscall_print_low_mmap() {
+       os::paging::on_all_pages(PML4T, [](os::paging::page* vaddr, os::phys_ptr<os::paging::page> paddr, std::size_t page_size_in_bytes) {
+               if (std::size_t(vaddr) < 128ul * 1024 * 1024 * 1024 * 1024) { // Lower half:
+                       if (std::size_t(vaddr) < 0x10'0000'0000) {
+                               os::print("segments:");
+                       } else if (std::size_t(vaddr) < 0x7FFF'FFFF'0000) {
+                               os::print("heap:    ");
+                       } else {
+                               os::print("stack:   ");
+                       }
+                       os::print(" {} -> {} (0x{}B)\n", std::size_t(vaddr), paddr.get_phys_addr(), page_size_in_bytes);
+               }
+       });
+}
+
+extern "C" void os::syscall_rax_error_handler() {
        os::assert(false, "Incorrect %rax for syscall.");
 }
index 54077c927f5b9e1c62efa51969a129bc2456ee6b..eab7646b35b2a5d23c2c3717f0b76a735d19eb8d 100644 (file)
@@ -41,6 +41,7 @@ extern "C" void syscall_64bit_handler();
 
 extern "C" void syscall_print(char c);
 extern "C" void syscall_println(char c);
+extern "C" void syscall_print_low_mmap();
 extern "C" void syscall_rax_error_handler();
 
 void set_ring0_stack(tss& tss, std::uint64_t stack);
index 65e81561b887e4221b57baf62556f1b435f7c201..968868ea7ba5f1d5dd58061b45d54dd766b22f56 100644 (file)
@@ -18,3 +18,9 @@ print:
        mov $0, %rax
        syscall
        ret
+
+.globl check_mem
+check_mem:
+       mov $2, %rax
+       syscall
+       ret
index ef01f0032287ecf7634fc2feebd0257fa1b9f1d6..4f6294dbb61c74c8b1feb07afa2c65908a775a4b 100644 (file)
@@ -14,6 +14,7 @@
 #include <stddef.h>
 
 extern "C" void print(char c);
+extern "C" void check_mem();
 
 void printstr(const char* str) {
        for (size_t i = 0; str[i] != '\0'; i++) {
@@ -26,5 +27,8 @@ extern "C" void _start() {
        for (size_t i = 0; i < 16; i++) {
                printstr(str);
        }
+       printstr("Mem:\n");
+       check_mem();
+       printstr("Done.\n");
        while (true) {}
 }