From 47a58c51c6dbdee78e5bcfa53ae09cdf2e70186c Mon Sep 17 00:00:00 2001 From: Timon Kruiper Date: Mon, 2 May 2022 20:03:06 +0200 Subject: [PATCH] Kernel: Modify UART::print_str() to also take into account the length Previously in the aarch64 Kernel, this would cause dbgln() to actually print more characters of the next string in memory, because strings in the Kernel are not zero terminated by default. Prevent this by using the passed in length of the string. --- Kernel/Arch/aarch64/Prekernel/PrekernelCommon.cpp | 5 ++--- Kernel/Arch/aarch64/RPi/UART.h | 4 ++-- Kernel/Arch/aarch64/kprintf.cpp | 12 ++++++------ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Kernel/Arch/aarch64/Prekernel/PrekernelCommon.cpp b/Kernel/Arch/aarch64/Prekernel/PrekernelCommon.cpp index f81eeb74fd..d7187bdfe0 100644 --- a/Kernel/Arch/aarch64/Prekernel/PrekernelCommon.cpp +++ b/Kernel/Arch/aarch64/Prekernel/PrekernelCommon.cpp @@ -15,9 +15,8 @@ namespace Prekernel { { auto& uart = Prekernel::UART::the(); - if (msg) { - uart.print_str(msg); - } + while (*msg) + uart.send(*msg++); Prekernel::halt(); } diff --git a/Kernel/Arch/aarch64/RPi/UART.h b/Kernel/Arch/aarch64/RPi/UART.h index 7b77cda167..5cf56aeecb 100644 --- a/Kernel/Arch/aarch64/RPi/UART.h +++ b/Kernel/Arch/aarch64/RPi/UART.h @@ -22,9 +22,9 @@ public: void send(u32 c); u32 receive(); - void print_str(char const* s) + void print_str(char const* s, size_t length) { - while (*s) + for (size_t i = 0; i < length; ++i) send(*s++); } void print_num(u64 n) diff --git a/Kernel/Arch/aarch64/kprintf.cpp b/Kernel/Arch/aarch64/kprintf.cpp index 7c20d34e4a..2324a9908a 100644 --- a/Kernel/Arch/aarch64/kprintf.cpp +++ b/Kernel/Arch/aarch64/kprintf.cpp @@ -9,29 +9,29 @@ // FIXME: Merge the code in this file with Kernel/kprintf.cpp once the proper abstractions are in place. -void kernelputstr(char const* characters, size_t) +void kernelputstr(char const* characters, size_t length) { if (!characters) return; auto& uart = Prekernel::UART::the(); - uart.print_str(characters); + uart.print_str(characters, length); } -void kernelcriticalputstr(char const* characters, size_t) +void kernelcriticalputstr(char const* characters, size_t length) { if (!characters) return; auto& uart = Prekernel::UART::the(); - uart.print_str(characters); + uart.print_str(characters, length); } -void kernelearlyputstr(char const* characters, size_t) +void kernelearlyputstr(char const* characters, size_t length) { if (!characters) return; auto& uart = Prekernel::UART::the(); - uart.print_str(characters); + uart.print_str(characters, length); }