summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2015-06-02 14:54:53 +0000
committerjhb <jhb@FreeBSD.org>2015-06-02 14:54:53 +0000
commitcb2edec922e11c0dcda53db951d9f33ae4096cd5 (patch)
treef5b76ef5f39fba89a6da6cb1a11b89d1dd7dd5b7
parentc89b9bba4337ee06f879632c707eee953d70d3a6 (diff)
downloadFreeBSD-src-cb2edec922e11c0dcda53db951d9f33ae4096cd5.zip
FreeBSD-src-cb2edec922e11c0dcda53db951d9f33ae4096cd5.tar.gz
MFC 281266:
Move the 32-bit compatible procfs types from freebsd32.h to <sys/procfs.h> and export them to userland. - Define __HAVE_REG32 on platforms that define a reg32 structure and check for this in <sys/procfs.h> to control when to export prstatus32, etc. - Add prstatus32_t and prpsinfo32_t typedefs for the 32-bit structures. libbfd looks for these types, and having them fixes 'gcore' in gdb of a 32-bit process on a 64-bit platform. - Use the structure definitions from <sys/procfs.h> in gcore's elf32 core dump code instead of duplicating the definitions.
-rw-r--r--sys/compat/freebsd32/freebsd32.h26
-rw-r--r--sys/ia64/include/reg.h2
-rw-r--r--sys/mips/include/reg.h4
-rw-r--r--sys/powerpc/include/reg.h4
-rw-r--r--sys/sparc64/include/reg.h6
-rw-r--r--sys/sys/procfs.h25
-rw-r--r--sys/x86/include/reg.h1
-rw-r--r--usr.bin/gcore/elf32core.c18
8 files changed, 40 insertions, 46 deletions
diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
index 221cdf3..bbe41cf 100644
--- a/sys/compat/freebsd32/freebsd32.h
+++ b/sys/compat/freebsd32/freebsd32.h
@@ -243,32 +243,6 @@ struct i386_ldt_args32 {
uint32_t num;
};
-/*
- * Alternative layouts for <sys/procfs.h>
- */
-struct prstatus32 {
- int pr_version;
- u_int pr_statussz;
- u_int pr_gregsetsz;
- u_int pr_fpregsetsz;
- int pr_osreldate;
- int pr_cursig;
- pid_t pr_pid;
- struct reg32 pr_reg;
-};
-
-struct prpsinfo32 {
- int pr_version;
- u_int pr_psinfosz;
- char pr_fname[PRFNAMESZ+1];
- char pr_psargs[PRARGSZ+1];
-};
-
-struct thrmisc32 {
- char pr_tname[MAXCOMLEN+1];
- u_int _pad;
-};
-
struct mq_attr32 {
int mq_flags;
int mq_maxmsg;
diff --git a/sys/ia64/include/reg.h b/sys/ia64/include/reg.h
index af6489d..74211e2 100644
--- a/sys/ia64/include/reg.h
+++ b/sys/ia64/include/reg.h
@@ -81,6 +81,8 @@ struct dbreg {
unsigned long dbr_inst[8];
};
+#define __HAVE_REG32
+
#ifdef _KERNEL
struct thread;
diff --git a/sys/mips/include/reg.h b/sys/mips/include/reg.h
index c240506..0dc36c6 100644
--- a/sys/mips/include/reg.h
+++ b/sys/mips/include/reg.h
@@ -70,7 +70,7 @@ struct dbreg {
unsigned long junk;
};
-#ifdef COMPAT_FREEBSD32
+#ifdef __LP64__
/* Must match struct trapframe */
struct reg32 {
uint32_t r_regs[NUMSAVEREGS];
@@ -83,6 +83,8 @@ struct fpreg32 {
struct dbreg32 {
uint32_t junk;
};
+
+#define __HAVE_REG32
#endif
#ifdef _KERNEL
diff --git a/sys/powerpc/include/reg.h b/sys/powerpc/include/reg.h
index 3d2d581..c774641 100644
--- a/sys/powerpc/include/reg.h
+++ b/sys/powerpc/include/reg.h
@@ -28,7 +28,7 @@ struct dbreg {
unsigned int junk;
};
-#ifdef COMPAT_FREEBSD32
+#ifdef __LP64__
/* Must match struct trapframe */
struct reg32 {
int32_t fixreg[32];
@@ -46,6 +46,8 @@ struct fpreg32 {
struct dbreg32 {
struct dbreg data;
};
+
+#define __HAVE_REG32
#endif
#ifdef _KERNEL
diff --git a/sys/sparc64/include/reg.h b/sys/sparc64/include/reg.h
index d224186..8a4dd2a 100644
--- a/sys/sparc64/include/reg.h
+++ b/sys/sparc64/include/reg.h
@@ -98,6 +98,12 @@ struct dbreg {
int dummy;
};
+/*
+ * NB: sparcv8 binaries are not supported even though this header
+ * defines the relevant structures.
+ */
+#define __HAVE_REG32
+
#ifdef _KERNEL
/*
* XXX these interfaces are MI, so they should be declared in a MI place.
diff --git a/sys/sys/procfs.h b/sys/sys/procfs.h
index cab9c30..7066a98 100644
--- a/sys/sys/procfs.h
+++ b/sys/sys/procfs.h
@@ -89,4 +89,29 @@ typedef struct thrmisc {
typedef uint64_t psaddr_t; /* An address in the target process. */
+#ifdef __HAVE_REG32
+typedef struct prstatus32 {
+ int32_t pr_version;
+ uint32_t pr_statussz;
+ uint32_t pr_gregsetsz;
+ uint32_t pr_fpregsetsz;
+ int32_t pr_osreldate;
+ int32_t pr_cursig;
+ int32_t pr_pid;
+ struct reg32 pr_reg;
+} prstatus32_t;
+
+typedef struct prpsinfo32 {
+ int32_t pr_version;
+ uint32_t pr_psinfosz;
+ char pr_fname[PRFNAMESZ+1];
+ char pr_psargs[PRARGSZ+1];
+} prpsinfo32_t;
+
+struct thrmisc32 {
+ char pr_tname[MAXCOMLEN+1];
+ uint32_t _pad;
+};
+#endif /* __HAVE_REG32 */
+
#endif /* _SYS_PROCFS_H_ */
diff --git a/sys/x86/include/reg.h b/sys/x86/include/reg.h
index 56668ea8..a1452cc 100644
--- a/sys/x86/include/reg.h
+++ b/sys/x86/include/reg.h
@@ -91,6 +91,7 @@
#define __fpreg64 fpreg
#define __dbreg32 dbreg32
#define __dbreg64 dbreg
+#define __HAVE_REG32
#endif
/*
diff --git a/usr.bin/gcore/elf32core.c b/usr.bin/gcore/elf32core.c
index de48500..d13a4ef 100644
--- a/usr.bin/gcore/elf32core.c
+++ b/usr.bin/gcore/elf32core.c
@@ -8,24 +8,6 @@
#include <sys/procfs.h>
-struct prpsinfo32 {
- int pr_version;
- u_int pr_psinfosz;
- char pr_fname[PRFNAMESZ+1];
- char pr_psargs[PRARGSZ+1];
-};
-
-struct prstatus32 {
- int pr_version;
- u_int pr_statussz;
- u_int pr_gregsetsz;
- u_int pr_fpregsetsz;
- int pr_osreldate;
- int pr_cursig;
- pid_t pr_pid;
- struct reg32 pr_reg;
-};
-
#define ELFCORE_COMPAT_32 1
#include "elfcore.c"
OpenPOWER on IntegriCloud