1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/sys.h>
18#include <asm/unistd.h>
19#include <asm/errno.h>
20#include <asm/processor.h>
21#include <asm/page.h>
22#include <asm/cache.h>
23#include <asm/ppc_asm.h>
24#include <asm/asm-offsets.h>
25#include <asm/cputable.h>
26#include <asm/thread_info.h>
27#include <asm/kexec.h>
28#include <asm/ptrace.h>
29
30 .text
31
32_GLOBAL(call_do_softirq)
33 mflr r0
34 std r0,16(r1)
35 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
36 mr r1,r3
37 bl .__do_softirq
38 ld r1,0(r1)
39 ld r0,16(r1)
40 mtlr r0
41 blr
42
43_GLOBAL(call_handle_irq)
44 ld r8,0(r6)
45 mflr r0
46 std r0,16(r1)
47 mtctr r8
48 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r5)
49 mr r1,r5
50 bctrl
51 ld r1,0(r1)
52 ld r0,16(r1)
53 mtlr r0
54 blr
55
56 .section ".toc","aw"
57PPC64_CACHES:
58 .tc ppc64_caches[TC],ppc64_caches
59 .section ".text"
60
61
62
63
64
65
66
67
68
69
70_KPROBE(__flush_icache_range)
71
72
73
74
75
76
77
78
79 ld r10,PPC64_CACHES@toc(r2)
80 lwz r7,DCACHEL1LINESIZE(r10)
81 addi r5,r7,-1
82 andc r6,r3,r5
83 subf r8,r6,r4
84 add r8,r8,r5
85 lwz r9,DCACHEL1LOGLINESIZE(r10)
86 srw. r8,r8,r9
87 beqlr
88 mtctr r8
891: dcbst 0,r6
90 add r6,r6,r7
91 bdnz 1b
92 sync
93
94
95
96 lwz r7,ICACHEL1LINESIZE(r10)
97 addi r5,r7,-1
98 andc r6,r3,r5
99 subf r8,r6,r4
100 add r8,r8,r5
101 lwz r9,ICACHEL1LOGLINESIZE(r10)
102 srw. r8,r8,r9
103 beqlr
104 mtctr r8
1052: icbi 0,r6
106 add r6,r6,r7
107 bdnz 2b
108 isync
109 blr
110 .previous .text
111
112
113
114
115
116
117
118_GLOBAL(flush_dcache_range)
119
120
121
122
123
124
125 ld r10,PPC64_CACHES@toc(r2)
126 lwz r7,DCACHEL1LINESIZE(r10)
127 addi r5,r7,-1
128 andc r6,r3,r5
129 subf r8,r6,r4
130 add r8,r8,r5
131 lwz r9,DCACHEL1LOGLINESIZE(r10)
132 srw. r8,r8,r9
133 beqlr
134 mtctr r8
1350: dcbst 0,r6
136 add r6,r6,r7
137 bdnz 0b
138 sync
139 blr
140
141
142
143
144
145
146
147
148
149
150
151_GLOBAL(flush_dcache_phys_range)
152 ld r10,PPC64_CACHES@toc(r2)
153 lwz r7,DCACHEL1LINESIZE(r10)
154 addi r5,r7,-1
155 andc r6,r3,r5
156 subf r8,r6,r4
157 add r8,r8,r5
158 lwz r9,DCACHEL1LOGLINESIZE(r10)
159 srw. r8,r8,r9
160 beqlr
161 mfmsr r5
162 ori r0,r5,MSR_DR
163 xori r0,r0,MSR_DR
164 sync
165 mtmsr r0
166 sync
167 isync
168 mtctr r8
1690: dcbst 0,r6
170 add r6,r6,r7
171 bdnz 0b
172 sync
173 isync
174 mtmsr r5
175 sync
176 isync
177 blr
178
179_GLOBAL(flush_inval_dcache_range)
180 ld r10,PPC64_CACHES@toc(r2)
181 lwz r7,DCACHEL1LINESIZE(r10)
182 addi r5,r7,-1
183 andc r6,r3,r5
184 subf r8,r6,r4
185 add r8,r8,r5
186 lwz r9,DCACHEL1LOGLINESIZE(r10)
187 srw. r8,r8,r9
188 beqlr
189 sync
190 isync
191 mtctr r8
1920: dcbf 0,r6
193 add r6,r6,r7
194 bdnz 0b
195 sync
196 isync
197 blr
198
199
200
201
202
203
204
205
206
207_GLOBAL(__flush_dcache_icache)
208
209
210
211
212
213
214
215 ld r7,PPC64_CACHES@toc(r2)
216 clrrdi r3,r3,PAGE_SHIFT
217 lwz r4,DCACHEL1LINESPERPAGE(r7)
218 lwz r5,DCACHEL1LINESIZE(r7)
219 mr r6,r3
220 mtctr r4
2210: dcbst 0,r6
222 add r6,r6,r5
223 bdnz 0b
224 sync
225
226
227
228 lwz r4,ICACHEL1LINESPERPAGE(r7)
229 lwz r5,ICACHEL1LINESIZE(r7)
230 mtctr r4
2311: icbi 0,r3
232 add r3,r3,r5
233 bdnz 1b
234 isync
235 blr
236
237
238
239
240
241
242_GLOBAL(real_readb)
243 mfmsr r7
244 ori r0,r7,MSR_DR
245 xori r0,r0,MSR_DR
246 sync
247 mtmsrd r0
248 sync
249 isync
250 mfspr r6,SPRN_HID4
251 rldicl r5,r6,32,0
252 ori r5,r5,0x100
253 rldicl r5,r5,32,0
254 sync
255 mtspr SPRN_HID4,r5
256 isync
257 slbia
258 isync
259 lbz r3,0(r3)
260 sync
261 mtspr SPRN_HID4,r6
262 isync
263 slbia
264 isync
265 mtmsrd r7
266 sync
267 isync
268 blr
269
270
271
272
273_GLOBAL(real_writeb)
274 mfmsr r7
275 ori r0,r7,MSR_DR
276 xori r0,r0,MSR_DR
277 sync
278 mtmsrd r0
279 sync
280 isync
281 mfspr r6,SPRN_HID4
282 rldicl r5,r6,32,0
283 ori r5,r5,0x100
284 rldicl r5,r5,32,0
285 sync
286 mtspr SPRN_HID4,r5
287 isync
288 slbia
289 isync
290 stb r3,0(r4)
291 sync
292 mtspr SPRN_HID4,r6
293 isync
294 slbia
295 isync
296 mtmsrd r7
297 sync
298 isync
299 blr
300#endif
301
302#ifdef CONFIG_PPC_PASEMI
303
304
305#define LBZCIX(RT,RA,RB) .long (0x7c0006aa|(RT<<21)|(RA<<16)|(RB << 11))
306#define STBCIX(RS,RA,RB) .long (0x7c0007aa|(RS<<21)|(RA<<16)|(RB << 11))
307
308
309_GLOBAL(real_205_readb)
310 mfmsr r7
311 ori r0,r7,MSR_DR
312 xori r0,r0,MSR_DR
313 sync
314 mtmsrd r0
315 sync
316 isync
317 LBZCIX(r3,0,r3)
318 isync
319 mtmsrd r7
320 sync
321 isync
322 blr
323
324_GLOBAL(real_205_writeb)
325 mfmsr r7
326 ori r0,r7,MSR_DR
327 xori r0,r0,MSR_DR
328 sync
329 mtmsrd r0
330 sync
331 isync
332 STBCIX(r3,0,r4)
333 isync
334 mtmsrd r7
335 sync
336 isync
337 blr
338
339#endif
340
341
342#ifdef CONFIG_CPU_FREQ_PMAC64
343
344
345
346
347
348
349
350
351
352
353_GLOBAL(scom970_read)
354
355 mfmsr r4
356 ori r0,r4,MSR_EE
357 xori r0,r0,MSR_EE
358 mtmsrd r0,1
359
360
361
362
363
364 rlwinm r3,r3,8,0,15
365 ori r3,r3,0x8000
366
367
368 sync
369 mtspr SPRN_SCOMC,r3
370 isync
371 mfspr r3,SPRN_SCOMD
372 isync
373 mfspr r0,SPRN_SCOMC
374 isync
375
376
377
378
379
380
381
382
383 mtmsrd r4,1
384 blr
385
386
387_GLOBAL(scom970_write)
388
389 mfmsr r5
390 ori r0,r5,MSR_EE
391 xori r0,r0,MSR_EE
392 mtmsrd r0,1
393
394
395
396
397
398 rlwinm r3,r3,8,0,15
399
400 sync
401 mtspr SPRN_SCOMD,r4
402 isync
403 mtspr SPRN_SCOMC,r3
404 isync
405 mfspr 3,SPRN_SCOMC
406 isync
407
408
409 mtmsrd r5,1
410 blr
411#endif
412
413
414
415
416
417
418_GLOBAL(kernel_thread)
419 std r29,-24(r1)
420 std r30,-16(r1)
421 stdu r1,-STACK_FRAME_OVERHEAD(r1)
422 mr r29,r3
423 mr r30,r4
424 ori r3,r5,CLONE_VM
425 oris r3,r3,(CLONE_UNTRACED>>16)
426 li r4,0
427 li r0,__NR_clone
428 sc
429 bns+ 1f
430 neg r3,r3
4311: cmpdi 0,r3,0
432 bne 2f
433 li r0,0
434 stdu r0,-STACK_FRAME_OVERHEAD(r1)
435 ld r2,8(r29)
436 ld r29,0(r29)
437 mtlr r29
438 mr r3,r30
439 blrl
440 li r0,__NR_exit
441 li r3,0
442 sc
4432: addi r1,r1,STACK_FRAME_OVERHEAD
444 ld r29,-24(r1)
445 ld r30,-16(r1)
446 blr
447
448
449
450
451
452_GLOBAL(disable_kernel_fp)
453 mfmsr r3
454 rldicl r0,r3,(63-MSR_FP_LG),1
455 rldicl r3,r0,(MSR_FP_LG+1),0
456 mtmsrd r3
457 isync
458 blr
459
460
461
462
463
464
465
466
467
468
469
470_GLOBAL(kexec_wait)
471 bl 1f
4721: mflr r5
473 addi r5,r5,kexec_flag-1b
474
47599: HMT_LOW
476#ifdef CONFIG_KEXEC
477 lwz r4,0(r5)
478 cmpwi 0,r4,0
479 bnea 0x60
480#endif
481 b 99b
482
483
484
485
486kexec_flag:
487 .long 0
488
489
490#ifdef CONFIG_KEXEC
491
492
493
494
495
496
497
498
499
500
501
502_GLOBAL(kexec_smp_wait)
503 lhz r3,PACAHWCPUID(r13)
504 bl real_mode
505
506 li r4,KEXEC_STATE_REAL_MODE
507 stb r4,PACAKEXECSTATE(r13)
508 SYNC
509
510 b .kexec_wait
511
512
513
514
515
516
517
518
519real_mode:
5201: li r9,MSR_RI
521 li r10,MSR_DR|MSR_IR
522 mflr r11
523 mfmsr r12
524 andc r9,r12,r9
525 andc r10,r12,r10
526
527 mtmsrd r9,1
528 mtspr SPRN_SRR1,r10
529 mtspr SPRN_SRR0,r11
530 rfid
531
532
533
534
535
536
537
538
539
540_GLOBAL(kexec_sequence)
541 mflr r0
542 std r0,16(r1)
543
544
545 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
546 mr r1,r3
547
548 li r0,0
549 std r0,16(r1)
550
551
552
553
554 std r31,-8(r1)
555 std r30,-16(r1)
556 std r29,-24(r1)
557 std r28,-32(r1)
558 std r27,-40(r1)
559 std r26,-48(r1)
560 std r25,-56(r1)
561
562 stdu r1,-STACK_FRAME_OVERHEAD-64(r1)
563
564
565 mr r31,r3
566 mr r30,r4
567 mr r29,r5
568 mr r28,r6
569 mr r27,r7
570 mr r26,r8
571 lhz r25,PACAHWCPUID(r13)
572
573
574 mfmsr r3
575 rlwinm r3,r3,0,17,15
576 mtmsrd r3,1
577
578
579 mr r3,r29
580 bl .kexec_copy_flush
581
582
583 bl real_mode
584
585
586 li r3,0
587 mr r4,r30
588 li r5,0x100
589 li r6,0
590 bl .copy_and_flush
5911:
592
593
594 mflr r5
595 li r6,1
596 stw r6,kexec_flag-1b(5)
597
598
599 ld r5,0(r27)
600 mtctr r5
601 bctrl
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628 mr r3,r25
629 mr r4,r30
630 mtlr 4
631 li r5,0
632 blr
633#endif
634