Lines Matching refs:kd

87 kvm_geterr(kvm_t *kd)
89 return (kd->errbuf);
93 kvm_getkernelname(kvm_t *kd)
95 return kd->kernelname;
99 * Report an error using printf style arguments. "program" is kd->program
105 _kvm_err(kvm_t *kd, const char *program, const char *fmt, ...)
115 (void)vsnprintf(kd->errbuf,
116 sizeof(kd->errbuf), fmt, ap);
122 _kvm_syserr(kvm_t *kd, const char *program, const char *fmt, ...)
133 char *cp = kd->errbuf;
135 (void)vsnprintf(cp, sizeof(kd->errbuf), fmt, ap);
137 (void)snprintf(&cp[n], sizeof(kd->errbuf) - n, ": %s",
144 _kvm_malloc(kvm_t *kd, size_t n)
149 _kvm_err(kd, kd->program, "%s", strerror(errno));
158 Lseek(kvm_t *kd, int fd, off_t offset, int whence)
165 _kvm_syserr(kd, kd->program, "Lseek");
172 _kvm_pread(kvm_t *kd, int fd, void *buf, size_t size, off_t off)
181 if (((off % kd->fdalign) | (size % kd->fdalign)) == 0) {
189 moff = (ptrdiff_t)off % kd->fdalign;
191 dsize = moff + size + kd->fdalign - 1;
192 dsize -= dsize % kd->fdalign;
193 if (kd->iobufsz < dsize) {
194 newbuf = realloc(kd->iobuf, dsize);
196 _kvm_syserr(kd, 0, "cannot allocate I/O buffer");
199 kd->iobuf = newbuf;
200 kd->iobufsz = dsize;
202 rv = pread(fd, kd->iobuf, dsize, doff);
205 memcpy(buf, kd->iobuf + moff, size);
214 Pread(kvm_t *kd, int fd, void *buf, size_t nbytes, off_t offset)
220 if ((rv = _kvm_pread(kd, fd, buf, nbytes, offset)) != nbytes &&
222 _kvm_syserr(kd, kd->program, "Pread");
227 _kvm_open(kvm_t *kd, const char *uf, const char *mf, const char *sf, int flag,
233 kd->pmfd = -1;
234 kd->vmfd = -1;
235 kd->swfd = -1;
236 kd->nlfd = -1;
237 kd->alive = KVM_ALIVE_DEAD;
238 kd->procbase = NULL;
239 kd->procbase_len = 0;
240 kd->procbase2 = NULL;
241 kd->procbase2_len = 0;
242 kd->lwpbase = NULL;
243 kd->lwpbase_len = 0;
244 kd->nbpg = getpagesize();
245 kd->swapspc = NULL;
246 kd->argspc = NULL;
247 kd->argspc_len = 0;
248 kd->argbuf = NULL;
249 kd->argv = NULL;
250 kd->vmst = NULL;
251 kd->vm_page_buckets = NULL;
252 kd->kcore_hdr = NULL;
253 kd->cpu_dsize = 0;
254 kd->cpu_data = NULL;
255 kd->dump_off = 0;
256 kd->fdalign = 1;
257 kd->iobuf = NULL;
258 kd->iobufsz = 0;
261 kd->alive = KVM_ALIVE_SYSCTL;
262 return(kd);
269 if (_kvm_mdopen(kd)) {
270 _kvm_err(kd, kd->program, "md init failed");
300 _kvm_err(kd, kd->program, "exec file name too long");
304 _kvm_err(kd, kd->program, "bad flags arg");
317 kd->nlfd = open(_PATH_KSYMS, O_RDONLY | O_CLOEXEC, 0);
318 if (kd->nlfd < 0) {
319 if ((kd->nlfd = open(uf, O_RDONLY | O_CLOEXEC, 0)) < 0) {
320 _kvm_syserr(kd, kd->program, "%s", uf);
323 strlcpy(kd->kernelname, uf, sizeof(kd->kernelname));
325 strlcpy(kd->kernelname, _PATH_KSYMS, sizeof(kd->kernelname));
331 * kd->nlfd is negative.
333 close(kd->nlfd);
334 kd->nlfd = -1;
337 if ((kd->pmfd = open(mf, flag | O_CLOEXEC, 0)) < 0) {
338 _kvm_syserr(kd, kd->program, "%s", mf);
341 if (fstat(kd->pmfd, &st) < 0) {
342 _kvm_syserr(kd, kd->program, "%s", mf);
351 if ((kd->vmfd = open(_PATH_KMEM, flag | O_CLOEXEC, 0)) < 0) {
352 _kvm_syserr(kd, kd->program, "%s", _PATH_KMEM);
355 kd->alive = KVM_ALIVE_FILES;
356 if ((kd->swfd = open(sf, flag | O_CLOEXEC, 0)) < 0) {
358 _kvm_syserr(kd, kd->program, "%s", sf);
364 kd->fdalign = DEV_BSIZE; /* XXX */
374 if (_kvm_get_header(kd) == 0) {
375 if (_kvm_initvtop(kd) < 0)
379 return (kd);
385 (void)strlcpy(errout, kd->errbuf, _POSIX2_LINE_MAX);
386 (void)kvm_close(kd);
402 _kvm_get_header(kvm_t *kd)
413 sz = Pread(kd, kd->pmfd, &kcore_hdr, sizeof(kcore_hdr), (off_t)0);
436 kd->kcore_hdr = _kvm_malloc(kd, sizeof(kcore_hdr));
437 memcpy(kd->kcore_hdr, &kcore_hdr, sizeof(kcore_hdr));
443 sz = Pread(kd, kd->pmfd, &cpu_hdr, sizeof(cpu_hdr), (off_t)offset);
454 kd->cpu_dsize = cpu_hdr.c_size;
455 kd->cpu_data = _kvm_malloc(kd, cpu_hdr.c_size);
456 if (kd->cpu_data == NULL)
458 sz = Pread(kd, kd->pmfd, kd->cpu_data, cpu_hdr.c_size, (off_t)offset);
466 sz = Pread(kd, kd->pmfd, &mem_hdr, sizeof(mem_hdr), (off_t)offset);
475 kd->dump_off = offset;
479 if (kd->kcore_hdr != NULL) {
480 free(kd->kcore_hdr);
481 kd->kcore_hdr = NULL;
483 if (kd->cpu_data != NULL) {
484 free(kd->cpu_data);
485 kd->cpu_data = NULL;
486 kd->cpu_dsize = 0;
499 kvm_dump_mkheader(kvm_t *kd, off_t dump_off)
505 if (kd->kcore_hdr != NULL) {
506 _kvm_err(kd, kd->program, "already has a dump header");
509 if (ISALIVE(kd)) {
510 _kvm_err(kd, kd->program, "don't use on live kernel");
517 sz = Pread(kd, kd->pmfd, &cpu_hdr, sizeof(cpu_hdr), dump_off);
522 _kvm_err(kd, 0, "invalid magic in cpu_hdr");
530 kd->cpu_dsize = cpu_hdr.c_size;
531 kd->cpu_data = _kvm_malloc(kd, kd->cpu_dsize);
532 if (kd->cpu_data == NULL)
534 sz = Pread(kd, kd->pmfd, kd->cpu_data, cpu_hdr.c_size,
538 hdr_size += kd->cpu_dsize;
543 kd->dump_off = dump_off + hdr_size;
544 if (Lseek(kd, kd->pmfd, kd->dump_off, SEEK_SET) == -1)
550 kd->kcore_hdr = _kvm_malloc(kd, sizeof(kcore_hdr_t));
551 if (kd->kcore_hdr == NULL)
554 kd->kcore_hdr->c_hdrsize = ALIGN(sizeof(kcore_hdr_t));
555 kd->kcore_hdr->c_seghdrsize = ALIGN(sizeof(kcore_seg_t));
556 kd->kcore_hdr->c_nseg = 2;
557 CORE_SETMAGIC(*(kd->kcore_hdr), KCORE_MAGIC, MID_MACHINE,0);
562 if (_kvm_initvtop(kd) == 0)
567 if (kd->kcore_hdr != NULL) {
568 free(kd->kcore_hdr);
569 kd->kcore_hdr = NULL;
571 if (kd->cpu_data != NULL) {
572 free(kd->cpu_data);
573 kd->cpu_data = NULL;
574 kd->cpu_dsize = 0;
580 clear_gap(kvm_t *kd, bool (*write_buf)(void *, const void *, size_t),
591 _kvm_syserr(kd, kd->program, "clear_gap");
604 kvm_dump_header(kvm_t *kd, bool (*write_buf)(void *, const void *, size_t),
611 if (kd->kcore_hdr == NULL || kd->cpu_data == NULL) {
612 _kvm_err(kd, kd->program, "no valid dump header(s)");
620 if (!(*write_buf)(cookie, kd->kcore_hdr, sizeof(kcore_hdr_t))) {
621 _kvm_syserr(kd, kd->program, "kvm_dump_header");
624 offset += kd->kcore_hdr->c_hdrsize;
625 gap = kd->kcore_hdr->c_hdrsize - sizeof(kcore_hdr_t);
626 if (clear_gap(kd, write_buf, cookie, gap) == -1)
633 seghdr.c_size = ALIGN(kd->cpu_dsize);
635 _kvm_syserr(kd, kd->program, "kvm_dump_header");
638 offset += kd->kcore_hdr->c_seghdrsize;
639 gap = kd->kcore_hdr->c_seghdrsize - sizeof(seghdr);
640 if (clear_gap(kd, write_buf, cookie, gap) == -1)
643 if (!(*write_buf)(cookie, kd->cpu_data, kd->cpu_dsize)) {
644 _kvm_syserr(kd, kd->program, "kvm_dump_header");
648 gap = seghdr.c_size - kd->cpu_dsize;
649 if (clear_gap(kd, write_buf, cookie, gap) == -1)
658 _kvm_syserr(kd, kd->program, "kvm_dump_header");
661 offset += kd->kcore_hdr->c_seghdrsize;
662 gap = kd->kcore_hdr->c_seghdrsize - sizeof(seghdr);
663 if (clear_gap(kd, write_buf, cookie, gap) == -1)
676 kvm_dump_wrtheader(kvm_t *kd, FILE *fp, int dumpsize)
678 return kvm_dump_header(kd, kvm_dump_header_stdio, fp, dumpsize);
685 kvm_t *kd;
687 if ((kd = malloc(sizeof(*kd))) == NULL) {
691 kd->program = 0;
692 return (_kvm_open(kd, uf, mf, sf, flag, errout));
699 kvm_t *kd;
701 if ((kd = malloc(sizeof(*kd))) == NULL) {
706 kd->program = program;
707 return (_kvm_open(kd, uf, mf, sf, flag, NULL));
711 kvm_close(kvm_t *kd)
715 if (kd->pmfd >= 0)
716 error |= close(kd->pmfd);
717 if (kd->vmfd >= 0)
718 error |= close(kd->vmfd);
719 if (kd->nlfd >= 0)
720 error |= close(kd->nlfd);
721 if (kd->swfd >= 0)
722 error |= close(kd->swfd);
723 if (kd->vmst)
724 _kvm_freevtop(kd);
725 kd->cpu_dsize = 0;
726 if (kd->cpu_data != NULL)
727 free(kd->cpu_data);
728 if (kd->kcore_hdr != NULL)
729 free(kd->kcore_hdr);
730 if (kd->procbase != 0)
731 free(kd->procbase);
732 if (kd->procbase2 != 0)
733 free(kd->procbase2);
734 if (kd->lwpbase != 0)
735 free(kd->lwpbase);
736 if (kd->swapspc != 0)
737 free(kd->swapspc);
738 if (kd->argspc != 0)
739 free(kd->argspc);
740 if (kd->argbuf != 0)
741 free(kd->argbuf);
742 if (kd->argv != 0)
743 free(kd->argv);
744 if (kd->iobuf != 0)
745 free(kd->iobuf);
746 free(kd);
752 kvm_nlist(kvm_t *kd, struct nlist *nl)
757 * kd->nlfd might be negative when we get here, and in that
761 if (kd->nlfd < 0) {
764 _kvm_err(kd, 0, "failed to open %s", _PATH_KSYMS);
768 nlfd = kd->nlfd;
776 _kvm_err(kd, 0, "bad namelist");
778 if (kd->nlfd < 0)
785 kvm_dump_inval(kvm_t *kd)
793 if (ISALIVE(kd)) {
794 _kvm_err(kd, kd->program, "clearing dump on live kernel");
800 if (kvm_nlist(kd, nl) == -1) {
801 _kvm_err(kd, 0, "bad namelist");
804 if (_kvm_kvatop(kd, (vaddr_t)nl[0].n_value, &pa) == 0)
808 dsize = MAX(kd->fdalign, sizeof(u_long));
809 if (kd->iobufsz < dsize) {
810 newbuf = realloc(kd->iobuf, dsize);
812 _kvm_syserr(kd, 0, "cannot allocate I/O buffer");
815 kd->iobuf = newbuf;
816 kd->iobufsz = dsize;
818 memset(kd->iobuf, 0, dsize);
819 doff = _kvm_pa2off(kd, pa);
820 doff -= doff % kd->fdalign;
821 if (pwrite(kd->pmfd, kd->iobuf, dsize, doff) == -1) {
822 _kvm_syserr(kd, 0, "cannot invalidate dump - pwrite");
829 kvm_read(kvm_t *kd, u_long kva, void *buf, size_t len)
834 if (ISKMEM(kd)) {
840 cc = _kvm_pread(kd, kd->vmfd, buf, len, (off_t)kva);
842 _kvm_syserr(kd, 0, "kvm_read");
845 _kvm_err(kd, kd->program, "short read");
847 } else if (ISSYSCTL(kd)) {
848 _kvm_err(kd, kd->program, "kvm_open called with KVM_NO_FILES, "
852 if ((kd->kcore_hdr == NULL) || (kd->cpu_data == NULL)) {
853 _kvm_err(kd, kd->program, "no valid dump header");
861 cc = _kvm_kvatop(kd, (vaddr_t)kva, &pa);
866 foff = _kvm_pa2off(kd, pa);
868 cc = _kvm_pread(kd, kd->pmfd, cp, (size_t)cc, foff);
870 _kvm_syserr(kd, kd->program, "kvm_read");
891 kvm_write(kvm_t *kd, u_long kva, const void *buf, size_t len)
895 if (ISKMEM(kd)) {
900 cc = pwrite(kd->vmfd, buf, len, (off_t)kva);
902 _kvm_syserr(kd, 0, "kvm_write");
905 _kvm_err(kd, kd->program, "short write");
907 } else if (ISSYSCTL(kd)) {
908 _kvm_err(kd, kd->program, "kvm_open called with KVM_NO_FILES, "
912 _kvm_err(kd, kd->program,