|
@@ -12,7 +12,6 @@
|
|
|
#include <linux/fs.h>
|
|
|
#include <uapi/linux/elf.h>
|
|
|
|
|
|
-#include <asm/cpu-info.h>
|
|
|
#include <asm/current.h>
|
|
|
|
|
|
/* ELF header e_flags defines. */
|
|
@@ -44,6 +43,7 @@
|
|
|
#define EF_MIPS_OPTIONS_FIRST 0x00000080
|
|
|
#define EF_MIPS_32BITMODE 0x00000100
|
|
|
#define EF_MIPS_FP64 0x00000200
|
|
|
+#define EF_MIPS_NAN2008 0x00000400
|
|
|
#define EF_MIPS_ABI 0x0000f000
|
|
|
#define EF_MIPS_ARCH 0xf0000000
|
|
|
|
|
@@ -305,7 +305,7 @@ do { \
|
|
|
\
|
|
|
current->thread.abi = &mips_abi; \
|
|
|
\
|
|
|
- current->thread.fpu.fcr31 = boot_cpu_data.fpu_csr31; \
|
|
|
+ mips_set_personality_nan(state); \
|
|
|
} while (0)
|
|
|
|
|
|
#endif /* CONFIG_32BIT */
|
|
@@ -367,7 +367,7 @@ do { \
|
|
|
else \
|
|
|
current->thread.abi = &mips_abi; \
|
|
|
\
|
|
|
- current->thread.fpu.fcr31 = boot_cpu_data.fpu_csr31; \
|
|
|
+ mips_set_personality_nan(state); \
|
|
|
\
|
|
|
p = personality(current->personality); \
|
|
|
if (p != PER_LINUX32 && p != PER_LINUX) \
|
|
@@ -432,6 +432,7 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm,
|
|
|
int uses_interp);
|
|
|
|
|
|
struct arch_elf_state {
|
|
|
+ int nan_2008;
|
|
|
int fp_abi;
|
|
|
int interp_fp_abi;
|
|
|
int overall_fp_mode;
|
|
@@ -440,6 +441,7 @@ struct arch_elf_state {
|
|
|
#define MIPS_ABI_FP_UNKNOWN (-1) /* Unknown FP ABI (kernel internal) */
|
|
|
|
|
|
#define INIT_ARCH_ELF_STATE { \
|
|
|
+ .nan_2008 = -1, \
|
|
|
.fp_abi = MIPS_ABI_FP_UNKNOWN, \
|
|
|
.interp_fp_abi = MIPS_ABI_FP_UNKNOWN, \
|
|
|
.overall_fp_mode = -1, \
|
|
@@ -451,6 +453,7 @@ extern int arch_elf_pt_proc(void *ehdr, void *phdr, struct file *elf,
|
|
|
extern int arch_check_elf(void *ehdr, bool has_interpreter, void *interp_ehdr,
|
|
|
struct arch_elf_state *state);
|
|
|
|
|
|
+extern void mips_set_personality_nan(struct arch_elf_state *state);
|
|
|
extern void mips_set_personality_fp(struct arch_elf_state *state);
|
|
|
|
|
|
#endif /* _ASM_ELF_H */
|