|
@@ -6,7 +6,7 @@
|
|
* ELF register definitions..
|
|
* ELF register definitions..
|
|
*/
|
|
*/
|
|
|
|
|
|
-#include <asm/ptrace.h>
|
|
|
|
|
|
+#include <linux/types.h>
|
|
|
|
|
|
#define EM_PARISC 15
|
|
#define EM_PARISC 15
|
|
|
|
|
|
@@ -169,16 +169,12 @@ typedef struct elf64_fdesc {
|
|
__u64 gp;
|
|
__u64 gp;
|
|
} Elf64_Fdesc;
|
|
} Elf64_Fdesc;
|
|
|
|
|
|
-#ifdef __KERNEL__
|
|
|
|
-
|
|
|
|
#ifdef CONFIG_64BIT
|
|
#ifdef CONFIG_64BIT
|
|
#define Elf_Fdesc Elf64_Fdesc
|
|
#define Elf_Fdesc Elf64_Fdesc
|
|
#else
|
|
#else
|
|
#define Elf_Fdesc Elf32_Fdesc
|
|
#define Elf_Fdesc Elf32_Fdesc
|
|
#endif /*CONFIG_64BIT*/
|
|
#endif /*CONFIG_64BIT*/
|
|
|
|
|
|
-#endif /*__KERNEL__*/
|
|
|
|
-
|
|
|
|
/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
|
|
/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
|
|
|
|
|
|
#define PT_HP_TLS (PT_LOOS + 0x0)
|
|
#define PT_HP_TLS (PT_LOOS + 0x0)
|
|
@@ -212,45 +208,45 @@ typedef struct elf64_fdesc {
|
|
#define PF_HP_LAZYSWAP 0x04000000
|
|
#define PF_HP_LAZYSWAP 0x04000000
|
|
#define PF_HP_SBP 0x08000000
|
|
#define PF_HP_SBP 0x08000000
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * This yields a string that ld.so will use to load implementation
|
|
|
|
+ * specific libraries for optimization. This is more specific in
|
|
|
|
+ * intent than poking at uname or /proc/cpuinfo.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#define ELF_PLATFORM ("PARISC")
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* The following definitions are those for 32-bit ELF binaries on a 32-bit
|
|
* The following definitions are those for 32-bit ELF binaries on a 32-bit
|
|
* kernel and for 64-bit binaries on a 64-bit kernel. To run 32-bit binaries
|
|
* kernel and for 64-bit binaries on a 64-bit kernel. To run 32-bit binaries
|
|
- * on a 64-bit kernel, arch/parisc/kernel/binfmt_elf32.c defines these
|
|
|
|
- * macros appropriately and then #includes binfmt_elf.c, which then includes
|
|
|
|
- * this file.
|
|
|
|
|
|
+ * on a 64-bit kernel, fs/compat_binfmt_elf.c defines ELF_CLASS and then
|
|
|
|
+ * #includes binfmt_elf.c, which then includes this file.
|
|
*/
|
|
*/
|
|
#ifndef ELF_CLASS
|
|
#ifndef ELF_CLASS
|
|
|
|
|
|
-/*
|
|
|
|
- * This is used to ensure we don't load something for the wrong architecture.
|
|
|
|
- *
|
|
|
|
- * Note that this header file is used by default in fs/binfmt_elf.c. So
|
|
|
|
- * the following macros are for the default case. However, for the 64
|
|
|
|
- * bit kernel we also support 32 bit parisc binaries. To do that
|
|
|
|
- * arch/parisc/kernel/binfmt_elf32.c defines its own set of these
|
|
|
|
- * macros, and then it includes fs/binfmt_elf.c to provide an alternate
|
|
|
|
- * elf binary handler for 32 bit binaries (on the 64 bit kernel).
|
|
|
|
- */
|
|
|
|
#ifdef CONFIG_64BIT
|
|
#ifdef CONFIG_64BIT
|
|
-#define ELF_CLASS ELFCLASS64
|
|
|
|
|
|
+#define ELF_CLASS ELFCLASS64
|
|
#else
|
|
#else
|
|
#define ELF_CLASS ELFCLASS32
|
|
#define ELF_CLASS ELFCLASS32
|
|
#endif
|
|
#endif
|
|
|
|
|
|
typedef unsigned long elf_greg_t;
|
|
typedef unsigned long elf_greg_t;
|
|
|
|
|
|
-/*
|
|
|
|
- * This yields a string that ld.so will use to load implementation
|
|
|
|
- * specific libraries for optimization. This is more specific in
|
|
|
|
- * intent than poking at uname or /proc/cpuinfo.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-#define ELF_PLATFORM ("PARISC\0")
|
|
|
|
-
|
|
|
|
#define SET_PERSONALITY(ex) \
|
|
#define SET_PERSONALITY(ex) \
|
|
|
|
+({ \
|
|
set_personality((current->personality & ~PER_MASK) | PER_LINUX); \
|
|
set_personality((current->personality & ~PER_MASK) | PER_LINUX); \
|
|
current->thread.map_base = DEFAULT_MAP_BASE; \
|
|
current->thread.map_base = DEFAULT_MAP_BASE; \
|
|
- current->thread.task_size = DEFAULT_TASK_SIZE \
|
|
|
|
|
|
+ current->thread.task_size = DEFAULT_TASK_SIZE; \
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+#endif /* ! ELF_CLASS */
|
|
|
|
+
|
|
|
|
+#define COMPAT_SET_PERSONALITY(ex) \
|
|
|
|
+({ \
|
|
|
|
+ set_thread_flag(TIF_32BIT); \
|
|
|
|
+ current->thread.map_base = DEFAULT_MAP_BASE32; \
|
|
|
|
+ current->thread.task_size = DEFAULT_TASK_SIZE32; \
|
|
|
|
+ })
|
|
|
|
|
|
/*
|
|
/*
|
|
* Fill in general registers in a core dump. This saves pretty
|
|
* Fill in general registers in a core dump. This saves pretty
|
|
@@ -277,10 +273,12 @@ typedef unsigned long elf_greg_t;
|
|
|
|
|
|
#define ELF_CORE_COPY_REGS(dst, pt) \
|
|
#define ELF_CORE_COPY_REGS(dst, pt) \
|
|
memset(dst, 0, sizeof(dst)); /* don't leak any "random" bits */ \
|
|
memset(dst, 0, sizeof(dst)); /* don't leak any "random" bits */ \
|
|
- memcpy(dst + 0, pt->gr, 32 * sizeof(elf_greg_t)); \
|
|
|
|
- memcpy(dst + 32, pt->sr, 8 * sizeof(elf_greg_t)); \
|
|
|
|
- memcpy(dst + 40, pt->iaoq, 2 * sizeof(elf_greg_t)); \
|
|
|
|
- memcpy(dst + 42, pt->iasq, 2 * sizeof(elf_greg_t)); \
|
|
|
|
|
|
+ { int i; \
|
|
|
|
+ for (i = 0; i < 32; i++) dst[i] = pt->gr[i]; \
|
|
|
|
+ for (i = 0; i < 8; i++) dst[32 + i] = pt->sr[i]; \
|
|
|
|
+ } \
|
|
|
|
+ dst[40] = pt->iaoq[0]; dst[41] = pt->iaoq[1]; \
|
|
|
|
+ dst[42] = pt->iasq[0]; dst[43] = pt->iasq[1]; \
|
|
dst[44] = pt->sar; dst[45] = pt->iir; \
|
|
dst[44] = pt->sar; dst[45] = pt->iir; \
|
|
dst[46] = pt->isr; dst[47] = pt->ior; \
|
|
dst[46] = pt->isr; dst[47] = pt->ior; \
|
|
dst[48] = mfctl(22); dst[49] = mfctl(0); \
|
|
dst[48] = mfctl(22); dst[49] = mfctl(0); \
|
|
@@ -292,7 +290,7 @@ typedef unsigned long elf_greg_t;
|
|
dst[60] = mfctl(12); dst[61] = mfctl(13); \
|
|
dst[60] = mfctl(12); dst[61] = mfctl(13); \
|
|
dst[62] = mfctl(10); dst[63] = mfctl(15);
|
|
dst[62] = mfctl(10); dst[63] = mfctl(15);
|
|
|
|
|
|
-#endif /* ! ELF_CLASS */
|
|
|
|
|
|
+#define CORE_DUMP_USE_REGSET
|
|
|
|
|
|
#define ELF_NGREG 80 /* We only need 64 at present, but leave space
|
|
#define ELF_NGREG 80 /* We only need 64 at present, but leave space
|
|
for expansion. */
|
|
for expansion. */
|
|
@@ -310,7 +308,10 @@ extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);
|
|
struct pt_regs; /* forward declaration... */
|
|
struct pt_regs; /* forward declaration... */
|
|
|
|
|
|
|
|
|
|
-#define elf_check_arch(x) ((x)->e_machine == EM_PARISC && (x)->e_ident[EI_CLASS] == ELF_CLASS)
|
|
|
|
|
|
+#define elf_check_arch(x) \
|
|
|
|
+ ((x)->e_machine == EM_PARISC && (x)->e_ident[EI_CLASS] == ELF_CLASS)
|
|
|
|
+#define compat_elf_check_arch(x) \
|
|
|
|
+ ((x)->e_machine == EM_PARISC && (x)->e_ident[EI_CLASS] == ELFCLASS32)
|
|
|
|
|
|
/*
|
|
/*
|
|
* These are used to set parameters in the core dumps.
|
|
* These are used to set parameters in the core dumps.
|