Lines Matching +full:page +full:- +full:offset

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
50 #define VM_IS_V1(vm) (vm->hdr.version == 1)
52 (VM_IS_V1(vm) ? ((va) & (AMD64_PAGE_SIZE - 1)) : ((va) & AMD64_PAGE_MASK))
71 * Version 2 minidumps use page directory entries, while version 1 use page
91 /* Get the first page table entry for a given page directory index. */
114 struct vmstate *vm = kd->vmst; in _amd64_minidump_freevtop()
117 kd->vmst = NULL; in _amd64_minidump_freevtop()
128 _kvm_err(kd, kd->program, "cannot allocate vm"); in _amd64_minidump_initvtop()
129 return (-1); in _amd64_minidump_initvtop()
131 kd->vmst = vmst; in _amd64_minidump_initvtop()
132 if (pread(kd->pmfd, &vmst->hdr, sizeof(vmst->hdr), 0) != in _amd64_minidump_initvtop()
133 sizeof(vmst->hdr)) { in _amd64_minidump_initvtop()
134 _kvm_err(kd, kd->program, "cannot read dump header"); in _amd64_minidump_initvtop()
135 return (-1); in _amd64_minidump_initvtop()
137 if (strncmp(MINIDUMP_MAGIC, vmst->hdr.magic, sizeof(vmst->hdr.magic)) != 0) { in _amd64_minidump_initvtop()
138 _kvm_err(kd, kd->program, "not a minidump for this platform"); in _amd64_minidump_initvtop()
139 return (-1); in _amd64_minidump_initvtop()
146 vmst->hdr.version = le32toh(vmst->hdr.version); in _amd64_minidump_initvtop()
147 if (vmst->hdr.version > MINIDUMP_VERSION || vmst->hdr.version < 1) { in _amd64_minidump_initvtop()
148 _kvm_err(kd, kd->program, "wrong minidump version. expected %d got %d", in _amd64_minidump_initvtop()
149 MINIDUMP_VERSION, vmst->hdr.version); in _amd64_minidump_initvtop()
150 return (-1); in _amd64_minidump_initvtop()
152 vmst->hdr.msgbufsize = le32toh(vmst->hdr.msgbufsize); in _amd64_minidump_initvtop()
153 vmst->hdr.bitmapsize = le32toh(vmst->hdr.bitmapsize); in _amd64_minidump_initvtop()
154 vmst->hdr.pmapsize = le32toh(vmst->hdr.pmapsize); in _amd64_minidump_initvtop()
155 vmst->hdr.kernbase = le64toh(vmst->hdr.kernbase); in _amd64_minidump_initvtop()
156 vmst->hdr.dmapbase = le64toh(vmst->hdr.dmapbase); in _amd64_minidump_initvtop()
157 vmst->hdr.dmapend = le64toh(vmst->hdr.dmapend); in _amd64_minidump_initvtop()
158 vmst->hdr.dumpavailsize = vmst->hdr.version == MINIDUMP_VERSION ? in _amd64_minidump_initvtop()
159 le32toh(vmst->hdr.dumpavailsize) : 0; in _amd64_minidump_initvtop()
162 dump_avail_off = AMD64_PAGE_SIZE + amd64_round_page(vmst->hdr.msgbufsize); in _amd64_minidump_initvtop()
165 off = dump_avail_off + amd64_round_page(vmst->hdr.dumpavailsize); in _amd64_minidump_initvtop()
167 sparse_off = off + amd64_round_page(vmst->hdr.bitmapsize) + in _amd64_minidump_initvtop()
168 amd64_round_page(vmst->hdr.pmapsize); in _amd64_minidump_initvtop()
169 if (_kvm_pt_init(kd, vmst->hdr.dumpavailsize, dump_avail_off, in _amd64_minidump_initvtop()
170 vmst->hdr.bitmapsize, off, sparse_off, AMD64_PAGE_SIZE) == -1) { in _amd64_minidump_initvtop()
171 return (-1); in _amd64_minidump_initvtop()
173 off += amd64_round_page(vmst->hdr.bitmapsize); in _amd64_minidump_initvtop()
175 if (_kvm_pmap_init(kd, vmst->hdr.pmapsize, off) == -1) { in _amd64_minidump_initvtop()
176 return (-1); in _amd64_minidump_initvtop()
178 off += amd64_round_page(vmst->hdr.pmapsize); in _amd64_minidump_initvtop()
187 amd64_physaddr_t offset; in _amd64_minidump_vatop_v1() local
193 vm = kd->vmst; in _amd64_minidump_vatop_v1()
194 offset = va & AMD64_PAGE_MASK; in _amd64_minidump_vatop_v1()
196 if (va >= vm->hdr.kernbase) { in _amd64_minidump_vatop_v1()
197 pteindex = (va - vm->hdr.kernbase) >> AMD64_PAGE_SHIFT; in _amd64_minidump_vatop_v1()
198 if (pteindex >= vm->hdr.pmapsize / sizeof(pte)) in _amd64_minidump_vatop_v1()
202 _kvm_err(kd, kd->program, in _amd64_minidump_vatop_v1()
208 if (ofs == -1) { in _amd64_minidump_vatop_v1()
209 _kvm_err(kd, kd->program, in _amd64_minidump_vatop_v1()
214 *pa = ofs + offset; in _amd64_minidump_vatop_v1()
215 return (AMD64_PAGE_SIZE - offset); in _amd64_minidump_vatop_v1()
216 } else if (va >= vm->hdr.dmapbase && va < vm->hdr.dmapend) { in _amd64_minidump_vatop_v1()
217 a = (va - vm->hdr.dmapbase) & ~AMD64_PAGE_MASK; in _amd64_minidump_vatop_v1()
219 if (ofs == -1) { in _amd64_minidump_vatop_v1()
220 _kvm_err(kd, kd->program, in _amd64_minidump_vatop_v1()
225 *pa = ofs + offset; in _amd64_minidump_vatop_v1()
226 return (AMD64_PAGE_SIZE - offset); in _amd64_minidump_vatop_v1()
228 _kvm_err(kd, kd->program, in _amd64_minidump_vatop_v1()
244 amd64_physaddr_t offset; in _amd64_minidump_vatop() local
252 vm = kd->vmst; in _amd64_minidump_vatop()
253 offset = va & AMD64_PAGE_MASK; in _amd64_minidump_vatop()
255 if (va >= vm->hdr.kernbase) { in _amd64_minidump_vatop()
256 pdeindex = (va - vm->hdr.kernbase) >> AMD64_PDRSHIFT; in _amd64_minidump_vatop()
257 if (pdeindex >= vm->hdr.pmapsize / sizeof(pde)) in _amd64_minidump_vatop()
261 _kvm_err(kd, kd->program, in _amd64_minidump_vatop()
269 if (ofs == -1) { in _amd64_minidump_vatop()
270 _kvm_err(kd, kd->program, in _amd64_minidump_vatop()
271 "cannot find page table entry for %ju", in _amd64_minidump_vatop()
275 if (pread(kd->pmfd, &pt, AMD64_PAGE_SIZE, ofs) != in _amd64_minidump_vatop()
277 _kvm_err(kd, kd->program, in _amd64_minidump_vatop()
278 "cannot read page table entry for %ju", in _amd64_minidump_vatop()
283 (AMD64_NPTEPG - 1); in _amd64_minidump_vatop()
286 _kvm_err(kd, kd->program, in _amd64_minidump_vatop()
293 a += (va & AMD64_PDRMASK) ^ offset; in _amd64_minidump_vatop()
296 if (ofs == -1) { in _amd64_minidump_vatop()
297 _kvm_err(kd, kd->program, in _amd64_minidump_vatop()
302 *pa = ofs + offset; in _amd64_minidump_vatop()
303 return (AMD64_PAGE_SIZE - offset); in _amd64_minidump_vatop()
304 } else if (va >= vm->hdr.dmapbase && va < vm->hdr.dmapend) { in _amd64_minidump_vatop()
305 a = (va - vm->hdr.dmapbase) & ~AMD64_PAGE_MASK; in _amd64_minidump_vatop()
307 if (ofs == -1) { in _amd64_minidump_vatop()
308 _kvm_err(kd, kd->program, in _amd64_minidump_vatop()
313 *pa = ofs + offset; in _amd64_minidump_vatop()
314 return (AMD64_PAGE_SIZE - offset); in _amd64_minidump_vatop()
316 _kvm_err(kd, kd->program, in _amd64_minidump_vatop()
336 if (((struct vmstate *)kd->vmst)->hdr.version == 1) in _amd64_minidump_kvatop()
345 struct vmstate *vm = kd->vmst; in _amd64_minidump_walk_pages()
346 u_long npdes = vm->hdr.pmapsize / sizeof(amd64_pde_t); in _amd64_minidump_walk_pages()
353 if (vm->hdr.version < 2) in _amd64_minidump_walk_pages()
356 if (!_kvm_bitmap_init(&bm, vm->hdr.bitmapsize, &bmindex)) in _amd64_minidump_walk_pages()
364 va = vm->hdr.kernbase + (pdeindex << AMD64_PDRSHIFT); in _amd64_minidump_walk_pages()
370 * Large page. Iterate on each 4K page section in _amd64_minidump_walk_pages()
371 * within this page. This differs from 4K pages in in _amd64_minidump_walk_pages()
372 * that every page here uses the same PDE to in _amd64_minidump_walk_pages()
377 dva = vm->hdr.dmapbase + pa; in _amd64_minidump_walk_pages()
386 /* 4K pages: pde references another page of entries. */ in _amd64_minidump_walk_pages()
388 /* Ignore page directory pages that were not dumped. */ in _amd64_minidump_walk_pages()
396 dva = vm->hdr.dmapbase + pa; in _amd64_minidump_walk_pages()
413 dva = vm->hdr.dmapbase + pa; in _amd64_minidump_walk_pages()
414 if (vm->hdr.dmapend < (dva + pgsz)) in _amd64_minidump_walk_pages()