diff --git a/core/panic/ui.cpp b/core/panic/ui.cpp index 114c6b6..74610cd 100644 --- a/core/panic/ui.cpp +++ b/core/panic/ui.cpp @@ -156,7 +156,7 @@ nsa void ExDumpData(void *Address, unsigned long Length) Display->UpdateBuffer(); } ExPrint(" \e4287f5%02x\eAABBCC", AddressChar[Iterate]); - if ((AddressChar[Iterate] < 0x20) || (AddressChar[Iterate] > 0x7e)) + if ((AddressChar[Iterate] < 0x20) || (AddressChar[Iterate] > 0x7E)) Buffer[Iterate % 16] = '.'; else Buffer[Iterate % 16] = AddressChar[Iterate]; diff --git a/kshell/cmds.hpp b/kshell/cmds.hpp index 8d78bdb..c33a519 100644 --- a/kshell/cmds.hpp +++ b/kshell/cmds.hpp @@ -43,6 +43,7 @@ void cmd_lsacpi(const char *args); void cmd_lsmod(const char *args); void cmd_modinfo(const char *args); void cmd_panic(const char *args); +void cmd_dump(const char *args); #define IF_ARG(x) strcmp(args, x) == 0 diff --git a/kshell/commands/dump.cpp b/kshell/commands/dump.cpp new file mode 100644 index 0000000..3218e9a --- /dev/null +++ b/kshell/commands/dump.cpp @@ -0,0 +1,77 @@ +/* + This file is part of Fennix Kernel. + + Fennix Kernel is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix Kernel is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix Kernel. If not, see . +*/ + +#include "../cmds.hpp" + +#include +#include + +#include "../../kernel.h" + +using namespace vfs; + +void cmd_dump(const char *args) +{ + if (args[0] == '\0') + return; + + // args == "0xdeadbeef 512" aka "address size" + + char *strAddr = (char *)args; + char *strLen = (char *)args; + while (*strLen != ' ') + strLen++; + *strLen = '\0'; + strLen++; + + void *Address = (void *)strtoul(strAddr, nullptr, 16); + unsigned long Length = strtoul(strLen, nullptr, 10); + + { + unsigned char *AddressChar = (unsigned char *)Address; + unsigned char Buffer[17]; + uint32_t Iterate; + + printf("Dumping %lu bytes from %#lx\n", Length, (uintptr_t)AddressChar); + + for (Iterate = 0; Iterate < (uint32_t)Length; Iterate++) + { + if ((Iterate % 16) == 0) + { + if (Iterate != 0) + printf(" %s\n", Buffer); + printf(" %04x ", Iterate); + } + + printf(" %02x", AddressChar[Iterate]); + + if ((AddressChar[Iterate] < 0x20) || (AddressChar[Iterate] > 0x7E)) + Buffer[Iterate % 16] = '.'; + else + Buffer[Iterate % 16] = AddressChar[Iterate]; + + Buffer[(Iterate % 16) + 1] = '\0'; + } + + while ((Iterate % 16) != 0) + { + printf(" "); + Iterate++; + } + putchar('\n'); + } +} \ No newline at end of file diff --git a/kshell/shell.cpp b/kshell/shell.cpp index 67aa31b..e275917 100644 --- a/kshell/shell.cpp +++ b/kshell/shell.cpp @@ -78,6 +78,7 @@ static Command commands[] = { {"modprobe", nullptr}, {"depmod", nullptr}, {"panic", cmd_panic}, + {"dump", cmd_dump}, }; void StartKernelShell()