Lines Matching +full:libelf +full:- +full:dev

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
9 * BG 91-66 and contributed to Berkeley.
74 return (kd->errbuf); in kvm_geterr()
83 _kvm_err(kd, kd->program, "Unsupported libelf"); in _kvm_read_kernel_ehdr()
84 return (-1); in _kvm_read_kernel_ehdr()
86 elf = elf_begin(kd->nlfd, ELF_C_READ, NULL); in _kvm_read_kernel_ehdr()
88 _kvm_err(kd, kd->program, "%s", elf_errmsg(0)); in _kvm_read_kernel_ehdr()
89 return (-1); in _kvm_read_kernel_ehdr()
92 _kvm_err(kd, kd->program, "kernel is not an ELF file"); in _kvm_read_kernel_ehdr()
93 return (-1); in _kvm_read_kernel_ehdr()
95 if (gelf_getehdr(elf, &kd->nlehdr) == NULL) { in _kvm_read_kernel_ehdr()
96 _kvm_err(kd, kd->program, "%s", elf_errmsg(0)); in _kvm_read_kernel_ehdr()
98 return (-1); in _kvm_read_kernel_ehdr()
102 switch (kd->nlehdr.e_ident[EI_DATA]) { in _kvm_read_kernel_ehdr()
107 _kvm_err(kd, kd->program, in _kvm_read_kernel_ehdr()
109 return (-1); in _kvm_read_kernel_ehdr()
119 kd->vmfd = -1; in _kvm_open()
120 kd->pmfd = -1; in _kvm_open()
121 kd->nlfd = -1; in _kvm_open()
122 kd->vmst = NULL; in _kvm_open()
123 kd->procbase = NULL; in _kvm_open()
124 kd->argspc = NULL; in _kvm_open()
125 kd->argv = NULL; in _kvm_open()
130 _kvm_err(kd, kd->program, "exec file name too long"); in _kvm_open()
134 _kvm_err(kd, kd->program, "bad flags arg"); in _kvm_open()
140 if ((kd->pmfd = open(mf, flag | O_CLOEXEC, 0)) < 0) { in _kvm_open()
141 _kvm_syserr(kd, kd->program, "%s", mf); in _kvm_open()
144 if (fstat(kd->pmfd, &st) < 0) { in _kvm_open()
145 _kvm_syserr(kd, kd->program, "%s", mf); in _kvm_open()
150 _kvm_syserr(kd, kd->program, "empty file"); in _kvm_open()
156 * it's /dev/mem. If so, open kmem too. (Maybe we should in _kvm_open()
157 * make it work for either /dev/mem or /dev/kmem -- in either in _kvm_open()
161 kd->vmfd = open(_PATH_DEVNULL, O_RDONLY | O_CLOEXEC); in _kvm_open()
164 if ((kd->vmfd = open(_PATH_KMEM, flag | O_CLOEXEC)) < in _kvm_open()
166 _kvm_syserr(kd, kd->program, "%s", _PATH_KMEM); in _kvm_open()
178 if ((kd->nlfd = open(uf, O_RDONLY | O_CLOEXEC, 0)) < 0) { in _kvm_open()
179 _kvm_syserr(kd, kd->program, "%s", uf); in _kvm_open()
186 kd->rawdump = 1; in _kvm_open()
187 kd->writable = 1; in _kvm_open()
190 if ((*parch)->ka_probe(kd)) { in _kvm_open()
191 kd->arch = *parch; in _kvm_open()
195 if (kd->arch == NULL) { in _kvm_open()
196 _kvm_err(kd, kd->program, "unsupported architecture"); in _kvm_open()
201 * Non-native kernels require a symbol resolver. in _kvm_open()
203 if (!kd->arch->ka_native(kd) && kd->resolve_symbol == NULL) { in _kvm_open()
204 _kvm_err(kd, kd->program, in _kvm_open()
205 "non-native kernel requires a symbol resolver"); in _kvm_open()
212 if (kd->arch->ka_initvtop(kd) < 0) in _kvm_open()
220 strlcpy(errout, kd->errbuf, _POSIX2_LINE_MAX); in _kvm_open()
252 kd->program = errstr; in kvm_open()
268 kd->resolve_symbol = resolver; in kvm_open2()
279 return (-1); in kvm_close()
281 if (kd->vmst != NULL) in kvm_close()
282 kd->arch->ka_freevtop(kd); in kvm_close()
283 if (kd->pmfd >= 0) in kvm_close()
284 error |= close(kd->pmfd); in kvm_close()
285 if (kd->vmfd >= 0) in kvm_close()
286 error |= close(kd->vmfd); in kvm_close()
287 if (kd->nlfd >= 0) in kvm_close()
288 error |= close(kd->nlfd); in kvm_close()
289 if (kd->procbase != 0) in kvm_close()
290 free((void *)kd->procbase); in kvm_close()
291 if (kd->argbuf != 0) in kvm_close()
292 free((void *) kd->argbuf); in kvm_close()
293 if (kd->argspc != 0) in kvm_close()
294 free((void *) kd->argspc); in kvm_close()
295 if (kd->argv != 0) in kvm_close()
296 free((void *)kd->argv); in kvm_close()
297 if (kd->dpcpu_initialized != 0) in kvm_close()
298 free(kd->dpcpu_off); in kvm_close()
299 if (kd->pt_map != NULL) in kvm_close()
300 free(kd->pt_map); in kvm_close()
301 if (kd->page_map != NULL) in kvm_close()
302 free(kd->page_map); in kvm_close()
303 if (kd->sparse_map != MAP_FAILED && kd->sparse_map != NULL) in kvm_close()
304 munmap(kd->sparse_map, kd->pt_sparse_size); in kvm_close()
328 * Avoid reporting truncated addresses by failing for non-native in kvm_nlist()
332 _kvm_err(kd, kd->program, "kvm_nlist of non-native vmcore"); in kvm_nlist()
333 return (-1); in kvm_nlist()
343 _kvm_err(kd, kd->program, "cannot allocate memory"); in kvm_nlist()
344 return (-1); in kvm_nlist()
376 * We're using /dev/kmem. Just read straight from the in kvm_read2()
380 if (lseek(kd->vmfd, (off_t)kva, 0) == -1 && errno != 0) { in kvm_read2()
383 return (-1); in kvm_read2()
385 cr = read(kd->vmfd, buf, len); in kvm_read2()
388 return (-1); in kvm_read2()
390 _kvm_err(kd, kd->program, "short read"); in kvm_read2()
396 cc = kd->arch->ka_kvatop(kd, kva, &pa); in kvm_read2()
398 return (-1); in kvm_read2()
402 if (lseek(kd->pmfd, pa, 0) == -1 && errno != 0) { in kvm_read2()
406 cr = read(kd->pmfd, cp, cc); in kvm_read2()
408 _kvm_syserr(kd, kd->program, "kvm_read"); in kvm_read2()
420 len -= cr; in kvm_read2()
423 return (cp - (char *)buf); in kvm_read2()
434 if (!ISALIVE(kd) && !kd->writable) { in kvm_write()
435 _kvm_err(kd, kd->program, in kvm_write()
437 return (-1); in kvm_write()
445 if (lseek(kd->vmfd, (off_t)kva, 0) == -1 && errno != 0) { in kvm_write()
447 return (-1); in kvm_write()
449 cc = write(kd->vmfd, buf, len); in kvm_write()
452 return (-1); in kvm_write()
454 _kvm_err(kd, kd->program, "short write"); in kvm_write()
460 cc = kd->arch->ka_kvatop(kd, kva, &pa); in kvm_write()
462 return (-1); in kvm_write()
466 if (lseek(kd->pmfd, pa, 0) == -1 && errno != 0) { in kvm_write()
470 cw = write(kd->pmfd, cp, cc); in kvm_write()
472 _kvm_syserr(kd, kd->program, "kvm_write"); in kvm_write()
484 len -= cw; in kvm_write()
487 return (cp - (const char *)buf); in kvm_write()
496 return (kd->arch->ka_native(kd)); in kvm_native()
503 if (kd->arch->ka_walk_pages == NULL) in kvm_walk_pages()
506 return (kd->arch->ka_walk_pages(kd, cb, closure)); in kvm_walk_pages()
518 &kernbase_len, NULL, 0) == -1) { in kvm_kerndisp()
519 _kvm_syserr(kd, kd->program, in kvm_kerndisp()
524 &rel_kernbase_len, NULL, 0) == -1) { in kvm_kerndisp()
525 _kvm_syserr(kd, kd->program, in kvm_kerndisp()
529 return (rel_kernbase - kernbase); in kvm_kerndisp()
532 if (kd->arch->ka_kerndisp == NULL) in kvm_kerndisp()
535 return (kd->arch->ka_kerndisp(kd)); in kvm_kerndisp()