diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-29 11:03:48 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-29 11:03:48 -0400 |
commit | c07724e5b868c603f2a65f3855c77b23454db3ed (patch) | |
tree | 658b1f0af5966e418f48a53e8b2f97e10b250f4f /arch/sparc/mm | |
parent | 302f5bc54448bd2b37d5a8be9b6abc29397827ef (diff) | |
parent | e69f58c037ab5b166b3858fa7b5d7fa470613e8f (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
kbuild: add ARCH=sparc32 target
sparc32: fix build failure on CONFIG_SPARC_LEON
sparc: Fixed random SPARC/LEON SMP CPU Stuck problem.
sparc32: remove CONFIG_HAVE_PERF_EVENTS option
sparc: don't #include asm/system.h in asm/jump_label.h
sparc32: Fix unaligned stack handling on trap return.
sparc: keep calling do_signal() as long as pending signals remain
Diffstat (limited to 'arch/sparc/mm')
-rw-r--r-- | arch/sparc/mm/fault_32.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index bd8601601afa..5b836f5aea90 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
@@ -539,6 +539,12 @@ do_sigbus: | |||
539 | __do_fault_siginfo(BUS_ADRERR, SIGBUS, tsk->thread.kregs, address); | 539 | __do_fault_siginfo(BUS_ADRERR, SIGBUS, tsk->thread.kregs, address); |
540 | } | 540 | } |
541 | 541 | ||
542 | static void check_stack_aligned(unsigned long sp) | ||
543 | { | ||
544 | if (sp & 0x7UL) | ||
545 | force_sig(SIGILL, current); | ||
546 | } | ||
547 | |||
542 | void window_overflow_fault(void) | 548 | void window_overflow_fault(void) |
543 | { | 549 | { |
544 | unsigned long sp; | 550 | unsigned long sp; |
@@ -547,6 +553,8 @@ void window_overflow_fault(void) | |||
547 | if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) | 553 | if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) |
548 | force_user_fault(sp + 0x38, 1); | 554 | force_user_fault(sp + 0x38, 1); |
549 | force_user_fault(sp, 1); | 555 | force_user_fault(sp, 1); |
556 | |||
557 | check_stack_aligned(sp); | ||
550 | } | 558 | } |
551 | 559 | ||
552 | void window_underflow_fault(unsigned long sp) | 560 | void window_underflow_fault(unsigned long sp) |
@@ -554,6 +562,8 @@ void window_underflow_fault(unsigned long sp) | |||
554 | if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) | 562 | if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) |
555 | force_user_fault(sp + 0x38, 0); | 563 | force_user_fault(sp + 0x38, 0); |
556 | force_user_fault(sp, 0); | 564 | force_user_fault(sp, 0); |
565 | |||
566 | check_stack_aligned(sp); | ||
557 | } | 567 | } |
558 | 568 | ||
559 | void window_ret_fault(struct pt_regs *regs) | 569 | void window_ret_fault(struct pt_regs *regs) |
@@ -564,4 +574,6 @@ void window_ret_fault(struct pt_regs *regs) | |||
564 | if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) | 574 | if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) |
565 | force_user_fault(sp + 0x38, 0); | 575 | force_user_fault(sp + 0x38, 0); |
566 | force_user_fault(sp, 0); | 576 | force_user_fault(sp, 0); |
577 | |||
578 | check_stack_aligned(sp); | ||
567 | } | 579 | } |