From 2ebcd458e34878c56f26893f3e4d403d4e7b2977 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Mon, 12 Nov 2012 00:30:40 +0000 Subject: [PATCH] Fix DDB command "show map XXX": - Check that an argument is always available, otherwise current map printing before to recurse is garbage. - Spit out a message if an argument is not provided. - Remove unread nlines variable. - Use an explicit recursive function, disassociated from the DB_SHOW_COMMAND() body, in order to make clear prototype and recursion of the above mentioned function. The code results now much less obscure. Submitted by: gianni --- sys/vm/vm_map.c | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index da96babae38f..034754ab35a2 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -3975,32 +3975,20 @@ vm_map_lookup_done(vm_map_t map, vm_map_entry_t entry) #include -/* - * vm_map_print: [ debug ] - */ -DB_SHOW_COMMAND(map, vm_map_print) +static void +vm_map_print(vm_map_t map) { - static int nlines; - /* XXX convert args. */ - vm_map_t map = (vm_map_t)addr; - boolean_t full = have_addr; - vm_map_entry_t entry; db_iprintf("Task map %p: pmap=%p, nentries=%d, version=%u\n", (void *)map, (void *)map->pmap, map->nentries, map->timestamp); - nlines++; - - if (!full && db_indent) - return; db_indent += 2; for (entry = map->header.next; entry != &map->header; entry = entry->next) { db_iprintf("map entry %p: start=%p, end=%p\n", (void *)entry, (void *)entry->start, (void *)entry->end); - nlines++; { static char *inheritance_name[4] = {"share", "copy", "none", "donate_copy"}; @@ -4016,14 +4004,11 @@ DB_SHOW_COMMAND(map, vm_map_print) db_printf(", share=%p, offset=0x%jx\n", (void *)entry->object.sub_map, (uintmax_t)entry->offset); - nlines++; if ((entry->prev == &map->header) || (entry->prev->object.sub_map != entry->object.sub_map)) { db_indent += 2; - vm_map_print((db_expr_t)(intptr_t) - entry->object.sub_map, - full, 0, (char *)0); + vm_map_print((vm_map_t)entry->object.sub_map); db_indent -= 2; } } else { @@ -4040,7 +4025,6 @@ DB_SHOW_COMMAND(map, vm_map_print) db_printf(", copy (%s)", (entry->eflags & MAP_ENTRY_NEEDS_COPY) ? "needed" : "done"); db_printf("\n"); - nlines++; if ((entry->prev == &map->header) || (entry->prev->object.vm_object != @@ -4048,17 +4032,23 @@ DB_SHOW_COMMAND(map, vm_map_print) db_indent += 2; vm_object_print((db_expr_t)(intptr_t) entry->object.vm_object, - full, 0, (char *)0); - nlines += 4; + 1, 0, (char *)0); db_indent -= 2; } } } db_indent -= 2; - if (db_indent == 0) - nlines = 0; } +DB_SHOW_COMMAND(map, map) +{ + + if (!have_addr) { + db_printf("usage: show map \n"); + return; + } + vm_map_print((vm_map_t)addr); +} DB_SHOW_COMMAND(procvm, procvm) { @@ -4074,7 +4064,7 @@ DB_SHOW_COMMAND(procvm, procvm) (void *)p, (void *)p->p_vmspace, (void *)&p->p_vmspace->vm_map, (void *)vmspace_pmap(p->p_vmspace)); - vm_map_print((db_expr_t)(intptr_t)&p->p_vmspace->vm_map, 1, 0, NULL); + vm_map_print((vm_map_t)&p->p_vmspace->vm_map); } #endif /* DDB */