|
@@ -115,28 +115,33 @@ BEGIN_FW_FTR_SECTION
|
|
END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
|
|
END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
|
|
#endif /* CONFIG_VIRT_CPU_ACCOUNTING && CONFIG_PPC_SPLPAR */
|
|
#endif /* CONFIG_VIRT_CPU_ACCOUNTING && CONFIG_PPC_SPLPAR */
|
|
|
|
|
|
-#ifdef CONFIG_TRACE_IRQFLAGS
|
|
|
|
- bl .trace_hardirqs_on
|
|
|
|
- REST_GPR(0,r1)
|
|
|
|
- REST_4GPRS(3,r1)
|
|
|
|
- REST_2GPRS(7,r1)
|
|
|
|
- addi r9,r1,STACK_FRAME_OVERHEAD
|
|
|
|
- ld r12,_MSR(r1)
|
|
|
|
-#endif /* CONFIG_TRACE_IRQFLAGS */
|
|
|
|
- li r10,1
|
|
|
|
- stb r10,PACASOFTIRQEN(r13)
|
|
|
|
- stb r10,PACAHARDIRQEN(r13)
|
|
|
|
- std r10,SOFTE(r1)
|
|
|
|
|
|
+ /*
|
|
|
|
+ * A syscall should always be called with interrupts enabled
|
|
|
|
+ * so we just unconditionally hard-enable here. When some kind
|
|
|
|
+ * of irq tracing is used, we additionally check that condition
|
|
|
|
+ * is correct
|
|
|
|
+ */
|
|
|
|
+#if defined(CONFIG_TRACE_IRQFLAGS) && defined(CONFIG_BUG)
|
|
|
|
+ lbz r10,PACASOFTIRQEN(r13)
|
|
|
|
+ xori r10,r10,1
|
|
|
|
+1: tdnei r10,0
|
|
|
|
+ EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,BUGFLAG_WARNING
|
|
|
|
+#endif
|
|
|
|
|
|
- /* Hard enable interrupts */
|
|
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
wrteei 1
|
|
wrteei 1
|
|
#else
|
|
#else
|
|
- mfmsr r11
|
|
|
|
|
|
+ ld r11,PACAKMSR(r13)
|
|
ori r11,r11,MSR_EE
|
|
ori r11,r11,MSR_EE
|
|
mtmsrd r11,1
|
|
mtmsrd r11,1
|
|
#endif /* CONFIG_PPC_BOOK3E */
|
|
#endif /* CONFIG_PPC_BOOK3E */
|
|
|
|
|
|
|
|
+ /* We do need to set SOFTE in the stack frame or the return
|
|
|
|
+ * from interrupt will be painful
|
|
|
|
+ */
|
|
|
|
+ li r10,1
|
|
|
|
+ std r10,SOFTE(r1)
|
|
|
|
+
|
|
#ifdef SHOW_SYSCALLS
|
|
#ifdef SHOW_SYSCALLS
|
|
bl .do_show_syscall
|
|
bl .do_show_syscall
|
|
REST_GPR(0,r1)
|
|
REST_GPR(0,r1)
|
|
@@ -187,16 +192,14 @@ syscall_exit:
|
|
andi. r10,r8,MSR_RI
|
|
andi. r10,r8,MSR_RI
|
|
beq- unrecov_restore
|
|
beq- unrecov_restore
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
- /* Disable interrupts so current_thread_info()->flags can't change,
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Disable interrupts so current_thread_info()->flags can't change,
|
|
* and so that we don't get interrupted after loading SRR0/1.
|
|
* and so that we don't get interrupted after loading SRR0/1.
|
|
*/
|
|
*/
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
wrteei 0
|
|
wrteei 0
|
|
#else
|
|
#else
|
|
- mfmsr r10
|
|
|
|
- rldicl r10,r10,48,1
|
|
|
|
- rotldi r10,r10,16
|
|
|
|
|
|
+ ld r10,PACAKMSR(r13)
|
|
mtmsrd r10,1
|
|
mtmsrd r10,1
|
|
#endif /* CONFIG_PPC_BOOK3E */
|
|
#endif /* CONFIG_PPC_BOOK3E */
|
|
|
|
|
|
@@ -308,7 +311,7 @@ syscall_exit_work:
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
wrteei 1
|
|
wrteei 1
|
|
#else
|
|
#else
|
|
- mfmsr r10
|
|
|
|
|
|
+ ld r10,PACAKMSR(r13)
|
|
ori r10,r10,MSR_EE
|
|
ori r10,r10,MSR_EE
|
|
mtmsrd r10,1
|
|
mtmsrd r10,1
|
|
#endif /* CONFIG_PPC_BOOK3E */
|
|
#endif /* CONFIG_PPC_BOOK3E */
|