powerpc: Call do_page_fault() with interrupts off
We currently turn interrupts back to their previous state before calling do_page_fault(). This can be annoying when debugging as a bad fault will potentially have lost some processor state before getting into the debugger. We also end up calling some generic code with interrupts enabled such as notify_page_fault() with interrupts enabled, which could be unexpected. This changes our code to behave more like other architectures, and make the assembly entry code call into do_page_faults() with interrupts disabled. They are conditionally re-enabled from within do_page_fault() in the same spot x86 does it. While there, add the might_sleep() test in the case of a successful trylock of the mmap semaphore, again like x86. Also fix a bug in the existing assembly where r12 (_MSR) could get clobbered by C calls (the DTL accounting in the exception common macro and DISABLE_INTS) in some cases. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- v2. Add the r12 clobber fix
This commit is contained in:
@@ -313,7 +313,7 @@ interrupt_end_book3e:
|
||||
NORMAL_EXCEPTION_PROLOG(0x300, PROLOG_ADDITION_2REGS)
|
||||
mfspr r14,SPRN_DEAR
|
||||
mfspr r15,SPRN_ESR
|
||||
EXCEPTION_COMMON(0x300, PACA_EXGEN, INTS_KEEP)
|
||||
EXCEPTION_COMMON(0x300, PACA_EXGEN, INTS_DISABLE_ALL)
|
||||
b storage_fault_common
|
||||
|
||||
/* Instruction Storage Interrupt */
|
||||
@@ -321,7 +321,7 @@ interrupt_end_book3e:
|
||||
NORMAL_EXCEPTION_PROLOG(0x400, PROLOG_ADDITION_2REGS)
|
||||
li r15,0
|
||||
mr r14,r10
|
||||
EXCEPTION_COMMON(0x400, PACA_EXGEN, INTS_KEEP)
|
||||
EXCEPTION_COMMON(0x400, PACA_EXGEN, INTS_DISABLE_ALL)
|
||||
b storage_fault_common
|
||||
|
||||
/* External Input Interrupt */
|
||||
@@ -591,7 +591,6 @@ storage_fault_common:
|
||||
mr r5,r15
|
||||
ld r14,PACA_EXGEN+EX_R14(r13)
|
||||
ld r15,PACA_EXGEN+EX_R15(r13)
|
||||
INTS_RESTORE_HARD
|
||||
bl .do_page_fault
|
||||
cmpdi r3,0
|
||||
bne- 1f
|
||||
|
Reference in New Issue
Block a user