diff options
-rw-r--r-- | arch/mips/include/asm/elf.h | 3 | ||||
-rw-r--r-- | arch/mips/include/asm/page.h | 6 | ||||
-rw-r--r-- | arch/mips/kernel/elf.c | 19 |
3 files changed, 26 insertions, 2 deletions
diff --git a/arch/mips/include/asm/elf.h b/arch/mips/include/asm/elf.h index ede8c4ff56f7..2b3dc2973670 100644 --- a/arch/mips/include/asm/elf.h +++ b/arch/mips/include/asm/elf.h | |||
@@ -499,4 +499,7 @@ extern int arch_check_elf(void *ehdr, bool has_interpreter, void *interp_ehdr, | |||
499 | extern void mips_set_personality_nan(struct arch_elf_state *state); | 499 | extern void mips_set_personality_nan(struct arch_elf_state *state); |
500 | extern void mips_set_personality_fp(struct arch_elf_state *state); | 500 | extern void mips_set_personality_fp(struct arch_elf_state *state); |
501 | 501 | ||
502 | #define elf_read_implies_exec(ex, stk) mips_elf_read_implies_exec(&(ex), stk) | ||
503 | extern int mips_elf_read_implies_exec(void *elf_ex, int exstack); | ||
504 | |||
502 | #endif /* _ASM_ELF_H */ | 505 | #endif /* _ASM_ELF_H */ |
diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index 21ed7150fec3..74cb004c2868 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h | |||
@@ -229,8 +229,10 @@ extern int __virt_addr_valid(const volatile void *kaddr); | |||
229 | #define virt_addr_valid(kaddr) \ | 229 | #define virt_addr_valid(kaddr) \ |
230 | __virt_addr_valid((const volatile void *) (kaddr)) | 230 | __virt_addr_valid((const volatile void *) (kaddr)) |
231 | 231 | ||
232 | #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ | 232 | #define VM_DATA_DEFAULT_FLAGS \ |
233 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | 233 | (VM_READ | VM_WRITE | \ |
234 | ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ | ||
235 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | ||
234 | 236 | ||
235 | #define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + UNCAC_BASE) | 237 | #define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + UNCAC_BASE) |
236 | #define CAC_ADDR(addr) ((addr) - UNCAC_BASE + PAGE_OFFSET) | 238 | #define CAC_ADDR(addr) ((addr) - UNCAC_BASE + PAGE_OFFSET) |
diff --git a/arch/mips/kernel/elf.c b/arch/mips/kernel/elf.c index 891f5ee63983..824b0373ba71 100644 --- a/arch/mips/kernel/elf.c +++ b/arch/mips/kernel/elf.c | |||
@@ -8,9 +8,12 @@ | |||
8 | * option) any later version. | 8 | * option) any later version. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/binfmts.h> | ||
11 | #include <linux/elf.h> | 12 | #include <linux/elf.h> |
13 | #include <linux/export.h> | ||
12 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
13 | 15 | ||
16 | #include <asm/cpu-features.h> | ||
14 | #include <asm/cpu-info.h> | 17 | #include <asm/cpu-info.h> |
15 | 18 | ||
16 | /* Whether to accept legacy-NaN and 2008-NaN user binaries. */ | 19 | /* Whether to accept legacy-NaN and 2008-NaN user binaries. */ |
@@ -326,3 +329,19 @@ void mips_set_personality_nan(struct arch_elf_state *state) | |||
326 | BUG(); | 329 | BUG(); |
327 | } | 330 | } |
328 | } | 331 | } |
332 | |||
333 | int mips_elf_read_implies_exec(void *elf_ex, int exstack) | ||
334 | { | ||
335 | if (exstack != EXSTACK_DISABLE_X) { | ||
336 | /* The binary doesn't request a non-executable stack */ | ||
337 | return 1; | ||
338 | } | ||
339 | |||
340 | if (!cpu_has_rixi) { | ||
341 | /* The CPU doesn't support non-executable memory */ | ||
342 | return 1; | ||
343 | } | ||
344 | |||
345 | return 0; | ||
346 | } | ||
347 | EXPORT_SYMBOL(mips_elf_read_implies_exec); | ||