svn commit: r258888 - in stable/9/sys: compat/freebsd32 kern sys
Konstantin Belousov
kib at FreeBSD.org
Tue Dec 3 19:55:50 UTC 2013
Author: kib
Date: Tue Dec 3 19:55:49 2013
New Revision: 258888
URL: http://svnweb.freebsd.org/changeset/base/258888
Log:
MFC r258661:
Add sysctl KERN_PROC_SIGTRAMP to retrieve signal trampoline location for the
given process.
Modified:
stable/9/sys/compat/freebsd32/freebsd32.h
stable/9/sys/kern/kern_proc.c
stable/9/sys/sys/sysctl.h
stable/9/sys/sys/user.h
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/sys/ (props changed)
Modified: stable/9/sys/compat/freebsd32/freebsd32.h
==============================================================================
--- stable/9/sys/compat/freebsd32/freebsd32.h Tue Dec 3 19:42:46 2013 (r258887)
+++ stable/9/sys/compat/freebsd32/freebsd32.h Tue Dec 3 19:55:49 2013 (r258888)
@@ -351,6 +351,12 @@ struct kinfo_proc32 {
int ki_tdflags;
};
+struct kinfo_sigtramp32 {
+ uint32_t ksigtramp_start;
+ uint32_t ksigtramp_end;
+ uint32_t ksigtramp_spare[4];
+};
+
struct kld32_file_stat_1 {
int version; /* set to sizeof(struct kld_file_stat_1) */
char name[MAXPATHLEN];
Modified: stable/9/sys/kern/kern_proc.c
==============================================================================
--- stable/9/sys/kern/kern_proc.c Tue Dec 3 19:42:46 2013 (r258887)
+++ stable/9/sys/kern/kern_proc.c Tue Dec 3 19:55:49 2013 (r258888)
@@ -2636,6 +2636,60 @@ errout:
return (error);
}
+static int
+sysctl_kern_proc_sigtramp(SYSCTL_HANDLER_ARGS)
+{
+ int *name = (int *)arg1;
+ u_int namelen = arg2;
+ struct proc *p;
+ struct kinfo_sigtramp kst;
+ const struct sysentvec *sv;
+ int error;
+#ifdef COMPAT_FREEBSD32
+ struct kinfo_sigtramp32 kst32;
+#endif
+
+ if (namelen != 1)
+ return (EINVAL);
+
+ error = pget((pid_t)name[0], PGET_CANDEBUG, &p);
+ if (error != 0)
+ return (error);
+ sv = p->p_sysent;
+#ifdef COMPAT_FREEBSD32
+ if ((req->flags & SCTL_MASK32) != 0) {
+ bzero(&kst32, sizeof(kst32));
+ if (SV_PROC_FLAG(p, SV_ILP32)) {
+ if (sv->sv_sigcode_base != 0) {
+ kst32.ksigtramp_start = sv->sv_sigcode_base;
+ kst32.ksigtramp_end = sv->sv_sigcode_base +
+ *sv->sv_szsigcode;
+ } else {
+ kst32.ksigtramp_start = sv->sv_psstrings -
+ *sv->sv_szsigcode;
+ kst32.ksigtramp_end = sv->sv_psstrings;
+ }
+ }
+ PROC_UNLOCK(p);
+ error = SYSCTL_OUT(req, &kst32, sizeof(kst32));
+ return (error);
+ }
+#endif
+ bzero(&kst, sizeof(kst));
+ if (sv->sv_sigcode_base != 0) {
+ kst.ksigtramp_start = (char *)sv->sv_sigcode_base;
+ kst.ksigtramp_end = (char *)sv->sv_sigcode_base +
+ *sv->sv_szsigcode;
+ } else {
+ kst.ksigtramp_start = (char *)sv->sv_psstrings -
+ *sv->sv_szsigcode;
+ kst.ksigtramp_end = (char *)sv->sv_psstrings;
+ }
+ PROC_UNLOCK(p);
+ error = SYSCTL_OUT(req, &kst, sizeof(kst));
+ return (error);
+}
+
SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD, 0, "Process table");
SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT|
@@ -2744,3 +2798,7 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC
static SYSCTL_NODE(_kern_proc, KERN_PROC_OSREL, osrel, CTLFLAG_RW |
CTLFLAG_ANYBODY | CTLFLAG_MPSAFE, sysctl_kern_proc_osrel,
"Process binary osreldate");
+
+static SYSCTL_NODE(_kern_proc, KERN_PROC_SIGTRAMP, sigtramp, CTLFLAG_RD |
+ CTLFLAG_MPSAFE, sysctl_kern_proc_sigtramp,
+ "Process signal trampoline location");
Modified: stable/9/sys/sys/sysctl.h
==============================================================================
--- stable/9/sys/sys/sysctl.h Tue Dec 3 19:42:46 2013 (r258887)
+++ stable/9/sys/sys/sysctl.h Tue Dec 3 19:55:49 2013 (r258888)
@@ -566,6 +566,7 @@ SYSCTL_ALLOWED_TYPES(UINT64, uint64_t *a
#define KERN_PROC_PS_STRINGS 38 /* get ps_strings location */
#define KERN_PROC_UMASK 39 /* process umask */
#define KERN_PROC_OSREL 40 /* osreldate for process binary */
+#define KERN_PROC_SIGTRAMP 41 /* signal trampoline location */
/*
* KERN_IPC identifiers
Modified: stable/9/sys/sys/user.h
==============================================================================
--- stable/9/sys/sys/user.h Tue Dec 3 19:42:46 2013 (r258887)
+++ stable/9/sys/sys/user.h Tue Dec 3 19:55:49 2013 (r258888)
@@ -496,6 +496,12 @@ struct kinfo_kstack {
int _kkst_ispare[16]; /* Space for more stuff. */
};
+struct kinfo_sigtramp {
+ void *ksigtramp_start;
+ void *ksigtramp_end;
+ void *ksigtramp_spare[4];
+};
+
#ifdef _KERNEL
/* Flags for kern_proc_out function. */
#define KERN_PROC_NOTHREADS 0x1
More information about the svn-src-stable
mailing list