diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-08-19 21:07:56 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-08-19 21:07:56 -0400 |
commit | 4f0dbc2781b9dc457159b676289f874ab2dc3560 (patch) | |
tree | 2b8af0f301eaf0bc47d643b99d48a84611b4bed3 /arch/powerpc/kernel/exceptions-64s.S | |
parent | 3c15a68880023722fc794018768df556f438ae98 (diff) | |
parent | 20002ded4d937ca87aca6253b874920a96a763c4 (diff) |
Merge commit 'paulus-perf/master' into next
Diffstat (limited to 'arch/powerpc/kernel/exceptions-64s.S')
-rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 50f2ad36ed09..1808876edcc9 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -731,6 +731,11 @@ BEGIN_FTR_SECTION | |||
731 | bne- do_ste_alloc /* If so handle it */ | 731 | bne- do_ste_alloc /* If so handle it */ |
732 | END_FTR_SECTION_IFCLR(CPU_FTR_SLB) | 732 | END_FTR_SECTION_IFCLR(CPU_FTR_SLB) |
733 | 733 | ||
734 | clrrdi r11,r1,THREAD_SHIFT | ||
735 | lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */ | ||
736 | andis. r0,r0,NMI_MASK@h /* (i.e. an irq when soft-disabled) */ | ||
737 | bne 77f /* then don't call hash_page now */ | ||
738 | |||
734 | /* | 739 | /* |
735 | * On iSeries, we soft-disable interrupts here, then | 740 | * On iSeries, we soft-disable interrupts here, then |
736 | * hard-enable interrupts so that the hash_page code can spin on | 741 | * hard-enable interrupts so that the hash_page code can spin on |
@@ -835,6 +840,20 @@ handle_page_fault: | |||
835 | bl .low_hash_fault | 840 | bl .low_hash_fault |
836 | b .ret_from_except | 841 | b .ret_from_except |
837 | 842 | ||
843 | /* | ||
844 | * We come here as a result of a DSI at a point where we don't want | ||
845 | * to call hash_page, such as when we are accessing memory (possibly | ||
846 | * user memory) inside a PMU interrupt that occurred while interrupts | ||
847 | * were soft-disabled. We want to invoke the exception handler for | ||
848 | * the access, or panic if there isn't a handler. | ||
849 | */ | ||
850 | 77: bl .save_nvgprs | ||
851 | mr r4,r3 | ||
852 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
853 | li r5,SIGSEGV | ||
854 | bl .bad_page_fault | ||
855 | b .ret_from_except | ||
856 | |||
838 | /* here we have a segment miss */ | 857 | /* here we have a segment miss */ |
839 | do_ste_alloc: | 858 | do_ste_alloc: |
840 | bl .ste_allocate /* try to insert stab entry */ | 859 | bl .ste_allocate /* try to insert stab entry */ |