summaryrefslogtreecommitdiffstats
path: root/debug
diff options
context:
space:
mode:
Diffstat (limited to 'debug')
-rw-r--r--debug/console.c116
-rw-r--r--debug/console.h14
2 files changed, 130 insertions, 0 deletions
diff --git a/debug/console.c b/debug/console.c
new file mode 100644
index 0000000..cb8aeb3
--- /dev/null
+++ b/debug/console.c
@@ -0,0 +1,116 @@
+#ifdef DEBUG_CONSOLE
+#include "debug/console.h"
+#include "lib/string.h"
+#include "lib/printf.h"
+#include "api/process.h"
+#include "proc/process.h"
+#include "sys/objdir.h"
+
+struct con_command {
+ char *name;
+ void (*func)(int, char*[]);
+};
+
+#define MAX_ARGS 8
+static int
+s_tokenize_buffer(char *buffer, char *argv[])
+{
+ int argc = 1;
+
+ //Populate the arguments buffer.
+ argv[0] = buffer;
+ for(char *s = buffer; *s; s++) {
+ if(*s == ' ') {
+ *s = 0;
+ argv[argc++] = s + 1;
+ }
+ }
+ return argc;
+}
+
+static int
+atoi(const char *cstr)
+{
+ int ret = 0;
+ for(const char *c = cstr; *c; c++) {
+ if(*c < '0' || *c > '9') return ret;
+ ret *= 10;
+ ret += *c - '0';
+ }
+ return ret;
+}
+
+static void
+s_command_dir_printdir(jove_obj_t *dir)
+{
+ jove_objdir_t *objdir = obj_deref((jove_owned_obj_t*)dir);
+ for(size_t i = 0; i < OBJDIR_ENTRIES; i++) {
+ jove_owned_obj_t *entry = (jove_owned_obj_t*)&objdir->entries[i];
+ if(obj_gettype(entry) == JOVE_OBJ_NONE) continue;
+ kprintf("%3i %16s %p\n", i, obj_gettypename(entry), obj_getvalue(entry));
+ }
+}
+
+static void
+s_command_dir(int argc, char *argv[])
+{
+ pid_t target_pid = 1;
+ if(argc > 1) {
+ if(argc > 2) {
+ kprintf("Too many arguments for 'dir': expected 2, got %i\n", argc);
+ return;
+ }
+ target_pid = atoi(argv[1]);
+ }
+ pcb_t *pcb = pcb_frompid(target_pid);
+ if(pcb == NULL) {
+ kprintf("Invalid PCB: '%i'\n", pcb);
+ return;
+ }
+ kprintf("Root directory for PID %i\n", target_pid);
+
+ jove_obj_t *rootdir = pcb_getrootdir(pcb);
+
+ while(1) {
+ s_command_dir_printdir(rootdir);
+read_input:
+ debug_console_readinput(argv[0], 128);
+ argc = s_tokenize_buffer(argv[0], argv);
+
+ if(strncmp(argv[0], "x", 1) == 0) return;
+ int traversi = atoi(argv[0]);
+
+ if(traversi > OBJDIR_ENTRIES) {
+ kprintf("Bad entry index: %i", traversi);
+ goto read_input;
+ }
+ if(obj_gettype(objdir_getlocal(rootdir, traversi)) != JOVE_OBJ_OBJDIR) {
+ kprintf("Bad subdirectory index: %i is not an objdir\n", traversi);
+ goto read_input;
+ }
+ rootdir = obj_release(objdir_getlocal(rootdir, traversi));
+ kprintf("\nSubdirectory %i\n", traversi);
+ }
+}
+
+static struct con_command s_console_commands[] = {
+ { "dir", s_command_dir }
+};
+static size_t s_console_commands_count = sizeof(s_console_commands) / sizeof(struct con_command);
+
+void debug_console_parsecmd(char *buffer)
+{
+ char *argv[MAX_ARGS];
+ int argc = s_tokenize_buffer(buffer, argv);
+
+ for(size_t i = 0; i < s_console_commands_count; i++) {
+ struct con_command *command = &s_console_commands[i];
+ if(strncmp(command->name, argv[0], 128) == 0) {
+ command->func(argc, argv);
+ return;
+ }
+ }
+ kprintf("Unknown command %s\n", argv[0]);
+}
+
+#endif
diff --git a/debug/console.h b/debug/console.h
new file mode 100644
index 0000000..616a255
--- /dev/null
+++ b/debug/console.h
@@ -0,0 +1,14 @@
+#ifndef _JOVE_DEBUG_CONSOLE_H
+#define _JOVE_DEBUG_CONSOLE_H 1
+
+#ifdef DEBUG_CONSOLE
+#include <stddef.h>
+
+__attribute__((noreturn)) void debug_console_start(void);
+
+int debug_console_readinput(char *buffer, size_t bufferw);
+void debug_console_parsecmd(char *buffer);
+
+#endif
+
+#endif