diff options
author | Robin Getz <robin.getz@analog.com> | 2007-10-29 18:14:15 +0800 |
---|---|---|
committer | Bryan Wu <bryan.wu@analog.com> | 2007-10-29 18:14:15 +0800 |
commit | aa770aa790f3a5f3ff568388d02aea2ef78773ec (patch) | |
tree | c100fc10a4cdbd9bc0104846795babcad915dd71 /arch/blackfin | |
parent | 7728ec33faf88605fb871b9b0ecf8e45d4359678 (diff) | |
download | linux-3.10-aa770aa790f3a5f3ff568388d02aea2ef78773ec.tar.gz linux-3.10-aa770aa790f3a5f3ff568388d02aea2ef78773ec.tar.bz2 linux-3.10-aa770aa790f3a5f3ff568388d02aea2ef78773ec.zip |
Blackfin arch: Fix random crash issue found by Michael.
This is fixes a problem where we could jump to the wrong address. By
doing a "p0 = reti; jump (p0)". If a different, higher level interrupt
came in, just before, rather than returning to the calling function, we
would return to a random place in the kernel.
This very elegant fix from Bernd grabs the return location off the
stack, and places it into P0, so when we do a return, it goes to the
correct place.
Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Diffstat (limited to 'arch/blackfin')
-rw-r--r-- | arch/blackfin/kernel/entry.S | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/blackfin/kernel/entry.S b/arch/blackfin/kernel/entry.S index 65c5ba4260b..65f4e67a65c 100644 --- a/arch/blackfin/kernel/entry.S +++ b/arch/blackfin/kernel/entry.S @@ -54,9 +54,11 @@ ENTRY(_ret_from_fork) [sp + PT_IPEND] = r0; /* do a 'fake' RTI by jumping to [RETI] * to avoid clearing supervisor mode in child - */ + */ + r0 = [sp + PT_PC]; + [sp + PT_P0] = r0; + RESTORE_ALL_SYS - p0 = reti; jump (p0); ENDPROC(_ret_from_fork) |