Changeset View
Changeset View
Standalone View
Standalone View
lib/libkvm/kvm_minidump_amd64.c
Show First 20 Lines • Show All 157 Lines • ▼ Show 20 Lines | _amd64_minidump_initvtop(kvm_t *kd) | ||||
vmst->hdr.dmapbase = le64toh(vmst->hdr.dmapbase); | vmst->hdr.dmapbase = le64toh(vmst->hdr.dmapbase); | ||||
vmst->hdr.dmapend = le64toh(vmst->hdr.dmapend); | vmst->hdr.dmapend = le64toh(vmst->hdr.dmapend); | ||||
/* Skip header and msgbuf */ | /* Skip header and msgbuf */ | ||||
off = AMD64_PAGE_SIZE + amd64_round_page(vmst->hdr.msgbufsize); | off = AMD64_PAGE_SIZE + amd64_round_page(vmst->hdr.msgbufsize); | ||||
sparse_off = off + amd64_round_page(vmst->hdr.bitmapsize) + | sparse_off = off + amd64_round_page(vmst->hdr.bitmapsize) + | ||||
amd64_round_page(vmst->hdr.pmapsize); | amd64_round_page(vmst->hdr.pmapsize); | ||||
if (_kvm_pt_init(kd, vmst->hdr.bitmapsize, off, sparse_off, | if (_kvm_pt_init(kd, sizeof(vmst->hdr), vmst->hdr.bitmapsize, off, | ||||
AMD64_PAGE_SIZE, sizeof(uint64_t)) == -1) { | sparse_off, AMD64_PAGE_SIZE, sizeof(uint64_t)) == -1) { | ||||
return (-1); | return (-1); | ||||
} | } | ||||
off += amd64_round_page(vmst->hdr.bitmapsize); | off += amd64_round_page(vmst->hdr.bitmapsize); | ||||
if (_kvm_pmap_init(kd, vmst->hdr.pmapsize, off) == -1) { | if (_kvm_pmap_init(kd, vmst->hdr.pmapsize, off) == -1) { | ||||
return (-1); | return (-1); | ||||
} | } | ||||
off += amd64_round_page(vmst->hdr.pmapsize); | off += amd64_round_page(vmst->hdr.pmapsize); | ||||
▲ Show 20 Lines • Show All 191 Lines • ▼ Show 20 Lines | if ((pde & AMD64_PG_PS) != 0) { | ||||
* Large page. Iterate on each 4K page section | * Large page. Iterate on each 4K page section | ||||
* within this page. This differs from 4K pages in | * within this page. This differs from 4K pages in | ||||
* that every page here uses the same PDE to | * that every page here uses the same PDE to | ||||
* generate permissions. | * generate permissions. | ||||
*/ | */ | ||||
pa = (pde & AMD64_PG_PS_FRAME) + | pa = (pde & AMD64_PG_PS_FRAME) + | ||||
((va & AMD64_PDRMASK) ^ VA_OFF(vm, va)); | ((va & AMD64_PDRMASK) ^ VA_OFF(vm, va)); | ||||
dva = vm->hdr.dmapbase + pa; | dva = vm->hdr.dmapbase + pa; | ||||
_kvm_bitmap_set(&bm, pa, AMD64_PAGE_SIZE); | _kvm_bitmap_set(&bm, _kvm_pa_bit_id(kd, pa, AMD64_PAGE_SIZE)); | ||||
if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, | if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, | ||||
_amd64_entry_to_prot(pde), AMD64_NBPDR, pgsz)) { | _amd64_entry_to_prot(pde), AMD64_NBPDR, pgsz)) { | ||||
goto out; | goto out; | ||||
} | } | ||||
continue; | continue; | ||||
} | } | ||||
/* 4K pages: pde references another page of entries. */ | /* 4K pages: pde references another page of entries. */ | ||||
ptes = _amd64_pde_first_pte(kd, pdeindex); | ptes = _amd64_pde_first_pte(kd, pdeindex); | ||||
/* Ignore page directory pages that were not dumped. */ | /* Ignore page directory pages that were not dumped. */ | ||||
if (ptes == NULL) | if (ptes == NULL) | ||||
continue; | continue; | ||||
for (i = 0; i < AMD64_NPTEPG; i++) { | for (i = 0; i < AMD64_NPTEPG; i++) { | ||||
amd64_pte_t pte = (u_long)ptes[i]; | amd64_pte_t pte = (u_long)ptes[i]; | ||||
pa = pte & AMD64_PG_FRAME; | pa = pte & AMD64_PG_FRAME; | ||||
dva = vm->hdr.dmapbase + pa; | dva = vm->hdr.dmapbase + pa; | ||||
if ((pte & AMD64_PG_V) != 0) { | if ((pte & AMD64_PG_V) != 0) { | ||||
_kvm_bitmap_set(&bm, pa, AMD64_PAGE_SIZE); | _kvm_bitmap_set(&bm, | ||||
_kvm_pa_bit_id(kd, pa, AMD64_PAGE_SIZE)); | |||||
if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, | if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, | ||||
_amd64_entry_to_prot(pte), pgsz, 0)) { | _amd64_entry_to_prot(pte), pgsz, 0)) { | ||||
goto out; | goto out; | ||||
} | } | ||||
} | } | ||||
va += AMD64_PAGE_SIZE; | va += AMD64_PAGE_SIZE; | ||||
} | } | ||||
} | } | ||||
while (_kvm_bitmap_next(&bm, &bmindex)) { | while (_kvm_bitmap_next(&bm, &bmindex)) { | ||||
pa = bmindex * AMD64_PAGE_SIZE; | pa = _kvm_bit_id_pa(kd, bmindex, AMD64_PAGE_SIZE); | ||||
dva = vm->hdr.dmapbase + pa; | dva = vm->hdr.dmapbase + pa; | ||||
if (vm->hdr.dmapend < (dva + pgsz)) | if (vm->hdr.dmapend < (dva + pgsz)) | ||||
break; | break; | ||||
va = 0; | va = 0; | ||||
/* amd64/pmap.c: create_pagetables(): dmap always R|W. */ | /* amd64/pmap.c: create_pagetables(): dmap always R|W. */ | ||||
prot = VM_PROT_READ | VM_PROT_WRITE; | prot = VM_PROT_READ | VM_PROT_WRITE; | ||||
if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, prot, pgsz, 0)) { | if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, prot, pgsz, 0)) { | ||||
goto out; | goto out; | ||||
Show All 20 Lines |