mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-30 08:18:01 +00:00
Added "uartmemdmp" command
This commit is contained in:
parent
afacc0e8de
commit
5ae9cbf27b
@ -7,6 +7,7 @@
|
|||||||
#include <printf.h>
|
#include <printf.h>
|
||||||
#include <lock.hpp>
|
#include <lock.hpp>
|
||||||
#include <rand.hpp>
|
#include <rand.hpp>
|
||||||
|
#include <uart.hpp>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <smp.hpp>
|
#include <smp.hpp>
|
||||||
#include <cpu.hpp>
|
#include <cpu.hpp>
|
||||||
@ -324,6 +325,7 @@ namespace CrashHandler
|
|||||||
EHPrint("tss <CORE> - Print the CPU task state segment\n");
|
EHPrint("tss <CORE> - Print the CPU task state segment\n");
|
||||||
EHPrint("dump <ADDRESS HEX> <LENGTH DEC> - Dump memory\n");
|
EHPrint("dump <ADDRESS HEX> <LENGTH DEC> - Dump memory\n");
|
||||||
EHPrint(" - \eFF4400WARNING: This can crash the system if you try to read from an unmapped page.\eFAFAFA\n");
|
EHPrint(" - \eFF4400WARNING: This can crash the system if you try to read from an unmapped page.\eFAFAFA\n");
|
||||||
|
EHPrint("uartmemdmp <INDEX> <SKIP INACCESSIBLE (bool 0,1)> - Dump the memory of a UART.\n");
|
||||||
EHPrint("main - Show the main screen.\n");
|
EHPrint("main - Show the main screen.\n");
|
||||||
EHPrint("details - Show the details screen.\n");
|
EHPrint("details - Show the details screen.\n");
|
||||||
EHPrint("frames - Show the stack frame screen.\n");
|
EHPrint("frames - Show the stack frame screen.\n");
|
||||||
@ -605,6 +607,76 @@ namespace CrashHandler
|
|||||||
EHDumpData((void *)Address, Length);
|
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<uint8_t *>(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)
|
else if (strcmp(Input, "main") == 0)
|
||||||
{
|
{
|
||||||
SBIdx = 255;
|
SBIdx = 255;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user