21#include <sys/kassert.h>
22#include <sys/kdebug.h>
24#include "../dev/console.h"
26#define DEBUG_MAX_LINE 128
27#define DEBUG_MAX_ARGS 16
32 const size_t row_size = 16;
36 for (row = 0; !stop; row++) {
37 size_t ix = row * row_size;
38 if (ix >= limit || ix >= length)
43 for (col = 0; col < row_size; col++) {
44 size_t ixc = ix + col;
45 if ((limit != 0 && ixc >= limit) || ixc >= length) {
47 for (; col < row_size; col++) {
54 kprintf(
"%02X ", (
unsigned char)data[ixc]);
58 for (col = 0; col < row_size; col++) {
59 size_t ixc = ix + col;
60 if ((limit != 0 && ixc >= limit) || ixc >= length) {
62 for (; col < row_size; col++) {
69 unsigned char c = (
unsigned char)data[ixc];
70 if (c >= 0x20 && c < 0x7F)
87 if (isSigned && ((*val & 0x80) == 0x80)) {
88 return (
uint64_t)*val | 0xFFFFFFFFFFFFFF00ULL;
94 if (isSigned && ((*val & 0x8000) == 0x8000)) {
95 return (
uint64_t)*val | 0xFFFFFFFFFFFF0000ULL;
101 if (isSigned && ((*val & 0x80000000) == 0x80000000)) {
102 return (
uint64_t)*val | 0xFFFFFFFF00000000ULL;
111 kprintf(
"Debug_GetValue: Unknown size parameter '%d'\n",
size);
130 if (s[0] ==
'0' && s[1] ==
'x')
136 while (s[i] !=
'\0') {
137 if (s[i] >=
'0' && s[i] <=
'9') {
139 }
else if (s[i] >=
'a' && s[i] <=
'f') {
143 }
else if (s[i] >=
'A' && s[i] <=
'F') {
159 if (*s >=
'0' || *s <=
'9')
162 kprintf(
"Unknown symbol '%s'\n");
166#define PHELP(_cmd, _msg) kprintf("%-16s %s\n", _cmd, _msg)
180 for (i = 0; i < commands; i++)
182 kprintf(
"%-16s %s\n", cmds[i].name, cmds[i].description);
185 PHELP(
"continue",
"Continue execution");
195 for (i = 1; i < argc; i++)
211 kprintf(
"Dump requires 3 arguments\n");
229 if (argc != 2 && argc != 3) {
230 kprintf(
"Disasm requires 2 or 3 arguments\n");
237 kprintf(
"Disassembly 0x%llx:\n", off);
252 char *nextArg, *last;
255 kprintf(
"Entered Debugger!\n");
274 argv[argc] = nextArg;
278 if (
strcmp(argv[0],
"continue") == 0) {
288 for (i = 0; i < commands; i++)
290 if (
strcmp(argv[0], cmds[i].name) == 0)
292 cmds[i].
func(argc, (
const char **)argv);
297 if (
strcmp(argv[0],
"") == 0)
301 kprintf(
"Unknown command '%s'\n", argv[0]);
void Console_Gets(char *str, size_t n)
uintptr_t db_disasm(uintptr_t loc, bool altfmt)
int kprintf(const char *fmt,...)
uint64_t Debug_StrToInt(const char *s)
#define REGISTER_DBGCMD(_NAME, _DESC, _FUNC)
static void Debug_Help(int argc, const char *argv[])
DebugCommand __kdbgcmd_end[]
static void Debug_Dump(int argc, const char *argv[])
static void Debug_Echo(int argc, const char *argv[])
uint64_t Debug_SymbolToInt(const char *s)
void Debug_PrintSymbol(uintptr_t off, int strategy)
static void Debug_Disasm(int argc, const char *argv[])
uint64_t Debug_GetValue(uintptr_t addr, int size, bool isSigned)
DebugCommand __kdbgcmd_start[]
void Debug_PrintHex(const char *data, size_t length, off_t off, size_t limit)
#define PHELP(_cmd, _msg)
int strcmp(const char *s1, const char *s2)
char * strtok_r(char *str, const char *delim, char **last)
void(* func)(int, const char **)