Hello community, here is the log from the commit of package libkdumpfile for openSUSE:Factory checked in at 2015-11-28 15:19:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libkdumpfile (Old) and /work/SRC/openSUSE:Factory/.libkdumpfile.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libkdumpfile" Changes: -------- --- /work/SRC/openSUSE:Factory/libkdumpfile/libkdumpfile.changes 2015-08-27 08:56:50.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.libkdumpfile.new/libkdumpfile.changes 2015-11-28 15:19:17.000000000 +0100 @@ -1,0 +2,22 @@ +Thu Nov 26 09:54:56 UTC 2015 - [email protected] + +- Remove autoreconf invocation (fix build on SLE10). + +------------------------------------------------------------------- +Wed Nov 25 13:29:56 UTC 2015 - [email protected] + +- Add pkg-config to BuildRequires (adds back zlib support). +- libkdumpfile-fallback-for-old-zlib.patch: Fall back to + AC_SEARCH_LIBS if there is no pkg-config file for zlib. + +------------------------------------------------------------------- +Wed Nov 25 12:50:16 UTC 2015 - [email protected] + +- upgrade to libkdumpfile-0.1.5 + * Improved support of Xen dumpcore files. + * Basic support for MIPS architecture. + * Fix support for LKCD dumps on s390x. +- Add libkdumpfile.pc pkg-config file to -devel package. +- libkdumpfile-remove-ARCH_PPC64LE.patch: Fix build on ppc64le. + +------------------------------------------------------------------- Old: ---- libkdumpfile-0.1.4.tar.bz2 New: ---- libkdumpfile-0.1.5.tar.bz2 libkdumpfile-fallback-for-old-zlib.patch libkdumpfile-remove-ARCH_PPC64LE.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libkdumpfile.spec ++++++ --- /var/tmp/diff_new_pack.R6CIR7/_old 2015-11-28 15:19:18.000000000 +0100 +++ /var/tmp/diff_new_pack.R6CIR7/_new 2015-11-28 15:19:18.000000000 +0100 @@ -33,7 +33,7 @@ # End compatibility cruft Name: libkdumpfile -Version: 0.1.4 +Version: 0.1.5 Release: 0 Summary: Kernel dump file access library License: LGPL-3.0+ or GPL-2.0+ @@ -41,8 +41,10 @@ Url: https://github.com/ptesarik/libkdumpfile Source: https://github.com/ptesarik/libkdumpfile/releases/download/v%version/%name-%version.tar.bz2 Patch1: %{name}-add-EM_AARCH64.patch -BuildRequires: libtool >= 2 +Patch2: %{name}-remove-ARCH_PPC64LE.patch +Patch3: %{name}-fallback-for-old-zlib.patch BuildRequires: lzo-devel +BuildRequires: pkgconfig BuildRequires: zlib-devel BuildRoot: %{_tmppath}/%{name}-%{version}-build %if 0%{?suse_version} < 1030 @@ -81,11 +83,12 @@ %prep %setup -q %patch1 -p1 +%patch2 -p1 +%patch3 -p1 +# Avoid autotools recheck after patching config* +touch aclocal.m4 Makefile.in config.h.in configure %build -if [ ! -e configure ]; then - autoreconf -fiv -fi %configure --disable-static make %{?_smp_mflags} @@ -106,5 +109,6 @@ %defattr(-,root,root) %{_libdir}/libkdumpfile.so %{_includedir}/kdumpfile.h +%{_libdir}/pkgconfig/libkdumpfile.pc %changelog ++++++ libkdumpfile-0.1.4.tar.bz2 -> libkdumpfile-0.1.5.tar.bz2 ++++++ ++++ 2013 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/Makefile.am new/libkdumpfile-0.1.5/Makefile.am --- old/libkdumpfile-0.1.4/Makefile.am 2014-12-05 17:29:35.000000000 +0100 +++ new/libkdumpfile-0.1.5/Makefile.am 2015-11-25 13:17:33.000000000 +0100 @@ -43,7 +43,7 @@ EXTRA_libkdumpfile_la_DEPENDENCIES = libkdumpfile.map -libkdumpfile_la_LDFLAGS = -version-info 3:0:3 +libkdumpfile_la_LDFLAGS = -version-info 4:0:4 libkdumpfile_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libkdumpfile.map include_HEADERS = \ @@ -58,3 +58,6 @@ COPYING.LGPLv3 \ README.md \ libkdumpfile.map + +pkgconfigdir=$(libdir)/pkgconfig +pkgconfig_DATA=libkdumpfile.pc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/NEWS new/libkdumpfile-0.1.5/NEWS --- old/libkdumpfile-0.1.4/NEWS 2014-12-05 17:27:29.000000000 +0100 +++ new/libkdumpfile-0.1.5/NEWS 2015-11-25 13:16:57.000000000 +0100 @@ -1,3 +1,9 @@ +0.1.5 +----- + * improved support of Xen dumpcore files + * basic support for MIPS architecture + * fix support for LKCD dumps on s390x + 0.1.4 ----- * support for IA32 (32-bit x86) architecture diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/config.h.in new/libkdumpfile-0.1.5/config.h.in --- old/libkdumpfile-0.1.4/config.h.in 2014-12-05 17:30:01.000000000 +0100 +++ new/libkdumpfile-0.1.5/config.h.in 2015-11-25 13:20:59.000000000 +0100 @@ -64,7 +64,7 @@ /* Define to enable support for snappy compression using -lsnappy */ #undef USE_SNAPPY -/* Define to enable support for zlib compression using -lz */ +/* Define to enable support for zlib compression */ #undef USE_ZLIB /* Version number of package */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/configure.ac new/libkdumpfile-0.1.5/configure.ac --- old/libkdumpfile-0.1.4/configure.ac 2014-12-05 17:29:10.000000000 +0100 +++ new/libkdumpfile-0.1.5/configure.ac 2015-11-25 13:17:52.000000000 +0100 @@ -19,7 +19,7 @@ dnl along with this program. If not, see <http://www.gnu.org/licenses/>. AC_INIT([Library for reading kernel core dumps], - [0.1.4],[[email protected]],[libkdumpfile]) + [0.1.5],[[email protected]],[libkdumpfile]) AC_CONFIG_SRCDIR([diskdump.c]) AC_CONFIG_MACRO_DIR([m4]) @@ -32,13 +32,26 @@ LT_INIT -kdump_COMPRESSION(zlib, ZLIB, z, uncompress) +AC_SUBST(REQUIRES_PRIVATE) +AC_SUBST(LIBS_PRIVATE) + +dnl This makes sure pkg.m4 is available. +m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-config]) + +PKG_CHECK_MODULES(ZLIB, zlib, + [ REQUIRES_PRIVATE="zlib $REQUIRES_PRIVATE" + AC_DEFINE(USE_ZLIB, 1, [Define to enable support for zlib compression]) + ],[# ignore if missing]) +AS_VAR_APPEND([CFLAGS], " $ZLIB_CFLAGS") +AS_VAR_APPEND([LIBS], " $ZLIB_LIBS") + kdump_COMPRESSION(lzo, LZO, lzo2, lzo1x_decompress_safe) kdump_COMPRESSION(snappy, SNAPPY, snappy, snappy_uncompress) AC_CONFIG_FILES([ Makefile doc/Makefile + libkdumpfile.pc ]) AC_OUTPUT diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/context.c new/libkdumpfile-0.1.5/context.c --- old/libkdumpfile-0.1.4/context.c 2014-11-28 17:21:04.000000000 +0100 +++ new/libkdumpfile-0.1.5/context.c 2015-07-23 11:50:55.000000000 +0200 @@ -66,9 +66,9 @@ [ARCH_ALPHA] = "alpha", [ARCH_ARM] = "arm", [ARCH_IA64] = "ia64", + [ARCH_MIPS] = "mips", [ARCH_PPC] = "ppc", [ARCH_PPC64] = "ppc64", - [ARCH_PPC64LE] = "ppc64le", [ARCH_S390] = "s390", [ARCH_S390X] = "s390x", [ARCH_X86] = "i386", @@ -245,3 +245,11 @@ return vmcoreinfo_symbol(ctx, ctx->vmcoreinfo_xen, symname, symvalue); } + +kdump_get_symbol_val_fn * +kdump_cb_get_symbol_val(kdump_ctx *ctx, kdump_get_symbol_val_fn *cb) +{ + kdump_get_symbol_val_fn *ret = ctx->cb_get_symbol_val; + ctx->cb_get_symbol_val = cb ?: kdump_vmcoreinfo_symbol; + return ret; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/diskdump.c new/libkdumpfile-0.1.5/diskdump.c --- old/libkdumpfile-0.1.4/diskdump.c 2014-12-03 17:18:23.000000000 +0100 +++ new/libkdumpfile-0.1.5/diskdump.c 2015-07-23 12:30:58.000000000 +0200 @@ -150,6 +150,9 @@ struct disk_dump_priv { unsigned char *bitmap; /* for compressed dumps */ off_t descoff; /* position of page descriptor table */ + + void *xen_map; + unsigned long xen_map_size; }; struct setup_data { @@ -170,6 +173,8 @@ | DUMP_DH_COMPRESSED_SNAPPY \ ) +static const struct format_ops xen_dom0_ops; + static void diskdump_cleanup(kdump_ctx *ctx); static inline int @@ -209,6 +214,7 @@ if (!page_is_dumpable(ctx, pfn)) { memset(ctx->page, 0, ctx->page_size); + ctx->last_pfn = -(kdump_paddr_t)1; return kdump_ok; } @@ -308,6 +314,166 @@ } static kdump_status +diskdump_read_xen_dom0(kdump_ctx *ctx, kdump_pfn_t pfn) +{ + struct disk_dump_priv *ddp = ctx->fmtdata; + unsigned fpp = ctx->page_size / ctx->ptr_size; + uint64_t mfn_idx, frame_idx; + kdump_status ret; + + mfn_idx = pfn / fpp; + frame_idx = pfn % fpp; + if (mfn_idx >= ddp->xen_map_size) + return set_error(ctx, kdump_nodata, "Out-of-bounds PFN"); + + pfn = (ctx->ptr_size == 8) + ? ((uint64_t*)ddp->xen_map)[mfn_idx] + : ((uint32_t*)ddp->xen_map)[mfn_idx]; + ret = diskdump_read_page(ctx, pfn); + if (ret != kdump_ok) + return set_error(ctx, ret, "Cannot read MFN %llx", + (unsigned long long) pfn); + + pfn = (ctx->ptr_size == 8) + ? ((uint64_t*)ctx->page)[frame_idx] + : ((uint32_t*)ctx->page)[frame_idx]; + ret = diskdump_read_page(ctx, pfn); + return set_error(ctx, ret, "Cannot read MFN %llx", + (unsigned long long) pfn); +} + +static kdump_status +initialize_xen_map64(kdump_ctx *ctx, void *dir) +{ + struct disk_dump_priv *ddp = ctx->fmtdata; + unsigned fpp = ctx->page_size / ctx->ptr_size; + uint64_t *dirp, *p, *map; + uint64_t pfn; + unsigned long mfns; + kdump_status ret; + + mfns = 0; + for (dirp = dir, pfn = 0; *dirp && pfn < ctx->max_pfn; + ++dirp, pfn += fpp * fpp) { + ret = diskdump_read_page(ctx, *dirp); + if (ret == kdump_nodata) + ret = kdump_dataerr; + if (ret != kdump_ok) + return set_error(ctx, ret, + "Cannot read Xen P2M map MFN 0x%llx", + (unsigned long long) *dirp); + + for (p = ctx->page; (void*)p < ctx->page + ctx->page_size; ++p) + if (*p) + ++mfns; + } + + map = ctx_malloc(mfns * sizeof(uint64_t), ctx, "Xen P2M map"); + if (!map) + return kdump_syserr; + ddp->xen_map = map; + ddp->xen_map_size = mfns; + + for (dirp = dir; mfns; ++dirp) { + ret = diskdump_read_page(ctx, *dirp); + if (ret == kdump_nodata) + ret = kdump_dataerr; + if (ret != kdump_ok) + return set_error(ctx, ret, + "Cannot read Xen P2M map MFN 0x%llx", + (unsigned long long) *dirp); + + for (p = ctx->page; (void*)p < ctx->page + ctx->page_size; ++p) + if (*p) { + *map++ = dump64toh(ctx, *p); + --mfns; + } + } + + return kdump_ok; +} + +static kdump_status +initialize_xen_map32(kdump_ctx *ctx, void *dir) +{ + struct disk_dump_priv *ddp = ctx->fmtdata; + unsigned fpp = ctx->page_size / ctx->ptr_size; + uint32_t *dirp, *p, *map; + uint32_t pfn; + unsigned long mfns; + kdump_status ret; + + mfns = 0; + for (dirp = dir, pfn = 0; *dirp && pfn < ctx->max_pfn; + ++dirp, pfn += fpp * fpp) { + ret = diskdump_read_page(ctx, *dirp); + if (ret == kdump_nodata) + ret = kdump_dataerr; + if (ret != kdump_ok) + return set_error(ctx, ret, + "Cannot read Xen P2M map MFN 0x%llx", + (unsigned long long) *dirp); + + for (p = ctx->page; (void*)p < ctx->page + ctx->page_size; ++p) + if (*p) + ++mfns; + } + + map = ctx_malloc(mfns * sizeof(uint32_t), ctx, "Xen P2M map"); + if (!map) + return kdump_syserr; + ddp->xen_map = map; + ddp->xen_map_size = mfns; + + for (dirp = dir; mfns; ++dirp) { + ret = diskdump_read_page(ctx, *dirp); + if (ret == kdump_nodata) + ret = kdump_dataerr; + if (ret != kdump_ok) + return set_error(ctx, ret, + "Cannot read Xen P2M map MFN 0x%llx", + (unsigned long long) *dirp); + + for (p = ctx->page; (void*)p < ctx->page + ctx->page_size; ++p) + if (*p) { + *map++ = dump32toh(ctx, *p); + --mfns; + } + } + + return kdump_ok; +} + +static kdump_status +initialize_xen_map(kdump_ctx *ctx) +{ + void *dir, *page; + kdump_status ret; + + ret = diskdump_read_page(ctx, ctx->xen_p2m_mfn); + if (ret != kdump_ok) + return set_error(ctx, ret, + "Cannot read Xen P2M directory MFN 0x%llx", + (unsigned long long) ctx->xen_p2m_mfn); + + dir = ctx->page; + page = ctx_malloc(ctx->page_size, ctx, "page buffer"); + if (page == NULL) + return kdump_syserr; + ctx->page = page; + + ret = (ctx->ptr_size == 8) + ? initialize_xen_map64(ctx, dir) + : initialize_xen_map32(ctx, dir); + + if (ret == kdump_ok) + ctx->ops = &xen_dom0_ops; + + free(dir); + return ret; +} + +static kdump_status read_vmcoreinfo(kdump_ctx *ctx, off_t off, size_t size) { void *info; @@ -657,6 +823,12 @@ if (ret != kdump_ok) goto err_cleanup; + if (ctx->xen_p2m_mfn) { + ret = initialize_xen_map(ctx); + if (ret != kdump_ok) + return ret; + } + return ret; err_cleanup: @@ -699,3 +871,9 @@ .read_page = diskdump_read_page, .cleanup = diskdump_cleanup, }; + +static const struct format_ops xen_dom0_ops = { + .read_page = diskdump_read_xen_dom0, + .read_xenmach_page = diskdump_read_page, + .cleanup = diskdump_cleanup, +}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/elfdump.c new/libkdumpfile-0.1.5/elfdump.c --- old/libkdumpfile-0.1.4/elfdump.c 2014-11-28 17:17:52.000000000 +0100 +++ new/libkdumpfile-0.1.5/elfdump.c 2015-03-30 10:31:26.000000000 +0200 @@ -93,6 +93,7 @@ case EM_FAKE_ALPHA: return ARCH_ALPHA; case EM_IA_64: return ARCH_IA64; + case EM_MIPS: return ARCH_MIPS; case EM_PPC: return ARCH_PPC; case EM_PPC64: return ARCH_PPC64; case EM_S390: return ARCH_S390; @@ -173,7 +174,7 @@ } static unsigned long -pfn_to_mfn(struct elfdump_priv *edp, unsigned long pfn) +pfn_to_idx(struct elfdump_priv *edp, kdump_pfn_t pfn) { unsigned long i; @@ -193,19 +194,78 @@ } static kdump_status -elf_read_xen_domU(kdump_ctx *ctx, unsigned long pfn) +elf_read_xen_domU(kdump_ctx *ctx, kdump_pfn_t pfn) { struct elfdump_priv *edp = ctx->fmtdata; - unsigned long mfn; + unsigned long idx; off_t offset; ssize_t rd; - if ((mfn = pfn_to_mfn(edp, pfn)) == ~0UL) + idx = pfn_to_idx(edp, pfn); + if (idx == ~0UL) return set_error(ctx, kdump_nodata, "No machine address for PFN: 0x%llx", (unsigned long long) pfn); - offset = edp->xen_pages_offset + (off_t)mfn * ctx->page_size; + offset = edp->xen_pages_offset + (off_t)idx * ctx->page_size; + rd = pread(ctx->fd, ctx->page, ctx->page_size, offset); + if (rd != ctx->page_size) + return set_error(ctx, read_error(rd), + "Cannot read page data at %llu: %s", + (unsigned long long) offset, + read_err_str(rd)); + + return 0; +} + +static unsigned long +mfn_to_idx(struct elfdump_priv *edp, kdump_pfn_t mfn) +{ + unsigned long i; + + if (edp->xen_map_type == xen_map_p2m) { + struct xen_p2m *p = edp->xen_map; + for (i = 0; i < edp->xen_map_size; ++i, ++p) + if (p->gmfn == mfn) + return i; + } + + return ~0UL; +} + +static kdump_status +elf_mfn_to_pfn(kdump_ctx *ctx, kdump_pfn_t mfn, kdump_pfn_t *pfn) +{ + struct elfdump_priv *edp = ctx->fmtdata; + unsigned long i; + + if (edp->xen_map_type == xen_map_p2m) { + struct xen_p2m *p = edp->xen_map; + for (i = 0; i < edp->xen_map_size; ++i, ++p) + if (p->gmfn == mfn) { + *pfn = p->pfn; + return kdump_ok; + } + } else + return set_error(ctx, kdump_unsupported, + "No MFN-to-PFN translation table"); + + return set_error(ctx, kdump_nodata, "MFN not found"); +} + +static kdump_status +elf_read_xenmach_domU(kdump_ctx *ctx, kdump_pfn_t mfn) +{ + struct elfdump_priv *edp = ctx->fmtdata; + unsigned long idx; + off_t offset; + ssize_t rd; + + idx = mfn_to_idx(edp, mfn); + if (idx == ~0UL) + return set_error(ctx, kdump_nodata, "Page not found"); + + offset = edp->xen_pages_offset + (off_t)idx * ctx->page_size; rd = pread(ctx->fd, ctx->page, ctx->page_size, offset); if (rd != ctx->page_size) return set_error(ctx, read_error(rd), @@ -486,7 +546,7 @@ unsigned fpp = ctx->page_size / ctx->ptr_size; uint64_t *dirp, *p, *map; uint64_t pfn; - unsigned mfns; + unsigned long mfns; kdump_status ret; mfns = 0; @@ -537,7 +597,7 @@ unsigned fpp = ctx->page_size / ctx->ptr_size; uint32_t *dirp, *p, *map; uint32_t pfn; - unsigned mfns; + unsigned long mfns; kdump_status ret; mfns = 0; @@ -705,6 +765,7 @@ strerror(errno)); edp->xen_map_type = xen_map_p2m; edp->xen_map_size = sect->size /sizeof(struct xen_p2m); + ctx->xen_pte_is_mach = 1; } else if (!strcmp(name, ".xen_pfn")) { edp->xen_map = read_elf_sect(ctx, sect); if (!edp->xen_map) @@ -712,6 +773,17 @@ strerror(errno)); edp->xen_map_type = xen_map_pfn; edp->xen_map_size = sect->size / sizeof(uint64_t); + ctx->xen_pte_is_mach = 0; + } else if (!strcmp(name, ".note.Xen")) { + notes = read_elf_sect(ctx, sect); + if (!notes) + return set_error(ctx, kdump_syserr, + strerror(errno)); + ret = process_notes(ctx, notes, sect->size); + free(notes); + if (ret != kdump_ok) + return set_error(ctx, ret, + "Cannot process Xen notes"); } } @@ -815,6 +887,7 @@ static const struct format_ops xen_domU_ops = { .read_page = elf_read_xen_domU, - .read_xenmach_page = elf_read_page, + .read_xenmach_page = elf_read_xenmach_domU, + .mfn_to_pfn = elf_mfn_to_pfn, .cleanup = elf_cleanup, }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/ia32.c new/libkdumpfile-0.1.5/ia32.c --- old/libkdumpfile-0.1.4/ia32.c 2014-11-28 17:14:24.000000000 +0100 +++ new/libkdumpfile-0.1.5/ia32.c 2015-03-26 18:27:03.000000000 +0100 @@ -214,7 +214,7 @@ kdump_status ret; size_t sz; - ret = kdump_vmcoreinfo_symbol(ctx, "swapper_pg_dir", &pgtaddr); + ret = get_symbol_val(ctx, "swapper_pg_dir", &pgtaddr); if (ret != kdump_ok) return ret; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/kdumpfile-priv.h new/libkdumpfile-0.1.5/kdumpfile-priv.h --- old/libkdumpfile-0.1.4/kdumpfile-priv.h 2014-12-04 11:05:34.000000000 +0100 +++ new/libkdumpfile-0.1.5/kdumpfile-priv.h 2015-07-23 11:50:55.000000000 +0200 @@ -55,9 +55,9 @@ ARCH_ALPHA, ARCH_ARM, ARCH_IA64, + ARCH_MIPS, ARCH_PPC, ARCH_PPC64, - ARCH_PPC64LE, ARCH_S390, ARCH_S390X, ARCH_X86, @@ -107,6 +107,14 @@ */ kdump_status (*read_xenmach_page)(kdump_ctx *, kdump_pfn_t); + /* Translate a machine frame number to physical frame number. + * ctx->fmtdata initialized in probe() + * Return: + * kdump_ok output variable contains translated PFN + * kdump_nodata given MFN was not found + */ + kdump_status (*mfn_to_pfn)(kdump_ctx *, kdump_pfn_t, kdump_pfn_t *); + /* Clean up all private data. */ void (*cleanup)(kdump_ctx *); @@ -230,10 +238,13 @@ kdump_xen_version_t xen_ver; /* Xen hypervisor version */ kdump_vaddr_t xen_extra_ver; kdump_pfn_t xen_p2m_mfn; + int xen_pte_is_mach; void *fmtdata; /* format-specific private data */ void *archdata; /* arch-specific private data */ + kdump_get_symbol_val_fn *cb_get_symbol_val; + char *err_str; /* error string */ char err_buf[ERRBUF]; /* buffer for error string */ }; @@ -338,6 +349,10 @@ #define cksum32 INTERNAL_NAME(cksum32) uint32_t cksum32(void *buffer, size_t size, uint32_t csum); +#define get_symbol_val INTERNAL_NAME(get_symbol_val) +kdump_status get_symbol_val(kdump_ctx *ctx, const char *name, + kdump_addr_t *val); + /* ELF notes */ #define process_notes INTERNAL_NAME(process_notes) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/kdumpfile.h new/libkdumpfile-0.1.5/kdumpfile.h --- old/libkdumpfile-0.1.4/kdumpfile.h 2014-12-04 19:01:07.000000000 +0100 +++ new/libkdumpfile-0.1.5/kdumpfile.h 2015-07-23 11:50:56.000000000 +0200 @@ -294,9 +294,9 @@ * - arm * - i386 * - ia64 + * - mips * - ppc * - ppc64 - * - ppc64le * - s390 * - s390x * - x86_64 @@ -467,6 +467,25 @@ */ void kdump_xen_version(kdump_ctx *ctx, kdump_xen_version_t *version); +/** Type for the get_symbol_val callback function. + * @param ctx Dump file object of the caller. + * @param[in] name Name of the symbol. + * @param[out] val Symbol value. + * @returns Error status. + * + * This type is used for @ref kdump_cb_get_symbol_val. + */ +typedef kdump_status kdump_get_symbol_val_fn( + kdump_ctx *ctx, const char *name, kdump_addr_t *val); + +/** Set the get_symbol_val callback + * @param ctx Dump file object. + * @param cb New callback function. + * @return the Previous callback function. + */ +kdump_get_symbol_val_fn * +kdump_cb_get_symbol_val(kdump_ctx *ctx, kdump_get_symbol_val_fn *cb); + #ifdef __cplusplus } #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/libkdumpfile.map new/libkdumpfile-0.1.5/libkdumpfile.map --- old/libkdumpfile-0.1.4/libkdumpfile.map 2014-12-03 17:49:52.000000000 +0100 +++ new/libkdumpfile-0.1.5/libkdumpfile.map 2015-07-23 11:50:56.000000000 +0200 @@ -34,6 +34,7 @@ kdump_vmcoreinfo_symbol; kdump_vmcoreinfo_symbol_xen; kdump_xen_version; + kdump_cb_get_symbol_val; local: *; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/libkdumpfile.pc.in new/libkdumpfile-0.1.5/libkdumpfile.pc.in --- old/libkdumpfile-0.1.4/libkdumpfile.pc.in 1970-01-01 01:00:00.000000000 +0100 +++ new/libkdumpfile-0.1.5/libkdumpfile.pc.in 2015-09-24 09:53:41.000000000 +0200 @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libkdumpfile +Description: Kernel coredump file access +URL: https://github.com/ptesarik/libkdumpfile +Version: @VERSION@ + +Requires: +Requires.private: @REQUIRES_PRIVATE@ +Libs: -L${libdir} -lkdumpfile +Libs.private: @LIBS_PRIVATE@ +Cflags: -I${includedir} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/lkcd.c new/libkdumpfile-0.1.5/lkcd.c --- old/libkdumpfile-0.1.4/lkcd.c 2014-11-28 17:15:04.000000000 +0100 +++ new/libkdumpfile-0.1.5/lkcd.c 2015-11-24 21:00:31.000000000 +0100 @@ -317,6 +317,8 @@ char format[MAX_FORMAT_NAME]; }; +static void lkcd_cleanup(kdump_ctx *ctx); + static off_t find_page(kdump_ctx *ctx, off_t off, unsigned pfn, struct dump_page *dp) { @@ -656,10 +658,6 @@ if (ret != kdump_ok) goto err_free; - ret = set_arch(ctx, machine_arch(ctx->utsname.machine)); - if (ret != kdump_ok) - goto err_free; - max_idx1 = pfn_idx1(ctx->max_pfn - 1) + 1; lkcdp->pfn_level1 = calloc(max_idx1, sizeof(struct pfn_level2*)); if (!lkcdp->pfn_level1) { @@ -669,10 +667,14 @@ goto err_free; } + ret = set_arch(ctx, machine_arch(ctx->utsname.machine)); + if (ret != kdump_ok) + goto err_free; + return kdump_ok; err_free: - free(lkcdp); + lkcd_cleanup(ctx); return ret; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/m4/compression.m4 new/libkdumpfile-0.1.5/m4/compression.m4 --- old/libkdumpfile-0.1.4/m4/compression.m4 2014-10-30 10:48:33.000000000 +0100 +++ new/libkdumpfile-0.1.5/m4/compression.m4 2015-09-24 10:10:35.000000000 +0200 @@ -7,6 +7,7 @@ [AC_SEARCH_LIBS([$4],[$3], [AC_DEFINE(USE_$2, 1, [Define to enable support for $1 compression using -l$3]) + AS_VAR_APPEND(LIBS_PRIVATE, " -l$3") ],[ if test "x$with_$1" != xcheck; then AC_MSG_FAILURE([--with-$1 was given, but test for $1 failed]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/m4/libtool.m4 new/libkdumpfile-0.1.5/m4/libtool.m4 --- old/libkdumpfile-0.1.4/m4/libtool.m4 2014-12-05 17:11:38.000000000 +0100 +++ new/libkdumpfile-0.1.5/m4/libtool.m4 2015-09-24 10:10:51.000000000 +0200 @@ -1312,7 +1312,7 @@ rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext @@ -1326,7 +1326,10 @@ x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; - ppc64-*linux*|powerpc64-*linux*) + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -1345,7 +1348,10 @@ x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - ppc*-*linux*|powerpc*-*linux*) + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/notes.c new/libkdumpfile-0.1.5/notes.c --- old/libkdumpfile-0.1.4/notes.c 2014-11-28 16:02:16.000000000 +0100 +++ new/libkdumpfile-0.1.5/notes.c 2015-11-24 23:44:46.000000000 +0100 @@ -74,6 +74,50 @@ /* Additional arch-dependent and version-dependent fields */ }; +#define XEN_EXTRA_VERSION_SZ 16 +#define XEN_COMPILER_SZ 64 +#define XEN_COMPILE_BY_SZ 16 +#define XEN_COMPLE_DOMAIN_SZ 32 +#define XEN_COMPILE_DATE_SZ 32 +#define XEN_CAPABILITIES_SZ 1024 +#define XEN_CHANGESET_SZ 64 + +struct xen_dumpcore_elfnote_xen_version_32 { + uint64_t major_version; + uint64_t minor_version; + char extra_version[XEN_EXTRA_VERSION_SZ]; + struct { + char compiler[XEN_COMPILER_SZ]; + char compile_by[XEN_COMPILE_BY_SZ]; + char compile_domain[XEN_COMPLE_DOMAIN_SZ]; + char compile_date[XEN_COMPILE_DATE_SZ]; + } compile_info; + char capabilities[XEN_CAPABILITIES_SZ]; + char changeset[XEN_CHANGESET_SZ]; + struct { + uint32_t virt_start; + } platform_parameters; + uint64_t pagesize; +}; + +struct xen_dumpcore_elfnote_xen_version_64 { + uint64_t major_version; + uint64_t minor_version; + char extra_version[XEN_EXTRA_VERSION_SZ]; + struct { + char compiler[XEN_COMPILER_SZ]; + char compile_by[XEN_COMPILE_BY_SZ]; + char compile_domain[XEN_COMPLE_DOMAIN_SZ]; + char compile_date[XEN_COMPILE_DATE_SZ]; + } compile_info; + char capabilities[XEN_CAPABILITIES_SZ]; + char changeset[XEN_CHANGESET_SZ]; + struct { + uint64_t virt_start; + } platform_parameters; + uint64_t pagesize; +}; + typedef kdump_status do_note_fn(kdump_ctx *ctx, Elf32_Word type, const char *name, size_t namesz, void *desc, size_t descsz); @@ -100,7 +144,7 @@ * endian * ptr_size */ -static void +static kdump_status process_xen_crash_info(kdump_ctx *ctx, void *data, size_t len) { unsigned words = len / ctx->ptr_size; @@ -120,6 +164,41 @@ ctx->xen_extra_ver = dump32toh(ctx, info->xen_extra_version); ctx->xen_p2m_mfn = dump32toh(ctx, ((uint32_t*)data)[words-1]); } + + return kdump_ok; +} + +static kdump_status +process_xen_dumpcore_version(kdump_ctx *ctx, void *data, size_t len) +{ + const char *ver_extra = NULL; + + if (ctx->ptr_size == 8 && + len >= sizeof(struct xen_dumpcore_elfnote_xen_version_64)) { + struct xen_dumpcore_elfnote_xen_version_64 *ver = data; + ctx->xen_ver.major = dump64toh(ctx, ver->major_version); + ctx->xen_ver.minor = dump64toh(ctx, ver->minor_version); + ver_extra = ver->extra_version; + } else if(ctx->ptr_size == 4 && + len >= sizeof(struct xen_dumpcore_elfnote_xen_version_32)) { + struct xen_dumpcore_elfnote_xen_version_32 *ver = data; + ctx->xen_ver.major = dump64toh(ctx, ver->major_version); + ctx->xen_ver.minor = dump64toh(ctx, ver->minor_version); + ver_extra = ver->extra_version; + } + + if (ver_extra) { + char *newextra; + newextra = ctx_malloc(XEN_EXTRA_VERSION_SZ + 1, + ctx, "Xen extra version"); + if (!newextra) + return kdump_syserr; + memcpy(newextra, ver_extra, XEN_EXTRA_VERSION_SZ); + newextra[XEN_EXTRA_VERSION_SZ] = '\0'; + ctx->xen_ver.extra = newextra; + } + + return kdump_ok; } /* These fields in kdump_ctx must be initialised: @@ -127,14 +206,19 @@ * endian * ptr_size */ -static void +static kdump_status process_xen_note(kdump_ctx *ctx, uint32_t type, void *desc, size_t descsz) { + kdump_status ret = kdump_ok; + if (type == XEN_ELFNOTE_CRASH_INFO) - process_xen_crash_info(ctx, desc, descsz); + ret = process_xen_crash_info(ctx, desc, descsz); + else if (type == XEN_ELFNOTE_DUMPCORE_XEN_VERSION) + process_xen_dumpcore_version(ctx, desc, descsz); ctx->flags |= DIF_XEN; + return ret; } /* These fields in kdump_ctx must be initialised: @@ -228,7 +312,7 @@ if (note_equal("CORE", name, namesz)) return process_core_note(ctx, type, desc, descsz); else if (note_equal("Xen", name, namesz)) - process_xen_note(ctx, type, desc, descsz); + return process_xen_note(ctx, type, desc, descsz); else if (note_equal(".note.Xen", name, namesz)) return process_xc_xen_note(ctx, type, desc, descsz); @@ -247,6 +331,8 @@ return do_arch_note(ctx, type, name, namesz, desc, descsz); } +#define roundup_size(sz) (((size_t)(sz)+3) & ~(size_t)3) + static kdump_status do_notes(kdump_ctx *ctx, void *data, size_t size, do_note_fn *do_note) { @@ -258,15 +344,19 @@ Elf32_Word namesz = dump32toh(ctx, hdr->n_namesz); Elf32_Word descsz = dump32toh(ctx, hdr->n_descsz); Elf32_Word type = dump32toh(ctx, hdr->n_type); - size_t descoff = sizeof(Elf32_Nhdr) + ((namesz + 3) & ~3); + size_t descoff = sizeof(Elf32_Nhdr) + roundup_size(namesz); - if (size < descoff + ((descsz + 3) & ~3)) + if (size < descoff + descsz) break; - size -= descoff + ((descsz + 3) & ~3); name = (char*) (hdr + 1); desc = (char*)hdr + descoff; - hdr = (Elf32_Nhdr*) (desc + ((descsz + 3) & ~3)); + size -= descoff; + + hdr = (Elf32_Nhdr*) (desc + roundup_size(descsz)); + size = (size >= roundup_size(descsz)) + ? size - roundup_size(descsz) + : 0; ret = do_note(ctx, type, name, namesz, desc, descsz); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/open.c new/libkdumpfile-0.1.5/open.c --- old/libkdumpfile-0.1.4/open.c 2014-12-03 18:05:49.000000000 +0100 +++ new/libkdumpfile-0.1.5/open.c 2015-11-24 21:20:11.000000000 +0100 @@ -63,6 +63,7 @@ return NULL; ctx->last_pfn = -(kdump_paddr_t)1; + ctx->cb_get_symbol_val = kdump_vmcoreinfo_symbol; return ctx; } @@ -157,7 +158,7 @@ size_t rd; kdump_status ret; - ret = kdump_vmcoreinfo_symbol(ctx, "init_uts_ns", &init_uts_ns); + ret = get_symbol_val(ctx, "init_uts_ns", &init_uts_ns); if (ret != kdump_ok) return ret; @@ -184,7 +185,7 @@ size_t rd; kdump_status ret; - ret = kdump_vmcoreinfo_symbol(ctx, "system_utsname", &uts_name); + ret = get_symbol_val(ctx, "system_utsname", &uts_name); if (ret == kdump_nodata) { clear_error(ctx); ret = uts_name_from_init_uts_ns(ctx, &uts_name); @@ -261,5 +262,7 @@ free(ctx->vmcoreinfo); if (ctx->vmcoreinfo_xen) free(ctx->vmcoreinfo_xen); + if (ctx->xen_ver.extra) + free((void*)ctx->xen_ver.extra); free(ctx); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/s390x.c new/libkdumpfile-0.1.5/s390x.c --- old/libkdumpfile-0.1.4/s390x.c 2014-12-04 12:59:26.000000000 +0100 +++ new/libkdumpfile-0.1.5/s390x.c 2015-03-26 18:27:30.000000000 +0100 @@ -274,7 +274,7 @@ return ret; } - ret = kdump_vmcoreinfo_symbol(ctx, "high_memory", &addr); + ret = get_symbol_val(ctx, "high_memory", &addr); if (ret == kdump_ok) { uint64_t highmem; size_t sz = sizeof(highmem); @@ -466,7 +466,7 @@ process_lowcore_info(ctx); clear_error(ctx); - ret = kdump_vmcoreinfo_symbol(ctx, "swapper_pg_dir", &pgtaddr); + ret = get_symbol_val(ctx, "swapper_pg_dir", &pgtaddr); if (ret == kdump_ok) { ret = read_pgt(ctx, pgtaddr); if (ret != kdump_ok) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/util.c new/libkdumpfile-0.1.5/util.c --- old/libkdumpfile-0.1.4/util.c 2014-12-04 11:05:52.000000000 +0100 +++ new/libkdumpfile-0.1.5/util.c 2015-07-23 11:50:56.000000000 +0200 @@ -103,13 +103,13 @@ case ARCH_ALPHA: case ARCH_IA64: case ARCH_PPC64: - case ARCH_PPC64LE: case ARCH_S390X: case ARCH_X86_64: return 8; /* 64 bits */ case ARCH_ARM: case ARCH_PPC: + case ARCH_MIPS: case ARCH_S390: case ARCH_X86: default: @@ -125,12 +125,13 @@ return ARCH_ALPHA; else if (!strcmp(machine, "ia64")) return ARCH_IA64; + else if (!strcmp(machine, "mips")) + return ARCH_MIPS; else if (!strcmp(machine, "ppc")) return ARCH_PPC; - else if (!strcmp(machine, "ppc64")) + else if (!strcmp(machine, "ppc64") || + !strcmp(machine, "ppc64le")) return ARCH_PPC64; - else if (!strcmp(machine, "ppc64le")) - return ARCH_PPC64LE; else if (!strcmp(machine, "s390")) return ARCH_S390; else if (!strcmp(machine, "s390x")) @@ -158,9 +159,9 @@ [ARCH_ALPHA]= 13, [ARCH_ARM] = 12, [ARCH_IA64] = 0, + [ARCH_MIPS] = 12, [ARCH_PPC] = 0, [ARCH_PPC64] = 0, - [ARCH_PPC64LE] = 0, [ARCH_S390] = 12, [ARCH_S390X] = 12, [ARCH_X86] = 12, @@ -180,9 +181,9 @@ case ARCH_ALPHA: case ARCH_ARM: case ARCH_IA64: + case ARCH_MIPS: case ARCH_PPC: case ARCH_PPC64: - case ARCH_PPC64LE: case ARCH_S390: /* TODO */ break; @@ -446,3 +447,10 @@ return csum; } + +kdump_status +get_symbol_val(kdump_ctx *ctx, const char *name, kdump_addr_t *val) +{ + kdump_status ret = ctx->cb_get_symbol_val(ctx, name, val); + return set_error(ctx, ret, "Cannot resolve \"%s\"", name); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/vtop.c new/libkdumpfile-0.1.5/vtop.c --- old/libkdumpfile-0.1.4/vtop.c 2014-11-28 16:31:26.000000000 +0100 +++ new/libkdumpfile-0.1.5/vtop.c 2015-03-30 11:02:05.000000000 +0200 @@ -182,7 +182,6 @@ "VTOP translation not initialized"); return ctx->arch_ops->vtop(ctx, vaddr, paddr); - /* fall through */ case KDUMP_XLAT_DIRECT: *paddr = vaddr - phys_off; return kdump_ok; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libkdumpfile-0.1.4/x86_64.c new/libkdumpfile-0.1.5/x86_64.c --- old/libkdumpfile-0.1.4/x86_64.c 2014-11-28 17:17:33.000000000 +0100 +++ new/libkdumpfile-0.1.5/x86_64.c 2015-10-05 11:41:51.000000000 +0200 @@ -296,7 +296,7 @@ kdump_status ret; size_t sz; - ret = kdump_vmcoreinfo_symbol(ctx, "init_level4_pgt", &pgtaddr); + ret = get_symbol_val(ctx, "init_level4_pgt", &pgtaddr); if (ret != kdump_ok) return ret; @@ -446,6 +446,8 @@ "Out-of-bounds register number: %u (max %u)", index, ELF_NGREG); + cpu = ctx->num_cpus - cpu - 1; + for (i = 0, cs = archdata->cpu_state; i < cpu && cs; ++i) cs = cs->next; if (!cs) @@ -488,7 +490,8 @@ } static kdump_status -x86_64_vtop(kdump_ctx *ctx, kdump_vaddr_t vaddr, kdump_paddr_t *paddr) +x86_64_pt_walk(kdump_ctx *ctx, kdump_vaddr_t vaddr, kdump_paddr_t *paddr, + int rdflags) { struct x86_64_data *archdata = ctx->archdata; uint64_t tbl[PTRS_PER_PAGE]; @@ -511,7 +514,7 @@ base = pgd & ~PHYSADDR_MASK & PAGE_MASK; sz = PAGE_SIZE; - ret = kdump_readp(ctx, base, tbl, &sz, KDUMP_PHYSADDR); + ret = kdump_readp(ctx, base, tbl, &sz, rdflags); if (ret != kdump_ok) return ret; @@ -530,7 +533,7 @@ base = pud & ~PHYSADDR_MASK & PAGE_MASK; sz = PAGE_SIZE; - ret = kdump_readp(ctx, base, tbl, &sz, KDUMP_PHYSADDR); + ret = kdump_readp(ctx, base, tbl, &sz, rdflags); if (ret != kdump_ok) return ret; @@ -548,7 +551,7 @@ base = pmd & ~PHYSADDR_MASK & PAGE_MASK; sz = PAGE_SIZE; - ret = kdump_readp(ctx, base, tbl, &sz, KDUMP_PHYSADDR); + ret = kdump_readp(ctx, base, tbl, &sz, rdflags); if (ret != kdump_ok) return ret; @@ -564,6 +567,38 @@ return kdump_ok; } +static kdump_status +x86_64_vtop(kdump_ctx *ctx, kdump_vaddr_t vaddr, kdump_paddr_t *paddr) +{ + kdump_status ret; + + if (ctx->flags & DIF_XEN && ctx->xen_pte_is_mach) { + kdump_addr_t maddr; + kdump_pfn_t mfn, pfn; + + if (!ctx->ops->mfn_to_pfn) + return set_error(ctx, kdump_nodata, + "No MFN-to-PFN translation method"); + + ret = x86_64_pt_walk(ctx, vaddr, &maddr, KDUMP_XENMACHADDR); + if (ret != kdump_ok) + return ret; + + mfn = maddr >> ctx->page_shift; + ret = ctx->ops->mfn_to_pfn(ctx, mfn, &pfn); + if (ret != kdump_ok) + return set_error(ctx, ret, + "Cannot translate MFN 0x%llx", + (unsigned long long) mfn); + + *paddr = (pfn << ctx->page_shift) | + (maddr & (ctx->page_size - 1)); + return kdump_ok; + } + + return x86_64_pt_walk(ctx, vaddr, paddr, KDUMP_PHYSADDR); +} + const struct arch_ops x86_64_ops = { .init = x86_64_init, .vtop_init = x86_64_vtop_init, ++++++ libkdumpfile-fallback-for-old-zlib.patch ++++++ From: Petr Tesarik <[email protected]> Subject: Fall back to AC_SEARCH_LIBS if there is no pkg-config file for zlib Patch-mainline: never, support of legacy products only Old version of zlib (before 1.2.7?) did not install a pkg-config file. As a result, support for zlib compression is missing from SLE11 SP2 and older. This is suboptimal, since most dump files for those products acutally use that compression algorithm. Signed-off-by: Petr Tesarik <[email protected]> --- configure | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- configure.ac | 2 2 files changed, 165 insertions(+), 3 deletions(-) --- a/configure.ac +++ b/configure.ac @@ -41,7 +41,7 @@ m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** PKG_CHECK_MODULES(ZLIB, zlib, [ REQUIRES_PRIVATE="zlib $REQUIRES_PRIVATE" AC_DEFINE(USE_ZLIB, 1, [Define to enable support for zlib compression]) - ],[# ignore if missing]) + ],[kdump_COMPRESSION(zlib, ZLIB, z, uncompress)]) AS_VAR_APPEND([CFLAGS], " $ZLIB_CFLAGS") AS_VAR_APPEND([LIBS], " $ZLIB_LIBS") --- a/configure +++ b/configure @@ -767,6 +767,7 @@ enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock +with_zlib with_lzo with_snappy ' @@ -1422,6 +1423,7 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). + --with-zlib support for zlib compression [default=check] --with-lzo support for lzo compression [default=check] --with-snappy support for snappy compression [default=check] @@ -11621,11 +11623,171 @@ fi # Put the nasty error message in config.log where it belongs echo "$ZLIB_PKG_ERRORS" >&5 - # ignore if missing + +# Check whether --with-zlib was given. +if test "${with_zlib+set}" = set; then : + withval=$with_zlib; +else + with_zlib=check +fi + +if test "x$with_zlib" != xno; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing uncompress" >&5 +$as_echo_n "checking for library containing uncompress... " >&6; } +if ${ac_cv_search_uncompress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char uncompress (); +int +main () +{ +return uncompress (); + ; + return 0; +} +_ACEOF +for ac_lib in '' z; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_uncompress=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_uncompress+:} false; then : + break +fi +done +if ${ac_cv_search_uncompress+:} false; then : + +else + ac_cv_search_uncompress=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_uncompress" >&5 +$as_echo "$ac_cv_search_uncompress" >&6; } +ac_res=$ac_cv_search_uncompress +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +$as_echo "#define USE_ZLIB 1" >>confdefs.h + + as_fn_append LIBS_PRIVATE " -lz" + +else + + if test "x$with_zlib" != xcheck; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "--with-zlib was given, but test for zlib failed +See \`config.log' for more details" "$LINENO" 5; } + fi + +fi + + +fi + elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - # ignore if missing + +# Check whether --with-zlib was given. +if test "${with_zlib+set}" = set; then : + withval=$with_zlib; +else + with_zlib=check +fi + +if test "x$with_zlib" != xno; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing uncompress" >&5 +$as_echo_n "checking for library containing uncompress... " >&6; } +if ${ac_cv_search_uncompress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char uncompress (); +int +main () +{ +return uncompress (); + ; + return 0; +} +_ACEOF +for ac_lib in '' z; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_uncompress=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_uncompress+:} false; then : + break +fi +done +if ${ac_cv_search_uncompress+:} false; then : + +else + ac_cv_search_uncompress=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_uncompress" >&5 +$as_echo "$ac_cv_search_uncompress" >&6; } +ac_res=$ac_cv_search_uncompress +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +$as_echo "#define USE_ZLIB 1" >>confdefs.h + + as_fn_append LIBS_PRIVATE " -lz" + +else + + if test "x$with_zlib" != xcheck; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "--with-zlib was given, but test for zlib failed +See \`config.log' for more details" "$LINENO" 5; } + fi + +fi + + +fi + else ZLIB_CFLAGS=$pkg_cv_ZLIB_CFLAGS ZLIB_LIBS=$pkg_cv_ZLIB_LIBS ++++++ libkdumpfile-remove-ARCH_PPC64LE.patch ++++++ From: Petr Tesarik <[email protected]> Subject: Remove last reference to ARCH_PPC64LE Patch-mainline: v0.1.6 Git-commit: 3667f3cad92e6ae9c1ede51ec95e2df2cdbd9f4a Commit 048a00d1e350212164e48c61cd9b94981f8dcd20 merged the ppc64le architecture into ppc64, but this reference was forgotten, so libkdumpfile no longer builds on ppc64le. Signed-off-by: Petr Tesarik <[email protected]> --- devmem.c | 4 ---- 1 file changed, 4 deletions(-) --- a/devmem.c +++ b/devmem.c @@ -132,11 +132,7 @@ devmem_probe(kdump_ctx *ctx) #elif defined(__i386__) ret = set_arch(ctx, ARCH_X86); #elif defined(__powerpc64__) -# if __BYTE_ORDER == __LITTLE_ENDIAN - ret = set_arch(ctx, ARCH_PPC64LE); -# else ret = set_arch(ctx, ARCH_PPC64); -# endif #elif defined(__powerpc__) ret = set_arch(ctx, ARCH_PPC); #elif defined(__s390x__)
