1
2
3
4
5
6
7
8
9
10
11
12 #include <linux/sys.h>
13 #include <asm/unistd.h>
14 #include <asm/errno.h>
15 #include <asm/processor.h>
16 #include <asm/page.h>
17 #include <asm/cache.h>
18 #include <asm/ppc_asm.h>
19 #include <asm/asm-offsets.h>
20 #include <asm/cputable.h>
21 #include <asm/thread_info.h>
22 #include <asm/kexec.h>
23 #include <asm/ptrace.h>
24 #include <asm/mmu.h>
25 #include <asm/export.h>
26 #include <asm/feature-fixups.h>
27
28 .text
29
30 _GLOBAL(call_do_softirq)
31 mflr r0
32 std r0,16(r1)
33 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
34 mr r1,r3
35 bl __do_softirq
36 ld r1,0(r1)
37 ld r0,16(r1)
38 mtlr r0
39 blr
40
41 _GLOBAL(call_do_irq)
42 mflr r0
43 std r0,16(r1)
44 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4)
45 mr r1,r4
46 bl __do_irq
47 ld r1,0(r1)
48 ld r0,16(r1)
49 mtlr r0
50 blr
51
52 _GLOBAL(__bswapdi2)
53 EXPORT_SYMBOL(__bswapdi2)
54 srdi r8,r3,32
55 rlwinm r7,r3,8,0xffffffff
56 rlwimi r7,r3,24,0,7
57 rlwinm r9,r8,8,0xffffffff
58 rlwimi r7,r3,24,16,23
59 rlwimi r9,r8,24,0,7
60 rlwimi r9,r8,24,16,23
61 sldi r7,r7,32
62 or r3,r7,r9
63 blr
64
65
66 #ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
67 _GLOBAL(rmci_on)
68 sync
69 isync
70 li r3,0x100
71 rldicl r3,r3,32,0
72 mfspr r5,SPRN_HID4
73 or r5,r5,r3
74 sync
75 mtspr SPRN_HID4,r5
76 isync
77 slbia
78 isync
79 sync
80 blr
81
82 _GLOBAL(rmci_off)
83 sync
84 isync
85 li r3,0x100
86 rldicl r3,r3,32,0
87 mfspr r5,SPRN_HID4
88 andc r5,r5,r3
89 sync
90 mtspr SPRN_HID4,r5
91 isync
92 slbia
93 isync
94 sync
95 blr
96 #endif
97
98 #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
99
100
101
102
103 _GLOBAL(real_readb)
104 mfmsr r7
105 ori r0,r7,MSR_DR
106 xori r0,r0,MSR_DR
107 sync
108 mtmsrd r0
109 sync
110 isync
111 mfspr r6,SPRN_HID4
112 rldicl r5,r6,32,0
113 ori r5,r5,0x100
114 rldicl r5,r5,32,0
115 sync
116 mtspr SPRN_HID4,r5
117 isync
118 slbia
119 isync
120 lbz r3,0(r3)
121 sync
122 mtspr SPRN_HID4,r6
123 isync
124 slbia
125 isync
126 mtmsrd r7
127 sync
128 isync
129 blr
130
131
132
133
134 _GLOBAL(real_writeb)
135 mfmsr r7
136 ori r0,r7,MSR_DR
137 xori r0,r0,MSR_DR
138 sync
139 mtmsrd r0
140 sync
141 isync
142 mfspr r6,SPRN_HID4
143 rldicl r5,r6,32,0
144 ori r5,r5,0x100
145 rldicl r5,r5,32,0
146 sync
147 mtspr SPRN_HID4,r5
148 isync
149 slbia
150 isync
151 stb r3,0(r4)
152 sync
153 mtspr SPRN_HID4,r6
154 isync
155 slbia
156 isync
157 mtmsrd r7
158 sync
159 isync
160 blr
161 #endif
162
163 #ifdef CONFIG_PPC_PASEMI
164
165 _GLOBAL(real_205_readb)
166 mfmsr r7
167 ori r0,r7,MSR_DR
168 xori r0,r0,MSR_DR
169 sync
170 mtmsrd r0
171 sync
172 isync
173 LBZCIX(R3,R0,R3)
174 isync
175 mtmsrd r7
176 sync
177 isync
178 blr
179
180 _GLOBAL(real_205_writeb)
181 mfmsr r7
182 ori r0,r7,MSR_DR
183 xori r0,r0,MSR_DR
184 sync
185 mtmsrd r0
186 sync
187 isync
188 STBCIX(R3,R0,R4)
189 isync
190 mtmsrd r7
191 sync
192 isync
193 blr
194
195 #endif
196
197
198 #if defined(CONFIG_CPU_FREQ_PMAC64) || defined(CONFIG_CPU_FREQ_MAPLE)
199
200
201
202
203
204
205
206
207
208
209 _GLOBAL(scom970_read)
210
211 mfmsr r4
212 ori r0,r4,MSR_EE
213 xori r0,r0,MSR_EE
214 mtmsrd r0,1
215
216
217
218
219
220 rlwinm r3,r3,8,0,15
221 ori r3,r3,0x8000
222
223
224 sync
225 mtspr SPRN_SCOMC,r3
226 isync
227 mfspr r3,SPRN_SCOMD
228 isync
229 mfspr r0,SPRN_SCOMC
230 isync
231
232
233
234
235
236
237
238
239 mtmsrd r4,1
240 blr
241
242
243 _GLOBAL(scom970_write)
244
245 mfmsr r5
246 ori r0,r5,MSR_EE
247 xori r0,r0,MSR_EE
248 mtmsrd r0,1
249
250
251
252
253
254 rlwinm r3,r3,8,0,15
255
256 sync
257 mtspr SPRN_SCOMD,r4
258 isync
259 mtspr SPRN_SCOMC,r3
260 isync
261 mfspr 3,SPRN_SCOMC
262 isync
263
264
265 mtmsrd r5,1
266 blr
267 #endif
268
269
270
271
272
273
274
275
276
277
278
279 _GLOBAL(kexec_wait)
280 bl 1f
281 1: mflr r5
282 addi r5,r5,kexec_flag-1b
283
284 99: HMT_LOW
285 #ifdef CONFIG_KEXEC_CORE
286 lwz r4,0(r5)
287 cmpwi 0,r4,0
288 beq 99b
289 #ifdef CONFIG_PPC_BOOK3S_64
290 li r10,0x60
291 mfmsr r11
292 clrrdi r11,r11,1
293 mtsrr0 r10
294 mtsrr1 r11
295 rfid
296 #else
297
298 li r4,0
299 ba 0x60
300 #endif
301 #endif
302
303
304
305
306 kexec_flag:
307 .long 0
308
309
310 #ifdef CONFIG_KEXEC_CORE
311 #ifdef CONFIG_PPC_BOOK3E
312
313
314
315
316
317 kexec_create_tlb:
318
319
320
321
322 PPC_TLBILX_ALL(0,R0)
323 sync
324 isync
325
326 mfspr r10,SPRN_TLB1CFG
327 andi. r10,r10,TLBnCFG_N_ENTRY
328 subi r10,r10,1
329 lis r9,MAS0_TLBSEL(1)@h
330 rlwimi r9,r10,16,4,15
331
332
333 #if defined(CONFIG_SMP) || defined(CONFIG_PPC_E500MC)
334 #define M_IF_NEEDED MAS2_M
335 #else
336 #define M_IF_NEEDED 0
337 #endif
338 mtspr SPRN_MAS0,r9
339
340 lis r9,(MAS1_VALID|MAS1_IPROT)@h
341 ori r9,r9,(MAS1_TSIZE(BOOK3E_PAGESZ_1GB))@l
342 mtspr SPRN_MAS1,r9
343
344 LOAD_REG_IMMEDIATE(r9, 0x0 | M_IF_NEEDED)
345 mtspr SPRN_MAS2,r9
346
347 LOAD_REG_IMMEDIATE(r9, 0x0 | MAS3_SR | MAS3_SW | MAS3_SX)
348 mtspr SPRN_MAS3,r9
349 li r9,0
350 mtspr SPRN_MAS7,r9
351
352 tlbwe
353 isync
354 blr
355 #endif
356
357
358
359
360
361
362
363
364
365
366
367 _GLOBAL(kexec_smp_wait)
368 lhz r3,PACAHWCPUID(r13)
369 bl real_mode
370
371 li r4,KEXEC_STATE_REAL_MODE
372 stb r4,PACAKEXECSTATE(r13)
373 SYNC
374
375 b kexec_wait
376
377
378
379
380
381
382
383
384 real_mode:
385 #ifdef CONFIG_PPC_BOOK3E
386
387 b kexec_create_tlb
388 #else
389 1: li r9,MSR_RI
390 li r10,MSR_DR|MSR_IR
391 mflr r11
392 mfmsr r12
393 andc r9,r12,r9
394 andc r10,r12,r10
395
396 mtmsrd r9,1
397 mtspr SPRN_SRR1,r10
398 mtspr SPRN_SRR0,r11
399 rfid
400 #endif
401
402
403
404
405
406
407
408
409
410 _GLOBAL(kexec_sequence)
411 mflr r0
412 std r0,16(r1)
413
414
415 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
416 mr r1,r3
417
418 li r0,0
419 std r0,16(r1)
420
421 BEGIN_FTR_SECTION
422
423
424
425
426
427
428
429 mtspr SPRN_IAMR,r0
430 BEGIN_FTR_SECTION_NESTED(42)
431 mtspr SPRN_AMOR,r0
432 END_FTR_SECTION_NESTED_IFSET(CPU_FTR_HVMODE, 42)
433 END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
434
435
436
437
438 std r31,-8(r1)
439 std r30,-16(r1)
440 std r29,-24(r1)
441 std r28,-32(r1)
442 std r27,-40(r1)
443 std r26,-48(r1)
444 std r25,-56(r1)
445
446 stdu r1,-STACK_FRAME_OVERHEAD-64(r1)
447
448
449 mr r31,r3
450 mr r30,r4
451 mr r29,r5
452 mr r28,r6
453 mr r27,r7
454 mr r26,r8
455 lhz r25,PACAHWCPUID(r13)
456
457
458 #ifdef CONFIG_PPC_BOOK3E
459 wrteei 0
460 #else
461 mfmsr r3
462 rlwinm r3,r3,0,17,15
463 mtmsrd r3,1
464 #endif
465
466
467
468
469 cmpdi r26,0
470 beq 1f
471 bl real_mode
472 1:
473
474 mr r3,r29
475 bl kexec_copy_flush
476
477
478 cmpdi r26,0
479 bne 1f
480 bl real_mode
481
482
483 1: li r3,0
484 mr r4,r30
485 li r5,0x100
486 li r6,0
487 bl copy_and_flush
488 1:
489
490
491 mflr r5
492 li r6,1
493 stw r6,kexec_flag-1b(5)
494
495 cmpdi r27,0
496 beq 1f
497
498
499 #ifdef PPC64_ELF_ABI_v1
500 ld r12,0(r27)
501 #else
502 mr r12,r27
503 #endif
504 mtctr r12
505 bctrl
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532 1: mr r3,r25 # my phys cpu
533 mr r4,r30 # start, aka phys mem offset
534 mtlr 4
535 li r5,0
536 blr
537 #endif