Index: lib/libkvm/kvm.c =================================================================== --- lib/libkvm/kvm.c +++ lib/libkvm/kvm.c @@ -500,5 +500,5 @@ if (kd->arch->ka_walk_pages == NULL) return (0); - return kd->arch->ka_walk_pages(kd, cb, closure); + return (kd->arch->ka_walk_pages(kd, cb, closure)); } Index: lib/libkvm/kvm_aarch64.h =================================================================== --- lib/libkvm/kvm_aarch64.h +++ lib/libkvm/kvm_aarch64.h @@ -44,8 +44,8 @@ #define AARCH64_ATTR_MASK 0xfff0000000000fff #define AARCH64_ATTR_UXN (1UL << 54) #define AARCH64_ATTR_PXN (1UL << 53) -#define AARCH64_ATTR_XN (AARCH64_ATTR_PXN | AARCH64_ATTR_UXN) -#define AARCH64_ATTR_AP(x) ((x) << 6) +#define AARCH64_ATTR_XN (AARCH64_ATTR_PXN | AARCH64_ATTR_UXN) +#define AARCH64_ATTR_AP(x) ((x) << 6) #define AARCH64_ATTR_AP_RO (1 << 1) #define AARCH64_ATTR_DESCR_MASK 3 Index: lib/libkvm/kvm_arm.h =================================================================== --- lib/libkvm/kvm_arm.h +++ lib/libkvm/kvm_arm.h @@ -53,7 +53,7 @@ #define ARM_L2_S_OFFSET (ARM_L2_S_SIZE - 1) #define ARM_L2_S_FRAME (~ARM_L2_S_OFFSET) #define ARM_L2_S_SHIFT 12 -#define ARM_L2_TEX1 0x00000080 +#define ARM_L2_TEX1 0x00000080 #define ARM_PTE2_RO ARM_L2_TEX1 #define ARM_L2_NX 0x00000001 #define ARM_PTE2_NX ARM_L2_NX Index: lib/libkvm/kvm_minidump_aarch64.c =================================================================== --- lib/libkvm/kvm_minidump_aarch64.c +++ lib/libkvm/kvm_minidump_aarch64.c @@ -122,13 +122,11 @@ aarch64_round_page(vmst->hdr.pmapsize); if (_kvm_pt_init(kd, vmst->hdr.bitmapsize, off, sparse_off, AARCH64_PAGE_SIZE, sizeof(uint64_t)) == -1) { - _kvm_err(kd, kd->program, "cannot load core bitmap"); return (-1); } off += aarch64_round_page(vmst->hdr.bitmapsize); if (_kvm_pmap_init(kd, vmst->hdr.pmapsize, off) == -1) { - _kvm_err(kd, kd->program, "cannot load page map"); return (-1); } off += aarch64_round_page(vmst->hdr.pmapsize); Index: lib/libkvm/kvm_minidump_amd64.c =================================================================== --- lib/libkvm/kvm_minidump_amd64.c +++ lib/libkvm/kvm_minidump_amd64.c @@ -66,6 +66,11 @@ return prot; } +/* + * Version 2 minidumps use page directory entries, while version 1 use page + * table entries. + */ + static amd64_pde_t _amd64_pde_get(kvm_t *kd, u_long pdeindex) { @@ -157,13 +162,11 @@ amd64_round_page(vmst->hdr.pmapsize); if (_kvm_pt_init(kd, vmst->hdr.bitmapsize, off, sparse_off, AMD64_PAGE_SIZE, sizeof(uint64_t)) == -1) { - _kvm_err(kd, kd->program, "cannot load core bitmap"); return (-1); } off += amd64_round_page(vmst->hdr.bitmapsize); if (_kvm_pmap_init(kd, vmst->hdr.pmapsize, off) == -1) { - _kvm_err(kd, kd->program, "cannot load page map"); return (-1); } off += amd64_round_page(vmst->hdr.pmapsize); Index: lib/libkvm/kvm_minidump_arm.c =================================================================== --- lib/libkvm/kvm_minidump_arm.c +++ lib/libkvm/kvm_minidump_arm.c @@ -128,13 +128,11 @@ arm_round_page(vmst->hdr.ptesize); if (_kvm_pt_init(kd, vmst->hdr.bitmapsize, off, sparse_off, ARM_PAGE_SIZE, sizeof(uint32_t)) == -1) { - _kvm_err(kd, kd->program, "cannot load core bitmap"); return (-1); } off += arm_round_page(vmst->hdr.bitmapsize); if (_kvm_pmap_init(kd, vmst->hdr.ptesize, off) == -1) { - _kvm_err(kd, kd->program, "cannot load page map"); return (-1); } off += arm_round_page(vmst->hdr.ptesize); Index: lib/libkvm/kvm_minidump_i386.c =================================================================== --- lib/libkvm/kvm_minidump_i386.c +++ lib/libkvm/kvm_minidump_i386.c @@ -124,13 +124,11 @@ i386_round_page(vmst->hdr.ptesize); if (_kvm_pt_init(kd, vmst->hdr.bitmapsize, off, sparse_off, I386_PAGE_SIZE, sizeof(uint32_t)) == -1) { - _kvm_err(kd, kd->program, "cannot load core bitmap"); return (-1); } off += i386_round_page(vmst->hdr.bitmapsize); if (_kvm_pmap_init(kd, vmst->hdr.ptesize, off) == -1) { - _kvm_err(kd, kd->program, "cannot load page map"); return (-1); } off += i386_round_page(vmst->hdr.ptesize); Index: lib/libkvm/kvm_minidump_mips.c =================================================================== --- lib/libkvm/kvm_minidump_mips.c +++ lib/libkvm/kvm_minidump_mips.c @@ -127,13 +127,11 @@ mips_round_page(vmst->hdr.ptesize); if (_kvm_pt_init(kd, vmst->hdr.bitmapsize, off, sparse_off, MIPS_PAGE_SIZE, sizeof(uint32_t)) == -1) { - _kvm_err(kd, kd->program, "cannot load core bitmap"); return (-1); } off += mips_round_page(vmst->hdr.bitmapsize); if (_kvm_pmap_init(kd, vmst->hdr.ptesize, off) == -1) { - _kvm_err(kd, kd->program, "cannot load page map"); return (-1); } off += mips_round_page(vmst->hdr.ptesize); Index: lib/libkvm/kvm_private.c =================================================================== --- lib/libkvm/kvm_private.c +++ lib/libkvm/kvm_private.c @@ -328,8 +328,10 @@ res = map_len; pc_bins = 1 + (res * NBBY + POPCOUNT_BITS / 2) / POPCOUNT_BITS; kd->pt_popcounts = calloc(pc_bins, sizeof(uint32_t)); - if (kd->pt_popcounts == NULL) + if (kd->pt_popcounts == NULL) { + _kvm_err(kd, kd->program, "cannot allocate popcount bins"); return (-1); + } for (popcount_bin = &kd->pt_popcounts[1]; res > 0; addr++, res -= sizeof(*addr)) { @@ -356,12 +358,13 @@ * this is much larger than is reasonable to read in up front, so * mmap it in instead. */ - kd->sparse_map = mmap(NULL, kd->pt_sparse_size, PROT_READ, 0, - kd->pmfd, kd->pt_sparse_off); + kd->sparse_map = mmap(NULL, kd->pt_sparse_size, PROT_READ, + MAP_PRIVATE, kd->pmfd, kd->pt_sparse_off); if (kd->sparse_map == MAP_FAILED) { _kvm_err(kd, kd->program, "cannot map %" PRIu64 - " bytes from offset %ld for sparse map", - kd->pt_sparse_size, kd->pt_sparse_off); + " bytes from fd %d offset %ld for sparse map: %s", + kd->pt_sparse_size, kd->pmfd, + kd->pt_sparse_off, strerror(errno)); return (-1); } return (0);