From 6a6b75b4183e8793e08444d1a12435d50efd9c1c Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Mon, 6 Feb 2023 20:53:47 -0800 Subject: [PATCH] [kernel] Conditionally add an isa-debugcon output to logger There have been a number of incidents lately where I've needed to see logs but have been working on init, and broken the log output of srv.logger. This commit adds a debug console output to io port 0x6600 if enabled at the top of logger.cpp. --- qemu.sh | 4 ++-- src/kernel/logger.cpp | 33 +++++++++++++++++++++++++++++++-- src/kernel/logger.h | 3 +++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/qemu.sh b/qemu.sh index f8026e3..febcefa 100755 --- a/qemu.sh +++ b/qemu.sh @@ -75,7 +75,7 @@ if [[ -n $TMUX ]]; then if [[ -n $debug ]]; then tmux split-window -h "gdb ${debugtarget}" & else - tmux split-window -h -l 80 "sleep 1; telnet localhost 45455" & + tmux split-window -h -l 100 "sleep 1; telnet localhost 45455" & tmux last-pane tmux split-window -l 10 "sleep 1; telnet localhost 45454" & fi @@ -91,9 +91,9 @@ qemu-system-x86_64 \ -drive "if=pflash,format=raw,readonly,file=${assets}/ovmf/x64/ovmf_code.fd" \ -drive "if=pflash,format=raw,file=${build}/ovmf_vars.fd" \ -drive "format=raw,file=${build}/jsix.img" \ + -chardev socket,host=localhost,port=45455,server,nowait,telnet=on,id=jsix_debug -device isa-debugcon,iobase=0x6600,chardev=jsix_debug \ -monitor telnet:localhost:45454,server,nowait \ -serial stdio \ - -serial telnet:localhost:45455,server,nowait \ -smp "${smp}" \ -m 4096 \ -cpu "${cpu}" \ diff --git a/src/kernel/logger.cpp b/src/kernel/logger.cpp index 133a406..3e7b8a8 100644 --- a/src/kernel/logger.cpp +++ b/src/kernel/logger.cpp @@ -10,7 +10,10 @@ #include "objects/system.h" #include "objects/thread.h" -static uint8_t log_buffer[128 * 1024]; +static constexpr bool j6_debugcon_enable = false; +static constexpr uint16_t j6_debugcon_port = 0x6600; + +static uint8_t log_buffer[log::logger::log_pages * arch::frame_size]; // The logger is initialized _before_ global constructors are called, // so that we can start log output immediately. Keep its constructor @@ -30,6 +33,19 @@ const char *logger::s_area_names[] = { nullptr }; +inline void +debug_out(const char *msg, size_t size) +{ + asm ( "rep outsb;" :: "c"(size), "d"(j6_debugcon_port), "S"(msg) ); +} + +inline void +debug_newline() +{ + static const char *newline = "\r\n"; + asm ( "rep outsb;" :: "c"(2), "d"(j6_debugcon_port), "S"(newline) ); +} + logger::logger() : m_buffer(nullptr, 0) { @@ -52,7 +68,15 @@ logger::logger(uint8_t *buffer, size_t size) : void logger::output(level severity, logs area, const char *fmt, va_list args) { - uint8_t buffer[256]; + char buffer[256]; + + if constexpr (j6_debugcon_enable) { + size_t dlen = util::format({buffer, sizeof(buffer)}, "%7s %7s| ", + s_area_names[static_cast(area)], + s_level_names[static_cast(severity)]); + debug_out(buffer, dlen); + } + entry *header = reinterpret_cast(buffer); header->bytes = sizeof(entry); header->area = area; @@ -62,6 +86,11 @@ logger::output(level severity, logs area, const char *fmt, va_list args) header->message[mlen] = 0; header->bytes += mlen + 1; + if constexpr (j6_debugcon_enable) { + debug_out(header->message, mlen); + debug_newline(); + } + util::scoped_lock lock {m_lock}; uint8_t *out; diff --git a/src/kernel/logger.h b/src/kernel/logger.h index d3397a4..bab2b2e 100644 --- a/src/kernel/logger.h +++ b/src/kernel/logger.h @@ -29,6 +29,9 @@ constexpr unsigned areas_count = class logger { public: + /// Size of the log ring buffer + static constexpr unsigned log_pages = 16; + /// Default constructor. Creates a logger without a backing store. logger();