if (cpsr & MODE32_BIT) {
struct mm_struct *mm = current->mm;
/*
-@@ -408,7 +409,9 @@ setup_return(struct pt_regs *regs, struc
- retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb;
+@@ -407,7 +408,9 @@ setup_return(struct pt_regs *regs, struc
+ */
retcode = mm->context.sigpage + signal_return_offset +
(idx << 2) + thumb;
- } else {
arch/arm/include/asm/elf.h | 4 +++
arch/arm/include/asm/mmu.h | 1
arch/arm/kernel/process.c | 40 +++++++++++++++++++++++++++++++++---
- arch/arm/kernel/signal.c | 49 ++++++++++++++++++++++++++++++++++++++++-----
- arch/arm/kernel/signal.h | 12 -----------
+ arch/arm/kernel/signal.c | 50 +++++++++++++++++++++++++++++++++++++++------
+ arch/arm/kernel/signal.h | 12 ----------
arch/arm/kernel/traps.c | 9 --------
- 6 files changed, 86 insertions(+), 29 deletions(-)
+ 6 files changed, 86 insertions(+), 30 deletions(-)
--- a/arch/arm/include/asm/elf.h
+++ b/arch/arm/include/asm/elf.h
#ifdef CONFIG_CRUNCH
static int preserve_crunch_context(struct crunch_sigframe __user *frame)
{
-@@ -397,11 +399,15 @@ setup_return(struct pt_regs *regs, struc
+@@ -397,11 +399,14 @@ setup_return(struct pt_regs *regs, struc
return 1;
if (cpsr & MODE32_BIT) {
+ * except when the MPU has protected the vectors
+ * page from PL0
*/
- retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb;
+- retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb;
+ retcode = mm->context.sigpage + signal_return_offset +
+ (idx << 2) + thumb;
} else {
/*
* Ensure that the instruction cache sees
-@@ -603,3 +609,36 @@ do_work_pending(struct pt_regs *regs, un
+@@ -603,3 +608,36 @@ do_work_pending(struct pt_regs *regs, un
} while (thread_flags & _TIF_WORK_MASK);
return 0;
}