From 5ae9cbf27b8c0c3bd51270c7325ab8a8d3b9233b Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 16 Feb 2023 02:29:43 +0200 Subject: [PATCH] Added "uartmemdmp" command --- Core/Crash/CrashHandler.cpp | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index 870b75e..0c6eb9e 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -324,6 +325,7 @@ namespace CrashHandler EHPrint("tss - Print the CPU task state segment\n"); EHPrint("dump
- Dump memory\n"); EHPrint(" - \eFF4400WARNING: This can crash the system if you try to read from an unmapped page.\eFAFAFA\n"); + EHPrint("uartmemdmp - Dump the memory of a UART.\n"); EHPrint("main - Show the main screen.\n"); EHPrint("details - Show the details screen.\n"); EHPrint("frames - Show the stack frame screen.\n"); @@ -605,6 +607,76 @@ namespace CrashHandler EHDumpData((void *)Address, Length); } } + else if (strncmp(Input, "uartmemdmp", 10) == 0) + { + char *arg = TrimWhiteSpace(Input + 10); + char *cPort = strtok(arg, " "); + char *cBoolSkip = strtok(NULL, " "); + UniversalAsynchronousReceiverTransmitter::SerialPorts port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM1; + switch (cPort[0]) + { + case '1': + port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM1; + break; + case '2': + port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM2; + break; + case '3': + port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM3; + break; + case '4': + port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM4; + break; + case '5': + port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM5; + break; + case '6': + port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM6; + break; + case '7': + port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM7; + break; + case '8': + port = UniversalAsynchronousReceiverTransmitter::SerialPorts::COM8; + break; + default: + EHPrint("\eFF0000Invalid port! Defaulting to 1.\n"); + break; + } + EHPrint("\eF8F8F8Dumping memory to UART port %c (%#lx) and %s inaccessible pages.\n", cPort[0], port, cBoolSkip[0] == '1' ? "skipping" : "zeroing"); + Display->SetBuffer(SBIdx); + uint64_t Length = KernelAllocator.GetTotalMemory(); + uint64_t ProgressLength = Length; + UniversalAsynchronousReceiverTransmitter::UART uart(port); + Memory::Virtual vma; + uint8_t *Address = reinterpret_cast(0x0); + int Progress = 0; + for (size_t i = 0; i < Length; i++) + { + if (vma.Check(Address)) + uart.Write(*Address); + else if (cBoolSkip[0] == '0') + uart.Write((uint8_t)0); + else + ProgressLength--; + Address++; + + if (unlikely(i % 0x1000 == 0)) + { + int NewProgress = (i * 100) / ProgressLength; + if (unlikely(NewProgress != Progress)) + { + Progress = NewProgress; + EHPrint("\n%d%%\n", Progress); + Display->SetBuffer(SBIdx); + } + Display->Print('.', SBIdx); + if (unlikely(i % 0x500 == 0)) + Display->SetBuffer(SBIdx); + } + } + EHPrint("\nDone.\n"); + } else if (strcmp(Input, "main") == 0) { SBIdx = 255;