Lines Matching defs:kd

61 fail(kvm_t *kd, const char *err, const char *message, ...)
66 if (err || (kd && kd->kvm_debug)) {
72 if (kd != NULL)
73 (void) kvm_close(kd);
82 kvm_t *kd;
86 if ((kd = calloc(1, sizeof (kvm_t))) == NULL)
89 kd->kvm_corefd = kd->kvm_kmemfd = kd->kvm_memfd = -1;
90 kd->kvm_debug = getenv("KVM_DEBUG");
92 if ((kd->kvm_openflag = flag) != O_RDONLY && flag != O_RDWR)
93 return (fail(kd, err, "illegal flag 0x%x to kvm_open()", flag));
99 return (fail(kd, err, "cannot stat %s", corefile));
103 return (fail(kd, err, "cannot stat /dev/mem"));
106 return (fail(kd, err, "cannot stat /dev/kmem"));
109 return (fail(kd, err, "cannot stat /dev/allkmem"));
116 if ((kd->kvm_kmemfd = open64(kmem, flag)) == -1)
117 return (fail(kd, err, "cannot open %s", kmem));
118 if ((kd->kvm_memfd = open64("/dev/mem", flag)) == -1)
119 return (fail(kd, err, "cannot open /dev/mem"));
122 if ((kd->kvm_corefd = open64(corefile, flag)) == -1)
123 return (fail(kd, err, "cannot open %s", corefile));
124 if (pread64(kd->kvm_corefd, &kd->kvm_dump,
125 sizeof (kd->kvm_dump), 0) != sizeof (kd->kvm_dump))
126 return (fail(kd, err, "cannot read dump header"));
127 if (kd->kvm_dump.dump_magic != DUMP_MAGIC)
128 return (fail(kd, err, "%s is not a kernel core file "
130 kd->kvm_dump.dump_magic));
131 if (kd->kvm_dump.dump_version != DUMP_VERSION) {
133 (kd->kvm_dump.dump_version == 9)) {
138 bzero(kd->kvm_dump.dump_uuid,
139 sizeof (kd->kvm_dump.dump_uuid));
141 return (fail(kd, err,
144 DUMP_VERSION, kd->kvm_dump.dump_version));
147 if (kd->kvm_dump.dump_wordsize != DUMP_WORDSIZE)
148 return (fail(kd, err, "%s is a %d-bit core file - "
150 kd->kvm_dump.dump_wordsize, DUMP_WORDSIZE));
156 kd->kvm_coremapsize = (size_t)corestat.st_size;
158 (kd->kvm_core = mmap64(0, kd->kvm_coremapsize,
159 PROT_READ, MAP_SHARED, kd->kvm_corefd, 0)) == MAP_FAILED) {
160 kd->kvm_coremapsize = kd->kvm_dump.dump_data;
161 if ((kd->kvm_core = mmap64(0, kd->kvm_coremapsize,
162 PROT_READ, MAP_SHARED, kd->kvm_corefd, 0)) ==
164 return (fail(kd, err, "cannot mmap corefile"));
166 kd->kvm_map = (void *)(kd->kvm_core + kd->kvm_dump.dump_map);
167 kd->kvm_pfn = (void *)(kd->kvm_core + kd->kvm_dump.dump_pfn);
173 (void) strncpy(kd->kvm_namelist, namelist, MAXNAMELEN);
175 if (kvm_nlist(kd, nl) == -1)
176 return (fail(kd, err, "%s is not a %d-bit kernel namelist",
179 kd->kvm_kas = (struct as *)nl[0].n_value;
180 kd->kvm_practive = (proc_t *)nl[1].n_value;
182 (void) kvm_setproc(kd);
183 return (kd);
187 kvm_close(kvm_t *kd)
189 if (kd->kvm_core != NULL && kd->kvm_core != MAP_FAILED)
190 (void) munmap(kd->kvm_core, kd->kvm_coremapsize);
191 if (kd->kvm_corefd != -1)
192 (void) close(kd->kvm_corefd);
193 if (kd->kvm_kmemfd != -1)
194 (void) close(kd->kvm_kmemfd);
195 if (kd->kvm_memfd != -1)
196 (void) close(kd->kvm_memfd);
197 free(kd);
202 kvm_nlist(kvm_t *kd, struct nlist nl[])
204 return (nlist(kd->kvm_namelist, nl));
208 kvm_lookup(kvm_t *kd, struct as *as, uint64_t addr)
210 uintptr_t pageoff = addr & (kd->kvm_dump.dump_pagesize - 1);
214 if (kd->kvm_debug)
219 long last = kd->kvm_dump.dump_npages - 1;
220 pfn_t target = (pfn_t)(page >> kd->kvm_dump.dump_pageshift);
223 pfn_t pfn = kd->kvm_pfn[middle];
224 if (kd->kvm_debug)
227 off = kd->kvm_dump.dump_data + pageoff +
229 kd->kvm_dump.dump_pageshift);
238 long hash = DUMP_HASH(&kd->kvm_dump, as, page);
239 off = kd->kvm_map[hash].dm_first;
241 dump_map_t *dmp = (void *)(kd->kvm_core + off);
242 if (kd->kvm_debug)
244 if (dmp < kd->kvm_map ||
245 dmp > kd->kvm_map + kd->kvm_dump.dump_hashmask ||
247 DUMP_HASH(&kd->kvm_dump, dmp->dm_as, dmp->dm_va) !=
249 if (kd->kvm_debug)
260 if (kd->kvm_debug)
266 kvm_rw(kvm_t *kd, uint64_t addr, void *buf, size_t size,
278 if (kd->kvm_core == NULL) {
283 if (as == kd->kvm_kas)
284 return (prw(kd->kvm_kmemfd, buf, size, addr));
286 return (prw(kd->kvm_memfd, buf, size, addr));
288 (void) sprintf(procbuf, "/proc/%ld/as", kd->kvm_pid);
289 if ((procfd = open64(procbuf, kd->kvm_openflag)) == -1)
297 uintptr_t pageoff = addr & (kd->kvm_dump.dump_pagesize - 1);
298 ssize_t len = MIN(resid, kd->kvm_dump.dump_pagesize - pageoff);
300 if ((off = kvm_lookup(kd, as, addr)) == 0)
303 if (prw == PREAD && off < kd->kvm_coremapsize)
304 bcopy(kd->kvm_core + off, buf, len);
305 else if ((len = prw(kd->kvm_corefd, buf, len, off)) <= 0)
315 kvm_read(kvm_t *kd, uintptr_t addr, void *buf, size_t size)
317 return (kvm_rw(kd, addr, buf, size, kd->kvm_kas, PREAD));
321 kvm_kread(kvm_t *kd, uintptr_t addr, void *buf, size_t size)
323 return (kvm_rw(kd, addr, buf, size, kd->kvm_kas, PREAD));
327 kvm_uread(kvm_t *kd, uintptr_t addr, void *buf, size_t size)
329 return (kvm_rw(kd, addr, buf, size, kd->kvm_proc.p_as, PREAD));
333 kvm_aread(kvm_t *kd, uintptr_t addr, void *buf, size_t size, struct as *as)
335 return (kvm_rw(kd, addr, buf, size, as, PREAD));
339 kvm_pread(kvm_t *kd, uint64_t addr, void *buf, size_t size)
341 return (kvm_rw(kd, addr, buf, size, NULL, PREAD));
345 kvm_write(kvm_t *kd, uintptr_t addr, const void *buf, size_t size)
347 return (kvm_rw(kd, addr, (void *)buf, size, kd->kvm_kas, PWRITE));
351 kvm_kwrite(kvm_t *kd, uintptr_t addr, const void *buf, size_t size)
353 return (kvm_rw(kd, addr, (void *)buf, size, kd->kvm_kas, PWRITE));
357 kvm_uwrite(kvm_t *kd, uintptr_t addr, const void *buf, size_t size)
359 return (kvm_rw(kd, addr, (void *)buf, size, kd->kvm_proc.p_as, PWRITE));
363 kvm_awrite(kvm_t *kd, uintptr_t addr, const void *buf, size_t size,
366 return (kvm_rw(kd, addr, (void *)buf, size, as, PWRITE));
370 kvm_pwrite(kvm_t *kd, uint64_t addr, const void *buf, size_t size)
372 return (kvm_rw(kd, addr, (void *)buf, size, NULL, PWRITE));
376 kvm_physaddr(kvm_t *kd, struct as *as, uintptr_t addr)
381 if (kd->kvm_core == NULL) {
384 if (ioctl(kd->kvm_kmemfd, MEM_VTOP, &mem_vtop) == 0)
388 if ((off = kvm_lookup(kd, as, addr)) != 0) {
390 (u_offset_t)(off - kd->kvm_dump.dump_data) >>
391 kd->kvm_dump.dump_pageshift;
392 return (((uint64_t)kd->kvm_pfn[pfn_index] <<
393 kd->kvm_dump.dump_pageshift) +
394 (addr & (kd->kvm_dump.dump_pagesize - 1)));
401 kvm_getproc(kvm_t *kd, pid_t pid)
403 (void) kvm_setproc(kd);
404 while (kvm_nextproc(kd) != NULL)
405 if (kd->kvm_pid == pid)
406 return (&kd->kvm_proc);
411 kvm_nextproc(kvm_t *kd)
413 if (kd->kvm_proc.p_next == NULL ||
414 kvm_kread(kd, (uintptr_t)kd->kvm_proc.p_next,
415 &kd->kvm_proc, sizeof (proc_t)) != sizeof (proc_t) ||
416 kvm_kread(kd, (uintptr_t)&kd->kvm_proc.p_pidp->pid_id,
417 &kd->kvm_pid, sizeof (pid_t)) != sizeof (pid_t))
420 return (&kd->kvm_proc);
424 kvm_setproc(kvm_t *kd)
426 (void) kvm_kread(kd, (uintptr_t)kd->kvm_practive,
427 &kd->kvm_proc.p_next, sizeof (proc_t *));
428 kd->kvm_pid = -1;
434 kvm_getu(kvm_t *kd, struct proc *p)