--- crash-4.0-7.1/main.c 2008-09-15 11:37:30.000000000 -0400 +++ crash-4.0-7.2/main.c 2008-09-03 13:04:59.000000000 -0400 @@ -467,6 +467,7 @@ hq_init(); machdep_init(PRE_SYMTAB); symtab_init(); + paravirt_init(); machdep_init(PRE_GDB); datatype_init(); --- crash-4.0-7.1/memory.c 2008-09-15 11:37:34.000000000 -0400 +++ crash-4.0-7.2/memory.c 2008-09-12 16:00:00.000000000 -0400 @@ -98,6 +98,8 @@ static void dump_kmem_cache_info_v2(struct meminfo *); static void kmem_cache_list_slub(void); static ulong get_cpu_slab_ptr(struct meminfo *, int, ulong *); +static unsigned int oo_order(ulong); +static unsigned int oo_objects(ulong); static char *vaddr_to_kmem_cache(ulong, char *, int); static ulong vaddr_to_slab(ulong); static void do_slab_chain(int, struct meminfo *); @@ -472,6 +474,10 @@ ANON_MEMBER_OFFSET_INIT(page_slab, "page", "slab"); ANON_MEMBER_OFFSET_INIT(page_first_page, "page", "first_page"); ANON_MEMBER_OFFSET_INIT(page_freelist, "page", "freelist"); + if (INVALID_MEMBER(kmem_cache_objects)) { + MEMBER_OFFSET_INIT(kmem_cache_oo, "kmem_cache", "oo"); + ANON_MEMBER_OFFSET_INIT(page_objects, "page", "objects"); + } if (VALID_MEMBER(kmem_cache_node)) { ARRAY_LENGTH_INIT(len, NULL, "kmem_cache.node", NULL, 0); vt->flags |= CONFIG_NUMA; @@ -12606,6 +12612,7 @@ { ulong addr; ulong mem_section_size; + int dimension; if (!IS_SPARSEMEM()) return; @@ -12617,9 +12624,9 @@ if (!MAX_PHYSMEM_BITS()) error(FATAL, "CONFIG_SPARSEMEM kernels not supported for this architecture\n"); - - if (get_array_length("mem_section", NULL, 0) == - (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT_EXTREME())) + + if ((get_array_length("mem_section", &dimension, 0) == + (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT_EXTREME())) || !dimension) vt->flags |= SPARSEMEM_EX; if (IS_SPARSEMEM_EX()) { @@ -12653,7 +12660,7 @@ char * read_mem_section(ulong addr) { - if (!IS_KVADDR(addr)) + if ((addr == 0) || !IS_KVADDR(addr)) return 0; readmem(addr, KVADDR, vt->mem_section, SIZE(mem_section), @@ -12668,7 +12675,8 @@ ulong addr; ulong *mem_sec = vt->mem_sec; - if (!IS_KVADDR(mem_sec[SECTION_NR_TO_ROOT(nr)])) + if ((mem_sec[SECTION_NR_TO_ROOT(nr)] == 0) || + !IS_KVADDR(mem_sec[SECTION_NR_TO_ROOT(nr)])) return 0; if (IS_SPARSEMEM_EX()) @@ -12850,14 +12858,17 @@ !symbol_exists("node_states")) return 0; - if (LKCD_KERNTYPES()) { - if ((len = STRUCT_SIZE("nodemask_t")) < 0) - error(FATAL, "cannot determine type nodemask_t\n"); - mapaddr = symbol_value("node_online_map"); - } else if (symbol_exists("node_online_map")) { - len = get_symbol_type("node_online_map", NULL, &req) - == TYPE_CODE_UNDEF ? sizeof(ulong) : req.length; - mapaddr = symbol_value("node_online_map"); + if (symbol_exists("node_online_map")) { + if (LKCD_KERNTYPES()) { + if ((len = STRUCT_SIZE("nodemask_t")) < 0) + error(FATAL, + "cannot determine type nodemask_t\n"); + mapaddr = symbol_value("node_online_map"); + } else { + len = get_symbol_type("node_online_map", NULL, &req) + == TYPE_CODE_UNDEF ? sizeof(ulong) : req.length; + mapaddr = symbol_value("node_online_map"); + } } else if (symbol_exists("node_states")) { if ((get_symbol_type("node_states", NULL, &req) != TYPE_CODE_ARRAY) || !(len = get_array_length("node_states", NULL, 0)) || @@ -13485,12 +13496,19 @@ dump_kmem_cache_slub(struct meminfo *si) { int i; - ulong name; + ulong name, oo; unsigned int size, objsize, objects, order, offset; char *reqname, *p1; char kbuf[BUFSIZE]; char buf[BUFSIZE]; + if (INVALID_MEMBER(kmem_cache_node_nr_slabs)) { + error(INFO, + "option requires kmem_cache_node.nr_slabs member!\n" + "(the kernel must be built with CONFIG_SLUB_DEBUG)\n"); + return; + } + si->cache_count = get_kmem_cache_list(&si->cache_list); si->cache_buf = GETBUF(SIZE(kmem_cache)); @@ -13539,9 +13557,18 @@ objsize = UINT(si->cache_buf + OFFSET(kmem_cache_objsize)); size = UINT(si->cache_buf + OFFSET(kmem_cache_size)); - objects = UINT(si->cache_buf + OFFSET(kmem_cache_objects)); - order = UINT(si->cache_buf + OFFSET(kmem_cache_order)); offset = UINT(si->cache_buf + OFFSET(kmem_cache_offset)); + if (VALID_MEMBER(kmem_cache_objects)) { + objects = UINT(si->cache_buf + + OFFSET(kmem_cache_objects)); + order = UINT(si->cache_buf + OFFSET(kmem_cache_order)); + } else if (VALID_MEMBER(kmem_cache_oo)) { + oo = ULONG(si->cache_buf + OFFSET(kmem_cache_oo)); + objects = oo_objects(oo); + order = oo_order(oo); + } else + error(FATAL, "cannot determine " + "kmem_cache objects/order values\n"); si->cache = si->cache_list[i]; si->curname = buf; @@ -13660,7 +13687,7 @@ } full_slabs = node_nr_slabs - per_cpu[n] - node_nr_partial; - objects = INT(si->cache_buf + OFFSET(kmem_cache_objects)); + objects = si->objects; switch (cmd) { @@ -13764,10 +13791,10 @@ #define DUMP_SLAB_INFO_SLUB() \ { \ char b1[BUFSIZE], b2[BUFSIZE]; \ - fprintf(fp, " %s %s %4d %5ld %9d %4ld\n", \ + fprintf(fp, " %s %s %4d %5d %9d %4d\n", \ mkstring(b1, VADDR_PRLEN, LJUST|LONG_HEX, MKSTR(si->slab)), \ mkstring(b2, VADDR_PRLEN, LJUST|LONG_HEX, MKSTR(vaddr)), \ - node, si->objects, inuse, si->objects - inuse); \ + node, objects, inuse, objects - inuse); \ } static void @@ -13775,7 +13802,7 @@ { physaddr_t paddr; ulong vaddr; - ushort inuse; + ushort inuse, objects; ulong freelist, cpu_freelist, cpu_slab_ptr; int i, cpu_slab, is_free, node; ulong p, q; @@ -13806,6 +13833,24 @@ if (!readmem(si->slab + OFFSET(page_freelist), KVADDR, &freelist, sizeof(void *), "page.freelist", RETURN_ON_ERROR)) return; + /* + * Pre-2.6.27, the object count and order were fixed in the + * kmem_cache structure. Now they may change, say if a high + * order slab allocation fails, so the per-slab object count + * is kept in the slab. + */ + if (VALID_MEMBER(page_objects)) { + if (!readmem(si->slab + OFFSET(page_objects), KVADDR, &objects, + sizeof(ushort), "page.objects", RETURN_ON_ERROR)) + return; + + if (CRASHDEBUG(1) && (objects != si->objects)) + error(NOTE, "%s: slab: %lx oo objects: %ld " + "slab objects: %d\n", + si->curname, si->slab, + si->objects, objects); + } else + objects = (ushort)si->objects; if (!verbose) { DUMP_SLAB_INFO_SLUB(); @@ -13856,7 +13901,7 @@ fprintf(fp, "< SLUB: free list END (%d found) >\n", i); } - for (p = vaddr; p < vaddr + si->objects * si->size; p += si->size) { + for (p = vaddr; p < vaddr + objects * si->size; p += si->size) { is_free = FALSE; for (is_free = 0, q = freelist; q; q = get_freepointer(si, (void *)q)) { @@ -14232,6 +14277,22 @@ return cpu_slab_ptr; } +/* + * In 2.6.27 kmem_cache.order and kmem_cache.objects were merged + * into the kmem_cache.oo, a kmem_cache_order_objects structure. + * oo_order() and oo_objects() emulate the kernel functions + * of the same name. + */ +static unsigned int oo_order(ulong oo) +{ + return (oo >> 16); +} + +static unsigned int oo_objects(ulong oo) +{ + return (oo & ((1 << 16) - 1)); +} + #ifdef NOT_USED ulong slab_to_kmem_cache_node(struct meminfo *si, ulong slab_page) --- crash-4.0-7.1/kernel.c 2008-09-15 11:37:34.000000000 -0400 +++ crash-4.0-7.2/kernel.c 2008-09-03 13:32:09.000000000 -0400 @@ -79,7 +79,8 @@ kt->end = symbol_value("_end"); /* - * For the Xen architecture, default to writable page tables unless: + * For the traditional (non-pv_ops) Xen architecture, default to writable + * page tables unless: * * (1) it's an "xm save" CANONICAL_PAGE_TABLES dumpfile, or * (2) the --shadow_page_tables option was explicitly entered. @@ -88,7 +89,7 @@ * it's not an "xm save" canonical dumpfile, then we have no choice * but to presume shadow page tables. */ - if (symbol_exists("xen_start_info")) { + if (!PVOPS() && symbol_exists("xen_start_info")) { kt->flags |= ARCH_XEN; if (!(kt->xen_flags & (SHADOW_PAGE_TABLES|CANONICAL_PAGE_TABLES))) kt->xen_flags |= WRITABLE_PAGE_TABLES; @@ -3887,6 +3888,8 @@ fprintf(fp, "%sARCH_XEN", others++ ? "|" : ""); if (kt->flags & ARCH_OPENVZ) fprintf(fp, "%sARCH_OPENVZ", others++ ? "|" : ""); + if (kt->flags & ARCH_PVOPS) + fprintf(fp, "%sARCH_PVOPS", others++ ? "|" : ""); if (kt->flags & NO_IKCONFIG) fprintf(fp, "%sNO_IKCONFIG", others++ ? "|" : ""); if (kt->flags & DWARF_UNWIND) @@ -6290,3 +6293,24 @@ break; } } + +/* + * With the evidence available, attempt to pre-determine whether + * this is a paravirt-capable kernel running as bare-metal, xen, + * kvm, etc. + * + * NOTE: Only bare-metal pv_ops kernels are supported so far. + */ +void +paravirt_init(void) +{ + /* + * pv_init_ops appears to be (as of 2.6.27) an arch-common + * symbol. This may have to change. + */ + if (kernel_symbol_exists("pv_init_ops")) { + if (CRASHDEBUG(1)) + error(INFO, "pv_init_ops exists: ARCH_PVOPS\n"); + kt->flags |= ARCH_PVOPS; + } +} --- crash-4.0-7.1/configure.c 2008-09-15 11:37:30.000000000 -0400 +++ crash-4.0-7.2/configure.c 2008-08-26 14:25:08.000000000 -0400 @@ -1167,6 +1167,7 @@ printf("ExclusiveArch: i386 alpha ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 s390 s390x\n"); printf("Buildroot: %%{_tmppath}/%%{name}-root\n"); printf("BuildRequires: ncurses-devel zlib-devel\n"); + printf("Requires: binutils\n"); printf("# Patch0: crash-3.3-20.installfix.patch (patch example)\n"); printf("\n"); printf("%%description\n"); --- crash-4.0-7.1/s390.c 2008-09-15 11:37:34.000000000 -0400 +++ crash-4.0-7.2/s390.c 2008-09-10 09:22:47.000000000 -0400 @@ -130,6 +130,8 @@ machdep->dump_irq = s390_dump_irq; if (!machdep->hz) machdep->hz = HZ; + machdep->section_size_bits = _SECTION_SIZE_BITS; + machdep->max_physmem_bits = _MAX_PHYSMEM_BITS; break; case POST_INIT: @@ -195,6 +197,8 @@ fprintf(fp, " pmd: %lx\n", (ulong)machdep->pmd); fprintf(fp, " ptbl: %lx\n", (ulong)machdep->ptbl); fprintf(fp, " ptrs_per_pgd: %d\n", machdep->ptrs_per_pgd); + fprintf(fp, " max_physmem_bits: %ld\n", machdep->max_physmem_bits); + fprintf(fp, " section_size_bits: %ld\n", machdep->section_size_bits); fprintf(fp, " machspec: %lx\n", (ulong)machdep->machspec); } --- crash-4.0-7.1/s390x.c 2008-09-15 11:37:34.000000000 -0400 +++ crash-4.0-7.2/s390x.c 2008-09-10 09:23:22.000000000 -0400 @@ -128,6 +128,8 @@ machdep->dump_irq = s390x_dump_irq; if (!machdep->hz) machdep->hz = HZ; + machdep->section_size_bits = _SECTION_SIZE_BITS; + machdep->max_physmem_bits = _MAX_PHYSMEM_BITS; break; case POST_INIT: @@ -194,6 +196,8 @@ fprintf(fp, " pmd: %lx\n", (ulong)machdep->pmd); fprintf(fp, " ptbl: %lx\n", (ulong)machdep->ptbl); fprintf(fp, " ptrs_per_pgd: %d\n", machdep->ptrs_per_pgd); + fprintf(fp, " max_physmem_bits: %ld\n", machdep->max_physmem_bits); + fprintf(fp, " section_size_bits: %ld\n", machdep->section_size_bits); fprintf(fp, " machspec: %lx\n", (ulong)machdep->machspec); } --- crash-4.0-7.1/x86_64.c 2008-09-15 11:37:34.000000000 -0400 +++ crash-4.0-7.2/x86_64.c 2008-09-03 13:19:26.000000000 -0400 @@ -147,7 +147,9 @@ case PRE_GDB: if (!(machdep->flags & VM_FLAGS)) { if (symbol_exists("xen_start_info")) { - if (symbol_exists("low_pml4") && + if (PVOPS()) + machdep->flags |= VM_2_6_11; + else if (symbol_exists("low_pml4") && symbol_exists("swap_low_mappings")) machdep->flags |= VM_XEN_RHEL4; else @@ -178,7 +180,6 @@ case VM_2_6_11: /* 2.6.11 layout */ machdep->machspec->userspace_top = USERSPACE_TOP_2_6_11; - machdep->machspec->page_offset = PAGE_OFFSET_2_6_11; machdep->machspec->vmalloc_start_addr = VMALLOC_START_ADDR_2_6_11; machdep->machspec->vmalloc_end = VMALLOC_END_2_6_11; machdep->machspec->modules_vaddr = MODULES_VADDR_2_6_11; @@ -190,6 +191,13 @@ if (symbol_exists("vmemmap_populate")) machdep->flags |= VMEMMAP; + if (kernel_symbol_exists("end_pfn")) + /* 2.6.11 layout */ + machdep->machspec->page_offset = PAGE_OFFSET_2_6_11; + else + /* 2.6.27 layout */ + machdep->machspec->page_offset = PAGE_OFFSET_2_6_27; + machdep->uvtop = x86_64_uvtop_level4; break; @@ -534,7 +542,7 @@ static void x86_64_cpu_pda_init(void) { - int i, cpus, nr_pda, cpunumber, _cpu_pda; + int i, cpus, nr_pda, cpunumber, _cpu_pda, _boot_cpu_pda; char *cpu_pda_buf; ulong level4_pgt, data_offset, cpu_pda_addr; struct syment *sp, *nsp; @@ -569,11 +577,21 @@ _cpu_pda = FALSE; } } - + if (_cpu_pda) { + if (symbol_exists("_boot_cpu_pda")) + _boot_cpu_pda = TRUE; + else + _boot_cpu_pda = FALSE; + } for (i = cpus = 0; i < nr_pda; i++) { if (_cpu_pda) { - if (!_CPU_PDA_READ(i, cpu_pda_buf)) - break; + if (_boot_cpu_pda) { + if (!_CPU_PDA_READ2(i, cpu_pda_buf)) + break; + } else { + if (!_CPU_PDA_READ(i, cpu_pda_buf)) + break; + } } else { if (!CPU_PDA_READ(i, cpu_pda_buf)) break; @@ -3914,7 +3932,7 @@ int x86_64_get_smp_cpus(void) { - int i, cpus, nr_pda, cpunumber, _cpu_pda; + int i, cpus, nr_pda, cpunumber, _cpu_pda, _boot_cpu_pda; char *cpu_pda_buf; ulong level4_pgt, cpu_pda_addr; @@ -3940,10 +3958,21 @@ _cpu_pda = FALSE; } } + if (_cpu_pda) { + if (symbol_exists("_boot_cpu_pda")) + _boot_cpu_pda = TRUE; + else + _boot_cpu_pda = FALSE; + } for (i = cpus = 0; i < nr_pda; i++) { if (_cpu_pda) { - if (!_CPU_PDA_READ(i, cpu_pda_buf)) - break; + if (_boot_cpu_pda) { + if (!_CPU_PDA_READ2(i, cpu_pda_buf)) + break; + } else { + if (!_CPU_PDA_READ(i, cpu_pda_buf)) + break; + } } else { if (!CPU_PDA_READ(i, cpu_pda_buf)) break; --- crash-4.0-7.1/symbols.c 2008-09-15 11:37:34.000000000 -0400 +++ crash-4.0-7.2/symbols.c 2008-09-12 11:44:04.000000000 -0400 @@ -49,6 +49,7 @@ static long rodata_search(ulong *, ulong); static int ascii_long(ulong word); static int is_bfd_format(char *); +static int is_binary_stripped(char *); static int namespace_ctl(int, struct namespace *, void *, void *); static void symval_hash_init(void); static struct syment *symval_hash_search(ulong); @@ -2719,6 +2720,33 @@ return TRUE; } +static int +is_binary_stripped(char *filename) +{ +#if defined(GDB_6_0) || defined(GDB_6_1) + struct bfd *bfd; +#else + struct _bfd *bfd; +#endif + int number_of_symbols; + + if ((bfd = bfd_openr(filename, NULL)) == NULL) { + error(INFO, "cannot open ELF file: %s\n", filename); + return FALSE; + } + + if (!bfd_check_format(bfd, bfd_object)) { + error(INFO, "invalid ELF file: %s\n", filename); + bfd_close(bfd); + return FALSE; + } + + number_of_symbols = bfd_canonicalize_symtab(bfd, NULL); + + bfd_close(bfd); + + return (number_of_symbols == 0); +} /* * This command may be used to: @@ -6260,6 +6288,8 @@ fprintf(fp, " page_inuse: %ld\n", OFFSET(page_inuse)); + fprintf(fp, " page_objects: %ld\n", + OFFSET(page_objects)); fprintf(fp, " page_slab: %ld\n", OFFSET(page_slab)); fprintf(fp, " page_first_page: %ld\n", @@ -6620,6 +6650,8 @@ OFFSET(kmem_cache_node)); fprintf(fp, " kmem_cache_cpu_slab: %ld\n", OFFSET(kmem_cache_cpu_slab)); + fprintf(fp, " kmem_cache_oo: %ld\n", + OFFSET(kmem_cache_oo)); fprintf(fp, " kmem_cache_node_nr_partial: %ld\n", OFFSET(kmem_cache_node_nr_partial)); @@ -9048,9 +9080,10 @@ char *arglist[MAXARGS]; char buf[BUFSIZE]; FILE *pipe; - ulong vaddr, lookfor; - ulong last_vaddr; + ulong vaddr, size, lookfor; + ulong last_vaddr, last_size; char symbol[BUFSIZE]; + const char *nm_call; fflush(fp); fflush(stdout); @@ -9073,11 +9106,16 @@ return; } + if (is_binary_stripped(thisfile)) + nm_call = "/usr/bin/nm -DSBn %s"; + else + nm_call = "/usr/bin/nm -BSn %s"; + for (i = 0; i < NUMBER_STACKFRAMES; i++) { if (!(lookfor = retaddr[i])) continue; - sprintf(buf, "/usr/bin/nm -Bn %s", thisfile); + sprintf(buf, nm_call, thisfile); if (!(pipe = popen(buf, "r"))) { perror("pipe"); break; @@ -9086,20 +9124,27 @@ last_vaddr = 0; BZERO(symbol, BUFSIZE); - while (fgets(buf, 80, pipe)) { + while (fgets(buf, BUFSIZE, pipe)) { c = parse_line(strip_linefeeds(buf), arglist); - if (c != 3) + if (c != 4) continue; vaddr = htol(arglist[0], FAULT_ON_ERROR, NULL); + size = htol(arglist[1], FAULT_ON_ERROR, NULL); if (vaddr > lookfor) { - fprintf(stderr, "%s %lx: %s+%ld\n", - i == 0 ? "\n" : "", - lookfor, symbol, - lookfor-last_vaddr); + if ((lookfor - last_vaddr) > last_size) + fprintf(stderr, "%s %lx: (undetermined)\n", + i == 0 ? "\n" : "", + lookfor); + else + fprintf(stderr, "%s %lx: %s+%ld\n", + i == 0 ? "\n" : "", + lookfor, symbol, + lookfor-last_vaddr); break; } - strcpy(symbol, arglist[2]); + strcpy(symbol, arglist[3]); last_vaddr = vaddr; + last_size = size; } pclose(pipe); --- crash-4.0-7.1/defs.h 2008-09-15 11:37:34.000000000 -0400 +++ crash-4.0-7.2/defs.h 2008-09-15 11:15:31.000000000 -0400 @@ -470,11 +470,13 @@ #define RELOC_SET (0x2000000) #define RELOC_FORCE (0x4000000) #define ARCH_OPENVZ (0x8000000) +#define ARCH_PVOPS (0x10000000) #define GCC_VERSION_DEPRECATED (GCC_3_2|GCC_3_2_3|GCC_2_96|GCC_3_3_2|GCC_3_3_3) #define XEN() (kt->flags & ARCH_XEN) #define OPENVZ() (kt->flags & ARCH_OPENVZ) +#define PVOPS() (kt->flags & ARCH_PVOPS) #define XEN_MACHINE_TO_MFN(m) ((ulonglong)(m) >> PAGESHIFT()) #define XEN_PFN_TO_PSEUDO(p) ((ulonglong)(p) << PAGESHIFT()) @@ -1452,6 +1454,8 @@ long vcpu_struct_rq; long task_struct_sched_info; long sched_info_last_arrival; + long page_objects; + long kmem_cache_oo; }; struct size_table { /* stash of commonly-used sizes */ @@ -2124,6 +2128,8 @@ #define VMEMMAP_VADDR_2_6_24 0xffffe20000000000 #define VMEMMAP_END_2_6_24 0xffffe2ffffffffff +#define PAGE_OFFSET_2_6_27 0xffff880000000000 + #define USERSPACE_TOP_XEN 0x0000800000000000 #define PAGE_OFFSET_XEN 0xffff880000000000 #define VMALLOC_START_ADDR_XEN 0xffffc20000000000 @@ -2221,6 +2227,17 @@ #define PAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask) +#define _CPU_PDA_READ2(CPU, BUFFER) \ + ((readmem(symbol_value("_cpu_pda"), \ + KVADDR, &cpu_pda_addr, sizeof(unsigned long), \ + "_cpu_pda addr", FAULT_ON_ERROR)) && \ + (readmem(cpu_pda_addr + ((CPU) * sizeof(void *)), \ + KVADDR, &cpu_pda_addr, sizeof(unsigned long), \ + "_cpu_pda addr", FAULT_ON_ERROR)) && \ + (cpu_pda_addr) && \ + (readmem(cpu_pda_addr, KVADDR, (BUFFER), SIZE(x8664_pda), \ + "cpu_pda entry", FAULT_ON_ERROR))) + #define _CPU_PDA_READ(CPU, BUFFER) \ ((STRNEQ("_cpu_pda", closest_symbol((symbol_value("_cpu_pda") + \ ((CPU) * sizeof(unsigned long)))))) && \ @@ -2636,6 +2653,9 @@ #define TIF_SIGPENDING (2) +#define _SECTION_SIZE_BITS 25 +#define _MAX_PHYSMEM_BITS 31 + #endif /* S390 */ #ifdef S390X @@ -2658,6 +2678,9 @@ #define TIF_SIGPENDING (2) +#define _SECTION_SIZE_BITS 28 +#define _MAX_PHYSMEM_BITS 42 + #endif /* S390X */ #ifdef PLATFORM @@ -3609,6 +3632,7 @@ int get_cpus_present(void); int get_cpus_possible(void); int in_cpu_map(int, int); +void paravirt_init(void); void print_stack_text_syms(struct bt_info *, ulong, ulong); void back_trace(struct bt_info *); #define BT_RAW (0x1ULL) --- crash-4.0-7.1/extensions/sial.c 2008-09-15 11:37:34.000000000 -0400 +++ crash-4.0-7.2/extensions/sial.c 2008-09-15 10:33:56.000000000 -0400 @@ -1,5 +1,5 @@ /* - * $Id: sial.c,v 1.5 2007/11/13 21:03:15 anderson Exp $ + * $Id: sial.c,v 1.6 2008/09/15 14:33:56 anderson Exp $ * * This file is part of lcrash, an analysis tool for Linux memory dumps. * @@ -800,7 +800,7 @@ NULL }; -#define NCMDS 100 +#define NCMDS 200 static struct command_table_entry command_table[NCMDS] = { {"edit", edit_cmd, edit_help},