Module Name:    src
Committed By:   chs
Date:           Fri Jun  9 01:17:25 UTC 2017

Modified Files:
        src/external/bsd/libproc/dist: _libproc.h libproc.h proc_create.c
            proc_util.c

Log Message:
add a proc_getmodel() interface to return whether a process
is a 32-bit or 64-bit process.  the interface is from freebsd
but the implementation is different.
needed by dtrace.


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1 -r1.2 src/external/bsd/libproc/dist/_libproc.h
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/libproc/dist/libproc.h \
    src/external/bsd/libproc/dist/proc_create.c
cvs rdiff -u -r1.5 -r1.6 src/external/bsd/libproc/dist/proc_util.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/libproc/dist/_libproc.h
diff -u src/external/bsd/libproc/dist/_libproc.h:1.1.1.1 src/external/bsd/libproc/dist/_libproc.h:1.2
--- src/external/bsd/libproc/dist/_libproc.h:1.1.1.1	Thu Sep 24 14:05:35 2015
+++ src/external/bsd/libproc/dist/_libproc.h	Fri Jun  9 01:17:25 2017
@@ -41,6 +41,7 @@ struct proc_handle {
 	int	flags;			/* Process flags. */
 	int	status;			/* Process status (PS_*). */
 	int	wstat;			/* Process wait status. */
+	int	model;			/* Process data model. */
 	rd_agent_t *rdap;		/* librtld_db agent */
 	rd_loadobj_t *rdobjs;
 	size_t	rdobjsz;

Index: src/external/bsd/libproc/dist/libproc.h
diff -u src/external/bsd/libproc/dist/libproc.h:1.2 src/external/bsd/libproc/dist/libproc.h:1.3
--- src/external/bsd/libproc/dist/libproc.h:1.2	Fri Sep 25 16:07:32 2015
+++ src/external/bsd/libproc/dist/libproc.h	Fri Jun  9 01:17:25 2017
@@ -114,6 +114,9 @@ typedef struct lwpstatus {
 #define FLTBPT		-1
 } lwpstatus_t;
 
+#define	PR_MODEL_ILP32	1
+#define	PR_MODEL_LP64	2
+
 typedef struct {
 	uint8_t data[PTRACE_BREAKPOINT_SIZE];
 } proc_breakpoint_t;
@@ -143,6 +146,7 @@ int	proc_name2sym(struct proc_handle *, 
 struct ctf_file *proc_name2ctf(struct proc_handle *, const char *);
 int	proc_setflags(struct proc_handle *, int);
 int	proc_state(struct proc_handle *);
+int	proc_getmodel(struct proc_handle *);
 pid_t	proc_getpid(struct proc_handle *);
 int	proc_wstatus(struct proc_handle *);
 int	proc_getwstat(struct proc_handle *);
Index: src/external/bsd/libproc/dist/proc_create.c
diff -u src/external/bsd/libproc/dist/proc_create.c:1.2 src/external/bsd/libproc/dist/proc_create.c:1.3
--- src/external/bsd/libproc/dist/proc_create.c:1.2	Thu Sep 24 14:12:48 2015
+++ src/external/bsd/libproc/dist/proc_create.c	Fri Jun  9 01:17:25 2017
@@ -26,7 +26,7 @@
  * $FreeBSD: head/lib/libproc/proc_create.c 265255 2014-05-03 04:44:03Z markj $
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: proc_create.c,v 1.2 2015/09/24 14:12:48 christos Exp $");
+__RCSID("$NetBSD: proc_create.c,v 1.3 2017/06/09 01:17:25 chs Exp $");
 
 #include <sys/types.h>
 #include <sys/sysctl.h>
@@ -47,7 +47,8 @@ static int	proc_init(pid_t, int, int, st
 static int
 proc_init(pid_t pid, int flags, int status, struct proc_handle *phdl)
 {
-	int mib[4], error;
+	struct kinfo_proc2 kp;
+	int mib[6], error;
 	size_t len;
 
 	memset(phdl, 0, sizeof(*phdl));
@@ -68,6 +69,24 @@ proc_init(pid_t pid, int flags, int stat
 	if (len == 0)
 		phdl->execname[0] = '\0';
 
+#ifdef _LP64
+	len = sizeof(kp);
+	mib[0] = CTL_KERN;
+	mib[1] = KERN_PROC2;
+	mib[2] = KERN_PROC_PID;
+	mib[3] = pid;
+	mib[4] = len;
+	mib[5] = 1;
+	if (sysctl(mib, 6, &kp, &len, NULL, 0) != 0) {
+		error = errno;
+		DPRINTF("ERROR: cannot get kinfo_proc2 for pid %d", pid);
+		return (error);
+	}
+	phdl->model = (kp.p_flag & P_32) ? PR_MODEL_ILP32 : PR_MODEL_LP64;
+#else
+	phdl->model = PR_MODEL_ILP32;
+#endif
+
 	return (0);
 }
 

Index: src/external/bsd/libproc/dist/proc_util.c
diff -u src/external/bsd/libproc/dist/proc_util.c:1.5 src/external/bsd/libproc/dist/proc_util.c:1.6
--- src/external/bsd/libproc/dist/proc_util.c:1.5	Wed Feb  1 20:01:39 2017
+++ src/external/bsd/libproc/dist/proc_util.c	Fri Jun  9 01:17:25 2017
@@ -144,6 +144,16 @@ proc_state(struct proc_handle *phdl)
 	return (phdl->status);
 }
 
+int
+proc_getmodel(struct proc_handle *phdl)
+{
+
+	if (phdl == NULL)
+		return (-1);
+
+	return (phdl->model);
+}
+
 pid_t
 proc_getpid(struct proc_handle *phdl)
 {

Reply via email to