2 * PowerPC 64-bit swsusp implementation
4 * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
9 #include <linux/threads.h>
10 #include <asm/processor.h>
12 #include <asm/cputable.h>
13 #include <asm/thread_info.h>
14 #include <asm/ppc_asm.h>
15 #include <asm/asm-offsets.h>
16 #include <asm/feature-fixups.h>
19 * Structure for storing CPU registers on the save area.
21 #define SL_r1 0x00 /* stack pointer */
50 #define SL_SPRG1 0x100
52 #define SL_SIZE SL_TCR+8
54 /* these macros rely on the save area being
55 * pointed to by r11 */
57 #define SAVE_SPR(register) \
58 mfspr r0, SPRN_##register ;\
59 std r0, SL_##register(r11)
60 #define RESTORE_SPR(register) \
61 ld r0, SL_##register(r11) ;\
62 mtspr SPRN_##register, r0
63 #define SAVE_SPECIAL(special) \
65 std r0, SL_##special(r11)
66 #define RESTORE_SPECIAL(special) \
67 ld r0, SL_##special(r11) ;\
69 #define SAVE_REGISTER(reg) \
70 std reg, SL_##reg(r11)
71 #define RESTORE_REGISTER(reg) \
74 /* space for storing cpu state */
82 .tc swsusp_save_area[TC],swsusp_save_area
84 .tc restore_pblist[TC],restore_pblist
88 _GLOBAL(swsusp_arch_suspend)
89 ld r11,swsusp_save_area_ptr@toc(r2)
117 #ifdef CONFIG_PPC_BOOK3S_64
120 END_FW_FTR_SECTION_IFCLR(FW_FEATURE_LPAR)
124 /* Save SPRG1, SPRG1 be used save paca */
128 /* we push the stack up 128 bytes but don't store the
129 * stack pointer on the stack like a real stackframe */
136 ld r11,swsusp_save_area_ptr@toc(r2)
143 _GLOBAL(swsusp_arch_resume)
144 /* Stop pending alitvec streams and memory accesses */
147 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
150 ld r12,restore_pblist_ptr@toc(r2)
157 ld r13,pbe_address(r12)
158 ld r14,pbe_orig_address(r12)
173 #ifdef CONFIG_PPC_BOOK3S_64
178 ori r3, r3, CONFIG_KERNEL_START>>48
192 ld r11,swsusp_save_area_ptr@toc(r2)
196 /* restore timebase */
199 /* get upper 32 bits of it */
201 /* clear tb lower to avoid wrap */
209 /* restore registers */
212 RESTORE_REGISTER(r12)
213 RESTORE_REGISTER(r13)
214 RESTORE_REGISTER(r14)
215 RESTORE_REGISTER(r15)
216 RESTORE_REGISTER(r16)
217 RESTORE_REGISTER(r17)
218 RESTORE_REGISTER(r18)
219 RESTORE_REGISTER(r19)
220 RESTORE_REGISTER(r20)
221 RESTORE_REGISTER(r21)
222 RESTORE_REGISTER(r22)
223 RESTORE_REGISTER(r23)
224 RESTORE_REGISTER(r24)
225 RESTORE_REGISTER(r25)
226 RESTORE_REGISTER(r26)
227 RESTORE_REGISTER(r27)
228 RESTORE_REGISTER(r28)
229 RESTORE_REGISTER(r29)
230 RESTORE_REGISTER(r30)
231 RESTORE_REGISTER(r31)
233 #ifdef CONFIG_PPC_BOOK3S_64
234 /* can't use RESTORE_SPECIAL(MSR) */
238 RESTORE_SPECIAL(SDR1)
239 END_FW_FTR_SECTION_IFCLR(FW_FEATURE_LPAR)
241 /* Restore SPRG1, be used to save paca */
247 /* Restore TCR and clear any pending bits in TSR. */
249 lis r0, (TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS)@h
252 /* Kick decrementer */
256 /* Invalidate all tlbs */
264 #ifdef CONFIG_PPC_BOOK3S_64
265 bl slb_flush_and_rebolt
270 ld r11,swsusp_save_area_ptr@toc(r2)