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.

Differential Revision:	https://reviews.freebsd.org/D2142
Reviewed by:	kib, nathanw (powerpc bits)
MFC after:	1 week
This commit is contained in:
John Baldwin 2015-04-08 16:30:45 +00:00
parent d61251e934
commit dbee5c671a
7 changed files with 38 additions and 46 deletions

View File

@ -243,32 +243,6 @@ struct i386_ldt_args32 {
uint32_t num; 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 { struct mq_attr32 {
int mq_flags; int mq_flags;
int mq_maxmsg; int mq_maxmsg;

View File

@ -70,7 +70,7 @@ struct dbreg {
unsigned long junk; unsigned long junk;
}; };
#ifdef COMPAT_FREEBSD32 #ifdef __LP64__
/* Must match struct trapframe */ /* Must match struct trapframe */
struct reg32 { struct reg32 {
uint32_t r_regs[NUMSAVEREGS]; uint32_t r_regs[NUMSAVEREGS];
@ -83,6 +83,8 @@ struct fpreg32 {
struct dbreg32 { struct dbreg32 {
uint32_t junk; uint32_t junk;
}; };
#define __HAVE_REG32
#endif #endif
#ifdef _KERNEL #ifdef _KERNEL

View File

@ -39,7 +39,7 @@ struct dbreg {
unsigned int junk; unsigned int junk;
}; };
#ifdef COMPAT_FREEBSD32 #ifdef __LP64__
/* Must match struct trapframe */ /* Must match struct trapframe */
struct reg32 { struct reg32 {
int32_t fixreg[32]; int32_t fixreg[32];
@ -61,6 +61,8 @@ struct vmxreg32 {
struct dbreg32 { struct dbreg32 {
struct dbreg data; struct dbreg data;
}; };
#define __HAVE_REG32
#endif #endif
#ifdef _KERNEL #ifdef _KERNEL

View File

@ -98,6 +98,12 @@ struct dbreg {
int dummy; int dummy;
}; };
/*
* NB: sparcv8 binaries are not supported even though this header
* defines the relevant structures.
*/
#define __HAVE_REG32
#ifdef _KERNEL #ifdef _KERNEL
/* /*
* XXX these interfaces are MI, so they should be declared in a MI place. * XXX these interfaces are MI, so they should be declared in a MI place.

View File

@ -89,4 +89,29 @@ typedef struct thrmisc {
typedef uint64_t psaddr_t; /* An address in the target process. */ 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_ */ #endif /* _SYS_PROCFS_H_ */

View File

@ -91,6 +91,7 @@
#define __fpreg64 fpreg #define __fpreg64 fpreg
#define __dbreg32 dbreg32 #define __dbreg32 dbreg32
#define __dbreg64 dbreg #define __dbreg64 dbreg
#define __HAVE_REG32
#endif #endif
/* /*

View File

@ -8,24 +8,6 @@
#include <sys/procfs.h> #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 #define ELFCORE_COMPAT_32 1
#include "elfcore.c" #include "elfcore.c"