Index: lib/libkvm/kvm_minidump_amd64.c =================================================================== --- lib/libkvm/kvm_minidump_amd64.c +++ lib/libkvm/kvm_minidump_amd64.c @@ -369,13 +369,17 @@ * that every page here uses the same PDE to * generate permissions. */ - pa = (pde & AMD64_PG_PS_FRAME) + - ((va & AMD64_PDRMASK) ^ VA_OFF(vm, va)); - dva = vm->hdr.dmapbase + pa; _kvm_bitmap_set(&bm, pa, AMD64_PAGE_SIZE); - if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, - _amd64_entry_to_prot(pde), AMD64_NBPDR, pgsz)) { - goto out; + for (i = 0; i < AMD64_NBPDR; i += AMD64_PAGE_SIZE){ + pa = (pde & AMD64_PG_PS_FRAME) + + ((va & AMD64_PDRMASK) ^ VA_OFF(vm, va)); + dva = vm->hdr.dmapbase + pa; + + if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, + _amd64_entry_to_prot(pde), AMD64_PAGE_SIZE, pgsz)) { + goto out; + } + va += AMD64_PAGE_SIZE; } continue; } Index: lib/libkvm/kvm_private.c =================================================================== --- lib/libkvm/kvm_private.c +++ lib/libkvm/kvm_private.c @@ -723,7 +723,7 @@ int _kvm_bitmap_next(struct kvm_bitmap *bm, u_long *idx) { - u_long first_invalid = bm->size * CHAR_BIT; + u_long first_invalid = bm->size * 8; if (*idx == ULONG_MAX) *idx = 0; @@ -732,8 +732,8 @@ /* Find the next valid idx. */ for (; *idx < first_invalid; (*idx)++) { - unsigned int mask = *idx % CHAR_BIT; - if ((bm->map[*idx * CHAR_BIT] & mask) == 0) + unsigned int mask = (1UL << (*idx % 8)); + if ((bm->map[*idx / 8] & mask) != 0) break; }