|
@@ -402,7 +402,8 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
|
|
|
__put_user(sigreturn_codes[idx+1], rc+1))
|
|
|
return 1;
|
|
|
|
|
|
- if ((cpsr & MODE32_BIT) && !IS_ENABLED(CONFIG_ARM_MPU)) {
|
|
|
+#ifdef CONFIG_MMU
|
|
|
+ if (cpsr & MODE32_BIT) {
|
|
|
struct mm_struct *mm = current->mm;
|
|
|
|
|
|
/*
|
|
@@ -412,7 +413,9 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
|
|
|
*/
|
|
|
retcode = mm->context.sigpage + signal_return_offset +
|
|
|
(idx << 2) + thumb;
|
|
|
- } else {
|
|
|
+ } else
|
|
|
+#endif
|
|
|
+ {
|
|
|
/*
|
|
|
* Ensure that the instruction cache sees
|
|
|
* the return code written onto the stack.
|
|
@@ -614,35 +617,32 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static struct page *signal_page;
|
|
|
-
|
|
|
struct page *get_signal_page(void)
|
|
|
{
|
|
|
- if (!signal_page) {
|
|
|
- unsigned long ptr;
|
|
|
- unsigned offset;
|
|
|
- void *addr;
|
|
|
+ unsigned long ptr;
|
|
|
+ unsigned offset;
|
|
|
+ struct page *page;
|
|
|
+ void *addr;
|
|
|
|
|
|
- signal_page = alloc_pages(GFP_KERNEL, 0);
|
|
|
+ page = alloc_pages(GFP_KERNEL, 0);
|
|
|
|
|
|
- if (!signal_page)
|
|
|
- return NULL;
|
|
|
+ if (!page)
|
|
|
+ return NULL;
|
|
|
|
|
|
- addr = page_address(signal_page);
|
|
|
+ addr = page_address(page);
|
|
|
|
|
|
- /* Give the signal return code some randomness */
|
|
|
- offset = 0x200 + (get_random_int() & 0x7fc);
|
|
|
- signal_return_offset = offset;
|
|
|
+ /* Give the signal return code some randomness */
|
|
|
+ offset = 0x200 + (get_random_int() & 0x7fc);
|
|
|
+ signal_return_offset = offset;
|
|
|
|
|
|
- /*
|
|
|
- * Copy signal return handlers into the vector page, and
|
|
|
- * set sigreturn to be a pointer to these.
|
|
|
- */
|
|
|
- memcpy(addr + offset, sigreturn_codes, sizeof(sigreturn_codes));
|
|
|
+ /*
|
|
|
+ * Copy signal return handlers into the vector page, and
|
|
|
+ * set sigreturn to be a pointer to these.
|
|
|
+ */
|
|
|
+ memcpy(addr + offset, sigreturn_codes, sizeof(sigreturn_codes));
|
|
|
|
|
|
- ptr = (unsigned long)addr + offset;
|
|
|
- flush_icache_range(ptr, ptr + sizeof(sigreturn_codes));
|
|
|
- }
|
|
|
+ ptr = (unsigned long)addr + offset;
|
|
|
+ flush_icache_range(ptr, ptr + sizeof(sigreturn_codes));
|
|
|
|
|
|
- return signal_page;
|
|
|
+ return page;
|
|
|
}
|