|
|
@@ -52,6 +52,36 @@
|
|
|
|
|
|
.text
|
|
|
|
|
|
+/*
|
|
|
+ * Used by threads before entering deep idle states. Saves SPRs
|
|
|
+ * in interrupt stack frame
|
|
|
+ */
|
|
|
+save_sprs_to_stack:
|
|
|
+ /*
|
|
|
+ * Note all register i.e per-core, per-subcore or per-thread is saved
|
|
|
+ * here since any thread in the core might wake up first
|
|
|
+ */
|
|
|
+ mfspr r3,SPRN_SDR1
|
|
|
+ std r3,_SDR1(r1)
|
|
|
+ mfspr r3,SPRN_RPR
|
|
|
+ std r3,_RPR(r1)
|
|
|
+ mfspr r3,SPRN_SPURR
|
|
|
+ std r3,_SPURR(r1)
|
|
|
+ mfspr r3,SPRN_PURR
|
|
|
+ std r3,_PURR(r1)
|
|
|
+ mfspr r3,SPRN_TSCR
|
|
|
+ std r3,_TSCR(r1)
|
|
|
+ mfspr r3,SPRN_DSCR
|
|
|
+ std r3,_DSCR(r1)
|
|
|
+ mfspr r3,SPRN_AMOR
|
|
|
+ std r3,_AMOR(r1)
|
|
|
+ mfspr r3,SPRN_WORT
|
|
|
+ std r3,_WORT(r1)
|
|
|
+ mfspr r3,SPRN_WORC
|
|
|
+ std r3,_WORC(r1)
|
|
|
+
|
|
|
+ blr
|
|
|
+
|
|
|
/*
|
|
|
* Used by threads when the lock bit of core_idle_state is set.
|
|
|
* Threads will spin in HMT_LOW until the lock bit is cleared.
|
|
|
@@ -209,28 +239,8 @@ fastsleep_workaround_at_entry:
|
|
|
b common_enter
|
|
|
|
|
|
enter_winkle:
|
|
|
- /*
|
|
|
- * Note all register i.e per-core, per-subcore or per-thread is saved
|
|
|
- * here since any thread in the core might wake up first
|
|
|
- */
|
|
|
- mfspr r3,SPRN_SDR1
|
|
|
- std r3,_SDR1(r1)
|
|
|
- mfspr r3,SPRN_RPR
|
|
|
- std r3,_RPR(r1)
|
|
|
- mfspr r3,SPRN_SPURR
|
|
|
- std r3,_SPURR(r1)
|
|
|
- mfspr r3,SPRN_PURR
|
|
|
- std r3,_PURR(r1)
|
|
|
- mfspr r3,SPRN_TSCR
|
|
|
- std r3,_TSCR(r1)
|
|
|
- mfspr r3,SPRN_DSCR
|
|
|
- std r3,_DSCR(r1)
|
|
|
- mfspr r3,SPRN_AMOR
|
|
|
- std r3,_AMOR(r1)
|
|
|
- mfspr r3,SPRN_WORT
|
|
|
- std r3,_WORT(r1)
|
|
|
- mfspr r3,SPRN_WORC
|
|
|
- std r3,_WORC(r1)
|
|
|
+ bl save_sprs_to_stack
|
|
|
+
|
|
|
IDLE_STATE_ENTER_SEQ(PPC_WINKLE)
|
|
|
|
|
|
_GLOBAL(power7_idle)
|