--- crash-4.0-7.5/tools.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/tools.c 2009-01-06 11:16:24.000000000 -0500 @@ -1534,7 +1534,7 @@ int right; char buf[BUFSIZE]; - switch (flags & (LONG_DEC|LONG_HEX|INT_HEX|INT_DEC|LONGLONG_HEX)) + switch (flags & (LONG_DEC|LONG_HEX|INT_HEX|INT_DEC|LONGLONG_HEX|ZERO_FILL)) { case LONG_DEC: sprintf(s, "%lu", (ulong)opt); @@ -1542,6 +1542,12 @@ case LONG_HEX: sprintf(s, "%lx", (ulong)opt); break; + case (LONG_HEX|ZERO_FILL): + if (VADDR_PRLEN == 8) + sprintf(s, "%08lx", (ulong)opt); + else if (VADDR_PRLEN == 16) + sprintf(s, "%016lx", (ulong)opt); + break; case INT_DEC: sprintf(s, "%u", (uint)((ulong)opt)); break; --- crash-4.0-7.5/memory.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/memory.c 2008-12-09 11:59:04.000000000 -0500 @@ -644,8 +644,9 @@ if (kernel_symbol_exists("mem_map")) get_symbol_data("max_mapnr", sizeof(ulong), &vt->max_mapnr); - get_symbol_data("nr_swapfiles", sizeof(unsigned int), - &vt->nr_swapfiles); + if (kernel_symbol_exists("nr_swapfiles")) + get_symbol_data("nr_swapfiles", sizeof(unsigned int), + &vt->nr_swapfiles); STRUCT_SIZE_INIT(page, "page"); STRUCT_SIZE_INIT(free_area, "free_area"); @@ -2976,7 +2977,7 @@ #define VM_REF_CHECK_DECVAL(X,V) \ (DO_REF_SEARCH(X) && ((X)->cmdflags & VM_REF_NUMBER) && ((X)->decval == (V))) #define VM_REF_CHECK_STRING(X,S) \ - (DO_REF_SEARCH(X) && (S) && FILENAME_COMPONENT((S),(X)->str)) + (DO_REF_SEARCH(X) && (string_exists(S)) && FILENAME_COMPONENT((S),(X)->str)) #define VM_REF_FOUND(X) ((X) && ((X)->cmdflags & VM_REF_HEADER)) ulong --- crash-4.0-7.5/filesys.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/filesys.c 2009-01-06 10:51:02.000000000 -0500 @@ -76,6 +76,7 @@ #define DUMP_FULL_NAME 1 #define DUMP_INODE_ONLY 2 #define DUMP_DENTRY_ONLY 4 +#define DUMP_EMPTY_FILE 8 /* * Open the namelist, dumpfile and output devices. @@ -2301,7 +2302,7 @@ if (ref && file) { open_tmpfile(); if (file_dump(file, 0, 0, i, - DUMP_FULL_NAME)) { + DUMP_FULL_NAME|DUMP_EMPTY_FILE)) { BZERO(buf4, BUFSIZE); rewind(pc->tmpfile); fgets(buf4, BUFSIZE, @@ -2319,8 +2320,8 @@ fprintf(fp, files_header); header_printed = 1; } - file_dump(file, 0, 0, i, - DUMP_FULL_NAME); + file_dump(file, 0, 0, i, + DUMP_FULL_NAME|DUMP_EMPTY_FILE); } } i++; @@ -2517,16 +2518,60 @@ dentry = ULONG(file_buf + OFFSET(file_f_dentry)); } - if (!dentry) + if (!dentry) { + if (flags & DUMP_EMPTY_FILE) { + fprintf(fp, "%3d%s%s%s%s%s%s%s%s%s%s\n", + fd, + space(MINSPACE), + mkstring(buf1, VADDR_PRLEN, + CENTER|RJUST|LONG_HEX, + MKSTR(file)), + space(MINSPACE), + mkstring(buf2, VADDR_PRLEN, + CENTER|LONG_HEX|ZERO_FILL, + MKSTR(dentry)), + space(MINSPACE), + mkstring(buf3, VADDR_PRLEN, + CENTER, + "?"), + space(MINSPACE), + "? ", + space(MINSPACE), + "?"); + return TRUE; + } return FALSE; + } if (!inode) { dentry_buf = fill_dentry_cache(dentry); inode = ULONG(dentry_buf + OFFSET(dentry_d_inode)); } - if (!inode) + if (!inode) { + if (flags & DUMP_EMPTY_FILE) { + fprintf(fp, "%3d%s%s%s%s%s%s%s%s%s%s\n", + fd, + space(MINSPACE), + mkstring(buf1, VADDR_PRLEN, + CENTER|RJUST|LONG_HEX, + MKSTR(file)), + space(MINSPACE), + mkstring(buf2, VADDR_PRLEN, + CENTER|RJUST|LONG_HEX, + MKSTR(dentry)), + space(MINSPACE), + mkstring(buf3, VADDR_PRLEN, + CENTER|LONG_HEX|ZERO_FILL, + MKSTR(inode)), + space(MINSPACE), + "? ", + space(MINSPACE), + "?"); + return TRUE; + } return FALSE; + } inode_buf = fill_inode_cache(inode); --- crash-4.0-7.5/task.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/task.c 2008-12-17 14:15:33.000000000 -0500 @@ -643,6 +643,7 @@ static int verify_task(struct task_context *tc, int level) { + int i; ulong next_task; ulong readflag; @@ -663,11 +664,27 @@ /* fall through */ case 2: - if ((tc->processor < 0) || (tc->processor >= NR_CPUS)) + if (!IS_TASK_ADDR(tc->ptask)) return FALSE; - if (!IS_TASK_ADDR(tc->ptask)) + if ((tc->processor < 0) || (tc->processor >= NR_CPUS)) { + for (i = 0; i < NR_CPUS; i++) { + if (tc->task == tt->active_set[i]) { + error(WARNING, + "active task %lx on cpu %d: corrupt cpu value: %d\n\n", + tc->task, i, tc->processor); + tc->processor = i; + return TRUE; + } + } + + if (CRASHDEBUG(1)) + error(INFO, + "verify_task: task: %lx invalid processor: %d", + tc->task, tc->processor); return FALSE; + } + break; } --- crash-4.0-7.5/kernel.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/kernel.c 2009-01-08 11:47:40.000000000 -0500 @@ -2069,7 +2069,7 @@ else btloc.hp->esp = ULONG(bt->stackbuf + SIZE(irq_ctx) - - (sizeof(unsigned int)*2)); + (sizeof(char *)*2)); fprintf(fp, "--- ---\n"); break; @@ -2096,7 +2096,7 @@ BCOPY(bt, &btsave, sizeof(struct bt_info)); if (CRASHDEBUG(4)) - dump_bt_info(bt); + dump_bt_info(bt, "back_trace"); machdep->back_trace(bt); @@ -2128,6 +2128,8 @@ restore_stack(struct bt_info *bt) { ulonglong type; + struct syment *sp; + ulong retvaddr; bt->instptr = bt->stkptr = 0; type = 0; @@ -2135,18 +2137,30 @@ switch (bt->flags & (BT_HARDIRQ|BT_SOFTIRQ)) { case BT_HARDIRQ: - bt->instptr = symbol_value("do_IRQ"); + retvaddr = ULONG(bt->stackbuf + + SIZE(irq_ctx) - sizeof(char *)); + if ((sp = value_search(retvaddr, NULL)) && + STREQ(sp->name, "do_IRQ")) + bt->instptr = retvaddr; + else + bt->instptr = symbol_value("do_IRQ"); if (symbol_exists("__do_IRQ")) bt->stkptr = ULONG(bt->stackbuf + OFFSET(thread_info_previous_esp)); else bt->stkptr = ULONG(bt->stackbuf + - SIZE(irq_ctx) - (sizeof(unsigned int)*2)); + SIZE(irq_ctx) - (sizeof(char *)*2)); type = BT_HARDIRQ; break; case BT_SOFTIRQ: - bt->instptr = symbol_value("do_softirq"); + retvaddr = ULONG(bt->stackbuf + + SIZE(irq_ctx) - sizeof(char *)); + if ((sp = value_search(retvaddr, NULL)) && + STREQ(sp->name, "do_softirq")) + bt->instptr = retvaddr; + else + bt->instptr = symbol_value("do_softirq"); bt->stkptr = ULONG(bt->stackbuf + OFFSET(thread_info_previous_esp)); type = BT_SOFTIRQ; @@ -2205,7 +2219,8 @@ if ((p1 = strstr(buf, ":"))) { esp = eip = 0; *p1 = NULLCHAR; - if ((esp = htol(buf, RETURN_ON_ERROR, NULL)) != BADADDR) + if (((esp = htol(buf, RETURN_ON_ERROR, NULL)) != BADADDR) + && INSTACK(esp, bt)) eip = GET_STACK_ULONG(esp); if (esp && eip) { hooks[cnt].esp = esp; @@ -2230,8 +2245,9 @@ * Debug routine most likely useful from above in back_trace() */ void -dump_bt_info(struct bt_info *bt) +dump_bt_info(struct bt_info *bt, char *where) { + fprintf(fp, "[%lx] %s:\n", (ulong)bt, where); fprintf(fp, " task: %lx\n", bt->task); fprintf(fp, " flags: %llx\n", bt->flags); fprintf(fp, " instptr: %lx\n", bt->instptr); --- crash-4.0-7.5/configure.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/configure.c 2008-12-09 11:49:53.000000000 -0500 @@ -941,7 +941,7 @@ p = &LASTCHAR(line); while (*p == '\n') - *p = (char)NULL; + *p = '\0'; return(line); } --- crash-4.0-7.5/x86_64.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/x86_64.c 2008-12-09 14:22:48.000000000 -0500 @@ -3741,7 +3741,10 @@ OFFSET(thread_struct_rip), KVADDR, &rip, sizeof(void *), "thread_struct rip", FAULT_ON_ERROR); - return rip; + if (rip) + return rip; + else + return symbol_value("thread_return"); } offset = OFFSET(task_struct_thread) + OFFSET(thread_struct_rip); --- crash-4.0-7.5/symbols.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/symbols.c 2008-12-17 11:34:16.000000000 -0500 @@ -1780,6 +1780,19 @@ if (ec->st_shndx == SHN_UNDEF) continue; + if (!IN_MODULE(kstrtab + ec->st_name, lm)) { + if (CRASHDEBUG(3)) { + error(WARNING, + "%s: bad st_name index: %lx -> %lx\n " + " st_value: %lx st_shndx: %ld st_info: %c\n", + lm->mod_name, + ec->st_name, (kstrtab + ec->st_name), + ec->st_value, ec->st_shndx, + ec->st_info); + } + continue; + } + nameptr = locstrtab + ec->st_name; if (*nameptr == '\0') continue; @@ -7494,14 +7507,14 @@ { int i; struct load_module *lm; - int request; + ulong request; asection **sec; - request = (int)((ulong)reqptr); + request = ((ulong)reqptr); switch (request) { - case (uint)KERNEL_SECTIONS: + case (ulong)KERNEL_SECTIONS: sec = (asection **)st->sections; for (i = 0; (i < st->bfd->section_count) && *sec; i++) sec++; @@ -7528,12 +7541,12 @@ } break; - case (uint)MODULE_SECTIONS: + case (ulong)MODULE_SECTIONS: lm = st->current; store_section_data(lm, bfd, section); break; - case (uint)VERIFY_SECTIONS: + case (ulong)VERIFY_SECTIONS: if (STREQ(bfd_get_section_name(bfd, section), ".text") || STREQ(bfd_get_section_name(bfd, section), ".data")) { if (!(bfd_get_section_flags(bfd, section) & SEC_LOAD)) --- crash-4.0-7.5/cmdline.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/cmdline.c 2008-12-10 11:04:08.000000000 -0500 @@ -1285,8 +1285,10 @@ "cannot malloc input file command line buffer\n"); return; } + BZERO(pc->runtime_ifile_cmd, BUFSIZE); } - strcpy(pc->runtime_ifile_cmd, pc->orig_line); + if (!strlen(pc->runtime_ifile_cmd)) + strcpy(pc->runtime_ifile_cmd, pc->orig_line); pc->ifile_in_progress = RUNTIME_IFILE; } --- crash-4.0-7.5/lkcd_x86_trace.c 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/lkcd_x86_trace.c 2009-01-08 11:32:20.000000000 -0500 @@ -510,6 +510,8 @@ COMPILER_VERSION_EQUAL, GCC(2,96,0), 0, 0, 48 }, { "default_idle", NULL, COMPILER_VERSION_START, GCC(2,96,0), 0, -4, 0 }, + { "hidinput_hid_event", NULL, + COMPILER_VERSION_START, GCC(4,1,2), 0, 0, 28 }, { NULL, NULL, 0, 0, 0, 0, 0 }, }; --- crash-4.0-7.5/defs.h 2009-01-08 14:45:43.000000000 -0500 +++ crash-4.0-7.6/defs.h 2009-01-08 11:31:55.000000000 -0500 @@ -93,8 +93,10 @@ #define HIST_BLKSIZE (4096) -#define STREQ(A, B) (A && B && (strcmp((char *)(A), (char *)(B)) == 0)) -#define STRNEQ(A, B) (A && B && \ +static inline int string_exists(char *s) { return (s ? TRUE : FALSE); } +#define STREQ(A, B) (string_exists((char *)A) && string_exists((char *)B) && \ + (strcmp((char *)(A), (char *)(B)) == 0)) +#define STRNEQ(A, B) (string_exists((char *)A) && string_exists((char *)B) && \ (strncmp((char *)(A), (char *)(B), strlen((char *)(B))) == 0)) #define BZERO(S, N) (memset(S, NULLCHAR, N)) #define BCOPY(S, D, C) (memcpy(D, S, C)) @@ -2775,6 +2777,7 @@ #define INT_DEC (0x20) #define INT_HEX (0x40) #define LONGLONG_HEX (0x80) +#define ZERO_FILL (0x100) #define INIT_TIME (1) #define RUN_TIME (2) @@ -3625,7 +3628,7 @@ char *get_uptime(char *, ulonglong *); void clone_bt_info(struct bt_info *, struct bt_info *, struct task_context *); void dump_kernel_table(int); -void dump_bt_info(struct bt_info *); +void dump_bt_info(struct bt_info *, char *where); void dump_log(int); void set_cpu(int); void clear_machdep_cache(void);