static void search_cmd(char **ptr) { static int lastval = 0, lastcount = 0; static lispobj *start = 0, *end = 0; int val, count; lispobj *addr, obj; if (more_p(ptr)) { val = parse_number(ptr); if (val < 0 || val > 0xff) { printf("can only search for single bytes\n"); return; } if (more_p(ptr)) { addr = (lispobj *)native_pointer((uword_t)parse_addr(ptr)); if (more_p(ptr)) { count = parse_number(ptr); } else { /* Specified value and address, but no count. Only one. */ count = -1; } } else { /* Specified a value, but no address, so search same range. */ addr = start; count = lastcount; } } else { /* Specified nothing, search again for val. */ val = lastval; addr = end; count = lastcount; } lastval = val; start = end = addr; lastcount = count; printf("searching for 0x%x at %p\n", val, (void*)(uword_t)end); while (search_for_type(val, &end, &count)) { printf("found 0x%x at %p:\n", val, (void*)(uword_t)end); obj = *end; addr = end; end += 2; if (widetag_of(obj) == SIMPLE_FUN_HEADER_WIDETAG) { print((uword_t)addr | FUN_POINTER_LOWTAG); } else if (other_immediate_lowtag_p(obj)) { print((lispobj)addr | OTHER_POINTER_LOWTAG); } else { print((lispobj)addr); } if (count == -1) { return; } } }
static void print_context_cmd(char **ptr) { int free_ici; struct thread *thread=arch_os_get_current_thread(); free_ici = fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)); if (more_p(ptr)) { int index; index = parse_number(ptr); if ((index >= 0) && (index < free_ici)) { printf("There are %d interrupt contexts.\n", free_ici); printf("printing context %d\n", index); print_context(thread->interrupt_contexts[index]); } else { printf("There aren't that many/few contexts.\n"); printf("There are %d interrupt contexts.\n", free_ici); } } else { if (free_ici == 0) printf("There are no interrupt contexts!\n"); else { printf("There are %d interrupt contexts.\n", free_ici); printf("printing context %d\n", free_ici - 1); print_context(thread->interrupt_contexts[free_ici - 1]); } } }
static void backtrace_cmd(char **ptr) { void lisp_backtrace(int frames); int n; if (more_p(ptr)) n = parse_number(ptr); else n = 100; printf("Backtrace:\n"); lisp_backtrace(n); }
static void dump_cmd(char **ptr) { static char *lastaddr = 0; static int lastcount = 20; char *addr = lastaddr; int count = lastcount, displacement; int force = 0, decode = 0; if (more_p(ptr)) { // you can't both "force" and "decode" - only one or the other, // or neither if (!strncmp(*ptr, "-f ", 3)) { force = 1; *ptr += 3; } else if (!strncmp(*ptr, "-d ", 3)) { decode = 1; *ptr += 3; } addr = parse_addr(ptr, !force); if (more_p(ptr)) count = parse_number(ptr); } if (count == 0) { printf("COUNT must be non-zero.\n"); return; } lastcount = count; if (count > 0) displacement = N_WORD_BYTES; else { displacement = -N_WORD_BYTES; count = -count; } boolean aligned = ((uword_t)addr & LOWTAG_MASK) == 0; if (decode && (!aligned || displacement < 0)) { printf("Sorry, can only decode if aligned and stepping forward\n"); decode = 0; } lispobj* next_object = decode ? (lispobj*)addr : 0; while (count-- > 0) { #ifndef LISP_FEATURE_ALPHA printf("%p: ", (os_vm_address_t) addr); #else printf("0x%08X: ", (u32) addr); #endif if (force || gc_managed_addr_p((lispobj)addr)) { #ifndef LISP_FEATURE_ALPHA unsigned long *lptr = (unsigned long *)addr; #else u32 *lptr = (u32 *)addr; #endif unsigned char *cptr = (unsigned char *)addr; #if N_WORD_BYTES == 8 printf("0x%016lx | %c%c%c%c%c%c%c%c", lptr[0], visible(cptr[0]), visible(cptr[1]), visible(cptr[2]), visible(cptr[3]), visible(cptr[4]), visible(cptr[5]), visible(cptr[6]), visible(cptr[7])); #else unsigned short *sptr = (unsigned short *)addr; printf("0x%08lx 0x%04x 0x%04x " "0x%02x 0x%02x 0x%02x 0x%02x " "%c%c" "%c%c", lptr[0], sptr[0], sptr[1], cptr[0], cptr[1], cptr[2], cptr[3], visible(cptr[0]), visible(cptr[1]), visible(cptr[2]), visible(cptr[3])); #endif #ifdef LISP_FEATURE_GENCGC if (aligned) { lispobj ptr = *(lispobj*)addr; int gen; if (is_lisp_pointer(ptr) && gc_managed_heap_space_p(ptr) && (gen = gc_gen_of(ptr, 99)) != 99) // say that static is 99 if (gen != 99) printf(" | %d", gen); } #endif if (decode && addr == (char*)next_object) { lispobj word = *addr; // ensure validity of widetag because crashing with // "no size function" would be worse than doing nothing if (word != 0 && !is_lisp_pointer(word) && valid_widetag_p(header_widetag(word))) { printf(" %s", widetag_names[header_widetag(word)>>2]); next_object += sizetab[header_widetag(word)](next_object); } else if (is_cons_half(word)) {
static void dump_cmd(char **ptr) { static char *lastaddr = 0; static int lastcount = 20; char *addr = lastaddr; int count = lastcount, displacement; if (more_p(ptr)) { addr = parse_addr(ptr); if (more_p(ptr)) count = parse_number(ptr); } if (count == 0) { printf("COUNT must be non-zero.\n"); return; } lastcount = count; if (count > 0) displacement = N_WORD_BYTES; else { displacement = -N_WORD_BYTES; count = -count; } while (count-- > 0) { #ifndef LISP_FEATURE_ALPHA printf("%p: ", (os_vm_address_t) addr); #else printf("0x%08X: ", (u32) addr); #endif if (is_valid_lisp_addr((os_vm_address_t)addr)) { #ifndef LISP_FEATURE_ALPHA unsigned long *lptr = (unsigned long *)addr; #else u32 *lptr = (u32 *)addr; #endif unsigned char *cptr = (unsigned char *)addr; #if N_WORD_BYTES == 8 printf("0x%016lx | %c%c%c%c%c%c%c%c\n", lptr[0], visible(cptr[0]), visible(cptr[1]), visible(cptr[2]), visible(cptr[3]), visible(cptr[4]), visible(cptr[5]), visible(cptr[6]), visible(cptr[7])); #else unsigned short *sptr = (unsigned short *)addr; printf("0x%08lx 0x%04x 0x%04x " "0x%02x 0x%02x 0x%02x 0x%02x " "%c%c" "%c%c\n", lptr[0], sptr[0], sptr[1], cptr[0], cptr[1], cptr[2], cptr[3], visible(cptr[0]), visible(cptr[1]), visible(cptr[2]), visible(cptr[3])); #endif } else printf("invalid Lisp-level address\n"); addr += displacement; } lastaddr = addr; }