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 .section ".toc","aw"
53PPC64_CACHES:
54 .tc ppc64_caches[TC],ppc64_caches
55 .section ".text"
56
57
58
59
60
61
62
63
64
65
66_GLOBAL_TOC(flush_icache_range)
67BEGIN_FTR_SECTION
68 PURGE_PREFETCHED_INS
69 blr
70END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
71
72
73
74
75
76
77
78 ld r10,PPC64_CACHES@toc(r2)
79 lwz r7,DCACHEL1BLOCKSIZE(r10)
80 addi r5,r7,-1
81 andc r6,r3,r5
82 subf r8,r6,r4
83 add r8,r8,r5
84 lwz r9,DCACHEL1LOGBLOCKSIZE(r10)
85 srw. r8,r8,r9
86 beqlr
87 mtctr r8
881: dcbst 0,r6
89 add r6,r6,r7
90 bdnz 1b
91 sync
92
93
94
95 lwz r7,ICACHEL1BLOCKSIZE(r10)
96 addi r5,r7,-1
97 andc r6,r3,r5
98 subf r8,r6,r4
99 add r8,r8,r5
100 lwz r9,ICACHEL1LOGBLOCKSIZE(r10)
101 srw. r8,r8,r9
102 beqlr
103 mtctr r8
1042: icbi 0,r6
105 add r6,r6,r7
106 bdnz 2b
107 isync
108 blr
109_ASM_NOKPROBE_SYMBOL(flush_icache_range)
110EXPORT_SYMBOL(flush_icache_range)
111
112
113
114
115
116
117
118
119_GLOBAL(__flush_dcache_icache)
120
121
122
123
124
125
126BEGIN_FTR_SECTION
127 PURGE_PREFETCHED_INS
128 blr
129END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
130
131
132 ld r7,PPC64_CACHES@toc(r2)
133 clrrdi r3,r3,PAGE_SHIFT
134 lwz r4,DCACHEL1BLOCKSPERPAGE(r7)
135 lwz r5,DCACHEL1BLOCKSIZE(r7)
136 mr r6,r3
137 mtctr r4
1380: dcbst 0,r6
139 add r6,r6,r5
140 bdnz 0b
141 sync
142
143
144
145 lwz r4,ICACHEL1BLOCKSPERPAGE(r7)
146 lwz r5,ICACHEL1BLOCKSIZE(r7)
147 mtctr r4
1481: icbi 0,r3
149 add r3,r3,r5
150 bdnz 1b
151 isync
152 blr
153
154_GLOBAL(__bswapdi2)
155EXPORT_SYMBOL(__bswapdi2)
156 srdi r8,r3,32
157 rlwinm r7,r3,8,0xffffffff
158 rlwimi r7,r3,24,0,7
159 rlwinm r9,r8,8,0xffffffff
160 rlwimi r7,r3,24,16,23
161 rlwimi r9,r8,24,0,7
162 rlwimi r9,r8,24,16,23
163 sldi r7,r7,32
164 or r3,r7,r9
165 blr
166
167
168#ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
169_GLOBAL(rmci_on)
170 sync
171 isync
172 li r3,0x100
173 rldicl r3,r3,32,0
174 mfspr r5,SPRN_HID4
175 or r5,r5,r3
176 sync
177 mtspr SPRN_HID4,r5
178 isync
179 slbia
180 isync
181 sync
182 blr
183
184_GLOBAL(rmci_off)
185 sync
186 isync
187 li r3,0x100
188 rldicl r3,r3,32,0
189 mfspr r5,SPRN_HID4
190 andc r5,r5,r3
191 sync
192 mtspr SPRN_HID4,r5
193 isync
194 slbia
195 isync
196 sync
197 blr
198#endif
199
200
201
202
203
204
205_GLOBAL(real_readb)
206 mfmsr r7
207 ori r0,r7,MSR_DR
208 xori r0,r0,MSR_DR
209 sync
210 mtmsrd r0
211 sync
212 isync
213 mfspr r6,SPRN_HID4
214 rldicl r5,r6,32,0
215 ori r5,r5,0x100
216 rldicl r5,r5,32,0
217 sync
218 mtspr SPRN_HID4,r5
219 isync
220 slbia
221 isync
222 lbz r3,0(r3)
223 sync
224 mtspr SPRN_HID4,r6
225 isync
226 slbia
227 isync
228 mtmsrd r7
229 sync
230 isync
231 blr
232
233
234
235
236_GLOBAL(real_writeb)
237 mfmsr r7
238 ori r0,r7,MSR_DR
239 xori r0,r0,MSR_DR
240 sync
241 mtmsrd r0
242 sync
243 isync
244 mfspr r6,SPRN_HID4
245 rldicl r5,r6,32,0
246 ori r5,r5,0x100
247 rldicl r5,r5,32,0
248 sync
249 mtspr SPRN_HID4,r5
250 isync
251 slbia
252 isync
253 stb r3,0(r4)
254 sync
255 mtspr SPRN_HID4,r6
256 isync
257 slbia
258 isync
259 mtmsrd r7
260 sync
261 isync
262 blr
263#endif
264
265#ifdef CONFIG_PPC_PASEMI
266
267_GLOBAL(real_205_readb)
268 mfmsr r7
269 ori r0,r7,MSR_DR
270 xori r0,r0,MSR_DR
271 sync
272 mtmsrd r0
273 sync
274 isync
275 LBZCIX(R3,R0,R3)
276 isync
277 mtmsrd r7
278 sync
279 isync
280 blr
281
282_GLOBAL(real_205_writeb)
283 mfmsr r7
284 ori r0,r7,MSR_DR
285 xori r0,r0,MSR_DR
286 sync
287 mtmsrd r0
288 sync
289 isync
290 STBCIX(R3,R0,R4)
291 isync
292 mtmsrd r7
293 sync
294 isync
295 blr
296
297#endif
298
299
300
301
302
303
304
305
306
307
308
309
310
311_GLOBAL(scom970_read)
312
313 mfmsr r4
314 ori r0,r4,MSR_EE
315 xori r0,r0,MSR_EE
316 mtmsrd r0,1
317
318
319
320
321
322 rlwinm r3,r3,8,0,15
323 ori r3,r3,0x8000
324
325
326 sync
327 mtspr SPRN_SCOMC,r3
328 isync
329 mfspr r3,SPRN_SCOMD
330 isync
331 mfspr r0,SPRN_SCOMC
332 isync
333
334
335
336
337
338
339
340
341 mtmsrd r4,1
342 blr
343
344
345_GLOBAL(scom970_write)
346
347 mfmsr r5
348 ori r0,r5,MSR_EE
349 xori r0,r0,MSR_EE
350 mtmsrd r0,1
351
352
353
354
355
356 rlwinm r3,r3,8,0,15
357
358 sync
359 mtspr SPRN_SCOMD,r4
360 isync
361 mtspr SPRN_SCOMC,r3
362 isync
363 mfspr 3,SPRN_SCOMC
364 isync
365
366
367 mtmsrd r5,1
368 blr
369#endif
370
371
372
373
374
375
376
377
378
379
380
381_GLOBAL(kexec_wait)
382 bl 1f
3831: mflr r5
384 addi r5,r5,kexec_flag-1b
385
38699: HMT_LOW
387#ifdef CONFIG_KEXEC_CORE
388 lwz r4,0(r5)
389 cmpwi 0,r4,0
390 beq 99b
391#ifdef CONFIG_PPC_BOOK3S_64
392 li r10,0x60
393 mfmsr r11
394 clrrdi r11,r11,1
395 mtsrr0 r10
396 mtsrr1 r11
397 rfid
398#else
399
400 li r4,0
401 ba 0x60
402#endif
403#endif
404
405
406
407
408kexec_flag:
409 .long 0
410
411
412#ifdef CONFIG_KEXEC_CORE
413#ifdef CONFIG_PPC_BOOK3E
414
415
416
417
418
419kexec_create_tlb:
420
421
422
423
424 PPC_TLBILX_ALL(0,R0)
425 sync
426 isync
427
428 mfspr r10,SPRN_TLB1CFG
429 andi. r10,r10,TLBnCFG_N_ENTRY
430 subi r10,r10,1
431 lis r9,MAS0_TLBSEL(1)@h
432 rlwimi r9,r10,16,4,15
433
434
435
436#define M_IF_NEEDED MAS2_M
437#else
438#define M_IF_NEEDED 0
439#endif
440 mtspr SPRN_MAS0,r9
441
442 lis r9,(MAS1_VALID|MAS1_IPROT)@h
443 ori r9,r9,(MAS1_TSIZE(BOOK3E_PAGESZ_1GB))@l
444 mtspr SPRN_MAS1,r9
445
446 LOAD_REG_IMMEDIATE(r9, 0x0 | M_IF_NEEDED)
447 mtspr SPRN_MAS2,r9
448
449 LOAD_REG_IMMEDIATE(r9, 0x0 | MAS3_SR | MAS3_SW | MAS3_SX)
450 mtspr SPRN_MAS3,r9
451 li r9,0
452 mtspr SPRN_MAS7,r9
453
454 tlbwe
455 isync
456 blr
457#endif
458
459
460
461
462
463
464
465
466
467
468
469_GLOBAL(kexec_smp_wait)
470 lhz r3,PACAHWCPUID(r13)
471 bl real_mode
472
473 li r4,KEXEC_STATE_REAL_MODE
474 stb r4,PACAKEXECSTATE(r13)
475 SYNC
476
477 b kexec_wait
478
479
480
481
482
483
484
485
486real_mode:
487#ifdef CONFIG_PPC_BOOK3E
488
489 b kexec_create_tlb
490#else
4911: li r9,MSR_RI
492 li r10,MSR_DR|MSR_IR
493 mflr r11
494 mfmsr r12
495 andc r9,r12,r9
496 andc r10,r12,r10
497
498 mtmsrd r9,1
499 mtspr SPRN_SRR1,r10
500 mtspr SPRN_SRR0,r11
501 rfid
502#endif
503
504
505
506
507
508
509
510
511
512_GLOBAL(kexec_sequence)
513 mflr r0
514 std r0,16(r1)
515
516
517 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
518 mr r1,r3
519
520 li r0,0
521 std r0,16(r1)
522
523BEGIN_FTR_SECTION
524
525
526
527
528
529
530
531 mtspr SPRN_IAMR,r0
532BEGIN_FTR_SECTION_NESTED(42)
533 mtspr SPRN_AMOR,r0
534END_FTR_SECTION_NESTED_IFSET(CPU_FTR_HVMODE, 42)
535END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
536
537
538
539
540 std r31,-8(r1)
541 std r30,-16(r1)
542 std r29,-24(r1)
543 std r28,-32(r1)
544 std r27,-40(r1)
545 std r26,-48(r1)
546 std r25,-56(r1)
547
548 stdu r1,-STACK_FRAME_OVERHEAD-64(r1)
549
550
551 mr r31,r3
552 mr r30,r4
553 mr r29,r5
554 mr r28,r6
555 mr r27,r7
556 mr r26,r8
557 lhz r25,PACAHWCPUID(r13)
558
559
560#ifdef CONFIG_PPC_BOOK3E
561 wrteei 0
562#else
563 mfmsr r3
564 rlwinm r3,r3,0,17,15
565 mtmsrd r3,1
566#endif
567
568
569
570
571 cmpdi r26,0
572 beq 1f
573 bl real_mode
5741:
575
576 mr r3,r29
577 bl kexec_copy_flush
578
579
580 cmpdi r26,0
581 bne 1f
582 bl real_mode
583
584
5851: li r3,0
586 mr r4,r30
587 li r5,0x100
588 li r6,0
589 bl copy_and_flush
5901:
591
592
593 mflr r5
594 li r6,1
595 stw r6,kexec_flag-1b(5)
596
597 cmpdi r27,0
598 beq 1f
599
600
601#ifdef PPC64_ELF_ABI_v1
602 ld r12,0(r27)
603#else
604 mr r12,r27
605#endif
606 mtctr r12
607 bctrl
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
6341: mr r3,r25
635 mr r4,r30
636 mtlr 4
637 li r5,0
638 blr
639#endif
640