From dc5efeecbb4e0f193bd8cb4f7855865a1c9d69a4 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sat, 12 Feb 2022 21:38:44 -0800 Subject: [PATCH] [panic.serial] Display memory around the user rip When displaying a set of user regs, also display memory around the current rip from those user regs. This helps find or rule out memory corruption errors causing invalid code to run. --- src/kernel/panic.serial/display.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/kernel/panic.serial/display.cpp b/src/kernel/panic.serial/display.cpp index 8bcc87c..2ff2cbd 100644 --- a/src/kernel/panic.serial/display.cpp +++ b/src/kernel/panic.serial/display.cpp @@ -113,11 +113,34 @@ print_cpu_state(serial_port &out, const cpu_state ®s) out.write(clear); } +static void +print_rip(serial_port &out, uintptr_t addr) +{ + constexpr size_t per_line = 16; + addr -= per_line; + uint8_t *data = reinterpret_cast(addr); + + char bit[100]; + + out.write("\n"); + for (unsigned i = 0; i < per_line*3; i += per_line) { + snprintf(bit, sizeof(bit), "\e[0;33m%20lx: \e[0m", addr + i); + out.write(bit); + + for (unsigned j = 0; j < per_line; ++j) { + snprintf(bit, sizeof(bit), "%02x ", data[i+j]); + out.write(bit); + } + out.write("\n"); + } +} + void print_user_state(serial_port &out, const cpu_state ®s) { out.write("\n\e[1;35m USER:\e[0 "); print_cpu_state(out, regs); + print_rip(out, regs.rip); } } // namespace panicking