1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <linux/init.h>
29#include <linux/pgtable.h>
30#include <asm/processor.h>
31#include <asm/page.h>
32#include <asm/mmu.h>
33#include <asm/cputable.h>
34#include <asm/thread_info.h>
35#include <asm/ppc_asm.h>
36#include <asm/asm-offsets.h>
37#include <asm/ptrace.h>
38#include <asm/export.h>
39
40#include "head_32.h"
41
42
43
44
45
46
47
48
49
50
51
52
53
54 __HEAD
55_ENTRY(_stext);
56_ENTRY(_start);
57
58 mr r31,r3
59
60
61
62
63 bl initial_mmu
64
65
66
67
68turn_on_mmu:
69 lis r0,MSR_KERNEL@h
70 ori r0,r0,MSR_KERNEL@l
71 mtspr SPRN_SRR1,r0
72 lis r0,start_here@h
73 ori r0,r0,start_here@l
74 mtspr SPRN_SRR0,r0
75 rfi
76 b .
77
78
79
80
81
82 . = 0xc0
83crit_save:
84_ENTRY(crit_r10)
85 .space 4
86_ENTRY(crit_r11)
87 .space 4
88_ENTRY(crit_srr0)
89 .space 4
90_ENTRY(crit_srr1)
91 .space 4
92_ENTRY(crit_r1)
93 .space 4
94_ENTRY(crit_dear)
95 .space 4
96_ENTRY(crit_esr)
97 .space 4
98
99
100
101
102
103
104
105
106
107.macro CRITICAL_EXCEPTION_PROLOG trapno name
108 stw r10,crit_r10@l(0)
109 stw r11,crit_r11@l(0)
110 mfspr r10,SPRN_SRR0
111 mfspr r11,SPRN_SRR1
112 stw r10,crit_srr0@l(0)
113 stw r11,crit_srr1@l(0)
114 mfspr r10,SPRN_DEAR
115 mfspr r11,SPRN_ESR
116 stw r10,crit_dear@l(0)
117 stw r11,crit_esr@l(0)
118 mfcr r10
119 mfspr r11,SPRN_SRR3
120 andi. r11,r11,MSR_PR
121 lis r11,(critirq_ctx-PAGE_OFFSET)@ha
122 lwz r11,(critirq_ctx-PAGE_OFFSET)@l(r11)
123 beq 1f
124
125 mfspr r11,SPRN_SPRG_THREAD
126 lwz r11,TASK_STACK-THREAD(r11)
1271: stw r1,crit_r1@l(0)
128 addi r1,r11,THREAD_SIZE-INT_FRAME_SIZE
129 LOAD_REG_IMMEDIATE(r11, MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE))
130 mtspr SPRN_SRR1, r11
131 lis r11, 1f@h
132 ori r11, r11, 1f@l
133 mtspr SPRN_SRR0, r11
134 rfi
135
136 .text
1371:
138\name\()_virt:
139 lwz r11,crit_r1@l(0)
140 stw r11,GPR1(r1)
141 stw r11,0(r1)
142 mr r11,r1
143 stw r10,_CCR(r11)
144 stw r12,GPR12(r11)
145 stw r9,GPR9(r11)
146 mflr r10
147 stw r10,_LINK(r11)
148 lis r9,PAGE_OFFSET@ha
149 lwz r10,crit_r10@l(r9)
150 lwz r12,crit_r11@l(r9)
151 stw r10,GPR10(r11)
152 stw r12,GPR11(r11)
153 lwz r12,crit_dear@l(r9)
154 lwz r9,crit_esr@l(r9)
155 stw r12,_DEAR(r11)
156 stw r9,_ESR(r11)
157 mfspr r12,SPRN_SRR2
158 mfspr r9,SPRN_SRR3
159 rlwinm r9,r9,0,14,12
160 COMMON_EXCEPTION_PROLOG_END \trapno + 2
161_ASM_NOKPROBE_SYMBOL(\name\()_virt)
162.endm
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180#define CRITICAL_EXCEPTION(n, label, hdlr) \
181 START_EXCEPTION(n, label); \
182 CRITICAL_EXCEPTION_PROLOG n label; \
183 prepare_transfer_to_handler; \
184 bl hdlr; \
185 b ret_from_crit_exc
186
187
188
189
190 CRITICAL_EXCEPTION(0x0100, CriticalInterrupt, unknown_exception)
191
192
193
194
195 CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
196
197
198
199
200
201
202
203
204 START_EXCEPTION(0x0300, DataStorage)
205 EXCEPTION_PROLOG 0x300 DataStorage handle_dar_dsisr=1
206 prepare_transfer_to_handler
207 bl do_page_fault
208 b interrupt_return
209
210
211
212
213
214 START_EXCEPTION(0x0400, InstructionAccess)
215 EXCEPTION_PROLOG 0x400 InstructionAccess
216 li r5,0
217 stw r5, _ESR(r11)
218 stw r12, _DEAR(r11)
219 prepare_transfer_to_handler
220 bl do_page_fault
221 b interrupt_return
222
223
224 EXCEPTION(0x0500, HardwareInterrupt, do_IRQ)
225
226
227 START_EXCEPTION(0x0600, Alignment)
228 EXCEPTION_PROLOG 0x600 Alignment handle_dar_dsisr=1
229 prepare_transfer_to_handler
230 bl alignment_exception
231 REST_NVGPRS(r1)
232 b interrupt_return
233
234
235 START_EXCEPTION(0x0700, ProgramCheck)
236 EXCEPTION_PROLOG 0x700 ProgramCheck handle_dar_dsisr=1
237 prepare_transfer_to_handler
238 bl program_check_exception
239 REST_NVGPRS(r1)
240 b interrupt_return
241
242 EXCEPTION(0x0800, Trap_08, unknown_exception)
243 EXCEPTION(0x0900, Trap_09, unknown_exception)
244 EXCEPTION(0x0A00, Trap_0A, unknown_exception)
245 EXCEPTION(0x0B00, Trap_0B, unknown_exception)
246
247
248 START_EXCEPTION(0x0C00, SystemCall)
249 SYSCALL_ENTRY 0xc00
250
251
252
253 EXCEPTION(0x0E00, Trap_0E, unknown_exception)
254 EXCEPTION(0x0F00, Trap_0F, unknown_exception)
255
256
257 START_EXCEPTION(0x1000, DecrementerTrap)
258 b Decrementer
259
260
261 START_EXCEPTION(0x1010, FITExceptionTrap)
262 b FITException
263
264
265 START_EXCEPTION(0x1020, WDTExceptionTrap)
266 b WDTException
267
268
269
270
271
272
273 START_EXCEPTION(0x1100, DTLBMiss)
274 mtspr SPRN_SPRG_SCRATCH5, r10
275 mtspr SPRN_SPRG_SCRATCH6, r11
276 mtspr SPRN_SPRG_SCRATCH3, r12
277 mtspr SPRN_SPRG_SCRATCH4, r9
278 mfcr r12
279 mfspr r9, SPRN_PID
280 rlwimi r12, r9, 0, 0xff
281 mfspr r10, SPRN_DEAR
282
283
284
285
286 lis r11, PAGE_OFFSET@h
287 cmplw r10, r11
288 blt+ 3f
289 lis r11, swapper_pg_dir@h
290 ori r11, r11, swapper_pg_dir@l
291 li r9, 0
292 mtspr SPRN_PID, r9
293 b 4f
294
295
296
2973:
298 mfspr r11,SPRN_SPRG_THREAD
299 lwz r11,PGDIR(r11)
3004:
301 tophys(r11, r11)
302 rlwimi r11, r10, 12, 20, 29
303 lwz r11, 0(r11)
304 andi. r9, r11, _PMD_PRESENT
305 beq 2f
306
307 rlwimi r11, r10, 22, 20, 29
308 lwz r11, 0(r11)
309 li r9, _PAGE_PRESENT | _PAGE_ACCESSED
310 andc. r9, r9, r11
311 bne 5f
312
313 rlwinm r9, r11, 1, _PAGE_RW
314 and r9, r9, r11
315 rlwimi r11, r9, 0, _PAGE_RW
316
317
318
319
320 li r9, 0x00c0
321 rlwimi r10, r9, 0, 20, 31
322
323 b finish_tlb_load
324
3252:
326 rlwinm. r9, r11, 2, 22, 24
327 beq 5f
328
329
330
331
332 ori r9, r9, 0x40
333 rlwimi r10, r9, 0, 20, 31
334
335 b finish_tlb_load
336
3375:
338
339
340
341 mtspr SPRN_PID, r12
342 mtcrf 0x80, r12
343 mfspr r9, SPRN_SPRG_SCRATCH4
344 mfspr r12, SPRN_SPRG_SCRATCH3
345 mfspr r11, SPRN_SPRG_SCRATCH6
346 mfspr r10, SPRN_SPRG_SCRATCH5
347 b DataStorage
348
349
350
351
352
353 START_EXCEPTION(0x1200, ITLBMiss)
354 mtspr SPRN_SPRG_SCRATCH5, r10
355 mtspr SPRN_SPRG_SCRATCH6, r11
356 mtspr SPRN_SPRG_SCRATCH3, r12
357 mtspr SPRN_SPRG_SCRATCH4, r9
358 mfcr r12
359 mfspr r9, SPRN_PID
360 rlwimi r12, r9, 0, 0xff
361 mfspr r10, SPRN_SRR0
362
363
364
365
366 lis r11, PAGE_OFFSET@h
367 cmplw r10, r11
368 blt+ 3f
369 lis r11, swapper_pg_dir@h
370 ori r11, r11, swapper_pg_dir@l
371 li r9, 0
372 mtspr SPRN_PID, r9
373 b 4f
374
375
376
3773:
378 mfspr r11,SPRN_SPRG_THREAD
379 lwz r11,PGDIR(r11)
3804:
381 tophys(r11, r11)
382 rlwimi r11, r10, 12, 20, 29
383 lwz r11, 0(r11)
384 andi. r9, r11, _PMD_PRESENT
385 beq 2f
386
387 rlwimi r11, r10, 22, 20, 29
388 lwz r11, 0(r11)
389 li r9, _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
390 andc. r9, r9, r11
391 bne 5f
392
393 rlwinm r9, r11, 1, _PAGE_RW
394 and r9, r9, r11
395 rlwimi r11, r9, 0, _PAGE_RW
396
397
398
399
400 li r9, 0x00c0
401 rlwimi r10, r9, 0, 20, 31
402
403 b finish_tlb_load
404
4052:
406 rlwinm. r9, r11, 2, 22, 24
407 beq 5f
408
409
410
411
412 ori r9, r9, 0x40
413 rlwimi r10, r9, 0, 20, 31
414
415 b finish_tlb_load
416
4175:
418
419
420
421 mtspr SPRN_PID, r12
422 mtcrf 0x80, r12
423 mfspr r9, SPRN_SPRG_SCRATCH4
424 mfspr r12, SPRN_SPRG_SCRATCH3
425 mfspr r11, SPRN_SPRG_SCRATCH6
426 mfspr r10, SPRN_SPRG_SCRATCH5
427 b InstructionAccess
428
429 EXCEPTION(0x1300, Trap_13, unknown_exception)
430 EXCEPTION(0x1400, Trap_14, unknown_exception)
431 EXCEPTION(0x1500, Trap_15, unknown_exception)
432 EXCEPTION(0x1600, Trap_16, unknown_exception)
433 EXCEPTION(0x1700, Trap_17, unknown_exception)
434 EXCEPTION(0x1800, Trap_18, unknown_exception)
435 EXCEPTION(0x1900, Trap_19, unknown_exception)
436 EXCEPTION(0x1A00, Trap_1A, unknown_exception)
437 EXCEPTION(0x1B00, Trap_1B, unknown_exception)
438 EXCEPTION(0x1C00, Trap_1C, unknown_exception)
439 EXCEPTION(0x1D00, Trap_1D, unknown_exception)
440 EXCEPTION(0x1E00, Trap_1E, unknown_exception)
441 EXCEPTION(0x1F00, Trap_1F, unknown_exception)
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457 START_EXCEPTION(0x2000, DebugTrap)
458 CRITICAL_EXCEPTION_PROLOG 0x2000 DebugTrap
459
460
461
462
463
464
465
466
467
468 mfspr r10,SPRN_DBSR
469 andis. r10,r10,DBSR_IC@h
470 beq+ 2f
471
472 andi. r10,r9,MSR_IR|MSR_PR
473 beq 1f
474
475 mfspr r10,SPRN_SRR2
476 cmplwi r10,0x2100
477 bgt+ 2f
478
479
4801: rlwinm r9,r9,0,~MSR_DE
481 lis r10,DBSR_IC@h
482 mtspr SPRN_DBSR,r10
483
484 lwz r10,_CCR(r11)
485 lwz r0,GPR0(r11)
486 lwz r1,GPR1(r11)
487 mtcrf 0x80,r10
488 mtspr SPRN_SRR2,r12
489 mtspr SPRN_SRR3,r9
490 lwz r9,GPR9(r11)
491 lwz r12,GPR12(r11)
492 lwz r10,crit_r10@l(0)
493 lwz r11,crit_r11@l(0)
494 rfci
495 b .
496
497
4982: mfspr r4,SPRN_DBSR
499 stw r4,_ESR(r11)
500 prepare_transfer_to_handler
501 bl DebugException
502 b ret_from_crit_exc
503
504
505 __HEAD
506Decrementer:
507 EXCEPTION_PROLOG 0x1000 Decrementer
508 lis r0,TSR_PIS@h
509 mtspr SPRN_TSR,r0
510 prepare_transfer_to_handler
511 bl timer_interrupt
512 b interrupt_return
513
514
515 __HEAD
516FITException:
517 EXCEPTION_PROLOG 0x1010 FITException
518 prepare_transfer_to_handler
519 bl unknown_exception
520 b interrupt_return
521
522
523 __HEAD
524WDTException:
525 CRITICAL_EXCEPTION_PROLOG 0x1020 WDTException
526 prepare_transfer_to_handler
527 bl WatchdogException
528 b ret_from_crit_exc
529
530
531
532
533
534
535
536 __HEAD
537
538
539
540
541
542
543
544
545
546
547
548tlb_4xx_index:
549 .long 0
550finish_tlb_load:
551
552
553
554
555
556 li r9, 0x0ce2
557 andc r11, r11, r9
558
559
560 lwz r9, tlb_4xx_index@l(0)
561 addi r9, r9, 1
562 andi. r9, r9, PPC40X_TLB_SIZE - 1
563 stw r9, tlb_4xx_index@l(0)
564
565 tlbwe r11, r9, TLB_DATA
566 tlbwe r10, r9, TLB_TAG
567
568
569
570 mtspr SPRN_PID, r12
571 mtcrf 0x80, r12
572 mfspr r9, SPRN_SPRG_SCRATCH4
573 mfspr r12, SPRN_SPRG_SCRATCH3
574 mfspr r11, SPRN_SPRG_SCRATCH6
575 mfspr r10, SPRN_SPRG_SCRATCH5
576 rfi
577 b .
578
579
580
581start_here:
582
583
584 lis r2,init_task@h
585 ori r2,r2,init_task@l
586
587
588 tophys(r4,r2)
589 addi r4,r4,THREAD
590 mtspr SPRN_SPRG_THREAD,r4
591
592
593 lis r1,init_thread_union@ha
594 addi r1,r1,init_thread_union@l
595 li r0,0
596 stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
597
598 bl early_init
599
600
601
602
603#ifdef CONFIG_KASAN
604 bl kasan_early_init
605#endif
606 li r3,0
607 mr r4,r31
608 bl machine_init
609 bl MMU_init
610
611
612
613
614
615
616 lis r4,2f@h
617 ori r4,r4,2f@l
618 tophys(r4,r4)
619 lis r3,(MSR_KERNEL & ~(MSR_IR|MSR_DR))@h
620 ori r3,r3,(MSR_KERNEL & ~(MSR_IR|MSR_DR))@l
621 mtspr SPRN_SRR0,r4
622 mtspr SPRN_SRR1,r3
623 rfi
624 b .
625
626
6272:
628 sync
629 tlbia
630 isync
631
632
633
634 lis r6, swapper_pg_dir@h
635 ori r6, r6, swapper_pg_dir@l
636 lis r5, abatron_pteptrs@h
637 ori r5, r5, abatron_pteptrs@l
638 stw r5, 0xf0(0)
639 tophys(r5,r5)
640 stw r6, 0(r5)
641
642
643 lis r4,MSR_KERNEL@h
644 ori r4,r4,MSR_KERNEL@l
645 lis r3,start_kernel@h
646 ori r3,r3,start_kernel@l
647 mtspr SPRN_SRR0,r3
648 mtspr SPRN_SRR1,r4
649 rfi
650 b .
651
652
653
654
655
656initial_mmu:
657 tlbia
658 isync
659
660
661
662
663
664
665
666 lis r3,KERNELBASE@h
667 ori r3,r3,KERNELBASE@l
668 tophys(r4,r3)
669
670 iccci r0,r3
671
672
673
674 li r0,0
675 mtspr SPRN_PID,r0
676 sync
677
678
679 clrrwi r4,r4,10
680 ori r4,r4,(TLB_WR | TLB_EX)
681
682 clrrwi r3,r3,10
683 ori r3,r3,(TLB_VALID | TLB_PAGESZ(PAGESZ_16M))
684
685 li r0,63
686
687 tlbwe r4,r0,TLB_DATA
688 tlbwe r3,r0,TLB_TAG
689
690 isync
691
692
693
694 lis r4,KERNELBASE@h
695 tophys(r0,r4)
696 mtspr SPRN_EVPR,r0
697
698 blr
699
700_GLOBAL(abort)
701 mfspr r13,SPRN_DBCR0
702 oris r13,r13,DBCR0_RST_SYSTEM@h
703 mtspr SPRN_DBCR0,r13
704