summaryrefslogtreecommitdiffstats
path: root/arch/m68k/kernel
diff options
context:
space:
mode:
authorGreg Ungerer <gerg@linux-m68k.org>2016-07-29 14:26:53 +1000
committerGreg Ungerer <gerg@linux-m68k.org>2016-08-08 12:38:47 +1000
commit0b98027122d0715aa2dc39882e4c295112275785 (patch)
treead50dec705aca10b23a3a8cd9bbb9a9f092a6700 /arch/m68k/kernel
parent29b4817d4018df78086157ea3a55c1d9424a7cfc (diff)
downloadlinux-0b98027122d0715aa2dc39882e4c295112275785.tar.gz
linux-0b98027122d0715aa2dc39882e4c295112275785.tar.bz2
linux-0b98027122d0715aa2dc39882e4c295112275785.zip
m68knommu: fix user a5 register being overwritten
On no-MMU systems the application a5 register can be overwitten with the address of the process data segment when processing application signals. For flat format applications compiled with full absolute relocation this effectively corrupts the a5 register on signal processing - and this very quickly leads to process crash and often takes out the whole system with a panic as well. This has no effect on flat format applications compiled with the more common PIC methods (such as -msep-data). These format applications reserve a5 for the pointer to the data segment anyway - so it doesn't change it. A long time ago the a5 register was used in the code packed into the user stack to enable signal return processing. And so it had to be restored on end of signal cleanup processing back to the original a5 user value. This was historically done by saving away a5 in the sigcontext structure. At some point (a long time back it seems) the a5 restore process was changed and it was hard coded to put the user data segment address directly into a5. Which is ok for the common PIC compiled application case, but breaks the full relocation application code. We no longer use this type of signal handling mechanism and so we don't need to do anything special to save and restore a5 at all now. So remove the code that hard codes a5 to the address of the user data segment. Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
Diffstat (limited to 'arch/m68k/kernel')
-rw-r--r--arch/m68k/kernel/signal.c1
1 files changed, 0 insertions, 1 deletions
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index 2dcee3a88867..9202f82dfce6 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -213,7 +213,6 @@ static inline int frame_extra_sizes(int f)
static inline void adjustformat(struct pt_regs *regs)
{
- ((struct switch_stack *)regs - 1)->a5 = current->mm->start_data;
/*
* set format byte to make stack appear modulo 4, which it will
* be when doing the rte