diff options
Diffstat (limited to 'lib/libkvm')
-rw-r--r-- | lib/libkvm/kvm.c | 183 | ||||
-rw-r--r-- | lib/libkvm/kvm_alpha.c | 11 | ||||
-rw-r--r-- | lib/libkvm/kvm_arm32.c | 8 | ||||
-rw-r--r-- | lib/libkvm/kvm_i386.c | 27 | ||||
-rw-r--r-- | lib/libkvm/kvm_m68k.c | 16 | ||||
-rw-r--r-- | lib/libkvm/kvm_mips.c | 7 | ||||
-rw-r--r-- | lib/libkvm/kvm_ns32k.c | 11 | ||||
-rw-r--r-- | lib/libkvm/kvm_private.h | 6 | ||||
-rw-r--r-- | lib/libkvm/kvm_proc.c | 28 | ||||
-rw-r--r-- | lib/libkvm/kvm_sparc.c | 7 |
10 files changed, 126 insertions, 178 deletions
diff --git a/lib/libkvm/kvm.c b/lib/libkvm/kvm.c index 372db2b23cc..a71efcd792d 100644 --- a/lib/libkvm/kvm.c +++ b/lib/libkvm/kvm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm.c,v 1.21 2001/05/17 21:03:55 miod Exp $ */ +/* $OpenBSD: kvm.c,v 1.22 2001/05/18 09:08:36 art Exp $ */ /* $NetBSD: kvm.c,v 1.43 1996/05/05 04:31:59 gwr Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)kvm.c 8.2 (Berkeley) 2/13/94"; #else -static char *rcsid = "$OpenBSD: kvm.c,v 1.21 2001/05/17 21:03:55 miod Exp $"; +static char *rcsid = "$OpenBSD: kvm.c,v 1.22 2001/05/18 09:08:36 art Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -81,8 +81,6 @@ static int _kvm_get_header __P((kvm_t *)); static kvm_t *_kvm_open __P((kvm_t *, const char *, const char *, const char *, int, char *)); static int clear_gap __P((kvm_t *, FILE *, int)); -static off_t Lseek __P((kvm_t *, int, off_t, int)); -static ssize_t Read __P(( kvm_t *, int, void *, size_t)); char * kvm_geterr(kd) @@ -98,6 +96,56 @@ kvm_geterr(kd) #endif /* + * Wrapper around pread. + */ +ssize_t +#ifdef __STDC__ +_kvm_pread(kvm_t *kd, int fd, void *buf, size_t nbytes, off_t offset) +#else +_kvm_pread(kd, fd, buf, nbytes, offset) + kvm_t *kd; + int fd; + void *buf; + size_t nbytes; + off_t offset; +#endif +{ +ssize_t rval; + + errno = 0; + rval = pread(fd, buf, nbytes, offset); + if (rval == -1 || errno != 0) { + _kvm_syserr(kd, kd->program, "pread"); + } + return(rval); +} + +/* + * Wrapper around pwrite. + */ +ssize_t +#ifdef __STDC__ +_kvm_pwrite(kvm_t *kd, int fd, void *buf, size_t nbytes, off_t offset) +#else +_kvm_pwrite(kd, fd, buf, nbytes, offset) + kvm_t *kd; + int fd; + void *buf; + size_t nbytes; + off_t offset; +#endif +{ +ssize_t rval; + + errno = 0; + rval = pwrite(fd, buf, nbytes, offset); + if (rval == -1 || errno != 0) { + _kvm_syserr(kd, kd->program, "pwrite"); + } + return(rval); +} + +/* * Report an error using printf style arguments. "program" is kd->program * on hard errors, and 0 on soft errors, so that under sun error emulation, * only hard errors are printed out (otherwise, programs like gdb will @@ -176,42 +224,6 @@ _kvm_malloc(kd, n) return (p); } -/* - * Wrappers for Lseek/Read system calls. They check for errors and - * call _kvm_syserr() if appropriate. - */ -static off_t -Lseek(kd, fd, offset, whence) - kvm_t *kd; - int fd, whence; - off_t offset; -{ - off_t off; - - errno = 0; - if ((off = lseek(fd, offset, whence)) == -1 && errno != 0) { - _kvm_syserr(kd, kd->program, "Lseek"); - return (-1); - } - return (off); -} - -static ssize_t -Read(kd, fd, buf, nbytes) - kvm_t *kd; - int fd; - void *buf; - size_t nbytes; -{ - ssize_t rv; - - errno = 0; - - if ((rv = read(fd, buf, nbytes)) != nbytes && errno != 0) - _kvm_syserr(kd, kd->program, "Read"); - return (rv); -} - static kvm_t * _kvm_open(kd, uf, mf, sf, flag, errout) register kvm_t *kd; @@ -359,11 +371,10 @@ _kvm_get_header(kd) /* * Read the kcore_hdr_t */ - if (Lseek(kd, kd->pmfd, (off_t)0, SEEK_SET) == -1) - return (-1); - sz = Read(kd, kd->pmfd, &kcore_hdr, sizeof(kcore_hdr)); - if (sz != sizeof(kcore_hdr)) + sz = _kvm_pread(kd, kd->pmfd, &kcore_hdr, sizeof(kcore_hdr), (off_t)0); + if (sz != sizeof(kcore_hdr)) { return (-1); + } /* * Currently, we only support dump-files made by the current @@ -393,11 +404,11 @@ _kvm_get_header(kd) /* * Read the CPU segment header */ - if (Lseek(kd, kd->pmfd, (off_t)offset, SEEK_SET) == -1) - goto fail; - sz = Read(kd, kd->pmfd, &cpu_hdr, sizeof(cpu_hdr)); - if (sz != sizeof(cpu_hdr)) + sz = _kvm_pread(kd, kd->pmfd, &cpu_hdr, sizeof(cpu_hdr), (off_t)offset); + if (sz != sizeof(cpu_hdr)) { goto fail; + } + if ((CORE_GETMAGIC(cpu_hdr) != KCORESEG_MAGIC) || (CORE_GETFLAG(cpu_hdr) != CORE_CPU)) goto fail; @@ -410,21 +421,22 @@ _kvm_get_header(kd) kd->cpu_data = _kvm_malloc(kd, cpu_hdr.c_size); if (kd->cpu_data == NULL) goto fail; - if (Lseek(kd, kd->pmfd, (off_t)offset, SEEK_SET) == -1) - goto fail; - sz = Read(kd, kd->pmfd, kd->cpu_data, cpu_hdr.c_size); - if (sz != cpu_hdr.c_size) + + sz = _kvm_pread(kd, kd->pmfd, kd->cpu_data, cpu_hdr.c_size, (off_t)offset); + if (sz != cpu_hdr.c_size) { goto fail; + } + offset += cpu_hdr.c_size; /* * Read the next segment header: data segment */ - if (Lseek(kd, kd->pmfd, (off_t)offset, SEEK_SET) == -1) - goto fail; - sz = Read(kd, kd->pmfd, &mem_hdr, sizeof(mem_hdr)); - if (sz != sizeof(mem_hdr)) + sz = _kvm_pread(kd, kd->pmfd, &mem_hdr, sizeof(mem_hdr), (off_t)offset); + if (sz != sizeof(mem_hdr)) { goto fail; + } + offset += kcore_hdr.c_seghdrsize; if ((CORE_GETMAGIC(mem_hdr) != KCORESEG_MAGIC) || @@ -475,11 +487,10 @@ off_t dump_off; /* * Validate new format crash dump */ - if (Lseek(kd, kd->pmfd, dump_off, SEEK_SET) == -1) - return (-1); - sz = Read(kd, kd->pmfd, &cpu_hdr, sizeof(cpu_hdr)); - if (sz != sizeof(cpu_hdr)) + sz = _kvm_pread(kd, kd->pmfd, &cpu_hdr, sizeof(cpu_hdr), (off_t)dump_off); + if (sz != sizeof(cpu_hdr)) { return (-1); + } if ((CORE_GETMAGIC(cpu_hdr) != KCORE_MAGIC) || (CORE_GETMID(cpu_hdr) != MID_MACHINE)) { _kvm_err(kd, 0, "invalid magic in cpu_hdr"); @@ -494,9 +505,8 @@ off_t dump_off; kd->cpu_data = _kvm_malloc(kd, kd->cpu_dsize); if (kd->cpu_data == NULL) goto fail; - if (Lseek(kd, kd->pmfd, dump_off+hdr_size, SEEK_SET) == -1) - goto fail; - sz = Read(kd, kd->pmfd, kd->cpu_data, cpu_hdr.c_size); + + sz = _kvm_pread(kd, kd->pmfd, kd->cpu_data, cpu_hdr.c_size, (off_t)dump_off+hdr_size); if (sz != cpu_hdr.c_size) { _kvm_err(kd, 0, "invalid size in cpu_hdr"); goto fail; @@ -507,8 +517,9 @@ off_t dump_off; * Leave phys mem pointer at beginning of memory data */ kd->dump_off = dump_off + hdr_size; - if (Lseek(kd, kd->pmfd, kd->dump_off, SEEK_SET) == -1) { - _kvm_err(kd, 0, "invalid dump offset"); + errno = 0; + if (lseek(kd->pmfd, kd->dump_off, SEEK_SET) != kd->dump_off && errno != 0) { + _kvm_err(kd, 0, "invalid dump offset - lseek"); goto fail; } @@ -871,15 +882,9 @@ kvm_t *kd; if (_kvm_kvatop(kd, (u_long)nlist[0].n_value, &pa) == 0) return (-1); - errno = 0; - if (lseek(kd->pmfd, _kvm_pa2off(kd, pa), SEEK_SET) == -1 - && errno != 0) { - _kvm_err(kd, 0, "cannot invalidate dump - lseek"); - return (-1); - } pa = 0; - if (write(kd->pmfd, &pa, sizeof(pa)) != sizeof(pa)) { - _kvm_err(kd, 0, "cannot invalidate dump - write"); + if (_kvm_pwrite(kd, kd->pmfd, &pa, sizeof(pa), (off_t)_kvm_pa2off(kd, pa)) != sizeof(pa)) { + _kvm_err(kd, 0, "cannot invalidate dump"); return (-1); } return (0); @@ -900,15 +905,9 @@ kvm_read(kd, kva, buf, len) * We're using /dev/kmem. Just read straight from the * device and let the active kernel do the address translation. */ - errno = 0; - if (lseek(kd->vmfd, (off_t)kva, SEEK_SET) == -1 - && errno != 0) { - _kvm_err(kd, 0, "invalid address (%lx)", kva); - return (-1); - } - cc = read(kd->vmfd, buf, len); + cc = _kvm_pread(kd, kd->vmfd, buf, len, (off_t)kva); if (cc < 0) { - _kvm_syserr(kd, 0, "kvm_read"); + _kvm_err(kd, 0, "invalid address (%lx)", kva); return (-1); } else if (cc < len) _kvm_err(kd, kd->program, "short read"); @@ -921,7 +920,6 @@ kvm_read(kd, kva, buf, len) cp = buf; while (len > 0) { u_long pa; - off_t foff; /* In case of error, _kvm_kvatop sets the err string */ cc = _kvm_kvatop(kd, kva, &pa); @@ -929,16 +927,9 @@ kvm_read(kd, kva, buf, len) return (-1); if (cc > len) cc = len; - foff = _kvm_pa2off(kd, pa); - errno = 0; - if (lseek(kd->pmfd, foff, SEEK_SET) == -1 - && errno != 0) { - _kvm_syserr(kd, 0, _PATH_MEM); - break; - } - cc = read(kd->pmfd, cp, cc); + cc = _kvm_pread(kd, kd->pmfd, cp, cc, (off_t)_kvm_pa2off(kd, pa)); if (cc < 0) { - _kvm_syserr(kd, kd->program, "kvm_read"); + _kvm_syserr(kd, 0, _PATH_MEM); break; } /* @@ -971,15 +962,9 @@ kvm_write(kd, kva, buf, len) /* * Just like kvm_read, only we write. */ - errno = 0; - if (lseek(kd->vmfd, (off_t)kva, SEEK_SET) == -1 - && errno != 0) { - _kvm_err(kd, 0, "invalid address (%lx)", kva); - return (-1); - } - cc = write(kd->vmfd, buf, len); + cc = _kvm_pwrite(kd, kd->vmfd, (void*)buf, (size_t)len, (off_t)kva); if (cc < 0) { - _kvm_syserr(kd, 0, "kvm_write"); + _kvm_err(kd, 0, "invalid address (%lx)", kva); return (-1); } else if (cc < len) _kvm_err(kd, kd->program, "short write"); diff --git a/lib/libkvm/kvm_alpha.c b/lib/libkvm/kvm_alpha.c index 84f385d9951..40fc3304826 100644 --- a/lib/libkvm/kvm_alpha.c +++ b/lib/libkvm/kvm_alpha.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_alpha.c,v 1.6 2001/01/22 14:01:28 art Exp $ */ +/* $OpenBSD: kvm_alpha.c,v 1.7 2001/05/18 09:08:37 art Exp $ */ /* $NetBSD: kvm_alpha.c,v 1.5 1996/10/01 21:12:05 cgd Exp $ */ /* @@ -128,8 +128,7 @@ _kvm_kvatop(kd, va, pa) /* Find and read the L1 PTE. */ pteoff = cpu_kh->lev1map_pa + l1pte_index(va) * sizeof(alpha_pt_entry_t); - if (lseek(kd->pmfd, _kvm_pa2off(kd, pteoff), 0) == -1 || - read(kd->pmfd, (char *)&pte, sizeof(pte)) != sizeof(pte)) { + if (_kvm_pread(kd, kd->pmfd, (char *)&pte, sizeof(pte), (off_t)_kvm_pa2off(kd, pteoff)) != sizeof(pte)) { _kvm_syserr(kd, 0, "could not read L1 PTE"); goto lose; } @@ -141,8 +140,7 @@ _kvm_kvatop(kd, va, pa) } pteoff = ALPHA_PTE_TO_PFN(pte) * cpu_kh->page_size + l2pte_index(va) * sizeof(alpha_pt_entry_t); - if (lseek(kd->pmfd, _kvm_pa2off(kd, pteoff), 0) == -1 || - read(kd->pmfd, (char *)&pte, sizeof(pte)) != sizeof(pte)) { + if (_kvm_pread(kd, kd->pmfd, (char *)&pte, sizeof(pte), (off_t)_kvm_pa2off(kd, pteoff)) != sizeof(pte)) { _kvm_syserr(kd, 0, "could not read L2 PTE"); goto lose; } @@ -154,8 +152,7 @@ _kvm_kvatop(kd, va, pa) } pteoff = ALPHA_PTE_TO_PFN(pte) * cpu_kh->page_size + l3pte_index(va) * sizeof(alpha_pt_entry_t); - if (lseek(kd->pmfd, _kvm_pa2off(kd, pteoff), 0) == -1 || - read(kd->pmfd, (char *)&pte, sizeof(pte)) != sizeof(pte)) { + if (_kvm_pread(kd, kd->pmfd, (char *)&pte, sizeof(pte), (off_t)_kvm_pa2off(kd, pteoff)) != sizeof(pte)) { _kvm_syserr(kd, 0, "could not read L3 PTE"); goto lose; } diff --git a/lib/libkvm/kvm_arm32.c b/lib/libkvm/kvm_arm32.c index ff2fe048f25..9a4b2bb4b37 100644 --- a/lib/libkvm/kvm_arm32.c +++ b/lib/libkvm/kvm_arm32.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_arm32.c,v 1.2 1997/02/26 16:46:29 niklas Exp $ */ +/* $OpenBSD: kvm_arm32.c,v 1.3 2001/05/18 09:08:37 art Exp $ */ /* $NetBSD: kvm_arm32.c,v 1.2 1996/03/18 22:33:16 thorpej Exp $ */ /* @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93"; #else -static char *rcsid = "$OpenBSD: kvm_arm32.c,v 1.2 1997/02/26 16:46:29 niklas Exp $"; +static char *rcsid = "$OpenBSD: kvm_arm32.c,v 1.3 2001/05/18 09:08:37 art Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -189,9 +189,7 @@ _kvm_uvatop(kd, p, va, pa) goto invalid; pteloc = (pt_entry_t *)(pde & PG_FRAME) + btop(va & PT_MASK); - if (lseek(kd->pmfd, (off_t)(u_long)pteloc, 0) != (off_t)(u_long)pteloc) - goto invalid; - if (read(kd->pmfd, (char *)&pte, sizeof(pte)) != sizeof(pte)) + if (_kvm_pread(kd, (kd->pmfd, (char *)&pte, sizeof(pte), (off_t)(u_long)pteloc) != sizeof(pte)) goto invalid; if (pte == 0) goto invalid; diff --git a/lib/libkvm/kvm_i386.c b/lib/libkvm/kvm_i386.c index dcddba2c7da..574fb9224da 100644 --- a/lib/libkvm/kvm_i386.c +++ b/lib/libkvm/kvm_i386.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_i386.c,v 1.6 2000/04/16 21:02:04 mickey Exp $ */ +/* $OpenBSD: kvm_i386.c,v 1.7 2001/05/18 09:08:37 art Exp $ */ /* $NetBSD: kvm_i386.c,v 1.9 1996/03/18 22:33:38 thorpej Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93"; #else -static char *rcsid = "$OpenBSD: kvm_i386.c,v 1.6 2000/04/16 21:02:04 mickey Exp $"; +static char *rcsid = "$OpenBSD: kvm_i386.c,v 1.7 2001/05/18 09:08:37 art Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -109,24 +109,13 @@ _kvm_initvtop(kd) vm->PTD = 0; - if (lseek(kd->pmfd, _kvm_pa2off(kd, nlist[0].n_value - KERNBASE), - SEEK_SET) == -1 && errno != 0) { - _kvm_syserr(kd, kd->program, "kvm_lseek"); - goto invalid; - } - if (read(kd->pmfd, &pa, sizeof pa) != sizeof pa) { - _kvm_syserr(kd, kd->program, "kvm_read"); + if (_kvm_pread(kd, kd->pmfd, &pa, sizeof pa, (off_t)_kvm_pa2off(kd, nlist[0].n_value - KERNBASE)) != sizeof pa) { goto invalid; } vm->PTD = (pd_entry_t *)_kvm_malloc(kd, NBPG); - if (lseek(kd->pmfd, _kvm_pa2off(kd, pa), SEEK_SET) == -1 && errno != 0) { - _kvm_syserr(kd, kd->program, "kvm_lseek"); - goto invalid; - } - if (read(kd->pmfd, vm->PTD, NBPG) != NBPG) { - _kvm_syserr(kd, kd->program, "kvm_read"); + if (_kvm_pread(kd, kd->pmfd, vm->PTD, NBPG, (off_t)_kvm_pa2off(kd, pa)) != NBPG) { goto invalid; } @@ -175,13 +164,7 @@ _kvm_kvatop(kd, va, pa) (ptei(va) * sizeof(pt_entry_t)); /* XXX READ PHYSICAL XXX */ { - if (lseek(kd->pmfd, _kvm_pa2off(kd, pte_pa), SEEK_SET) == -1 && - errno != 0) { - _kvm_syserr(kd, kd->program, "kvm_lseek"); - goto invalid; - } - if (read(kd->pmfd, &pte, sizeof pte) != sizeof pte) { - _kvm_syserr(kd, kd->program, "kvm_read"); + if (_kvm_pread(kd, kd->pmfd, &pte, sizeof pte, (off_t)_kvm_pa2off(kd, pte_pa)) != sizeof pte) { goto invalid; } } diff --git a/lib/libkvm/kvm_m68k.c b/lib/libkvm/kvm_m68k.c index 42a98c1fa0b..50e72b33943 100644 --- a/lib/libkvm/kvm_m68k.c +++ b/lib/libkvm/kvm_m68k.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_m68k.c,v 1.5 1997/02/26 16:46:31 niklas Exp $ */ +/* $OpenBSD: kvm_m68k.c,v 1.6 2001/05/18 09:08:37 art Exp $ */ /* $NetBSD: kvm_m68k.c,v 1.9 1996/05/07 06:09:11 leo Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93"; #else -static char *rcsid = "$OpenBSD: kvm_m68k.c,v 1.5 1997/02/26 16:46:31 niklas Exp $"; +static char *rcsid = "$OpenBSD: kvm_m68k.c,v 1.6 2001/05/18 09:08:37 art Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -133,8 +133,7 @@ _kvm_vatop(kd, sta, va, pa) * Fortunately it is 1-to-1 mapped so we don't have to. */ if (sta == cpu_kh->sysseg_pa) { - if (lseek(kd->pmfd, _kvm_pa2off(kd, addr), 0) == -1 || - read(kd->pmfd, (char *)&ste, sizeof(ste)) < 0) + if (_kvm_pread(kd, (kd->pmfd, (char *)&ste, sizeof(ste), (off_t)_kvm_pa2off(kd, addr)) < 0) goto invalid; } else if (KREAD(kd, addr, &ste)) goto invalid; @@ -149,8 +148,7 @@ _kvm_vatop(kd, sta, va, pa) * Address from level 1 STE is a physical address, * so don't use kvm_read. */ - if (lseek(kd->pmfd, _kvm_pa2off(kd, addr), 0) == -1 || - read(kd->pmfd, (char *)&ste, sizeof(ste)) < 0) + if (_kvm_pread(kd, kd->pmfd, (char *)&ste, sizeof(ste), (off_t)_kvm_pa2off(kd, addr)) < 0) goto invalid; if ((ste & SG_V) == 0) { _kvm_err(kd, 0, "invalid level 2 descriptor (%x)", @@ -166,8 +164,7 @@ _kvm_vatop(kd, sta, va, pa) * Fortunately it is 1-to-1 mapped so we don't have to. */ if (sta == cpu_kh->sysseg_pa) { - if (lseek(kd->pmfd, _kvm_pa2off(kd, addr), 0) == -1 || - read(kd->pmfd, (char *)&ste, sizeof(ste)) < 0) + if (_kvm_pread(kd, kd->pmfd, (char *)&ste, sizeof(ste), (off_t)_kvm_pa2off(kd, addr)) < 0) goto invalid; } else if (KREAD(kd, addr, &ste)) goto invalid; @@ -181,8 +178,7 @@ _kvm_vatop(kd, sta, va, pa) /* * Address from STE is a physical address so don't use kvm_read. */ - if (lseek(kd->pmfd, _kvm_pa2off(kd, addr), 0) == -1 || - read(kd->pmfd, (char *)&pte, sizeof(pte)) < 0) + if (_kvm_pread(kd, kd->pmfd, (char *)&pte, sizeof(pte), (off_t)_kvm_pa2off(kd, addr)) < 0) goto invalid; addr = pte & PG_FRAME; if (pte == PG_NV) { diff --git a/lib/libkvm/kvm_mips.c b/lib/libkvm/kvm_mips.c index bd27e345a4d..40dc1a4eb9a 100644 --- a/lib/libkvm/kvm_mips.c +++ b/lib/libkvm/kvm_mips.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_mips.c,v 1.5 1998/08/31 18:02:21 pefo Exp $ */ +/* $OpenBSD: kvm_mips.c,v 1.6 2001/05/18 09:08:38 art Exp $ */ /* $NetBSD: kvm_mips.c,v 1.3 1996/03/18 22:33:44 thorpej Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)kvm_mips.c 8.1 (Berkeley) 6/4/93"; #else -static char *rcsid = "$OpenBSD: kvm_mips.c,v 1.5 1998/08/31 18:02:21 pefo Exp $"; +static char *rcsid = "$OpenBSD: kvm_mips.c,v 1.6 2001/05/18 09:08:38 art Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -156,8 +156,7 @@ _kvm_kvatop(kd, va, pa) * Can't use KREAD to read kernel segment table entries. * Fortunately it is 1-to-1 mapped so we don't have to. */ - if (lseek(kd->pmfd, (off_t)addr, 0) < 0 || - read(kd->pmfd, (char *)&pte, sizeof(pte)) < 0) + if (_kvm_pread(kd, (kd->pmfd, (char *)&pte, sizeof(pte), (off_t)addr) < 0) goto invalid; if (!(pte & PG_V)) goto invalid; diff --git a/lib/libkvm/kvm_ns32k.c b/lib/libkvm/kvm_ns32k.c index f8e5e26e424..c3274b31f41 100644 --- a/lib/libkvm/kvm_ns32k.c +++ b/lib/libkvm/kvm_ns32k.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_ns32k.c,v 1.3 1997/02/26 16:46:32 niklas Exp $ */ +/* $OpenBSD: kvm_ns32k.c,v 1.4 2001/05/18 09:08:38 art Exp $ */ /* $NetBSD: kvm_ns32k.c,v 1.4 1996/03/18 22:33:50 thorpej Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93"; #else -static char *rcsid = "$OpenBSD: kvm_ns32k.c,v 1.3 1997/02/26 16:46:32 niklas Exp $"; +static char *rcsid = "$OpenBSD: kvm_ns32k.c,v 1.4 2001/05/18 09:08:38 art Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -170,12 +170,7 @@ _kvm_kvatop(kd, va, pa) (ptei(va) * sizeof(pt_entry_t)); /* XXX READ PHYSICAL XXX */ { - if (lseek(kd->pmfd, (off_t)pte_pa, 0) == -1 && errno != 0) { - _kvm_syserr(kd, 0, "kvm_lseek"); - goto invalid; - } - if (read(kd->pmfd, &pte, sizeof pte) != sizeof pte) { - _kvm_syserr(kd, kd->program, "kvm_read"); + if (_kvm_pread(kd, (kd->pmfd, &pte, sizeof pte), (off_t)pte_pa) != sizeof pte) { goto invalid; } } diff --git a/lib/libkvm/kvm_private.h b/lib/libkvm/kvm_private.h index a1dbf75989f..5f0808a546b 100644 --- a/lib/libkvm/kvm_private.h +++ b/lib/libkvm/kvm_private.h @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_private.h,v 1.4 1996/05/10 12:58:33 deraadt Exp $ */ +/* $OpenBSD: kvm_private.h,v 1.5 2001/05/18 09:08:38 art Exp $ */ /* $NetBSD: kvm_private.h,v 1.7 1996/05/05 04:32:15 gwr Exp $ */ /*- @@ -101,3 +101,7 @@ off_t _kvm_pa2off __P((kvm_t *, u_long)); void *_kvm_realloc __P((kvm_t *kd, void *, size_t)); void _kvm_syserr __P((kvm_t *kd, const char *program, const char *fmt, ...)); +ssize_t _kvm_pread + __P((kvm_t *, int, void *, size_t, off_t)); +ssize_t _kvm_pwrite + __P((kvm_t *, int, void *, size_t, off_t)); diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c index 3f2117d058f..6980f46e1ca 100644 --- a/lib/libkvm/kvm_proc.c +++ b/lib/libkvm/kvm_proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_proc.c,v 1.6 2000/06/18 17:59:54 niklas Exp $ */ +/* $OpenBSD: kvm_proc.c,v 1.7 2001/05/18 09:08:38 art Exp $ */ /* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -77,7 +77,7 @@ #if 0 static char sccsid[] = "@(#)kvm_proc.c 8.3 (Berkeley) 9/23/93"; #else -static char *rcsid = "$OpenBSD: kvm_proc.c,v 1.6 2000/06/18 17:59:54 niklas Exp $"; +static char *rcsid = "$OpenBSD: kvm_proc.c,v 1.7 2001/05/18 09:08:38 art Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -222,19 +222,13 @@ _kvm_uread(kd, p, va, cnt) if (KREAD(kd, addr, &pg)) return NULL; - if (lseek(kd->pmfd, pg.phys_addr, SEEK_SET) < 0) - return NULL; - - if (read(kd->pmfd, (void *)kd->swapspc, (size_t)kd->nbpg) - != kd->nbpg) + if (_kvm_pread(kd, kd->pmfd, (void *)kd->swapspc, (size_t)kd->nbpg, (off_t)pg.phys_addr) != kd->nbpg) { return NULL; + } } else { - if (lseek(kd->swfd, (off_t)(anon.an_swslot * kd->nbpg), - SEEK_SET) < 0) - return NULL; - if (read(kd->swfd, (void *)kd->swapspc, (size_t)kd->nbpg) - != kd->nbpg) + if (_kvm_pread(kd, kd->swfd, (void *)kd->swapspc, (size_t)kd->nbpg, (off_t)(anon.an_swslot * kd->nbpg)) != kd->nbpg) { return NULL; + } } #else @@ -334,10 +328,9 @@ _kvm_readfromcore(kd, object, offset) seekpoint = mem.phys_addr; - if (lseek(kd->pmfd, seekpoint, 0) == -1) - return (-1); - if (read(kd->pmfd, kd->swapspc, kd->nbpg) != kd->nbpg) + if (_kvm_pread(kd, kd->pmfd, kd->swapspc, kd->nbpg, (off_t)seekpoint) != kd->nbpg) { return (-1); + } return (1); } @@ -413,10 +406,9 @@ _kvm_readfrompager(kd, vmop, offset) /* Calculate the physical address and read the page. */ seekpoint = dbtob(swb.swb_block) + (offset & ~(kd->nbpg -1)); - if (lseek(kd->swfd, seekpoint, 0) == -1) - return (-1); - if (read(kd->swfd, kd->swapspc, kd->nbpg) != kd->nbpg) + if (_kvm_pread(kd, kd->swfd, kd->swapspc, kd->nbpg, (off_t)seekpoint) != kd->nbpg) { return (-1); + } return (1); } diff --git a/lib/libkvm/kvm_sparc.c b/lib/libkvm/kvm_sparc.c index 92ed157a9b3..f37348c93df 100644 --- a/lib/libkvm/kvm_sparc.c +++ b/lib/libkvm/kvm_sparc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_sparc.c,v 1.4 1997/06/11 10:32:16 grr Exp $ */ +/* $OpenBSD: kvm_sparc.c,v 1.5 2001/05/18 09:08:38 art Exp $ */ /* $NetBSD: kvm_sparc.c,v 1.9 1996/04/01 19:23:03 cgd Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)kvm_sparc.c 8.1 (Berkeley) 6/4/93"; #else -static char *rcsid = "$OpenBSD: kvm_sparc.c,v 1.4 1997/06/11 10:32:16 grr Exp $"; +static char *rcsid = "$OpenBSD: kvm_sparc.c,v 1.5 2001/05/18 09:08:38 art Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -226,8 +226,7 @@ _kvm_kvatop4m(kd, va, pa) if (foff == (off_t)-1) return (0); - if (lseek(kd->pmfd, foff, 0) == -1 || - read(kd->pmfd, (void *)&pte, sizeof(pte)) < 0) { + if (_kvm_pread(kd, kd->pmfd, (void *)&pte, sizeof(pte), foff) < 0) { _kvm_err(kd, kd->program, "cannot read pte for %x", va); return (0); } |