summaryrefslogtreecommitdiffstats
path: root/lib/libkvm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libkvm')
-rw-r--r--lib/libkvm/kvm.c183
-rw-r--r--lib/libkvm/kvm_alpha.c11
-rw-r--r--lib/libkvm/kvm_arm32.c8
-rw-r--r--lib/libkvm/kvm_i386.c27
-rw-r--r--lib/libkvm/kvm_m68k.c16
-rw-r--r--lib/libkvm/kvm_mips.c7
-rw-r--r--lib/libkvm/kvm_ns32k.c11
-rw-r--r--lib/libkvm/kvm_private.h6
-rw-r--r--lib/libkvm/kvm_proc.c28
-rw-r--r--lib/libkvm/kvm_sparc.c7
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);
}