Skip to content

Commit

Permalink
Blackfin arch: fix signal handling bug
Browse files Browse the repository at this point in the history
There's a forum thread at
https://blackfin.uclinux.org/gf/project/uclinux-dist/forum/?action=ForumBrowse&_forum_action=MessageReply&message_id=24741

which has a testcase involving signal handling that crashes quite readily.
Inspecting the code I believe what happens is that signal handling can become
confused when it is invoked on return from an interrupt, if the contents of
P0 and R0 at the time of the interrupt happen to be such that P0 is larger
than zero (indicating to the signal code that we're in a syscall), and R0
happens to have a value of something like -EINTR or -ERESTARTSYS.
Fixed by setting orig_p0 to -1 if we're returning from an interrupt.  The
testcase now seems to run without problems.

Signed-off-by: Bernd Schmidt <bernd.schmidt@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Bernd Schmidt authored and Linus Torvalds committed May 21, 2007
1 parent a9c59c2 commit c824498
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions arch/blackfin/mach-common/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -712,6 +712,11 @@ _schedule_and_signal_from_int:
p1.h = _evt_system_call;
[p0] = p1;
csync;

/* Set orig_p0 to -1 to indicate this isn't the end of a syscall. */
r0 = -1 (x);
[sp + PT_ORIG_P0] = r0;

p1 = rets;
[sp + PT_RESERVED] = p1;

Expand Down

0 comments on commit c824498

Please sign in to comment.