[Midnightbsd-cvs] src [10668] trunk/lib/libkvm: sync
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sat Jun 9 15:33:17 EDT 2018
Revision: 10668
http://svnweb.midnightbsd.org/src/?rev=10668
Author: laffer1
Date: 2018-06-09 15:33:16 -0400 (Sat, 09 Jun 2018)
Log Message:
-----------
sync
Modified Paths:
--------------
trunk/lib/libkvm/Makefile
trunk/lib/libkvm/kvm.3
trunk/lib/libkvm/kvm.c
trunk/lib/libkvm/kvm.h
trunk/lib/libkvm/kvm_amd64.c
trunk/lib/libkvm/kvm_arm.c
trunk/lib/libkvm/kvm_cptime.c
trunk/lib/libkvm/kvm_file.c
trunk/lib/libkvm/kvm_getcptime.3
trunk/lib/libkvm/kvm_geterr.3
trunk/lib/libkvm/kvm_getfiles.3
trunk/lib/libkvm/kvm_getloadavg.3
trunk/lib/libkvm/kvm_getloadavg.c
trunk/lib/libkvm/kvm_getpcpu.3
trunk/lib/libkvm/kvm_getprocs.3
trunk/lib/libkvm/kvm_getswapinfo.3
trunk/lib/libkvm/kvm_getswapinfo.c
trunk/lib/libkvm/kvm_i386.c
trunk/lib/libkvm/kvm_ia64.c
trunk/lib/libkvm/kvm_minidump_amd64.c
trunk/lib/libkvm/kvm_minidump_arm.c
trunk/lib/libkvm/kvm_minidump_i386.c
trunk/lib/libkvm/kvm_minidump_mips.c
trunk/lib/libkvm/kvm_mips.c
trunk/lib/libkvm/kvm_nlist.3
trunk/lib/libkvm/kvm_open.3
trunk/lib/libkvm/kvm_pcpu.c
trunk/lib/libkvm/kvm_powerpc.c
trunk/lib/libkvm/kvm_powerpc64.c
trunk/lib/libkvm/kvm_private.h
trunk/lib/libkvm/kvm_proc.c
trunk/lib/libkvm/kvm_read.3
trunk/lib/libkvm/kvm_sparc.c
trunk/lib/libkvm/kvm_sparc64.c
trunk/lib/libkvm/kvm_vnet.c
Property Changed:
----------------
trunk/lib/libkvm/kvm.3
trunk/lib/libkvm/kvm_getcptime.3
trunk/lib/libkvm/kvm_geterr.3
trunk/lib/libkvm/kvm_getfiles.3
trunk/lib/libkvm/kvm_getloadavg.3
trunk/lib/libkvm/kvm_getpcpu.3
trunk/lib/libkvm/kvm_getprocs.3
trunk/lib/libkvm/kvm_getswapinfo.3
trunk/lib/libkvm/kvm_nlist.3
trunk/lib/libkvm/kvm_open.3
trunk/lib/libkvm/kvm_read.3
Modified: trunk/lib/libkvm/Makefile
===================================================================
--- trunk/lib/libkvm/Makefile 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/Makefile 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,8 +1,10 @@
+# $MidnightBSD$
# @(#)Makefile 8.1 (Berkeley) 6/4/93
-# $FreeBSD$
+# $FreeBSD: stable/10/lib/libkvm/Makefile 319012 2017-05-27 23:26:10Z ngie $
LIB= kvm
SHLIBDIR?= /lib
+SHLIB_MAJOR= 6
CFLAGS+=-DLIBC_SCCS -I${.CURDIR}
.if exists(${.CURDIR}/kvm_${MACHINE_ARCH}.c)
@@ -25,10 +27,18 @@
kvm_getpcpu.3 kvm_getprocs.3 kvm_getswapinfo.3 kvm_nlist.3 kvm_open.3 \
kvm_read.3
-MLINKS+=kvm_getpcpu.3 kvm_getmaxcpu.3
-MLINKS+=kvm_getpcpu.3 kvm_dpcpu_setcpu.3
+MLINKS+=kvm_getpcpu.3 kvm_getmaxcpu.3 \
+ kvm_getpcpu.3 kvm_dpcpu_setcpu.3 \
+ kvm_getpcpu.3 kvm_read_zpcpu.3 \
+ kvm_getpcpu.3 kvm_counter_u64_fetch.3
MLINKS+=kvm_getprocs.3 kvm_getargv.3 kvm_getprocs.3 kvm_getenvv.3
MLINKS+=kvm_open.3 kvm_close.3 kvm_open.3 kvm_openfiles.3
MLINKS+=kvm_read.3 kvm_write.3
+.include <bsd.own.mk>
+
+.if ${MK_TESTS} != "no"
+SUBDIR+= tests
+.endif
+
.include <bsd.lib.mk>
Modified: trunk/lib/libkvm/kvm.3
===================================================================
--- trunk/lib/libkvm/kvm.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 1992, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -30,7 +31,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kvm.3 8.1 (Berkeley) 6/4/93
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm.3 207187 2010-04-25 12:50:30Z jilles $
.\"
.Dd April 25, 2010
.Dt KVM 3
Property changes on: trunk/lib/libkvm/kvm.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm.c
===================================================================
--- trunk/lib/libkvm/kvm.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1989, 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm.c 316072 2017-03-28 06:05:26Z ngie $");
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
@@ -76,9 +77,14 @@
/* from src/lib/libc/gen/nlist.c */
int __fdnlist(int, struct nlist *);
+static char _kd_is_null[] = "";
+
char *
kvm_geterr(kvm_t *kd)
{
+
+ if (kd == NULL)
+ return (_kd_is_null);
return (kd->errbuf);
}
@@ -198,8 +204,10 @@
return (kd);
}
}
+
/*
- * This is a crash dump.
+ * This is either a crash dump or a remote live system with its physical
+ * memory fully accessible via a special device.
* Initialize the virtual address translation machinery,
* but first setup the namelist fd.
*/
@@ -207,8 +215,11 @@
_kvm_syserr(kd, kd->program, "%s", uf);
goto failed;
}
- if (strncmp(mf, _PATH_FWMEM, strlen(_PATH_FWMEM)) == 0)
+ if (strncmp(mf, _PATH_FWMEM, strlen(_PATH_FWMEM)) == 0 ||
+ strncmp(mf, _PATH_DEVVMM, strlen(_PATH_DEVVMM)) == 0) {
kd->rawdump = 1;
+ kd->writable = 1;
+ }
if (_kvm_initvtop(kd) < 0)
goto failed;
return (kd);
@@ -219,7 +230,7 @@
if (errout != 0)
strlcpy(errout, kd->errbuf, _POSIX2_LINE_MAX);
(void)kvm_close(kd);
- return (0);
+ return (NULL);
}
kvm_t *
@@ -230,7 +241,7 @@
if ((kd = calloc(1, sizeof(*kd))) == NULL) {
(void)strlcpy(errout, strerror(errno), _POSIX2_LINE_MAX);
- return (0);
+ return (NULL);
}
kd->program = 0;
return (_kvm_open(kd, uf, mf, flag, errout));
@@ -246,7 +257,7 @@
if (errstr != NULL)
(void)fprintf(stderr, "%s: %s\n",
errstr, strerror(errno));
- return (0);
+ return (NULL);
}
kd->program = errstr;
return (_kvm_open(kd, uf, mf, flag, NULL));
@@ -257,6 +268,10 @@
{
int error = 0;
+ if (kd == NULL) {
+ errno = EINVAL;
+ return (-1);
+ }
if (kd->pmfd >= 0)
error |= close(kd->pmfd);
if (kd->vmfd >= 0)
@@ -275,7 +290,7 @@
free((void *)kd->argv);
free((void *)kd);
- return (0);
+ return (error);
}
/*
@@ -557,7 +572,16 @@
kvm_write(kvm_t *kd, u_long kva, const void *buf, size_t len)
{
int cc;
+ ssize_t cw;
+ off_t pa;
+ const char *cp;
+ if (!ISALIVE(kd) && !kd->writable) {
+ _kvm_err(kd, kd->program,
+ "kvm_write not implemented for dead kernels");
+ return (-1);
+ }
+
if (ISALIVE(kd)) {
/*
* Just like kvm_read, only we write.
@@ -574,10 +598,36 @@
} else if ((size_t)cc < len)
_kvm_err(kd, kd->program, "short write");
return (cc);
- } else {
- _kvm_err(kd, kd->program,
- "kvm_write not implemented for dead kernels");
- return (-1);
}
- /* NOTREACHED */
+
+ cp = buf;
+ while (len > 0) {
+ cc = _kvm_kvatop(kd, kva, &pa);
+ if (cc == 0)
+ return (-1);
+ if (cc > (ssize_t)len)
+ cc = len;
+ errno = 0;
+ if (lseek(kd->pmfd, pa, 0) == -1 && errno != 0) {
+ _kvm_syserr(kd, 0, _PATH_MEM);
+ break;
+ }
+ cw = write(kd->pmfd, cp, cc);
+ if (cw < 0) {
+ _kvm_syserr(kd, kd->program, "kvm_write");
+ break;
+ }
+ /*
+ * If ka_kvatop returns a bogus value or our core file is
+ * truncated, we might wind up seeking beyond the end of the
+ * core file in which case the read will return 0 (EOF).
+ */
+ if (cw == 0)
+ break;
+ cp += cw;
+ kva += cw;
+ len -= cw;
+ }
+
+ return (cp - (const char *)buf);
}
Modified: trunk/lib/libkvm/kvm.h
===================================================================
--- trunk/lib/libkvm/kvm.h 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm.h 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
@@ -27,7 +28,7 @@
* SUCH DAMAGE.
*
* @(#)kvm.h 8.1 (Berkeley) 6/2/93
- * $FreeBSD$
+ * $FreeBSD: stable/10/lib/libkvm/kvm.h 312253 2017-01-16 03:52:20Z pfg $
*/
#ifndef _KVM_H_
@@ -34,7 +35,7 @@
#define _KVM_H_
#include <sys/cdefs.h>
-#include <sys/_types.h>
+#include <sys/types.h>
#include <nlist.h>
/* Default version symbol. */
@@ -58,11 +59,11 @@
struct kvm_swap {
char ksw_devname[32];
- int ksw_used;
- int ksw_total;
+ u_int ksw_used;
+ u_int ksw_total;
int ksw_flags;
- int ksw_reserved1;
- int ksw_reserved2;
+ u_int ksw_reserved1;
+ u_int ksw_reserved2;
};
#define SWIF_DEV_PREFIX 0x0002
@@ -77,7 +78,9 @@
char *kvm_getfiles(kvm_t *, int, int, int *);
int kvm_getloadavg(kvm_t *, double [], int);
int kvm_getmaxcpu(kvm_t *);
+int kvm_getncpus(kvm_t *);
void *kvm_getpcpu(kvm_t *, int);
+uint64_t kvm_counter_u64_fetch(kvm_t *, u_long);
struct kinfo_proc *
kvm_getprocs(kvm_t *, int, int, int *);
int kvm_getswapinfo(kvm_t *, struct kvm_swap *, int, int);
@@ -87,8 +90,7 @@
kvm_t *kvm_openfiles
(const char *, const char *, const char *, int, char *);
ssize_t kvm_read(kvm_t *, unsigned long, void *, size_t);
-ssize_t kvm_uread
- (kvm_t *, const struct kinfo_proc *, unsigned long, char *, size_t);
+ssize_t kvm_read_zpcpu(kvm_t *, unsigned long, void *, size_t, int);
ssize_t kvm_write(kvm_t *, unsigned long, const void *, size_t);
__END_DECLS
Modified: trunk/lib/libkvm/kvm_amd64.c
===================================================================
--- trunk/lib/libkvm/kvm_amd64.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_amd64.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1989, 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_amd64.c 299649 2016-05-13 09:49:52Z ngie $");
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
@@ -200,6 +201,7 @@
PML4 = _kvm_malloc(kd, PAGE_SIZE);
if (kvm_read(kd, pa, PML4, PAGE_SIZE) != PAGE_SIZE) {
_kvm_err(kd, kd->program, "cannot read KPML4phys");
+ free(PML4);
return (-1);
}
kd->vmst->PML4 = PML4;
Modified: trunk/lib/libkvm/kvm_arm.c
===================================================================
--- trunk/lib/libkvm/kvm_arm.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_arm.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2005 Olivier Houchard
* Copyright (c) 1989, 1992, 1993
@@ -36,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_arm.c 273828 2014-10-29 16:36:08Z andrew $");
#include <sys/param.h>
#include <sys/elf32.h>
@@ -128,8 +129,10 @@
u_long kernbase, physaddr, pa;
pd_entry_t *l1pt;
Elf32_Ehdr *ehdr;
+ Elf32_Phdr *phdr;
size_t hdrsz;
char minihdr[8];
+ int found, i;
if (!kd->rawdump) {
if (pread(kd->pmfd, &minihdr, 8, 0) == 8) {
@@ -154,19 +157,33 @@
hdrsz = ehdr->e_phoff + ehdr->e_phentsize * ehdr->e_phnum;
if (_kvm_maphdrs(kd, hdrsz) == -1)
return (-1);
- nl[0].n_name = "kernbase";
+
+ phdr = (Elf32_Phdr *)((uint8_t *)ehdr + ehdr->e_phoff);
+ found = 0;
+ for (i = 0; i < ehdr->e_phnum; i++) {
+ if (phdr[i].p_type == PT_DUMP_DELTA) {
+ kernbase = phdr[i].p_vaddr;
+ physaddr = phdr[i].p_paddr;
+ found = 1;
+ break;
+ }
+ }
+
nl[1].n_name = NULL;
- if (kvm_nlist(kd, nl) != 0)
- kernbase = KERNBASE;
- else
- kernbase = nl[0].n_value;
+ if (!found) {
+ nl[0].n_name = "kernbase";
+ if (kvm_nlist(kd, nl) != 0)
+ kernbase = KERNBASE;
+ else
+ kernbase = nl[0].n_value;
- nl[0].n_name = "physaddr";
- if (kvm_nlist(kd, nl) != 0) {
- _kvm_err(kd, kd->program, "couldn't get phys addr");
- return (-1);
+ nl[0].n_name = "physaddr";
+ if (kvm_nlist(kd, nl) != 0) {
+ _kvm_err(kd, kd->program, "couldn't get phys addr");
+ return (-1);
+ }
+ physaddr = nl[0].n_value;
}
- physaddr = nl[0].n_value;
nl[0].n_name = "kernel_l1pa";
if (kvm_nlist(kd, nl) != 0) {
_kvm_err(kd, kd->program, "bad namelist");
Modified: trunk/lib/libkvm/kvm_cptime.c
===================================================================
--- trunk/lib/libkvm/kvm_cptime.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_cptime.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2008 Yahoo!, Inc.
* All rights reserved.
@@ -29,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_cptime.c 217744 2011-01-23 11:08:28Z uqs $");
#include <sys/param.h>
#include <sys/pcpu.h>
Modified: trunk/lib/libkvm/kvm_file.c
===================================================================
--- trunk/lib/libkvm/kvm_file.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_file.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1989, 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -28,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_file.c 217744 2011-01-23 11:08:28Z uqs $");
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
Modified: trunk/lib/libkvm/kvm_getcptime.3
===================================================================
--- trunk/lib/libkvm/kvm_getcptime.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_getcptime.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 2008 Yahoo!, Inc.
.\" All rights reserved.
.\" Written by: John Baldwin <jhb at FreeBSD.org>
@@ -26,7 +27,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_getcptime.3 181880 2008-08-19 21:30:36Z jhb $
.\"
.Dd August 19, 2008
.Dt KVM_GETCPTIME 3
Property changes on: trunk/lib/libkvm/kvm_getcptime.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_geterr.3
===================================================================
--- trunk/lib/libkvm/kvm_geterr.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_geterr.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 1992, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -30,9 +31,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kvm_geterr.3 8.1 (Berkeley) 6/4/93
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_geterr.3 316072 2017-03-28 06:05:26Z ngie $
.\"
-.Dd June 4, 1993
+.Dd March 21, 2017
.Dt KVM_GETERR 3
.Os
.Sh NAME
@@ -54,6 +55,15 @@
The string returned is stored in memory owned by
.Xr kvm 3
so the message should be copied out and saved elsewhere if necessary.
+.Sh RETURN VALUES
+The function
+.Fn kvm_geterr
+will return "" if
+.Fa kd
+is
+.Dv NULL
+or an error has not been captured for
+.Fa kd .
.Sh SEE ALSO
.Xr kvm 3 ,
.Xr kvm_close 3 ,
Property changes on: trunk/lib/libkvm/kvm_geterr.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_getfiles.3
===================================================================
--- trunk/lib/libkvm/kvm_getfiles.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_getfiles.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 1992, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -30,7 +31,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kvm_getfiles.3 8.2 (Berkeley) 4/19/94
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_getfiles.3 165888 2007-01-08 17:35:36Z imp $
.\"
.Dd April 19, 1994
.Dt KVM_GETFILES 3
Property changes on: trunk/lib/libkvm/kvm_getfiles.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_getloadavg.3
===================================================================
--- trunk/lib/libkvm/kvm_getloadavg.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_getloadavg.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 1992, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -26,7 +27,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kvm_getloadavg.3 8.1 (Berkeley) 6/4/93
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_getloadavg.3 216756 2010-12-28 10:08:50Z uqs $
.\"
.Dd June 4, 1993
.Dt KVM_GETLOADAVG 3
Property changes on: trunk/lib/libkvm/kvm_getloadavg.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_getloadavg.c
===================================================================
--- trunk/lib/libkvm/kvm_getloadavg.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_getloadavg.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -28,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_getloadavg.c 217744 2011-01-23 11:08:28Z uqs $");
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
Modified: trunk/lib/libkvm/kvm_getpcpu.3
===================================================================
--- trunk/lib/libkvm/kvm_getpcpu.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_getpcpu.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 2008 Yahoo!, Inc.
.\" All rights reserved.
.\" Written by: John Baldwin <jhb at FreeBSD.org>
@@ -26,13 +27,13 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_getpcpu.3 315786 2017-03-23 04:50:50Z ngie $
.\"
-.Dd February 28, 2010
+.Dd March 15, 2017
.Dt KVM_GETPCPU 3
.Os
.Sh NAME
-.Nm kvm_dpcpu_setcpu
+.Nm kvm_dpcpu_setcpu ,
.Nm kvm_getmaxcpu ,
.Nm kvm_getpcpu
.Nd access per-CPU data
@@ -47,8 +48,14 @@
.Fn kvm_dpcpu_setcpu "kvm_t *kd" "u_int cpu"
.Ft int
.Fn kvm_getmaxcpu "kvm_t *kd"
+.Ft int
+.Fn kvm_getncpus "kvm_t *kd"
.Ft void *
.Fn kvm_getpcpu "kvm_t *kd" "int cpu"
+.Ft ssize_t
+.Fn kvm_read_zpcpu "kvm_t *kd" "u_long base" "void *buf" "size_t size" "int cpu"
+.Ft uint64_t
+.Fn kvm_counter_u64_fetch "kvm_t *kd" "u_long base"
.Sh DESCRIPTION
The
.Fn kvm_dpcpu_setcpu ,
@@ -69,6 +76,10 @@
function returns the maximum number of CPUs supported by the kernel.
.Pp
The
+.Fn kvm_getncpus
+function returns the current number of CPUs in the kernel.
+.Pp
+The
.Fn kvm_getpcpu
function returns a buffer holding the per-CPU data for a single CPU.
This buffer is described by the
@@ -83,12 +94,34 @@
.Dv NULL
is returned instead.
.Pp
+The
+.Fn kvm_read_zpcpu
+function is used to obtain private per-CPU copy from a
+.Dv UMA_ZONE_PCPU
+.Xr zone 9 .
+It takes
+.Fa base
+argument as base address of an allocation and copyies
+.Fa size
+bytes into
+.Fa buf
+from the part of allocation that is private to
+.Fa cpu .
+.Pp
+The
+.Fn kvm_counter_u64_fetch
+function fetches value of a
+.Xr counter 9
+pointed by
+.Fa base
+address.
+.Pp
Symbols for dynamic per-CPU data are accessed via
.Xr kvm_nlist 3
as with other symbols.
.Nm libkvm
maintains a notion of the "current CPU", set by
-.Xr kvm_dpcpu_setcpu ,
+.Fn kvm_dpcpu_setcpu ,
which defaults to 0.
Once another CPU is selected,
.Xr kvm_nlist 3
@@ -122,9 +155,16 @@
.Fn kvm_dpcpu_setcpu
call returns 0; if an error occurs, it returns -1 instead.
.Pp
+On success, the
+.Fn kvm_read_zpcpu
+function returns number of bytes copied.
+If an error occurs, it returns -1 instead.
+.Pp
If any function encounters an error,
then an error message may be retrieved via
.Xr kvm_geterr 3 .
.Sh SEE ALSO
.Xr free 3 ,
-.Xr kvm 3
+.Xr kvm 3 ,
+.Xr counter 9 ,
+.Xr zone 9
Property changes on: trunk/lib/libkvm/kvm_getpcpu.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_getprocs.3
===================================================================
--- trunk/lib/libkvm/kvm_getprocs.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_getprocs.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 1992, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -30,7 +31,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kvm_getprocs.3 8.1 (Berkeley) 6/4/93
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_getprocs.3 316040 2017-03-27 18:23:45Z ngie $
.\"
.Dd November 22, 2011
.Dt KVM_GETPROCS 3
@@ -47,7 +48,6 @@
.In sys/param.h
.In sys/sysctl.h
.In sys/user.h
-.\" .Fa kvm_t *kd
.Ft struct kinfo_proc *
.Fn kvm_getprocs "kvm_t *kd" "int op" "int arg" "int *cnt"
.Ft char **
Property changes on: trunk/lib/libkvm/kvm_getprocs.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_getswapinfo.3
===================================================================
--- trunk/lib/libkvm/kvm_getswapinfo.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_getswapinfo.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (C) 1999 Matthew Dillon. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -21,9 +22,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_getswapinfo.3 312253 2017-01-16 03:52:20Z pfg $
.\"
-.Dd January 22, 1999
+.Dd January 2, 2017
.Dt KVM_SWAPINFO 3
.Os
.Sh NAME
@@ -78,9 +79,9 @@
.It
.Va char ksw_devname[] ;
.It
-.Va int ksw_total ;
+.Va u_int ksw_total ;
.It
-.Va int ksw_used ;
+.Va u_int ksw_used ;
.It
.Va int ksw_flags ;
.El
Property changes on: trunk/lib/libkvm/kvm_getswapinfo.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_getswapinfo.c
===================================================================
--- trunk/lib/libkvm/kvm_getswapinfo.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_getswapinfo.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*
* Copyright (c) 1999, Matthew Dillon. All Rights Reserved.
* Copyright (c) 2001, Thomas Moestl. All Rights Reserved.
@@ -25,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_getswapinfo.c 312253 2017-01-16 03:52:20Z pfg $");
#include <sys/param.h>
#include <sys/time.h>
@@ -112,7 +113,8 @@
kvm_getswapinfo_kvm(kvm_t *kd, struct kvm_swap *swap_ary, int swap_max,
int flags)
{
- int i, ttl;
+ int i;
+ swblk_t ttl;
TAILQ_HEAD(, swdevt) swtailq;
struct swdevt *sp, swinfo;
struct kvm_swap tot;
@@ -157,7 +159,8 @@
kvm_getswapinfo_sysctl(kvm_t *kd, struct kvm_swap *swap_ary, int swap_max,
int flags)
{
- int ti, ttl;
+ int ti;
+ swblk_t ttl;
size_t mibi, len;
int soid[SWI_MAXMIB];
struct xswdev xsd;
Modified: trunk/lib/libkvm/kvm_i386.c
===================================================================
--- trunk/lib/libkvm/kvm_i386.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_i386.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1989, 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_i386.c 240301 2012-09-10 08:16:45Z kevlo $");
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
@@ -238,7 +239,6 @@
return (-1);
}
kd->vmst->PTD = PTD;
- return (0);
kd->vmst->pae = 0;
}
return (0);
Modified: trunk/lib/libkvm/kvm_ia64.c
===================================================================
--- trunk/lib/libkvm/kvm_ia64.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_ia64.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,4 +1,5 @@
-/* $FreeBSD$ */
+/* $MidnightBSD$ */
+/* $FreeBSD: stable/10/lib/libkvm/kvm_ia64.c 269449 2014-08-02 22:25:24Z marcel $ */
/* $NetBSD: kvm_alpha.c,v 1.7.2.1 1997/11/02 20:34:26 mellon Exp $ */
/*
@@ -32,12 +33,21 @@
#include <sys/elf64.h>
#include <sys/mman.h>
+#ifndef CROSS_LIBKVM
#include <machine/atomic.h>
#include <machine/bootinfo.h>
+#include <machine/elf.h>
#include <machine/pte.h>
+#else
+#include "../../sys/ia64/include/atomic.h"
+#include "../../sys/ia64/include/bootinfo.h"
+#include "../../sys/ia64/include/elf.h"
+#include "../../sys/ia64/include/pte.h"
+#endif
#include <kvm.h>
#include <limits.h>
+#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
@@ -55,6 +65,8 @@
#define PBVM_BASE 0x9ffc000000000000UL
#define PBVM_PGSZ (64 * 1024)
+typedef size_t (a2p_f)(kvm_t *, uint64_t, off_t *);
+
struct vmstate {
void *mmapbase;
size_t mmapsize;
@@ -62,6 +74,7 @@
u_long kptdir;
u_long *pbvm_pgtbl;
u_int pbvm_pgtblsz;
+ a2p_f *kvatop;
};
/*
@@ -70,7 +83,7 @@
* set of headers.
*/
static int
-_kvm_maphdrs(kvm_t *kd, size_t sz)
+ia64_maphdrs(kvm_t *kd, size_t sz)
{
struct vmstate *vm = kd->vmst;
@@ -91,38 +104,103 @@
}
/*
- * Translate a physical memory address to a file-offset in the crash-dump.
+ * Physical core support.
*/
+
static size_t
-_kvm_pa2off(kvm_t *kd, uint64_t pa, off_t *ofs, size_t pgsz)
+phys_addr2off(kvm_t *kd, uint64_t pa, off_t *ofs, size_t pgsz)
{
- Elf64_Ehdr *e = kd->vmst->mmapbase;
- Elf64_Phdr *p = (Elf64_Phdr*)((char*)e + e->e_phoff);
- int n = e->e_phnum;
+ Elf64_Ehdr *e;
+ Elf64_Phdr *p;
+ int n;
- if (pa != REGION_ADDR(pa)) {
- _kvm_err(kd, kd->program, "internal error");
- return (0);
- }
+ if (pa != REGION_ADDR(pa))
+ goto fail;
+ e = (Elf64_Ehdr *)(kd->vmst->mmapbase);
+ n = e->e_phnum;
+ p = (Elf64_Phdr *)(void *)((uintptr_t)(void *)e + e->e_phoff);
while (n && (pa < p->p_paddr || pa >= p->p_paddr + p->p_memsz))
p++, n--;
if (n == 0)
- return (0);
+ goto fail;
*ofs = (pa - p->p_paddr) + p->p_offset;
if (pgsz == 0)
return (p->p_memsz - (pa - p->p_paddr));
return (pgsz - ((size_t)pa & (pgsz - 1)));
+
+ fail:
+ _kvm_err(kd, kd->program, "invalid physical address %#jx",
+ (uintmax_t)pa);
+ return (0);
}
+static size_t
+phys_kvatop(kvm_t *kd, uint64_t va, off_t *ofs)
+{
+ struct ia64_lpte pte;
+ uint64_t pa, pgaddr, pt0addr, pt1addr;
+ size_t pgno, pgsz, pt0no, pt1no;
+
+ if (va >= REGION_BASE(6)) {
+ /* Regions 6 and 7: direct mapped. */
+ pa = REGION_ADDR(va);
+ return (phys_addr2off(kd, pa, ofs, 0));
+ } else if (va >= REGION_BASE(5)) {
+ /* Region 5: Kernel Virtual Memory. */
+ va = REGION_ADDR(va);
+ pgsz = kd->vmst->pagesize;
+ pt0no = KPTE_DIR0_INDEX(va, pgsz);
+ pt1no = KPTE_DIR1_INDEX(va, pgsz);
+ pgno = KPTE_PTE_INDEX(va, pgsz);
+ if (pt0no >= NKPTEDIR(pgsz))
+ goto fail;
+ pt0addr = kd->vmst->kptdir + (pt0no << 3);
+ if (kvm_read(kd, pt0addr, &pt1addr, 8) != 8)
+ goto fail;
+ if (pt1addr == 0)
+ goto fail;
+ pt1addr += pt1no << 3;
+ if (kvm_read(kd, pt1addr, &pgaddr, 8) != 8)
+ goto fail;
+ if (pgaddr == 0)
+ goto fail;
+ pgaddr += pgno * sizeof(pte);
+ if (kvm_read(kd, pgaddr, &pte, sizeof(pte)) != sizeof(pte))
+ goto fail;
+ if (!(pte.pte & PTE_PRESENT))
+ goto fail;
+ pa = (pte.pte & PTE_PPN_MASK) + (va & (pgsz - 1));
+ return (phys_addr2off(kd, pa, ofs, pgsz));
+ } else if (va >= PBVM_BASE) {
+ /* Region 4: Pre-Boot Virtual Memory (PBVM). */
+ va -= PBVM_BASE;
+ pgsz = PBVM_PGSZ;
+ pt0no = va / pgsz;
+ if (pt0no >= (kd->vmst->pbvm_pgtblsz >> 3))
+ goto fail;
+ pt0addr = kd->vmst->pbvm_pgtbl[pt0no];
+ if (!(pt0addr & PTE_PRESENT))
+ goto fail;
+ pa = (pt0addr & PTE_PPN_MASK) + va % pgsz;
+ return (phys_addr2off(kd, pa, ofs, pgsz));
+ }
+
+ fail:
+ _kvm_err(kd, kd->program, "invalid kernel virtual address %#jx",
+ (uintmax_t)va);
+ *ofs = -1;
+ return (0);
+}
+
static ssize_t
-_kvm_read_phys(kvm_t *kd, uint64_t pa, void *buf, size_t bufsz)
+phys_read(kvm_t *kd, uint64_t pa, void *buf, size_t bufsz)
{
off_t ofs;
size_t sz;
- sz = _kvm_pa2off(kd, pa, &ofs, 0);
+ sz = phys_addr2off(kd, pa, &ofs, 0);
if (sz < bufsz)
return ((ssize_t)sz);
@@ -131,6 +209,50 @@
return (read(kd->pmfd, buf, bufsz));
}
+/*
+ * Virtual core support (aka minidump).
+ */
+
+static size_t
+virt_addr2off(kvm_t *kd, uint64_t va, off_t *ofs, size_t pgsz)
+{
+ Elf64_Ehdr *e;
+ Elf64_Phdr *p;
+ int n;
+
+ if (va < REGION_BASE(4))
+ goto fail;
+
+ e = (Elf64_Ehdr *)(kd->vmst->mmapbase);
+ n = e->e_phnum;
+ p = (Elf64_Phdr *)(void *)((uintptr_t)(void *)e + e->e_phoff);
+ while (n && (va < p->p_vaddr || va >= p->p_vaddr + p->p_memsz))
+ p++, n--;
+ if (n == 0)
+ goto fail;
+
+ *ofs = (va - p->p_vaddr) + p->p_offset;
+ if (pgsz == 0)
+ return (p->p_memsz - (va - p->p_vaddr));
+ return (pgsz - ((size_t)va & (pgsz - 1)));
+
+ fail:
+ _kvm_err(kd, kd->program, "invalid virtual address %#jx",
+ (uintmax_t)va);
+ return (0);
+}
+
+static size_t
+virt_kvatop(kvm_t *kd, uint64_t va, off_t *ofs)
+{
+
+ return (virt_addr2off(kd, va, ofs, 0));
+}
+
+/*
+ * KVM architecture support functions.
+ */
+
void
_kvm_freevtop(kvm_t *kd)
{
@@ -160,27 +282,37 @@
return (-1);
}
+#ifndef CROSS_LIBKVM
kd->vmst->pagesize = getpagesize();
+#else
+ kd->vmst->pagesize = 8192;
+#endif
- if (_kvm_maphdrs(kd, sizeof(Elf64_Ehdr)) == -1)
+ if (ia64_maphdrs(kd, sizeof(Elf64_Ehdr)) == -1)
return (-1);
ehdr = kd->vmst->mmapbase;
hdrsz = ehdr->e_phoff + ehdr->e_phentsize * ehdr->e_phnum;
- if (_kvm_maphdrs(kd, hdrsz) == -1)
+ if (ia64_maphdrs(kd, hdrsz) == -1)
return (-1);
+ kd->vmst->kvatop = (ehdr->e_flags & EF_IA_64_ABSOLUTE) ?
+ phys_kvatop : virt_kvatop;
+
/*
* Load the PBVM page table. We need this to resolve PBVM addresses.
* The PBVM page table is obtained from the bootinfo structure, of
- * which the physical address is given to us in e_entry. If e_entry
- * is 0, then this is assumed to be a pre-PBVM kernel.
+ * which the address is given to us in e_entry. If e_entry is 0, then
+ * this is assumed to be a pre-PBVM kernel.
+ * Note that the address of the bootinfo structure is either physical
+ * or virtual, depending on whether the core is physical or virtual.
*/
- if (ehdr->e_entry != 0) {
- sz = _kvm_read_phys(kd, ehdr->e_entry, &bi, sizeof(bi));
+ if (ehdr->e_entry != 0 && (ehdr->e_flags & EF_IA_64_ABSOLUTE) != 0) {
+ sz = phys_read(kd, ehdr->e_entry, &bi, sizeof(bi));
if (sz != sizeof(bi)) {
_kvm_err(kd, kd->program,
- "cannot read bootinfo from PA %#lx", ehdr->e_entry);
+ "cannot read bootinfo at physical address %#jx",
+ (uintmax_t)ehdr->e_entry);
return (-1);
}
if (bi.bi_magic != BOOTINFO_MAGIC) {
@@ -193,12 +325,12 @@
return (-1);
}
kd->vmst->pbvm_pgtblsz = bi.bi_pbvm_pgtblsz;
- sz = _kvm_read_phys(kd, bi.bi_pbvm_pgtbl, kd->vmst->pbvm_pgtbl,
+ sz = phys_read(kd, bi.bi_pbvm_pgtbl, kd->vmst->pbvm_pgtbl,
bi.bi_pbvm_pgtblsz);
if (sz != bi.bi_pbvm_pgtblsz) {
_kvm_err(kd, kd->program,
- "cannot read page table from PA %#lx",
- bi.bi_pbvm_pgtbl);
+ "cannot read page table at physical address %#jx",
+ (uintmax_t)bi.bi_pbvm_pgtbl);
return (-1);
}
} else {
@@ -225,7 +357,7 @@
return (-1);
}
- if (va < REGION_BASE(6)) {
+ if (va == REGION_BASE(5)) {
_kvm_err(kd, kd->program, "kptdir is itself virtual");
return (-1);
}
@@ -237,56 +369,8 @@
int
_kvm_kvatop(kvm_t *kd, u_long va, off_t *ofs)
{
- struct ia64_lpte pte;
- uint64_t pa, pgaddr, pt0addr, pt1addr;
- size_t pgno, pgsz, pt0no, pt1no;
+ size_t sz;
- if (va >= REGION_BASE(6)) {
- /* Regions 6 and 7: direct mapped. */
- pa = REGION_ADDR(va);
- return (_kvm_pa2off(kd, pa, ofs, 0));
- } else if (va >= REGION_BASE(5)) {
- /* Region 5: Kernel Virtual Memory. */
- va = REGION_ADDR(va);
- pgsz = kd->vmst->pagesize;
- pt0no = KPTE_DIR0_INDEX(va, pgsz);
- pt1no = KPTE_DIR1_INDEX(va, pgsz);
- pgno = KPTE_PTE_INDEX(va, pgsz);
- if (pt0no >= NKPTEDIR(pgsz))
- goto fail;
- pt0addr = kd->vmst->kptdir + (pt0no << 3);
- if (kvm_read(kd, pt0addr, &pt1addr, 8) != 8)
- goto fail;
- if (pt1addr == 0)
- goto fail;
- pt1addr += pt1no << 3;
- if (kvm_read(kd, pt1addr, &pgaddr, 8) != 8)
- goto fail;
- if (pgaddr == 0)
- goto fail;
- pgaddr += pgno * sizeof(pte);
- if (kvm_read(kd, pgaddr, &pte, sizeof(pte)) != sizeof(pte))
- goto fail;
- if (!(pte.pte & PTE_PRESENT))
- goto fail;
- pa = (pte.pte & PTE_PPN_MASK) + (va & (pgsz - 1));
- return (_kvm_pa2off(kd, pa, ofs, pgsz));
- } else if (va >= PBVM_BASE) {
- /* Region 4: Pre-Boot Virtual Memory (PBVM). */
- va -= PBVM_BASE;
- pgsz = PBVM_PGSZ;
- pt0no = va / pgsz;
- if (pt0no >= (kd->vmst->pbvm_pgtblsz >> 3))
- goto fail;
- pt0addr = kd->vmst->pbvm_pgtbl[pt0no];
- if (!(pt0addr & PTE_PRESENT))
- goto fail;
- pa = (pt0addr & PTE_PPN_MASK) + va % pgsz;
- return (_kvm_pa2off(kd, pa, ofs, pgsz));
- }
-
- fail:
- _kvm_err(kd, kd->program, "invalid kernel virtual address");
- *ofs = ~0UL;
- return (0);
+ sz = kd->vmst->kvatop(kd, va, ofs);
+ return ((sz > INT_MAX) ? INT_MAX : sz);
}
Modified: trunk/lib/libkvm/kvm_minidump_amd64.c
===================================================================
--- trunk/lib/libkvm/kvm_minidump_amd64.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_minidump_amd64.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2006 Peter Wemm
*
@@ -24,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_minidump_amd64.c 269013 2014-07-23 14:29:28Z emaste $");
/*
* AMD64 machine dependent routines for kvm and minidumps.
@@ -214,6 +215,8 @@
if (va >= vm->hdr.kernbase) {
pteindex = (va - vm->hdr.kernbase) >> PAGE_SHIFT;
+ if (pteindex >= vm->hdr.pmapsize / sizeof(*vm->page_map))
+ goto invalid;
pte = vm->page_map[pteindex];
if (((u_long)pte & PG_V) == 0) {
_kvm_err(kd, kd->program, "_kvm_vatop: pte not valid");
@@ -264,6 +267,8 @@
if (va >= vm->hdr.kernbase) {
pdeindex = (va - vm->hdr.kernbase) >> PDRSHIFT;
+ if (pdeindex >= vm->hdr.pmapsize / sizeof(*vm->page_map))
+ goto invalid;
pde = vm->page_map[pdeindex];
if (((u_long)pde & PG_V) == 0) {
_kvm_err(kd, kd->program, "_kvm_vatop: pde not valid");
Modified: trunk/lib/libkvm/kvm_minidump_arm.c
===================================================================
--- trunk/lib/libkvm/kvm_minidump_arm.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_minidump_arm.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2008 Semihalf, Grzegorz Bernacki
* Copyright (c) 2006 Peter Wemm
@@ -27,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_minidump_arm.c 217744 2011-01-23 11:08:28Z uqs $");
/*
* ARM machine dependent routines for kvm and minidumps.
Modified: trunk/lib/libkvm/kvm_minidump_i386.c
===================================================================
--- trunk/lib/libkvm/kvm_minidump_i386.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_minidump_i386.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2006 Peter Wemm
*
@@ -24,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_minidump_i386.c 217744 2011-01-23 11:08:28Z uqs $");
/*
* AMD64 machine dependent routines for kvm and minidumps.
Modified: trunk/lib/libkvm/kvm_minidump_mips.c
===================================================================
--- trunk/lib/libkvm/kvm_minidump_mips.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_minidump_mips.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2010 Oleksandr Tymoshenko
* Copyright (c) 2008 Semihalf, Grzegorz Bernacki
@@ -28,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_minidump_mips.c 217744 2011-01-23 11:08:28Z uqs $");
/*
* MIPS machine dependent routines for kvm and minidumps.
Modified: trunk/lib/libkvm/kvm_mips.c
===================================================================
--- trunk/lib/libkvm/kvm_mips.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_mips.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (C) 2006 Bruce M. Simpson.
* All rights reserved.
@@ -10,22 +11,18 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Bruce M. Simpson.
- * 4. The name of Bruce M. Simpson may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY BRUCE M. SIMPSON ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL BRUCE M. SIMPSON BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
*/
/*
@@ -33,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_mips.c 251475 2013-06-06 21:09:27Z emaste $");
#include <sys/param.h>
#include <sys/elf32.h>
Modified: trunk/lib/libkvm/kvm_nlist.3
===================================================================
--- trunk/lib/libkvm/kvm_nlist.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_nlist.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 1992, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -30,7 +31,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kvm_nlist.3 8.1 (Berkeley) 6/4/93
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_nlist.3 165888 2007-01-08 17:35:36Z imp $
.\"
.Dd June 4, 1993
.Dt KVM_NLIST 3
Property changes on: trunk/lib/libkvm/kvm_nlist.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_open.3
===================================================================
--- trunk/lib/libkvm/kvm_open.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_open.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 1992, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -30,9 +31,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kvm_open.3 8.3 (Berkeley) 4/19/94
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_open.3 316070 2017-03-28 05:57:20Z ngie $
.\"
-.Dd January 29, 2004
+.Dd March 20, 2017
.Dt KVM_OPEN 3
.Os
.Sh NAME
@@ -181,10 +182,29 @@
writes the error message into
.Fa errbuf .
.Pp
+.Rv -std kvm_close
+.Sh ERRORS
The
.Fn kvm_close
-function returns 0 on success and -1 on failure.
+function may fail and set the global variable
+.Va errno
+for any of the errors specified for
+.Xr close 2 .
+.Pp
+The
+.Fn kvm_close
+function may also fail and set
+.Va errno
+if:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+The value passed via
+.Fa kd
+was
+.Dv NULL .
+.El
.Sh SEE ALSO
+.Xr close 2 ,
.Xr open 2 ,
.Xr kvm 3 ,
.Xr kvm_getargv 3 ,
Property changes on: trunk/lib/libkvm/kvm_open.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_pcpu.c
===================================================================
--- trunk/lib/libkvm/kvm_pcpu.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_pcpu.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,4 +1,6 @@
+/* $MidnightBSD$ */
/*-
+ * Copyright (c) 2013 Gleb Smirnoff <glebius at FreeBSD.org>
* Copyright (c) 2010 Juniper Networks, Inc.
* Copyright (c) 2009 Robert N. M. Watson
* Copyright (c) 2009 Bjoern A. Zeeb <bz at FreeBSD.org>
@@ -36,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_pcpu.c 262740 2014-03-04 14:49:05Z glebius $");
#include <sys/param.h>
#include <sys/pcpu.h>
@@ -50,8 +52,12 @@
static struct nlist kvm_pcpu_nl[] = {
{ .n_name = "_cpuid_to_pcpu" },
{ .n_name = "_mp_maxcpus" },
+ { .n_name = "_mp_ncpus" },
{ .n_name = NULL },
};
+#define NL_CPUID_TO_PCPU 0
+#define NL_MP_MAXCPUS 1
+#define NL_MP_NCPUS 2
/*
* Kernel per-CPU data state. We cache this stuff on the first
@@ -63,10 +69,8 @@
*/
static void **pcpu_data;
static int maxcpu;
+static int mp_ncpus;
-#define NL_CPUID_TO_PCPU 0
-#define NL_MP_MAXCPUS 1
-
static int
_kvm_pcpu_init(kvm_t *kd)
{
@@ -89,6 +93,15 @@
_kvm_err(kd, kd->program, "cannot read mp_maxcpus");
return (-1);
}
+ if (kvm_pcpu_nl[NL_MP_NCPUS].n_value == 0) {
+ _kvm_err(kd, kd->program, "unable to find mp_ncpus");
+ return (-1);
+ }
+ if (kvm_read(kd, kvm_pcpu_nl[NL_MP_NCPUS].n_value, &mp_ncpus,
+ sizeof(mp_ncpus)) != sizeof(mp_ncpus)) {
+ _kvm_err(kd, kd->program, "cannot read mp_ncpus");
+ return (-1);
+ }
len = max * sizeof(void *);
data = malloc(len);
if (data == NULL) {
@@ -161,6 +174,16 @@
return (maxcpu);
}
+int
+kvm_getncpus(kvm_t *kd)
+{
+
+ if (mp_ncpus == 0)
+ if (_kvm_pcpu_init(kd) < 0)
+ return (-1);
+ return (mp_ncpus);
+}
+
static int
_kvm_dpcpu_setcpu(kvm_t *kd, u_int cpu, int report_error)
{
@@ -289,3 +312,36 @@
return (_kvm_dpcpu_setcpu(kd, cpu, 1));
}
+
+/*
+ * Obtain a per-CPU copy for given cpu from UMA_ZONE_PCPU allocation.
+ */
+ssize_t
+kvm_read_zpcpu(kvm_t *kd, u_long base, void *buf, size_t size, int cpu)
+{
+
+ return (kvm_read(kd, (uintptr_t)(base + sizeof(struct pcpu) * cpu),
+ buf, size));
+}
+
+/*
+ * Fetch value of a counter(9).
+ */
+uint64_t
+kvm_counter_u64_fetch(kvm_t *kd, u_long base)
+{
+ uint64_t r, c;
+
+ if (mp_ncpus == 0)
+ if (_kvm_pcpu_init(kd) < 0)
+ return (0);
+
+ r = 0;
+ for (int i = 0; i < mp_ncpus; i++) {
+ if (kvm_read_zpcpu(kd, base, &c, sizeof(c), i) != sizeof(c))
+ return (0);
+ r += c;
+ }
+
+ return (r);
+}
Modified: trunk/lib/libkvm/kvm_powerpc.c
===================================================================
--- trunk/lib/libkvm/kvm_powerpc.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_powerpc.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2008, Juniper Networks, Inc.
* All rights reserved.
@@ -27,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_powerpc.c 217744 2011-01-23 11:08:28Z uqs $");
#include <sys/param.h>
#include <sys/endian.h>
Modified: trunk/lib/libkvm/kvm_powerpc64.c
===================================================================
--- trunk/lib/libkvm/kvm_powerpc64.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_powerpc64.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2008, Juniper Networks, Inc.
* All rights reserved.
@@ -27,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_powerpc64.c 217777 2011-01-24 11:06:40Z uqs $");
#include <sys/param.h>
#include <sys/endian.h>
Modified: trunk/lib/libkvm/kvm_private.h
===================================================================
--- trunk/lib/libkvm/kvm_private.h 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_private.h 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -31,7 +32,7 @@
* SUCH DAMAGE.
*
* @(#)kvm_private.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
+ * $FreeBSD: stable/10/lib/libkvm/kvm_private.h 312382 2017-01-18 14:14:00Z avg $
*/
struct __kvm {
@@ -62,6 +63,7 @@
*/
struct vmstate *vmst;
int rawdump; /* raw dump format */
+ int writable; /* physical memory is writable */
int vnet_initialized; /* vnet fields set up */
uintptr_t vnet_start; /* start of kernel's vnet region */
Modified: trunk/lib/libkvm/kvm_proc.c
===================================================================
--- trunk/lib/libkvm/kvm_proc.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_proc.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1989, 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -38,7 +39,7 @@
#endif
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_proc.c 310121 2016-12-15 16:52:17Z vangyzen $");
/*
* Proc traversal interface for kvm. ps and w are (probably) the exclusive
@@ -424,8 +425,6 @@
kp->ki_pri.pri_native = mtd.td_base_pri;
kp->ki_lastcpu = mtd.td_lastcpu;
kp->ki_wchan = mtd.td_wchan;
- if (mtd.td_name[0] != 0)
- strlcpy(kp->ki_tdname, mtd.td_name, MAXCOMLEN);
kp->ki_oncpu = mtd.td_oncpu;
if (mtd.td_name[0] != '\0')
strlcpy(kp->ki_tdname, mtd.td_name, sizeof(kp->ki_tdname));
@@ -642,6 +641,7 @@
static char *buf, *p;
static char **bufp;
static int argc;
+ char **nbufp;
if (!ISALIVE(kd)) {
_kvm_err(kd, kd->program,
@@ -657,9 +657,15 @@
_kvm_err(kd, kd->program, "cannot allocate memory");
return (0);
}
- buflen = nchr;
argc = 32;
bufp = malloc(sizeof(char *) * argc);
+ if (bufp == NULL) {
+ free(buf);
+ buf = NULL;
+ _kvm_err(kd, kd->program, "cannot allocate memory");
+ return (NULL);
+ }
+ buflen = nchr;
} else if (nchr > buflen) {
p = realloc(buf, nchr);
if (p != NULL) {
@@ -693,8 +699,10 @@
p += strlen(p) + 1;
if (i >= argc) {
argc += argc;
- bufp = realloc(bufp,
- sizeof(char *) * argc);
+ nbufp = realloc(bufp, sizeof(char *) * argc);
+ if (nbufp == NULL)
+ return (NULL);
+ bufp = nbufp;
}
} while (p < buf + bufsz);
bufp[i++] = 0;
Modified: trunk/lib/libkvm/kvm_read.3
===================================================================
--- trunk/lib/libkvm/kvm_read.3 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_read.3 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
.\" Copyright (c) 1992, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -30,7 +31,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kvm_read.3 8.1 (Berkeley) 6/4/93
-.\" $FreeBSD$
+.\" $FreeBSD: stable/10/lib/libkvm/kvm_read.3 165888 2007-01-08 17:35:36Z imp $
.\"
.Dd June 4, 1993
.Dt KVM_READ 3
Property changes on: trunk/lib/libkvm/kvm_read.3
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libkvm/kvm_sparc.c
===================================================================
--- trunk/lib/libkvm/kvm_sparc.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_sparc.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_sparc.c 165888 2007-01-08 17:35:36Z imp $");
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
Modified: trunk/lib/libkvm/kvm_sparc64.c
===================================================================
--- trunk/lib/libkvm/kvm_sparc64.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_sparc64.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 1989, 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -34,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_sparc64.c 221869 2011-05-14 01:53:38Z attilio $");
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
Modified: trunk/lib/libkvm/kvm_vnet.c
===================================================================
--- trunk/lib/libkvm/kvm_vnet.c 2018-06-09 19:32:49 UTC (rev 10667)
+++ trunk/lib/libkvm/kvm_vnet.c 2018-06-09 19:33:16 UTC (rev 10668)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2009 Robert N. M. Watson
* Copyright (c) 2009 Bjoern A. Zeeb <bz at FreeBSD.org>
@@ -26,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/lib/libkvm/kvm_vnet.c 217744 2011-01-23 11:08:28Z uqs $");
#include <sys/param.h>
More information about the Midnightbsd-cvs
mailing list