Lines Matching refs:kd
68 static int kvm_nlist_core(kvm_t *kd, struct nlist nl[], const char *err);
71 fail(kvm_t *kd, const char *err, const char *message, ...) in fail() argument
76 if (err || (kd && kd->kvm_debug)) { in fail()
82 if (kd != NULL) in fail()
83 (void) kvm_close(kd); in fail()
92 kvm_t *kd; in kvm_open() local
96 if ((kd = calloc(1, sizeof (kvm_t))) == NULL) in kvm_open()
99 kd->kvm_corefd = kd->kvm_kmemfd = kd->kvm_memfd = -1; in kvm_open()
100 kd->kvm_debug = getenv("KVM_DEBUG"); in kvm_open()
102 if ((kd->kvm_openflag = flag) != O_RDONLY && flag != O_RDWR) in kvm_open()
103 return (fail(kd, err, "illegal flag 0x%x to kvm_open()", flag)); in kvm_open()
109 return (fail(kd, err, "cannot stat %s", corefile)); in kvm_open()
113 return (fail(kd, err, "cannot stat /dev/mem")); in kvm_open()
116 return (fail(kd, err, "cannot stat /dev/kmem")); in kvm_open()
119 return (fail(kd, err, "cannot stat /dev/allkmem")); in kvm_open()
126 if ((kd->kvm_kmemfd = open64(kmem, flag)) == -1) in kvm_open()
127 return (fail(kd, err, "cannot open %s", kmem)); in kvm_open()
128 if ((kd->kvm_memfd = open64("/dev/mem", flag)) == -1) in kvm_open()
129 return (fail(kd, err, "cannot open /dev/mem")); in kvm_open()
132 if ((kd->kvm_corefd = open64(corefile, flag)) == -1) in kvm_open()
133 return (fail(kd, err, "cannot open %s", corefile)); in kvm_open()
134 if (pread64(kd->kvm_corefd, &kd->kvm_dump, in kvm_open()
135 sizeof (kd->kvm_dump), 0) != sizeof (kd->kvm_dump)) in kvm_open()
136 return (fail(kd, err, "cannot read dump header")); in kvm_open()
137 if (kd->kvm_dump.dump_magic != DUMP_MAGIC) in kvm_open()
138 return (fail(kd, err, "%s is not a kernel core file " in kvm_open()
140 kd->kvm_dump.dump_magic)); in kvm_open()
141 if (kd->kvm_dump.dump_version != DUMP_VERSION) in kvm_open()
142 return (fail(kd, err, in kvm_open()
144 DUMP_VERSION, kd->kvm_dump.dump_version)); in kvm_open()
145 if (kd->kvm_dump.dump_wordsize != DUMP_WORDSIZE) in kvm_open()
146 return (fail(kd, err, "%s is a %d-bit core file - " in kvm_open()
148 kd->kvm_dump.dump_wordsize, DUMP_WORDSIZE)); in kvm_open()
154 kd->kvm_coremapsize = (size_t)corestat.st_size; in kvm_open()
156 (kd->kvm_core = mmap64(0, kd->kvm_coremapsize, in kvm_open()
157 PROT_READ, MAP_SHARED, kd->kvm_corefd, 0)) == MAP_FAILED) { in kvm_open()
158 kd->kvm_coremapsize = kd->kvm_dump.dump_data; in kvm_open()
159 if ((kd->kvm_core = mmap64(0, kd->kvm_coremapsize, in kvm_open()
160 PROT_READ, MAP_SHARED, kd->kvm_corefd, 0)) == in kvm_open()
162 return (fail(kd, err, "cannot mmap corefile")); in kvm_open()
164 kd->kvm_map = (void *)(kd->kvm_core + kd->kvm_dump.dump_map); in kvm_open()
165 kd->kvm_pfn = (void *)(kd->kvm_core + kd->kvm_dump.dump_pfn); in kvm_open()
171 (void) strncpy(kd->kvm_namelist, namelist, MAXNAMELEN); in kvm_open()
173 if (kvm_nlist(kd, nl) == -1) { in kvm_open()
174 if (kd->kvm_corefd == -1) { in kvm_open()
175 return (fail(kd, err, "%s is not a %d-bit " in kvm_open()
179 if (kvm_nlist_core(kd, nl, err) == -1) in kvm_open()
183 kd->kvm_kas = (struct as *)nl[0].n_value; in kvm_open()
184 kd->kvm_practive = (proc_t *)nl[1].n_value; in kvm_open()
186 (void) kvm_setproc(kd); in kvm_open()
187 return (kd); in kvm_open()
191 kvm_close(kvm_t *kd) in kvm_close() argument
193 if (kd->kvm_core != NULL && kd->kvm_core != MAP_FAILED) in kvm_close()
194 (void) munmap(kd->kvm_core, kd->kvm_coremapsize); in kvm_close()
195 if (kd->kvm_corefd != -1) in kvm_close()
196 (void) close(kd->kvm_corefd); in kvm_close()
197 if (kd->kvm_kmemfd != -1) in kvm_close()
198 (void) close(kd->kvm_kmemfd); in kvm_close()
199 if (kd->kvm_memfd != -1) in kvm_close()
200 (void) close(kd->kvm_memfd); in kvm_close()
201 if (kd->kvm_namelist_core) in kvm_close()
202 (void) unlink(kd->kvm_namelist); in kvm_close()
203 free(kd); in kvm_close()
208 kvm_namelist(kvm_t *kd) in kvm_namelist() argument
210 return (kd->kvm_namelist); in kvm_namelist()
214 kvm_nlist(kvm_t *kd, struct nlist nl[]) in kvm_nlist() argument
216 return (nlist(kd->kvm_namelist, nl)); in kvm_nlist()
226 kvm_nlist_core(kvm_t *kd, struct nlist nl[], const char *err) in kvm_nlist_core() argument
228 dumphdr_t *dump = &kd->kvm_dump; in kvm_nlist_core()
234 (void) fail(kd, err, "%s: kernel symbols are compressed", msg); in kvm_nlist_core()
238 if (dump->dump_ksyms + dump->dump_ksyms_size > kd->kvm_coremapsize) { in kvm_nlist_core()
239 (void) fail(kd, err, "%s: kernel symbols not mapped", msg); in kvm_nlist_core()
248 (void) snprintf(kd->kvm_namelist, MAXNAMELEN, template, getpid()); in kvm_nlist_core()
250 if ((fd = mkstemp(kd->kvm_namelist)) == -1) { in kvm_nlist_core()
251 (void) fail(kd, err, "%s: couldn't create temporary " in kvm_nlist_core()
256 kd->kvm_namelist_core = B_TRUE; in kvm_nlist_core()
259 rval = write(fd, (caddr_t)((uintptr_t)kd->kvm_core + in kvm_nlist_core()
264 (void) fail(kd, err, "%s: couldn't write to temporary " in kvm_nlist_core()
272 if (kvm_nlist(kd, nl) == -1) { in kvm_nlist_core()
273 (void) fail(kd, err, "%s: symbols not valid", msg); in kvm_nlist_core()
281 kvm_lookup(kvm_t *kd, struct as *as, uint64_t addr) in kvm_lookup() argument
283 uintptr_t pageoff = addr & (kd->kvm_dump.dump_pagesize - 1); in kvm_lookup()
287 if (kd->kvm_debug) in kvm_lookup()
292 long last = kd->kvm_dump.dump_npages - 1; in kvm_lookup()
293 pfn_t target = (pfn_t)(page >> kd->kvm_dump.dump_pageshift); in kvm_lookup()
296 pfn_t pfn = kd->kvm_pfn[middle]; in kvm_lookup()
297 if (kd->kvm_debug) in kvm_lookup()
300 off = kd->kvm_dump.dump_data + pageoff + in kvm_lookup()
302 kd->kvm_dump.dump_pageshift); in kvm_lookup()
311 long hash = DUMP_HASH(&kd->kvm_dump, as, page); in kvm_lookup()
312 off = kd->kvm_map[hash].dm_first; in kvm_lookup()
314 dump_map_t *dmp = (void *)(kd->kvm_core + off); in kvm_lookup()
315 if (kd->kvm_debug) in kvm_lookup()
317 if (dmp < kd->kvm_map || in kvm_lookup()
318 dmp > kd->kvm_map + kd->kvm_dump.dump_hashmask || in kvm_lookup()
320 DUMP_HASH(&kd->kvm_dump, dmp->dm_as, dmp->dm_va) != in kvm_lookup()
322 if (kd->kvm_debug) in kvm_lookup()
333 if (kd->kvm_debug) in kvm_lookup()
339 kvm_rw(kvm_t *kd, uint64_t addr, void *buf, size_t size, in kvm_rw() argument
351 if (kd->kvm_core == NULL) { in kvm_rw()
356 if (as == kd->kvm_kas) in kvm_rw()
357 return (prw(kd->kvm_kmemfd, buf, size, addr)); in kvm_rw()
359 return (prw(kd->kvm_memfd, buf, size, addr)); in kvm_rw()
361 (void) sprintf(procbuf, "/proc/%ld/as", kd->kvm_pid); in kvm_rw()
362 if ((procfd = open64(procbuf, kd->kvm_openflag)) == -1) in kvm_rw()
370 uintptr_t pageoff = addr & (kd->kvm_dump.dump_pagesize - 1); in kvm_rw()
371 ssize_t len = MIN(resid, kd->kvm_dump.dump_pagesize - pageoff); in kvm_rw()
373 if ((off = kvm_lookup(kd, as, addr)) == 0) in kvm_rw()
376 if (prw == PREAD && off < kd->kvm_coremapsize) in kvm_rw()
377 bcopy(kd->kvm_core + off, buf, len); in kvm_rw()
378 else if ((len = prw(kd->kvm_corefd, buf, len, off)) <= 0) in kvm_rw()
388 kvm_read(kvm_t *kd, uintptr_t addr, void *buf, size_t size) in kvm_read() argument
390 return (kvm_rw(kd, addr, buf, size, kd->kvm_kas, PREAD)); in kvm_read()
394 kvm_kread(kvm_t *kd, uintptr_t addr, void *buf, size_t size) in kvm_kread() argument
396 return (kvm_rw(kd, addr, buf, size, kd->kvm_kas, PREAD)); in kvm_kread()
400 kvm_uread(kvm_t *kd, uintptr_t addr, void *buf, size_t size) in kvm_uread() argument
402 return (kvm_rw(kd, addr, buf, size, kd->kvm_proc.p_as, PREAD)); in kvm_uread()
406 kvm_aread(kvm_t *kd, uintptr_t addr, void *buf, size_t size, struct as *as) in kvm_aread() argument
408 return (kvm_rw(kd, addr, buf, size, as, PREAD)); in kvm_aread()
412 kvm_pread(kvm_t *kd, uint64_t addr, void *buf, size_t size) in kvm_pread() argument
414 return (kvm_rw(kd, addr, buf, size, NULL, PREAD)); in kvm_pread()
418 kvm_write(kvm_t *kd, uintptr_t addr, const void *buf, size_t size) in kvm_write() argument
420 return (kvm_rw(kd, addr, (void *)buf, size, kd->kvm_kas, PWRITE)); in kvm_write()
424 kvm_kwrite(kvm_t *kd, uintptr_t addr, const void *buf, size_t size) in kvm_kwrite() argument
426 return (kvm_rw(kd, addr, (void *)buf, size, kd->kvm_kas, PWRITE)); in kvm_kwrite()
430 kvm_uwrite(kvm_t *kd, uintptr_t addr, const void *buf, size_t size) in kvm_uwrite() argument
432 return (kvm_rw(kd, addr, (void *)buf, size, kd->kvm_proc.p_as, PWRITE)); in kvm_uwrite()
436 kvm_awrite(kvm_t *kd, uintptr_t addr, const void *buf, size_t size, in kvm_awrite() argument
439 return (kvm_rw(kd, addr, (void *)buf, size, as, PWRITE)); in kvm_awrite()
443 kvm_pwrite(kvm_t *kd, uint64_t addr, const void *buf, size_t size) in kvm_pwrite() argument
445 return (kvm_rw(kd, addr, (void *)buf, size, NULL, PWRITE)); in kvm_pwrite()
449 kvm_physaddr(kvm_t *kd, struct as *as, uintptr_t addr) in kvm_physaddr() argument
454 if (kd->kvm_core == NULL) { in kvm_physaddr()
457 if (ioctl(kd->kvm_kmemfd, MEM_VTOP, &mem_vtop) == 0) in kvm_physaddr()
461 if ((off = kvm_lookup(kd, as, addr)) != 0) { in kvm_physaddr()
463 (u_offset_t)(off - kd->kvm_dump.dump_data) >> in kvm_physaddr()
464 kd->kvm_dump.dump_pageshift; in kvm_physaddr()
465 return (((uint64_t)kd->kvm_pfn[pfn_index] << in kvm_physaddr()
466 kd->kvm_dump.dump_pageshift) + in kvm_physaddr()
467 (addr & (kd->kvm_dump.dump_pagesize - 1))); in kvm_physaddr()
474 kvm_getproc(kvm_t *kd, pid_t pid) in kvm_getproc() argument
476 (void) kvm_setproc(kd); in kvm_getproc()
477 while (kvm_nextproc(kd) != NULL) in kvm_getproc()
478 if (kd->kvm_pid == pid) in kvm_getproc()
479 return (&kd->kvm_proc); in kvm_getproc()
484 kvm_nextproc(kvm_t *kd) in kvm_nextproc() argument
486 if (kd->kvm_proc.p_next == NULL || in kvm_nextproc()
487 kvm_kread(kd, (uintptr_t)kd->kvm_proc.p_next, in kvm_nextproc()
488 &kd->kvm_proc, sizeof (proc_t)) != sizeof (proc_t) || in kvm_nextproc()
489 kvm_kread(kd, (uintptr_t)&kd->kvm_proc.p_pidp->pid_id, in kvm_nextproc()
490 &kd->kvm_pid, sizeof (pid_t)) != sizeof (pid_t)) in kvm_nextproc()
493 return (&kd->kvm_proc); in kvm_nextproc()
497 kvm_setproc(kvm_t *kd) in kvm_setproc() argument
499 (void) kvm_kread(kd, (uintptr_t)kd->kvm_practive, in kvm_setproc()
500 &kd->kvm_proc.p_next, sizeof (proc_t *)); in kvm_setproc()
501 kd->kvm_pid = -1; in kvm_setproc()
507 kvm_getu(kvm_t *kd, struct proc *p) in kvm_getu() argument