dbg_add_command() changed into BeOS compatible add_debugger_command().

remove_debugger_command() added.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@289 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Philippe Houdoin
2002-07-17 22:07:37 +00:00
parent 19ba51b74d
commit 2c24125957
10 changed files with 168 additions and 98 deletions
+3 -2
View File
@@ -763,7 +763,7 @@ int cbuf_truncate_tail(cbuf *buf, size_t trunc_bytes)
return B_NO_ERROR; return B_NO_ERROR;
} }
static void dbg_dump_cbuf_freelists(int argc, char **argv) static int dbg_dump_cbuf_freelists(int argc, char **argv)
{ {
cbuf *buf; cbuf *buf;
@@ -776,6 +776,7 @@ static void dbg_dump_cbuf_freelists(int argc, char **argv)
for(buf = cbuf_free_noblock_list; buf; buf = buf->next) for(buf = cbuf_free_noblock_list; buf; buf = buf->next)
dprintf("%p ", buf); dprintf("%p ", buf);
dprintf("\n"); dprintf("\n");
return 0;
} }
void cbuf_test() void cbuf_test()
@@ -832,7 +833,7 @@ int cbuf_init()
cbuf_lowlevel_spinlock = 0; cbuf_lowlevel_spinlock = 0;
// add the debug command // add the debug command
dbg_add_command(&dbg_dump_cbuf_freelists, "cbuf_freelist", "Dumps the cbuf free lists"); add_debugger_command("cbuf_freelist", &dbg_dump_cbuf_freelists, "Dumps the cbuf free lists");
free_list_sem = create_sem(1, "cbuf_free_list_sem"); free_list_sem = create_sem(1, "cbuf_free_list_sem");
if(free_list_sem < 0) { if(free_list_sem < 0) {
+65 -17
View File
@@ -34,8 +34,8 @@ static int debugger_on_cpu = -1;
struct debugger_command struct debugger_command
{ {
struct debugger_command *next; struct debugger_command *next;
void (*func)(int, char **); int (*func)(int, char **);
const char *cmd; const char *name;
const char *description; const char *description;
}; };
@@ -204,7 +204,7 @@ static void kernel_debugger_loop()
debugger_on_cpu = smp_get_current_cpu(); debugger_on_cpu = smp_get_current_cpu();
for(;;) { for(;;) {
dprintf("> "); dprintf("kdebug> ");
debug_read_line(line_buf[cur_line], LINE_BUF_SIZE); debug_read_line(line_buf[cur_line], LINE_BUF_SIZE);
debug_parse_line(line_buf[cur_line], args, &argc, MAX_ARGS); debug_parse_line(line_buf[cur_line], args, &argc, MAX_ARGS);
if(argc <= 0) if(argc <= 0)
@@ -214,8 +214,9 @@ static void kernel_debugger_loop()
cmd = commands; cmd = commands;
while(cmd != NULL) { while(cmd != NULL) {
if(strcmp(args[0], cmd->cmd) == 0) { if(strcmp(args[0], cmd->name) == 0) {
cmd->func(argc, args); cmd->func(argc, args);
break;
} }
cmd = cmd->next; cmd = cmd->next;
} }
@@ -225,10 +226,16 @@ static void kernel_debugger_loop()
} }
} }
void kernel_debugger() void kernel_debugger(const char * message)
{ {
dbg_save_registers(&(dbg_register_file[smp_get_current_cpu()][0])); dbg_save_registers(&(dbg_register_file[smp_get_current_cpu()][0]));
if (message) {
dprintf(message);
dprintf("\n");
};
dprintf("Welcome to Kernel Debugging Land...\n");
kernel_debugger_loop(); kernel_debugger_loop();
} }
@@ -257,7 +264,7 @@ int panic(const char *fmt, ...)
smp_send_broadcast_ici(SMP_MSG_CPU_HALT, 0, 0, 0, NULL, SMP_MSG_FLAG_SYNC); smp_send_broadcast_ici(SMP_MSG_CPU_HALT, 0, 0, 0, NULL, SMP_MSG_FLAG_SYNC);
} }
kernel_debugger(); kernel_debugger(NULL);
int_restore_interrupts(state); int_restore_interrupts(state);
return ret; return ret;
@@ -308,17 +315,17 @@ void dbg_puts(const char *s)
int_restore_interrupts(flags); int_restore_interrupts(flags);
} }
int dbg_add_command(void (*func)(int, char **), const char *name, const char *desc) int add_debugger_command(const char * name, int (*func)(int, char **), const char * desc)
{ {
int flags; int flags;
struct debugger_command *cmd; struct debugger_command *cmd;
cmd = (struct debugger_command *)kmalloc(sizeof(struct debugger_command)); cmd = (struct debugger_command *) kmalloc(sizeof(struct debugger_command));
if(cmd == NULL) if (cmd == NULL)
return ENOMEM; return ENOMEM;
cmd->func = func; cmd->func = func;
cmd->cmd = name; cmd->name = name;
cmd->description = desc; cmd->description = desc;
flags = int_disable_interrupts(); flags = int_disable_interrupts();
@@ -333,21 +340,62 @@ int dbg_add_command(void (*func)(int, char **), const char *name, const char *de
return B_NO_ERROR; return B_NO_ERROR;
} }
static void cmd_reboot(int argc, char **argv) int remove_debugger_command(const char * name, int (*func)(int, char **))
{ {
reboot(); int flags;
struct debugger_command *cmd;
struct debugger_command *prev;
flags = int_disable_interrupts();
acquire_spinlock(&dbg_spinlock);
prev = NULL;
cmd = commands;
while (cmd) {
if (strcmp(cmd->name, name) == 0 &&
cmd->func == func)
break;
prev = cmd;
cmd = cmd->next;
};
if (cmd) {
if (cmd == commands)
commands = cmd->next;
else
prev->next = cmd->next;
};
release_spinlock(&dbg_spinlock);
int_restore_interrupts(flags);
if (cmd) {
kfree(cmd);
return B_NO_ERROR;
};
return B_NAME_NOT_FOUND;
} }
static void cmd_help(int argc, char **argv)
static int cmd_reboot(int argc, char **argv)
{
reboot();
return 0; // I'll be really suprised if this line ever run! ;-)
}
static int cmd_help(int argc, char **argv)
{ {
struct debugger_command *cmd; struct debugger_command *cmd;
dprintf("debugger commands:\n"); dprintf("debugger commands:\n");
cmd = commands; cmd = commands;
while(cmd != NULL) { while(cmd != NULL) {
dprintf("%-32s\t\t%s\n", cmd->cmd, cmd->description); dprintf(" %-32s\t\t%s\n", cmd->name, cmd->description);
cmd = cmd->next; cmd = cmd->next;
} }
return 0;
} }
int dbg_init(kernel_args *ka) int dbg_init(kernel_args *ka)
@@ -359,9 +407,9 @@ int dbg_init(kernel_args *ka)
int dbg_init2(kernel_args *ka) int dbg_init2(kernel_args *ka)
{ {
dbg_add_command(&cmd_help, "help", "List all debugger commands"); add_debugger_command("help", &cmd_help, "List all debugger commands");
dbg_add_command(&cmd_reboot, "reboot", "Reboot"); add_debugger_command("reboot", &cmd_reboot, "Reboot");
dbg_add_command(&cmd_gdb, "gdb", "Connect to remote gdb"); add_debugger_command("gdb", &cmd_gdb, "Connect to remote gdb");
return B_NO_ERROR; return B_NO_ERROR;
} }
+2 -2
View File
@@ -522,11 +522,11 @@ gdb_state_machine(void)
return 0; return 0;
} }
void int
cmd_gdb(int argc, char **argv) cmd_gdb(int argc, char **argv)
{ {
(void)(argc); (void)(argc);
(void)(argv); (void)(argv);
gdb_state_machine(); return gdb_state_machine();
} }
+3 -2
View File
@@ -87,7 +87,7 @@ static void dump_bin(int bin_index)
dprintf("NULL\n"); dprintf("NULL\n");
} }
static void dump_bin_list(int argc, char **argv) static int dump_bin_list(int argc, char **argv)
{ {
int i; int i;
@@ -96,6 +96,7 @@ static void dump_bin_list(int argc, char **argv)
for(i=0; i<bin_count; i++) { for(i=0; i<bin_count; i++) {
dump_bin(i); dump_bin(i);
} }
return 0;
} }
// called from vm_init. The heap should already be mapped in at this point, we just // called from vm_init. The heap should already be mapped in at this point, we just
@@ -117,7 +118,7 @@ int heap_init(addr new_heap_base, unsigned int new_heap_size)
heap_lock.count = 0; heap_lock.count = 0;
// set up some debug commands // set up some debug commands
dbg_add_command(&dump_bin_list, "heap_bindump", "dump stats about bin usage"); add_debugger_command("heap_bindump", &dump_bin_list, "dump stats about bin usage");
return 0; return 0;
} }
+12 -11
View File
@@ -39,9 +39,9 @@ struct port_entry {
}; };
// internal API // internal API
void dump_port_list(int argc, char **argv); static int dump_port_list(int argc, char **argv);
static int dump_port_info(int argc, char **argv);
static void _dump_port_info(struct port_entry *port); static void _dump_port_info(struct port_entry *port);
static void dump_port_info(int argc, char **argv);
// MAX_PORTS must be power of 2 // MAX_PORTS must be power of 2
@@ -80,15 +80,15 @@ int port_init(kernel_args *ka)
ports[i].id = -1; ports[i].id = -1;
// add debugger commands // add debugger commands
dbg_add_command(&dump_port_list, "ports", "Dump a list of all active ports"); add_debugger_command("ports", &dump_port_list, "Dump a list of all active ports");
dbg_add_command(&dump_port_info, "port", "Dump info about a particular port"); add_debugger_command("port", &dump_port_info, "Dump info about a particular port");
ports_active = true; ports_active = true;
return 0; return 0;
} }
void dump_port_list(int argc, char **argv) int dump_port_list(int argc, char **argv)
{ {
int i; int i;
@@ -97,6 +97,7 @@ void dump_port_list(int argc, char **argv)
dprintf("%p\tid: 0x%x\t\tname: '%s'\n", &ports[i], ports[i].id, ports[i].name); dprintf("%p\tid: 0x%x\t\tname: '%s'\n", &ports[i], ports[i].id, ports[i].name);
} }
} }
return 0;
} }
static void _dump_port_info(struct port_entry *port) static void _dump_port_info(struct port_entry *port)
@@ -114,13 +115,13 @@ static void _dump_port_info(struct port_entry *port)
dprintf("write_sem: %d\n", cnt); dprintf("write_sem: %d\n", cnt);
} }
static void dump_port_info(int argc, char **argv) static int dump_port_info(int argc, char **argv)
{ {
int i; int i;
if(argc < 2) { if(argc < 2) {
dprintf("port: not enough arguments\n"); dprintf("port: not enough arguments\n");
return; return 0;
} }
// if the argument looks like a hex number, treat it as such // if the argument looks like a hex number, treat it as such
@@ -131,15 +132,15 @@ static void dump_port_info(int argc, char **argv)
// XXX semi-hack // XXX semi-hack
// one can use either address or a port_id, since KERNEL_BASE > MAX_PORTS assumed // one can use either address or a port_id, since KERNEL_BASE > MAX_PORTS assumed
_dump_port_info((struct port_entry *)num); _dump_port_info((struct port_entry *)num);
return; return 0;
} else { } else {
unsigned slot = num % MAX_PORTS; unsigned slot = num % MAX_PORTS;
if(ports[slot].id != (int)num) { if(ports[slot].id != (int)num) {
dprintf("port 0x%lx doesn't exist!\n", num); dprintf("port 0x%lx doesn't exist!\n", num);
return; return 0;
} }
_dump_port_info(&ports[slot]); _dump_port_info(&ports[slot]);
return; return 0;
} }
} }
@@ -148,7 +149,7 @@ static void dump_port_info(int argc, char **argv)
if (ports[i].name != NULL) if (ports[i].name != NULL)
if(strcmp(argv[1], ports[i].name) == 0) { if(strcmp(argv[1], ports[i].name) == 0) {
_dump_port_info(&ports[i]); _dump_port_info(&ports[i]);
return; return 0;
} }
} }
} }
+10 -9
View File
@@ -56,7 +56,7 @@ struct sem_timeout_args {
int sem_count; int sem_count;
}; };
static void dump_sem_list(int argc, char **argv) static int dump_sem_list(int argc, char **argv)
{ {
int i; int i;
@@ -65,6 +65,7 @@ static void dump_sem_list(int argc, char **argv)
dprintf("%p\tid: 0x%x\t\tname: '%s'\n", &sems[i], sems[i].id, sems[i].name); dprintf("%p\tid: 0x%x\t\tname: '%s'\n", &sems[i], sems[i].id, sems[i].name);
} }
} }
return 0;
} }
static void _dump_sem_info(struct sem_entry *sem) static void _dump_sem_info(struct sem_entry *sem)
@@ -76,13 +77,13 @@ static void _dump_sem_info(struct sem_entry *sem)
dprintf("queue: head %p tail %p\n", sem->q.head, sem->q.tail); dprintf("queue: head %p tail %p\n", sem->q.head, sem->q.tail);
} }
static void dump_sem_info(int argc, char **argv) static int dump_sem_info(int argc, char **argv)
{ {
int i; int i;
if(argc < 2) { if(argc < 2) {
dprintf("sem: not enough arguments\n"); dprintf("sem: not enough arguments\n");
return; return 0;
} }
// if the argument looks like a hex number, treat it as such // if the argument looks like a hex number, treat it as such
@@ -92,15 +93,15 @@ static void dump_sem_info(int argc, char **argv)
if(num > KERNEL_BASE && num <= (KERNEL_BASE + (KERNEL_SIZE - 1))) { if(num > KERNEL_BASE && num <= (KERNEL_BASE + (KERNEL_SIZE - 1))) {
// XXX semi-hack // XXX semi-hack
_dump_sem_info((struct sem_entry *)num); _dump_sem_info((struct sem_entry *)num);
return; return 0;
} else { } else {
unsigned slot = num % MAX_SEMS; unsigned slot = num % MAX_SEMS;
if(sems[slot].id != (int)num) { if(sems[slot].id != (int)num) {
dprintf("sem 0x%lx doesn't exist!\n", num); dprintf("sem 0x%lx doesn't exist!\n", num);
return; return 0;
} }
_dump_sem_info(&sems[slot]); _dump_sem_info(&sems[slot]);
return; return 0;
} }
} }
@@ -109,7 +110,7 @@ static void dump_sem_info(int argc, char **argv)
if (sems[i].name != NULL) if (sems[i].name != NULL)
if(strcmp(argv[1], sems[i].name) == 0) { if(strcmp(argv[1], sems[i].name) == 0) {
_dump_sem_info(&sems[i]); _dump_sem_info(&sems[i]);
return; return 0;
} }
} }
} }
@@ -132,8 +133,8 @@ int sem_init(kernel_args *ka)
sems[i].id = -1; sems[i].id = -1;
// add debugger commands // add debugger commands
dbg_add_command(&dump_sem_list, "sems", "Dump a list of all active semaphores"); add_debugger_command("sems", &dump_sem_list, "Dump a list of all active semaphores");
dbg_add_command(&dump_sem_info, "sem", "Dump info about a particular semaphore"); add_debugger_command("sem", &dump_sem_info, "Dump info about a particular semaphore");
dprintf("sem_init: exit\n"); dprintf("sem_init: exit\n");
+25 -19
View File
@@ -646,7 +646,7 @@ static void _dump_proc_info(struct proc *p)
dprintf("thread_list: %p\n", p->thread_list); dprintf("thread_list: %p\n", p->thread_list);
} }
static void dump_proc_info(int argc, char **argv) static int dump_proc_info(int argc, char **argv)
{ {
struct proc *p; struct proc *p;
int id = -1; int id = -1;
@@ -655,7 +655,7 @@ static void dump_proc_info(int argc, char **argv)
if(argc < 2) { if(argc < 2) {
dprintf("proc: not enough arguments\n"); dprintf("proc: not enough arguments\n");
return; return 0;
} }
// if the argument looks like a hex number, treat it as such // if the argument looks like a hex number, treat it as such
@@ -664,7 +664,7 @@ static void dump_proc_info(int argc, char **argv)
if(num > vm_get_kernel_aspace()->virtual_map.base) { if(num > vm_get_kernel_aspace()->virtual_map.base) {
// XXX semi-hack // XXX semi-hack
_dump_proc_info((struct proc*)num); _dump_proc_info((struct proc*)num);
return; return 0;
} else { } else {
id = num; id = num;
} }
@@ -679,6 +679,7 @@ static void dump_proc_info(int argc, char **argv)
} }
} }
hash_close(proc_hash, &i, false); hash_close(proc_hash, &i, false);
return 0;
} }
@@ -743,7 +744,7 @@ static void _dump_thread_info(struct thread *t)
last_thread_dumped = t; last_thread_dumped = t;
} }
static void dump_thread_info(int argc, char **argv) static int dump_thread_info(int argc, char **argv)
{ {
struct thread *t; struct thread *t;
int id = -1; int id = -1;
@@ -752,7 +753,7 @@ static void dump_thread_info(int argc, char **argv)
if(argc < 2) { if(argc < 2) {
dprintf("thread: not enough arguments\n"); dprintf("thread: not enough arguments\n");
return; return 0;
} }
// if the argument looks like a hex number, treat it as such // if the argument looks like a hex number, treat it as such
@@ -761,7 +762,7 @@ static void dump_thread_info(int argc, char **argv)
if(num > vm_get_kernel_aspace()->virtual_map.base) { if(num > vm_get_kernel_aspace()->virtual_map.base) {
// XXX semi-hack // XXX semi-hack
_dump_thread_info((struct thread *)num); _dump_thread_info((struct thread *)num);
return; return 0;
} else { } else {
id = num; id = num;
} }
@@ -776,9 +777,10 @@ static void dump_thread_info(int argc, char **argv)
} }
} }
hash_close(thread_hash, &i, false); hash_close(thread_hash, &i, false);
return 0;
} }
static void dump_thread_list(int argc, char **argv) static int dump_thread_list(int argc, char **argv)
{ {
struct thread *t; struct thread *t;
struct hash_iterator i; struct hash_iterator i;
@@ -799,15 +801,16 @@ static void dump_thread_list(int argc, char **argv)
dprintf("\t0x%lx\n", t->kernel_stack_base); dprintf("\t0x%lx\n", t->kernel_stack_base);
} }
hash_close(thread_hash, &i, false); hash_close(thread_hash, &i, false);
return 0;
} }
static void dump_next_thread_in_q(int argc, char **argv) static int dump_next_thread_in_q(int argc, char **argv)
{ {
struct thread *t = last_thread_dumped; struct thread *t = last_thread_dumped;
if(t == NULL) { if(t == NULL) {
dprintf("no thread previously dumped. Examine a thread first.\n"); dprintf("no thread previously dumped. Examine a thread first.\n");
return; return 0;
} }
dprintf("next thread in queue after thread @ %p\n", t); dprintf("next thread in queue after thread @ %p\n", t);
@@ -816,15 +819,16 @@ static void dump_next_thread_in_q(int argc, char **argv)
} else { } else {
dprintf("NULL\n"); dprintf("NULL\n");
} }
return 0;
} }
static void dump_next_thread_in_all_list(int argc, char **argv) static int dump_next_thread_in_all_list(int argc, char **argv)
{ {
struct thread *t = last_thread_dumped; struct thread *t = last_thread_dumped;
if(t == NULL) { if(t == NULL) {
dprintf("no thread previously dumped. Examine a thread first.\n"); dprintf("no thread previously dumped. Examine a thread first.\n");
return; return 0;
} }
dprintf("next thread in global list after thread @ %p\n", t); dprintf("next thread in global list after thread @ %p\n", t);
@@ -833,15 +837,16 @@ static void dump_next_thread_in_all_list(int argc, char **argv)
} else { } else {
dprintf("NULL\n"); dprintf("NULL\n");
} }
return 0;
} }
static void dump_next_thread_in_proc(int argc, char **argv) static int dump_next_thread_in_proc(int argc, char **argv)
{ {
struct thread *t = last_thread_dumped; struct thread *t = last_thread_dumped;
if(t == NULL) { if(t == NULL) {
dprintf("no thread previously dumped. Examine a thread first.\n"); dprintf("no thread previously dumped. Examine a thread first.\n");
return; return 0;
} }
dprintf("next thread in proc after thread @ %p\n", t); dprintf("next thread in proc after thread @ %p\n", t);
@@ -850,6 +855,7 @@ static void dump_next_thread_in_proc(int argc, char **argv)
} else { } else {
dprintf("NULL\n"); dprintf("NULL\n");
} }
return 0;
} }
static int get_death_stack(void) static int get_death_stack(void)
@@ -1016,12 +1022,12 @@ int thread_init(kernel_args *ka)
death_stack_sem = create_sem(num_death_stacks, "death_stack_noavail_sem"); death_stack_sem = create_sem(num_death_stacks, "death_stack_noavail_sem");
// set up some debugger commands // set up some debugger commands
dbg_add_command(dump_thread_list, "threads", "list all threads"); add_debugger_command("threads", &dump_thread_list, "list all threads");
dbg_add_command(dump_thread_info, "thread", "list info about a particular thread"); add_debugger_command("thread", &dump_thread_info, "list info about a particular thread");
dbg_add_command(dump_next_thread_in_q, "next_q", "dump the next thread in the queue of last thread viewed"); add_debugger_command("next_q", &dump_next_thread_in_q, "dump the next thread in the queue of last thread viewed");
dbg_add_command(dump_next_thread_in_all_list, "next_all", "dump the next thread in the global list of the last thread viewed"); add_debugger_command("next_all", &dump_next_thread_in_all_list, "dump the next thread in the global list of the last thread viewed");
dbg_add_command(dump_next_thread_in_proc, "next_proc", "dump the next thread in the process of the last thread viewed"); add_debugger_command("next_proc", &dump_next_thread_in_proc, "dump the next thread in the process of the last thread viewed");
dbg_add_command(dump_proc_info, "proc", "list info about a particular process"); add_debugger_command("proc", &dump_proc_info, "list info about a particular process");
return 0; return 0;
} }
+34 -27
View File
@@ -1066,7 +1066,7 @@ int vm_get_page_mapping(aspace_id aid, addr vaddr, addr *paddr)
return err; return err;
} }
static void display_mem(int argc, char **argv) static int display_mem(int argc, char **argv)
{ {
int item_size; int item_size;
int display_width; int display_width;
@@ -1077,7 +1077,7 @@ static void display_mem(int argc, char **argv)
if(argc < 2) { if(argc < 2) {
dprintf("not enough arguments\n"); dprintf("not enough arguments\n");
return; return 0;
} }
address = atoul(argv[1]); address = atoul(argv[1]);
@@ -1099,7 +1099,7 @@ static void display_mem(int argc, char **argv)
display_width = 4; display_width = 4;
} else { } else {
dprintf("display_mem called in an invalid way!\n"); dprintf("display_mem called in an invalid way!\n");
return; return 0;
} }
dprintf("[0x%lx] '", address); dprintf("[0x%lx] '", address);
@@ -1139,9 +1139,10 @@ static void display_mem(int argc, char **argv)
} }
} }
dprintf("\n"); dprintf("\n");
return 0;
} }
static void dump_cache_ref(int argc, char **argv) static int dump_cache_ref(int argc, char **argv)
{ {
addr address; addr address;
vm_region *region; vm_region *region;
@@ -1149,11 +1150,11 @@ static void dump_cache_ref(int argc, char **argv)
if(argc < 2) { if(argc < 2) {
dprintf("cache_ref: not enough arguments\n"); dprintf("cache_ref: not enough arguments\n");
return; return 0;
} }
if(strlen(argv[1]) < 2 || argv[1][0] != '0' || argv[1][1] != 'x') { if(strlen(argv[1]) < 2 || argv[1][0] != '0' || argv[1][1] != 'x') {
dprintf("cache_ref: invalid argument, pass address\n"); dprintf("cache_ref: invalid argument, pass address\n");
return; return 0;
} }
address = atoul(argv[1]); address = atoul(argv[1]);
@@ -1172,6 +1173,7 @@ static void dump_cache_ref(int argc, char **argv)
dprintf("lock = 0x%x\n", region->lock); dprintf("lock = 0x%x\n", region->lock);
} }
dprintf("ref_count: %d\n", cache_ref->ref_count); dprintf("ref_count: %d\n", cache_ref->ref_count);
return 0;
} }
static const char *page_state_to_text(int state) static const char *page_state_to_text(int state)
@@ -1198,7 +1200,7 @@ static const char *page_state_to_text(int state)
} }
} }
static void dump_cache(int argc, char **argv) static int dump_cache(int argc, char **argv)
{ {
addr address; addr address;
vm_cache *cache; vm_cache *cache;
@@ -1206,11 +1208,11 @@ static void dump_cache(int argc, char **argv)
if(argc < 2) { if(argc < 2) {
dprintf("cache: not enough arguments\n"); dprintf("cache: not enough arguments\n");
return; return 0;
} }
if(strlen(argv[1]) < 2 || argv[1][0] != '0' || argv[1][1] != 'x') { if(strlen(argv[1]) < 2 || argv[1][0] != '0' || argv[1][1] != 'x') {
dprintf("cache: invalid argument, pass address\n"); dprintf("cache: invalid argument, pass address\n");
return; return 0;
} }
address = atoul(argv[1]); address = atoul(argv[1]);
@@ -1235,6 +1237,7 @@ static void dump_cache(int argc, char **argv)
else else
dprintf(" %p UNKNOWN PAGE type %d\n", page, page->type); dprintf(" %p UNKNOWN PAGE type %d\n", page, page->type);
} }
return 0;
} }
static void _dump_region(vm_region *region) static void _dump_region(vm_region *region)
@@ -1254,14 +1257,14 @@ static void _dump_region(vm_region *region)
dprintf("cache_prev: %p\n", region->cache_prev); dprintf("cache_prev: %p\n", region->cache_prev);
} }
static void dump_region(int argc, char **argv) static int dump_region(int argc, char **argv)
{ {
// int i; // int i;
vm_region *region; vm_region *region;
if(argc < 2) { if(argc < 2) {
dprintf("region: not enough arguments\n"); dprintf("region: not enough arguments\n");
return; return 0;
} }
// if the argument looks like a hex number, treat it as such // if the argument looks like a hex number, treat it as such
@@ -1275,7 +1278,7 @@ static void dump_region(int argc, char **argv)
} else { } else {
_dump_region(region); _dump_region(region);
} }
return; return 0;
} else { } else {
// walk through the region list, looking for the arguments as a name // walk through the region list, looking for the arguments as a name
struct hash_iterator iter; struct hash_iterator iter;
@@ -1287,6 +1290,7 @@ static void dump_region(int argc, char **argv)
} }
} }
} }
return 0;
} }
region_id find_region_by_address (addr vaddress) region_id find_region_by_address (addr vaddress)
@@ -1319,7 +1323,7 @@ region_id find_region_by_name(const char *name)
return B_NAME_NOT_FOUND; return B_NAME_NOT_FOUND;
} }
static void dump_region_list(int argc, char **argv) static int dump_region_list(int argc, char **argv)
{ {
vm_region *region; vm_region *region;
struct hash_iterator iter; struct hash_iterator iter;
@@ -1332,6 +1336,7 @@ static void dump_region_list(int argc, char **argv)
region, region->id, region->name, region->base, region->size, region->lock, region->wiring); region, region->id, region->name, region->base, region->size, region->lock, region->wiring);
} }
hash_close(region_table, &iter, false); hash_close(region_table, &iter, false);
return 0;
} }
static void _dump_aspace(vm_address_space *aspace) static void _dump_aspace(vm_address_space *aspace)
@@ -1360,14 +1365,14 @@ static void _dump_aspace(vm_address_space *aspace)
} }
} }
static void dump_aspace(int argc, char **argv) static int dump_aspace(int argc, char **argv)
{ {
// int i; // int i;
vm_address_space *aspace; vm_address_space *aspace;
if(argc < 2) { if(argc < 2) {
dprintf("aspace: not enough arguments\n"); dprintf("aspace: not enough arguments\n");
return; return 0;
} }
// if the argument looks like a hex number, treat it as such // if the argument looks like a hex number, treat it as such
@@ -1381,7 +1386,7 @@ static void dump_aspace(int argc, char **argv)
} else { } else {
_dump_aspace(aspace); _dump_aspace(aspace);
} }
return; return 0;
} else { } else {
// walk through the aspace list, looking for the arguments as a name // walk through the aspace list, looking for the arguments as a name
struct hash_iterator iter; struct hash_iterator iter;
@@ -1393,9 +1398,10 @@ static void dump_aspace(int argc, char **argv)
} }
} }
} }
return 0;
} }
static void dump_aspace_list(int argc, char **argv) static int dump_aspace_list(int argc, char **argv)
{ {
vm_address_space *as; vm_address_space *as;
struct hash_iterator iter; struct hash_iterator iter;
@@ -1408,6 +1414,7 @@ static void dump_aspace_list(int argc, char **argv)
as, as->id, as->name, as->virtual_map.base, as->virtual_map.size); as, as->id, as->name, as->virtual_map.base, as->virtual_map.size);
} }
hash_close(aspace_table, &iter, false); hash_close(aspace_table, &iter, false);
return 0;
} }
vm_address_space *vm_get_kernel_aspace(void) vm_address_space *vm_get_kernel_aspace(void)
@@ -1730,16 +1737,16 @@ int vm_init(kernel_args *ka)
arch_vm_init_endvm(ka); arch_vm_init_endvm(ka);
// add some debugger commands // add some debugger commands
dbg_add_command(&dump_region_list, "regions", "Dump a list of all regions"); add_debugger_command("regions", &dump_region_list, "Dump a list of all regions");
dbg_add_command(&dump_region, "region", "Dump info about a particular region"); add_debugger_command("region", &dump_region, "Dump info about a particular region");
dbg_add_command(&dump_aspace_list, "aspaces", "Dump a list of all address spaces"); add_debugger_command("aspaces", &dump_aspace_list, "Dump a list of all address spaces");
dbg_add_command(&dump_aspace, "aspace", "Dump info about a particular address space"); add_debugger_command("aspace", &dump_aspace, "Dump info about a particular address space");
dbg_add_command(&dump_cache_ref, "cache_ref", "Dump cache_ref data structure"); add_debugger_command("cache_ref", &dump_cache_ref, "Dump cache_ref data structure");
dbg_add_command(&dump_cache, "cache", "Dump cache_ref data structure"); add_debugger_command("cache", &dump_cache, "Dump cache_ref data structure");
// dbg_add_command(&display_mem, "dl", "dump memory long words (64-bit)"); // add_debugger_command("dl", &display_mem, "dump memory long words (64-bit)");
dbg_add_command(&display_mem, "dw", "dump memory words (32-bit)"); add_debugger_command("dw", &display_mem, "dump memory words (32-bit)");
dbg_add_command(&display_mem, "ds", "dump memory shorts (16-bit)"); add_debugger_command("ds", &display_mem, "dump memory shorts (16-bit)");
dbg_add_command(&display_mem, "db", "dump memory bytes (8-bit)"); add_debugger_command("db", &display_mem, "dump memory bytes (8-bit)");
dprintf("vm_init: exit\n"); dprintf("vm_init: exit\n");
+10 -7
View File
@@ -40,8 +40,8 @@ static spinlock_t page_lock;
static sem_id modified_pages_available; static sem_id modified_pages_available;
void dump_page_stats(int argc, char **argv); static int dump_page_stats(int argc, char **argv);
void dump_free_page_table(int argc, char **argv); static int dump_free_page_table(int argc, char **argv);
static int vm_page_set_state_nolock(vm_page *page, int page_state); static int vm_page_set_state_nolock(vm_page *page, int page_state);
static void clear_page(addr pa); static void clear_page(addr pa);
static int page_scrubber(void *); static int page_scrubber(void *);
@@ -251,8 +251,8 @@ int vm_page_init2(kernel_args *ka)
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "page_structures", &null, REGION_ADDR_EXACT_ADDRESS, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "page_structures", &null, REGION_ADDR_EXACT_ADDRESS,
PAGE_ALIGN(num_pages * sizeof(vm_page)), REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL); PAGE_ALIGN(num_pages * sizeof(vm_page)), REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL);
dbg_add_command(&dump_page_stats, "page_stats", "Dump statistics about page usage"); add_debugger_command("page_stats", &dump_page_stats, "Dump statistics about page usage");
dbg_add_command(&dump_free_page_table, "free_pages", "Dump list of free pages"); add_debugger_command("free_pages", &dump_free_page_table, "Dump list of free pages");
return 0; return 0;
} }
@@ -620,12 +620,13 @@ addr vm_page_num_free_pages()
return page_free_queue.count + page_clear_queue.count; return page_free_queue.count + page_clear_queue.count;
} }
void dump_free_page_table(int argc, char **argv) static int dump_free_page_table(int argc, char **argv)
{ {
dprintf("not finished\n"); dprintf("not finished\n");
return 0;
} }
void dump_page_stats(int argc, char **argv) static int dump_page_stats(int argc, char **argv)
{ {
unsigned int page_types[8]; unsigned int page_types[8];
addr i; addr i;
@@ -641,11 +642,12 @@ void dump_page_stats(int argc, char **argv)
page_types[PAGE_STATE_ACTIVE], page_types[PAGE_STATE_INACTIVE], page_types[PAGE_STATE_BUSY], page_types[PAGE_STATE_UNUSED]); page_types[PAGE_STATE_ACTIVE], page_types[PAGE_STATE_INACTIVE], page_types[PAGE_STATE_BUSY], page_types[PAGE_STATE_UNUSED]);
dprintf("modified: %d\nfree: %d\nclear: %d\nwired: %d\n", dprintf("modified: %d\nfree: %d\nclear: %d\nwired: %d\n",
page_types[PAGE_STATE_MODIFIED], page_types[PAGE_STATE_FREE], page_types[PAGE_STATE_CLEAR], page_types[PAGE_STATE_WIRED]); page_types[PAGE_STATE_MODIFIED], page_types[PAGE_STATE_FREE], page_types[PAGE_STATE_CLEAR], page_types[PAGE_STATE_WIRED]);
return 0;
} }
#if 0 #if 0
static void dump_free_page_table(int argc, char **argv) static int dump_free_page_table(int argc, char **argv)
{ {
unsigned int i = 0; unsigned int i = 0;
unsigned int free_start = END_OF_LIST; unsigned int free_start = END_OF_LIST;
@@ -689,6 +691,7 @@ static void dump_free_page_table(int argc, char **argv)
dprintf("%d->%d ", i, free_page_table[i]); dprintf("%d->%d ", i, free_page_table[i]);
} }
*/ */
return 0;
} }
#endif #endif
static addr vm_alloc_vspace_from_ka_struct(kernel_args *ka, unsigned int size) static addr vm_alloc_vspace_from_ka_struct(kernel_args *ka, unsigned int size)
+4 -2
View File
@@ -160,12 +160,14 @@ image_id dev_load_dev_module(const char *name, const char *dirpath)
if (keep_loaded) if (keep_loaded)
return id; return id;
/* If the fucntion gets here then the following has happenned... /* If the function gets here then the following has happenned...
* - the driver has been loaded * - the driver has been loaded
* - it has appeared valid * - it has appeared valid
* - init_hardware has returned saying it should be used * - init_hardware has returned saying it should be used
* - init_driver has been run OK * - init_driver has been run OK
* - devfs_publish_devices has for some reason failed. * - publish_devices return empty paths list or
* devfs_publish_device has for some reason failed on each path.
*
* The error value we're about to return is 0, which probably * The error value we're about to return is 0, which probably
* means we're loosing error information here :( * means we're loosing error information here :(
* XXX - what error code should we be returning * XXX - what error code should we be returning