1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <asm/hw_irq.h>
17 #include <asm/exception-64s.h>
18 #include <asm/ptrace.h>
19 #include <asm/cpuidle.h>
20 #include <asm/head-64.h>
21 #include <asm/feature-fixups.h>
22 #include <asm/kup.h>
23
24
25 #define EX_R9 0
26 #define EX_R10 8
27 #define EX_R11 16
28 #define EX_R12 24
29 #define EX_R13 32
30 #define EX_DAR 40
31 #define EX_DSISR 48
32 #define EX_CCR 52
33 #define EX_CFAR 56
34 #define EX_PPR 64
35 #if defined(CONFIG_RELOCATABLE)
36 #define EX_CTR 72
37 .if EX_SIZE != 10
38 .error "EX_SIZE is wrong"
39 .endif
40 #else
41 .if EX_SIZE != 9
42 .error "EX_SIZE is wrong"
43 .endif
44 #endif
45
46
47
48
49
50
51
52
53
54
55
56
57 #define EXC_REAL_BEGIN(name, start, size) \
58 FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##name, start, size)
59
60 #define EXC_REAL_END(name, start, size) \
61 FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##name, start, size)
62
63 #define EXC_VIRT_BEGIN(name, start, size) \
64 FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##name, start, size)
65
66 #define EXC_VIRT_END(name, start, size) \
67 FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##name, start, size)
68
69 #define EXC_COMMON_BEGIN(name) \
70 USE_TEXT_SECTION(); \
71 .balign IFETCH_ALIGN_BYTES; \
72 .global name; \
73 _ASM_NOKPROBE_SYMBOL(name); \
74 DEFINE_FIXED_SYMBOL(name); \
75 name:
76
77 #define TRAMP_REAL_BEGIN(name) \
78 FIXED_SECTION_ENTRY_BEGIN(real_trampolines, name)
79
80 #define TRAMP_VIRT_BEGIN(name) \
81 FIXED_SECTION_ENTRY_BEGIN(virt_trampolines, name)
82
83 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
84 #define TRAMP_KVM_BEGIN(name) \
85 TRAMP_VIRT_BEGIN(name)
86 #else
87 #define TRAMP_KVM_BEGIN(name)
88 #endif
89
90 #define EXC_REAL_NONE(start, size) \
91 FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##unused, start, size); \
92 FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##unused, start, size)
93
94 #define EXC_VIRT_NONE(start, size) \
95 FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size); \
96 FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size)
97
98
99
100
101
102
103
104
105 #define LOAD_HANDLER(reg, label) \
106 ld reg,PACAKBASE(r13); \
107 ori reg,reg,FIXED_SYMBOL_ABS_ADDR(label)
108
109 #define __LOAD_HANDLER(reg, label) \
110 ld reg,PACAKBASE(r13); \
111 ori reg,reg,(ABS_ADDR(label))@l
112
113
114
115
116
117 #define __LOAD_FAR_HANDLER(reg, label) \
118 ld reg,PACAKBASE(r13); \
119 ori reg,reg,(ABS_ADDR(label))@l; \
120 addis reg,reg,(ABS_ADDR(label))@h
121
122
123 #define EXC_HV_OR_STD 2
124 #define EXC_HV 1
125 #define EXC_STD 0
126
127 #if defined(CONFIG_RELOCATABLE)
128
129
130
131
132
133 #define SAVE_CTR(reg, area) mfctr reg ; std reg,area+EX_CTR(r13)
134 #define GET_CTR(reg, area) ld reg,area+EX_CTR(r13)
135 #define RESTORE_CTR(reg, area) ld reg,area+EX_CTR(r13) ; mtctr reg
136 #else
137
138 #define SAVE_CTR(reg, area)
139 #define GET_CTR(reg, area) mfctr reg
140 #define RESTORE_CTR(reg, area)
141 #endif
142
143
144
145
146
147 #define SAVE_PPR(area, ra) \
148 BEGIN_FTR_SECTION_NESTED(940) \
149 ld ra,area+EX_PPR(r13); \
150 std ra,_PPR(r1); \
151 END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,940)
152
153 #define RESTORE_PPR_PACA(area, ra) \
154 BEGIN_FTR_SECTION_NESTED(941) \
155 ld ra,area+EX_PPR(r13); \
156 mtspr SPRN_PPR,ra; \
157 END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,941)
158
159
160
161
162 #define OPT_GET_SPR(ra, spr, ftr) \
163 BEGIN_FTR_SECTION_NESTED(943) \
164 mfspr ra,spr; \
165 END_FTR_SECTION_NESTED(ftr,ftr,943)
166
167
168
169
170 #define OPT_SET_SPR(ra, spr, ftr) \
171 BEGIN_FTR_SECTION_NESTED(943) \
172 mtspr spr,ra; \
173 END_FTR_SECTION_NESTED(ftr,ftr,943)
174
175
176
177
178 #define OPT_SAVE_REG_TO_PACA(offset, ra, ftr) \
179 BEGIN_FTR_SECTION_NESTED(943) \
180 std ra,offset(r13); \
181 END_FTR_SECTION_NESTED(ftr,ftr,943)
182
183
184
185
186
187
188
189
190
191 #define BRANCH_TO_C000(reg, label) \
192 __LOAD_FAR_HANDLER(reg, label); \
193 mtctr reg; \
194 bctr
195
196 .macro INT_KVM_HANDLER name, vec, hsrr, area, skip
197 TRAMP_KVM_BEGIN(\name\()_kvm)
198 KVM_HANDLER \vec, \hsrr, \area, \skip
199 .endm
200
201 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
202 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
203
204
205
206
207
208 #define kvmppc_interrupt kvmppc_interrupt_hv
209 #else
210 #define kvmppc_interrupt kvmppc_interrupt_pr
211 #endif
212
213 .macro KVMTEST name, hsrr, n
214 lbz r10,HSTATE_IN_GUEST(r13)
215 cmpwi r10,0
216 bne \name\()_kvm
217 .endm
218
219 .macro KVM_HANDLER vec, hsrr, area, skip
220 .if \skip
221 cmpwi r10,KVM_GUEST_MODE_SKIP
222 beq 89f
223 .else
224 BEGIN_FTR_SECTION_NESTED(947)
225 ld r10,\area+EX_CFAR(r13)
226 std r10,HSTATE_CFAR(r13)
227 END_FTR_SECTION_NESTED(CPU_FTR_CFAR,CPU_FTR_CFAR,947)
228 .endif
229
230 BEGIN_FTR_SECTION_NESTED(948)
231 ld r10,\area+EX_PPR(r13)
232 std r10,HSTATE_PPR(r13)
233 END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948)
234 ld r10,\area+EX_R10(r13)
235 std r12,HSTATE_SCRATCH0(r13)
236 sldi r12,r9,32
237
238 .if \hsrr == EXC_HV_OR_STD
239 BEGIN_FTR_SECTION
240 ori r12,r12,(\vec + 0x2)
241 FTR_SECTION_ELSE
242 ori r12,r12,(\vec)
243 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
244 .elseif \hsrr
245 ori r12,r12,(\vec + 0x2)
246 .else
247 ori r12,r12,(\vec)
248 .endif
249
250 #ifdef CONFIG_RELOCATABLE
251
252
253
254
255
256 mfctr r9
257 std r9,HSTATE_SCRATCH1(r13)
258 __LOAD_FAR_HANDLER(r9, kvmppc_interrupt)
259 mtctr r9
260 ld r9,\area+EX_R9(r13)
261 bctr
262 #else
263 ld r9,\area+EX_R9(r13)
264 b kvmppc_interrupt
265 #endif
266
267
268 .if \skip
269 89: mtocrf 0x80,r9
270 ld r9,\area+EX_R9(r13)
271 ld r10,\area+EX_R10(r13)
272 .if \hsrr == EXC_HV_OR_STD
273 BEGIN_FTR_SECTION
274 b kvmppc_skip_Hinterrupt
275 FTR_SECTION_ELSE
276 b kvmppc_skip_interrupt
277 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
278 .elseif \hsrr
279 b kvmppc_skip_Hinterrupt
280 .else
281 b kvmppc_skip_interrupt
282 .endif
283 .endif
284 .endm
285
286 #else
287 .macro KVMTEST name, hsrr, n
288 .endm
289 .macro KVM_HANDLER name, vec, hsrr, area, skip
290 .endm
291 #endif
292
293 .macro INT_SAVE_SRR_AND_JUMP label, hsrr, set_ri
294 ld r10,PACAKMSR(r13)
295 .if ! \set_ri
296 xori r10,r10,MSR_RI
297 .endif
298 .if \hsrr == EXC_HV_OR_STD
299 BEGIN_FTR_SECTION
300 mfspr r11,SPRN_HSRR0
301 mfspr r12,SPRN_HSRR1
302 mtspr SPRN_HSRR1,r10
303 FTR_SECTION_ELSE
304 mfspr r11,SPRN_SRR0
305 mfspr r12,SPRN_SRR1
306 mtspr SPRN_SRR1,r10
307 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
308 .elseif \hsrr
309 mfspr r11,SPRN_HSRR0
310 mfspr r12,SPRN_HSRR1
311 mtspr SPRN_HSRR1,r10
312 .else
313 mfspr r11,SPRN_SRR0
314 mfspr r12,SPRN_SRR1
315 mtspr SPRN_SRR1,r10
316 .endif
317 LOAD_HANDLER(r10, \label\())
318 .if \hsrr == EXC_HV_OR_STD
319 BEGIN_FTR_SECTION
320 mtspr SPRN_HSRR0,r10
321 HRFI_TO_KERNEL
322 FTR_SECTION_ELSE
323 mtspr SPRN_SRR0,r10
324 RFI_TO_KERNEL
325 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
326 .elseif \hsrr
327 mtspr SPRN_HSRR0,r10
328 HRFI_TO_KERNEL
329 .else
330 mtspr SPRN_SRR0,r10
331 RFI_TO_KERNEL
332 .endif
333 b .
334 .endm
335
336
337 .macro INT_VIRT_SAVE_SRR_AND_JUMP label, hsrr
338 #ifdef CONFIG_RELOCATABLE
339 .if \hsrr == EXC_HV_OR_STD
340 BEGIN_FTR_SECTION
341 mfspr r11,SPRN_HSRR0
342 FTR_SECTION_ELSE
343 mfspr r11,SPRN_SRR0
344 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
345 .elseif \hsrr
346 mfspr r11,SPRN_HSRR0
347 .else
348 mfspr r11,SPRN_SRR0
349 .endif
350 LOAD_HANDLER(r12, \label\())
351 mtctr r12
352 .if \hsrr == EXC_HV_OR_STD
353 BEGIN_FTR_SECTION
354 mfspr r12,SPRN_HSRR1
355 FTR_SECTION_ELSE
356 mfspr r12,SPRN_SRR1
357 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
358 .elseif \hsrr
359 mfspr r12,SPRN_HSRR1
360 .else
361 mfspr r12,SPRN_SRR1
362 .endif
363 li r10,MSR_RI
364 mtmsrd r10,1
365 bctr
366 #else
367 .if \hsrr == EXC_HV_OR_STD
368 BEGIN_FTR_SECTION
369 mfspr r11,SPRN_HSRR0
370 mfspr r12,SPRN_HSRR1
371 FTR_SECTION_ELSE
372 mfspr r11,SPRN_SRR0
373 mfspr r12,SPRN_SRR1
374 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
375 .elseif \hsrr
376 mfspr r11,SPRN_HSRR0
377 mfspr r12,SPRN_HSRR1
378 .else
379 mfspr r11,SPRN_SRR0
380 mfspr r12,SPRN_SRR1
381 .endif
382 li r10,MSR_RI
383 mtmsrd r10,1
384 b \label
385 #endif
386 .endm
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408 .macro INT_HANDLER name, vec, ool=0, early=0, virt=0, hsrr=0, area=PACA_EXGEN, ri=1, dar=0, dsisr=0, bitmask=0, kvm=0
409 SET_SCRATCH0(r13)
410 GET_PACA(r13)
411 std r9,\area\()+EX_R9(r13)
412 OPT_GET_SPR(r9, SPRN_PPR, CPU_FTR_HAS_PPR)
413 HMT_MEDIUM
414 std r10,\area\()+EX_R10(r13)
415 OPT_GET_SPR(r10, SPRN_CFAR, CPU_FTR_CFAR)
416 .if \ool
417 .if !\virt
418 b tramp_real_\name
419 .pushsection .text
420 TRAMP_REAL_BEGIN(tramp_real_\name)
421 .else
422 b tramp_virt_\name
423 .pushsection .text
424 TRAMP_VIRT_BEGIN(tramp_virt_\name)
425 .endif
426 .endif
427
428 OPT_SAVE_REG_TO_PACA(\area\()+EX_PPR, r9, CPU_FTR_HAS_PPR)
429 OPT_SAVE_REG_TO_PACA(\area\()+EX_CFAR, r10, CPU_FTR_CFAR)
430 INTERRUPT_TO_KERNEL
431 SAVE_CTR(r10, \area\())
432 mfcr r9
433 .if \kvm
434 KVMTEST \name \hsrr \vec
435 .endif
436 .if \bitmask
437 lbz r10,PACAIRQSOFTMASK(r13)
438 andi. r10,r10,\bitmask
439
440 .if \vec == 0x500 || \vec == 0xea0
441 li r10,PACA_IRQ_EE
442 .elseif \vec == 0x900
443 li r10,PACA_IRQ_DEC
444 .elseif \vec == 0xa00 || \vec == 0xe80
445 li r10,PACA_IRQ_DBELL
446 .elseif \vec == 0xe60
447 li r10,PACA_IRQ_HMI
448 .elseif \vec == 0xf00
449 li r10,PACA_IRQ_PMI
450 .else
451 .abort "Bad maskable vector"
452 .endif
453
454 .if \hsrr == EXC_HV_OR_STD
455 BEGIN_FTR_SECTION
456 bne masked_Hinterrupt
457 FTR_SECTION_ELSE
458 bne masked_interrupt
459 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
460 .elseif \hsrr
461 bne masked_Hinterrupt
462 .else
463 bne masked_interrupt
464 .endif
465 .endif
466
467 std r11,\area\()+EX_R11(r13)
468 std r12,\area\()+EX_R12(r13)
469
470
471
472
473
474
475 GET_SCRATCH0(r10)
476 std r10,\area\()+EX_R13(r13)
477 .if \dar
478 .if \hsrr
479 mfspr r10,SPRN_HDAR
480 .else
481 mfspr r10,SPRN_DAR
482 .endif
483 std r10,\area\()+EX_DAR(r13)
484 .endif
485 .if \dsisr
486 .if \hsrr
487 mfspr r10,SPRN_HDSISR
488 .else
489 mfspr r10,SPRN_DSISR
490 .endif
491 stw r10,\area\()+EX_DSISR(r13)
492 .endif
493
494 .if \early == 2
495
496 .elseif \early
497 mfctr r10
498 BRANCH_TO_C000(r11, \name\()_early_common)
499 .elseif !\virt
500 INT_SAVE_SRR_AND_JUMP \name\()_common, \hsrr, \ri
501 .else
502 INT_VIRT_SAVE_SRR_AND_JUMP \name\()_common, \hsrr
503 .endif
504 .if \ool
505 .popsection
506 .endif
507 .endm
508
509
510
511
512
513
514
515
516
517 .macro INT_COMMON vec, area, stack, kaup, reconcile, dar, dsisr
518 .if \stack
519 andi. r10,r12,MSR_PR
520 mr r10,r1
521 subi r1,r1,INT_FRAME_SIZE
522 beq- 100f
523 ld r1,PACAKSAVE(r13)
524 100: tdgei r1,-INT_FRAME_SIZE
525 EMIT_BUG_ENTRY 100b,__FILE__,__LINE__,0
526 .endif
527
528 std r9,_CCR(r1)
529 std r11,_NIP(r1)
530 std r12,_MSR(r1)
531 std r10,0(r1)
532 std r0,GPR0(r1)
533 std r10,GPR1(r1)
534
535 .if \stack
536 .if \kaup
537 kuap_save_amr_and_lock r9, r10, cr1, cr0
538 .endif
539 beq 101f
540 ACCOUNT_CPU_USER_ENTRY(r13, r9, r10)
541 SAVE_PPR(\area, r9)
542 101:
543 .else
544 .if \kaup
545 kuap_save_amr_and_lock r9, r10, cr1
546 .endif
547 .endif
548
549
550 ld r9,\area+EX_R9(r13)
551 ld r10,\area+EX_R10(r13)
552 std r9,GPR9(r1)
553 std r10,GPR10(r1)
554 ld r9,\area+EX_R11(r13)
555 ld r10,\area+EX_R12(r13)
556 ld r11,\area+EX_R13(r13)
557 std r9,GPR11(r1)
558 std r10,GPR12(r1)
559 std r11,GPR13(r1)
560 .if \dar
561 .if \dar == 2
562 ld r10,_NIP(r1)
563 .else
564 ld r10,\area+EX_DAR(r13)
565 .endif
566 std r10,_DAR(r1)
567 .endif
568 .if \dsisr
569 .if \dsisr == 2
570 ld r10,_MSR(r1)
571 lis r11,DSISR_SRR1_MATCH_64S@h
572 and r10,r10,r11
573 .else
574 lwz r10,\area+EX_DSISR(r13)
575 .endif
576 std r10,_DSISR(r1)
577 .endif
578 BEGIN_FTR_SECTION_NESTED(66)
579 ld r10,\area+EX_CFAR(r13)
580 std r10,ORIG_GPR3(r1)
581 END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66)
582 GET_CTR(r10, \area)
583 std r10,_CTR(r1)
584 std r2,GPR2(r1)
585 SAVE_4GPRS(3, r1)
586 SAVE_2GPRS(7, r1)
587 mflr r9
588 ld r2,PACATOC(r13)
589 std r9,_LINK(r1)
590 lbz r10,PACAIRQSOFTMASK(r13)
591 mfspr r11,SPRN_XER
592 std r10,SOFTE(r1)
593 std r11,_XER(r1)
594 li r9,(\vec)+1
595 std r9,_TRAP(r1)
596 li r10,0
597 ld r11,exception_marker@toc(r2)
598 std r10,RESULT(r1)
599 std r11,STACK_FRAME_OVERHEAD-16(r1)
600
601 .if \stack
602 ACCOUNT_STOLEN_TIME
603 .endif
604
605 .if \reconcile
606 RECONCILE_IRQ_STATE(r10, r11)
607 .endif
608 .endm
609
610
611
612
613
614 .macro EXCEPTION_RESTORE_REGS hsrr
615
616 ld r9,_MSR(r1)
617 .if \hsrr == EXC_HV_OR_STD
618 .error "EXC_HV_OR_STD Not implemented for EXCEPTION_RESTORE_REGS"
619 .endif
620 .if \hsrr
621 mtspr SPRN_HSRR1,r9
622 .else
623 mtspr SPRN_SRR1,r9
624 .endif
625 ld r9,_NIP(r1)
626 .if \hsrr
627 mtspr SPRN_HSRR0,r9
628 .else
629 mtspr SPRN_SRR0,r9
630 .endif
631 ld r9,_CTR(r1)
632 mtctr r9
633 ld r9,_XER(r1)
634 mtxer r9
635 ld r9,_LINK(r1)
636 mtlr r9
637 ld r9,_CCR(r1)
638 mtcr r9
639 REST_8GPRS(2, r1)
640 REST_4GPRS(10, r1)
641 REST_GPR(0, r1)
642
643 ld r1,GPR1(r1)
644 .endm
645
646 #define RUNLATCH_ON \
647 BEGIN_FTR_SECTION \
648 ld r3, PACA_THREAD_INFO(r13); \
649 ld r4,TI_LOCAL_FLAGS(r3); \
650 andi. r0,r4,_TLF_RUNLATCH; \
651 beql ppc64_runlatch_on_trampoline; \
652 END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
653
654
655
656
657
658
659
660
661 #ifdef CONFIG_PPC_970_NAP
662 #define FINISH_NAP \
663 BEGIN_FTR_SECTION \
664 ld r11, PACA_THREAD_INFO(r13); \
665 ld r9,TI_LOCAL_FLAGS(r11); \
666 andi. r10,r9,_TLF_NAPPING; \
667 bnel power4_fixup_nap; \
668 END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
669 #else
670 #define FINISH_NAP
671 #endif
672
673 #define EXC_COMMON(name, realvec, hdlr) \
674 EXC_COMMON_BEGIN(name); \
675 INT_COMMON realvec, PACA_EXGEN, 1, 1, 1, 0, 0 ; \
676 bl save_nvgprs; \
677 addi r3,r1,STACK_FRAME_OVERHEAD; \
678 bl hdlr; \
679 b ret_from_except
680
681
682
683
684
685 #define EXC_COMMON_ASYNC(name, realvec, hdlr) \
686 EXC_COMMON_BEGIN(name); \
687 INT_COMMON realvec, PACA_EXGEN, 1, 1, 1, 0, 0 ; \
688 FINISH_NAP; \
689 RUNLATCH_ON; \
690 addi r3,r1,STACK_FRAME_OVERHEAD; \
691 bl hdlr; \
692 b ret_from_except_lite
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739 OPEN_FIXED_SECTION(real_vectors, 0x0100, 0x1900)
740 OPEN_FIXED_SECTION(real_trampolines, 0x1900, 0x4000)
741 OPEN_FIXED_SECTION(virt_vectors, 0x4000, 0x5900)
742 OPEN_FIXED_SECTION(virt_trampolines, 0x5900, 0x7000)
743
744 #ifdef CONFIG_PPC_POWERNV
745 .globl start_real_trampolines
746 .globl end_real_trampolines
747 .globl start_virt_trampolines
748 .globl end_virt_trampolines
749 #endif
750
751 #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
752
753
754
755
756
757
758 ZERO_FIXED_SECTION(fwnmi_page, 0x7000, 0x8000)
759 OPEN_TEXT_SECTION(0x8000)
760 #else
761 OPEN_TEXT_SECTION(0x7000)
762 #endif
763
764 USE_FIXED_SECTION(real_vectors)
765
766
767
768
769
770
771
772
773
774 .globl __start_interrupts
775 __start_interrupts:
776
777
778 EXC_VIRT_NONE(0x4000, 0x100)
779
780
781 EXC_REAL_BEGIN(system_reset, 0x100, 0x100)
782 #ifdef CONFIG_PPC_P7_NAP
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799 BEGIN_FTR_SECTION
800 SET_SCRATCH0(r13)
801 GET_PACA(r13)
802 std r3,PACA_EXNMI+0*8(r13)
803 std r4,PACA_EXNMI+1*8(r13)
804 std r5,PACA_EXNMI+2*8(r13)
805 mfspr r3,SPRN_SRR1
806 mfocrf r4,0x80
807 rlwinm. r5,r3,47-31,30,31
808 bne+ system_reset_idle_wake
809
810 mtocrf 0x80,r4
811 ld r3,PACA_EXNMI+0*8(r13)
812 ld r4,PACA_EXNMI+1*8(r13)
813 ld r5,PACA_EXNMI+2*8(r13)
814 GET_SCRATCH0(r13)
815 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
816 #endif
817
818 INT_HANDLER system_reset, 0x100, area=PACA_EXNMI, ri=0, kvm=1
819
820
821
822
823
824
825
826
827
828
829 EXC_REAL_END(system_reset, 0x100, 0x100)
830 EXC_VIRT_NONE(0x4100, 0x100)
831 INT_KVM_HANDLER system_reset 0x100, EXC_STD, PACA_EXNMI, 0
832
833 #ifdef CONFIG_PPC_P7_NAP
834 TRAMP_REAL_BEGIN(system_reset_idle_wake)
835
836 cmpwi cr1,r5,2
837 bltlr cr1
838 BRANCH_TO_C000(r12, DOTSYM(idle_return_gpr_loss))
839 #endif
840
841 #ifdef CONFIG_PPC_PSERIES
842
843
844
845 TRAMP_REAL_BEGIN(system_reset_fwnmi)
846
847 INT_HANDLER system_reset, 0x100, area=PACA_EXNMI, ri=0
848
849 #endif
850
851 EXC_COMMON_BEGIN(system_reset_common)
852
853
854
855
856
857
858 lhz r10,PACA_IN_NMI(r13)
859 addi r10,r10,1
860 sth r10,PACA_IN_NMI(r13)
861 li r10,MSR_RI
862 mtmsrd r10,1
863
864 mr r10,r1
865 ld r1,PACA_NMI_EMERG_SP(r13)
866 subi r1,r1,INT_FRAME_SIZE
867 INT_COMMON 0x100, PACA_EXNMI, 0, 1, 0, 0, 0
868 bl save_nvgprs
869
870
871
872
873
874
875
876
877
878 li r10,IRQS_ALL_DISABLED
879 stb r10,PACAIRQSOFTMASK(r13)
880 lbz r10,PACAIRQHAPPENED(r13)
881 std r10,_DAR(r1)
882
883 addi r3,r1,STACK_FRAME_OVERHEAD
884 bl system_reset_exception
885
886
887 li r9,0
888 mtmsrd r9,1
889
890
891
892
893 lhz r10,PACA_IN_NMI(r13)
894 subi r10,r10,1
895 sth r10,PACA_IN_NMI(r13)
896
897
898
899
900 ld r10,_DAR(r1)
901 stb r10,PACAIRQHAPPENED(r13)
902 ld r10,SOFTE(r1)
903 stb r10,PACAIRQSOFTMASK(r13)
904
905 EXCEPTION_RESTORE_REGS EXC_STD
906 RFI_TO_USER_OR_KERNEL
907
908
909 EXC_REAL_BEGIN(machine_check, 0x200, 0x100)
910 INT_HANDLER machine_check, 0x200, early=1, area=PACA_EXMC, dar=1, dsisr=1
911
912
913
914
915
916 EXC_REAL_END(machine_check, 0x200, 0x100)
917 EXC_VIRT_NONE(0x4200, 0x100)
918
919 #ifdef CONFIG_PPC_PSERIES
920 TRAMP_REAL_BEGIN(machine_check_fwnmi)
921
922 INT_HANDLER machine_check, 0x200, early=1, area=PACA_EXMC, dar=1, dsisr=1
923 #endif
924
925 INT_KVM_HANDLER machine_check 0x200, EXC_STD, PACA_EXMC, 1
926
927 #define MACHINE_CHECK_HANDLER_WINDUP \
928 \
929 li r9,0; \
930 mtmsrd r9,1; \
931 \
932 lhz r12,PACA_IN_MCE(r13); \
933 subi r12,r12,1; \
934 sth r12,PACA_IN_MCE(r13); \
935 EXCEPTION_RESTORE_REGS EXC_STD
936
937 EXC_COMMON_BEGIN(machine_check_early_common)
938 mtctr r10
939 mfspr r11,SPRN_SRR0
940 mfspr r12,SPRN_SRR1
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963 lhz r10,PACA_IN_MCE(r13)
964 cmpwi r10,0
965 cmpwi cr1,r10,MAX_MCE_DEPTH
966 addi r10,r10,1
967 sth r10,PACA_IN_MCE(r13)
968
969 mr r10,r1
970 bne 1f
971
972 ld r1,PACAMCEMERGSP(r13)
973 1:
974 bgt cr1,unrecoverable_mce
975 subi r1,r1,INT_FRAME_SIZE
976
977
978 INT_COMMON 0x200, PACA_EXMC, 0, 0, 0, 1, 1
979
980 BEGIN_FTR_SECTION
981 bl enable_machine_check
982 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
983 li r10,MSR_RI
984 mtmsrd r10,1
985
986 bl save_nvgprs
987 addi r3,r1,STACK_FRAME_OVERHEAD
988 bl machine_check_early
989 std r3,RESULT(r1)
990 ld r12,_MSR(r1)
991
992 #ifdef CONFIG_PPC_P7_NAP
993
994
995
996
997
998
999
1000
1001
1002 BEGIN_FTR_SECTION
1003 rlwinm. r11,r12,47-31,30,31
1004 bne machine_check_idle_common
1005 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
1006 #endif
1007
1008 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
1009
1010
1011
1012
1013
1014
1015 lbz r11,HSTATE_IN_GUEST(r13)
1016 cmpwi r11,0
1017 bne mce_deliver
1018 #endif
1019
1020
1021
1022
1023
1024 andi. r11,r12,MSR_PR
1025 bne mce_deliver
1026
1027
1028
1029
1030
1031
1032
1033 andi. r11,r12,MSR_RI
1034 beq unrecoverable_mce
1035
1036
1037
1038
1039
1040 ld r3,RESULT(r1)
1041 cmpdi r3,0
1042 beq unrecoverable_mce
1043
1044
1045
1046
1047
1048
1049 bl machine_check_queue_event
1050 MACHINE_CHECK_HANDLER_WINDUP
1051 RFI_TO_KERNEL
1052
1053 mce_deliver:
1054
1055
1056
1057
1058
1059
1060
1061 BEGIN_FTR_SECTION
1062 ld r10,ORIG_GPR3(r1)
1063 mtspr SPRN_CFAR,r10
1064 END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
1065 MACHINE_CHECK_HANDLER_WINDUP
1066
1067 INT_HANDLER machine_check, 0x200, area=PACA_EXMC, ri=0, dar=1, dsisr=1, kvm=1
1068
1069 EXC_COMMON_BEGIN(machine_check_common)
1070
1071
1072
1073
1074 INT_COMMON 0x200, PACA_EXMC, 1, 1, 1, 1, 1
1075 FINISH_NAP
1076
1077 li r10,MSR_RI
1078 mtmsrd r10,1
1079 bl save_nvgprs
1080 addi r3,r1,STACK_FRAME_OVERHEAD
1081 bl machine_check_exception
1082 b ret_from_except
1083
1084 #ifdef CONFIG_PPC_P7_NAP
1085
1086
1087
1088
1089 EXC_COMMON_BEGIN(machine_check_idle_common)
1090 bl machine_check_queue_event
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102 ld r3,_MSR(r1)
1103 ld r4,_LINK(r1)
1104
1105 lhz r11,PACA_IN_MCE(r13)
1106 subi r11,r11,1
1107 sth r11,PACA_IN_MCE(r13)
1108
1109 mtlr r4
1110 rlwinm r10,r3,47-31,30,31
1111 cmpwi cr1,r10,2
1112 bltlr cr1
1113 b idle_return_gpr_loss
1114 #endif
1115
1116 EXC_COMMON_BEGIN(unrecoverable_mce)
1117
1118
1119
1120
1121
1122
1123
1124 BEGIN_FTR_SECTION
1125 li r10,0
1126 mtmsrd r10,1
1127 bl disable_machine_check
1128 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
1129 ld r10,PACAKMSR(r13)
1130 li r3,MSR_ME
1131 andc r10,r10,r3
1132 mtmsrd r10
1133
1134
1135 addi r3,r1,STACK_FRAME_OVERHEAD
1136 bl machine_check_exception
1137
1138
1139
1140
1141
1142 addi r3,r1,STACK_FRAME_OVERHEAD
1143 bl unrecoverable_exception
1144 b .
1145
1146
1147 EXC_REAL_BEGIN(data_access, 0x300, 0x80)
1148 INT_HANDLER data_access, 0x300, ool=1, dar=1, dsisr=1, kvm=1
1149 EXC_REAL_END(data_access, 0x300, 0x80)
1150 EXC_VIRT_BEGIN(data_access, 0x4300, 0x80)
1151 INT_HANDLER data_access, 0x300, virt=1, dar=1, dsisr=1
1152 EXC_VIRT_END(data_access, 0x4300, 0x80)
1153 INT_KVM_HANDLER data_access, 0x300, EXC_STD, PACA_EXGEN, 1
1154 EXC_COMMON_BEGIN(data_access_common)
1155
1156
1157
1158
1159
1160
1161 INT_COMMON 0x300, PACA_EXGEN, 1, 1, 1, 1, 1
1162 ld r4,_DAR(r1)
1163 ld r5,_DSISR(r1)
1164 BEGIN_MMU_FTR_SECTION
1165 ld r6,_MSR(r1)
1166 li r3,0x300
1167 b do_hash_page
1168 MMU_FTR_SECTION_ELSE
1169 b handle_page_fault
1170 ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
1171
1172
1173 EXC_REAL_BEGIN(data_access_slb, 0x380, 0x80)
1174 INT_HANDLER data_access_slb, 0x380, ool=1, area=PACA_EXSLB, dar=1, kvm=1
1175 EXC_REAL_END(data_access_slb, 0x380, 0x80)
1176 EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x80)
1177 INT_HANDLER data_access_slb, 0x380, virt=1, area=PACA_EXSLB, dar=1
1178 EXC_VIRT_END(data_access_slb, 0x4380, 0x80)
1179 INT_KVM_HANDLER data_access_slb, 0x380, EXC_STD, PACA_EXSLB, 1
1180 EXC_COMMON_BEGIN(data_access_slb_common)
1181 INT_COMMON 0x380, PACA_EXSLB, 1, 1, 0, 1, 0
1182 ld r4,_DAR(r1)
1183 addi r3,r1,STACK_FRAME_OVERHEAD
1184 BEGIN_MMU_FTR_SECTION
1185
1186 bl do_slb_fault
1187 cmpdi r3,0
1188 bne- 1f
1189 b fast_exception_return
1190 1:
1191 MMU_FTR_SECTION_ELSE
1192
1193 li r3,-EFAULT
1194 ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
1195 std r3,RESULT(r1)
1196 bl save_nvgprs
1197 RECONCILE_IRQ_STATE(r10, r11)
1198 ld r4,_DAR(r1)
1199 ld r5,RESULT(r1)
1200 addi r3,r1,STACK_FRAME_OVERHEAD
1201 bl do_bad_slb_fault
1202 b ret_from_except
1203
1204
1205 EXC_REAL_BEGIN(instruction_access, 0x400, 0x80)
1206 INT_HANDLER instruction_access, 0x400, kvm=1
1207 EXC_REAL_END(instruction_access, 0x400, 0x80)
1208 EXC_VIRT_BEGIN(instruction_access, 0x4400, 0x80)
1209 INT_HANDLER instruction_access, 0x400, virt=1
1210 EXC_VIRT_END(instruction_access, 0x4400, 0x80)
1211 INT_KVM_HANDLER instruction_access, 0x400, EXC_STD, PACA_EXGEN, 0
1212 EXC_COMMON_BEGIN(instruction_access_common)
1213 INT_COMMON 0x400, PACA_EXGEN, 1, 1, 1, 2, 2
1214 ld r4,_DAR(r1)
1215 ld r5,_DSISR(r1)
1216 BEGIN_MMU_FTR_SECTION
1217 ld r6,_MSR(r1)
1218 li r3,0x400
1219 b do_hash_page
1220 MMU_FTR_SECTION_ELSE
1221 b handle_page_fault
1222 ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
1223
1224
1225 EXC_REAL_BEGIN(instruction_access_slb, 0x480, 0x80)
1226 INT_HANDLER instruction_access_slb, 0x480, area=PACA_EXSLB, kvm=1
1227 EXC_REAL_END(instruction_access_slb, 0x480, 0x80)
1228 EXC_VIRT_BEGIN(instruction_access_slb, 0x4480, 0x80)
1229 INT_HANDLER instruction_access_slb, 0x480, virt=1, area=PACA_EXSLB
1230 EXC_VIRT_END(instruction_access_slb, 0x4480, 0x80)
1231 INT_KVM_HANDLER instruction_access_slb, 0x480, EXC_STD, PACA_EXSLB, 0
1232 EXC_COMMON_BEGIN(instruction_access_slb_common)
1233 INT_COMMON 0x480, PACA_EXSLB, 1, 1, 0, 2, 0
1234 ld r4,_DAR(r1)
1235 addi r3,r1,STACK_FRAME_OVERHEAD
1236 BEGIN_MMU_FTR_SECTION
1237
1238 bl do_slb_fault
1239 cmpdi r3,0
1240 bne- 1f
1241 b fast_exception_return
1242 1:
1243 MMU_FTR_SECTION_ELSE
1244
1245 li r3,-EFAULT
1246 ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
1247 std r3,RESULT(r1)
1248 bl save_nvgprs
1249 RECONCILE_IRQ_STATE(r10, r11)
1250 ld r4,_DAR(r1)
1251 ld r5,RESULT(r1)
1252 addi r3,r1,STACK_FRAME_OVERHEAD
1253 bl do_bad_slb_fault
1254 b ret_from_except
1255
1256 EXC_REAL_BEGIN(hardware_interrupt, 0x500, 0x100)
1257 INT_HANDLER hardware_interrupt, 0x500, hsrr=EXC_HV_OR_STD, bitmask=IRQS_DISABLED, kvm=1
1258 EXC_REAL_END(hardware_interrupt, 0x500, 0x100)
1259 EXC_VIRT_BEGIN(hardware_interrupt, 0x4500, 0x100)
1260 INT_HANDLER hardware_interrupt, 0x500, virt=1, hsrr=EXC_HV_OR_STD, bitmask=IRQS_DISABLED, kvm=1
1261 EXC_VIRT_END(hardware_interrupt, 0x4500, 0x100)
1262 INT_KVM_HANDLER hardware_interrupt, 0x500, EXC_HV_OR_STD, PACA_EXGEN, 0
1263 EXC_COMMON_ASYNC(hardware_interrupt_common, 0x500, do_IRQ)
1264
1265
1266 EXC_REAL_BEGIN(alignment, 0x600, 0x100)
1267 INT_HANDLER alignment, 0x600, dar=1, dsisr=1, kvm=1
1268 EXC_REAL_END(alignment, 0x600, 0x100)
1269 EXC_VIRT_BEGIN(alignment, 0x4600, 0x100)
1270 INT_HANDLER alignment, 0x600, virt=1, dar=1, dsisr=1
1271 EXC_VIRT_END(alignment, 0x4600, 0x100)
1272 INT_KVM_HANDLER alignment, 0x600, EXC_STD, PACA_EXGEN, 0
1273 EXC_COMMON_BEGIN(alignment_common)
1274 INT_COMMON 0x600, PACA_EXGEN, 1, 1, 1, 1, 1
1275 bl save_nvgprs
1276 addi r3,r1,STACK_FRAME_OVERHEAD
1277 bl alignment_exception
1278 b ret_from_except
1279
1280
1281 EXC_REAL_BEGIN(program_check, 0x700, 0x100)
1282 INT_HANDLER program_check, 0x700, kvm=1
1283 EXC_REAL_END(program_check, 0x700, 0x100)
1284 EXC_VIRT_BEGIN(program_check, 0x4700, 0x100)
1285 INT_HANDLER program_check, 0x700, virt=1
1286 EXC_VIRT_END(program_check, 0x4700, 0x100)
1287 INT_KVM_HANDLER program_check, 0x700, EXC_STD, PACA_EXGEN, 0
1288 EXC_COMMON_BEGIN(program_check_common)
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298 andi. r10,r12,MSR_PR
1299 bne 2f
1300
1301 andis. r10,r12,(SRR1_PROGTM)@h
1302 bne 1f
1303
1304 cmpdi r1,-INT_FRAME_SIZE
1305 blt 2f
1306
1307
1308 1: andi. r10,r12,MSR_PR
1309
1310 mr r10,r1
1311 ld r1,PACAEMERGSP(r13)
1312 subi r1,r1,INT_FRAME_SIZE
1313 INT_COMMON 0x700, PACA_EXGEN, 0, 1, 1, 0, 0
1314 b 3f
1315 2:
1316 INT_COMMON 0x700, PACA_EXGEN, 1, 1, 1, 0, 0
1317 3:
1318 bl save_nvgprs
1319 addi r3,r1,STACK_FRAME_OVERHEAD
1320 bl program_check_exception
1321 b ret_from_except
1322
1323
1324 EXC_REAL_BEGIN(fp_unavailable, 0x800, 0x100)
1325 INT_HANDLER fp_unavailable, 0x800, kvm=1
1326 EXC_REAL_END(fp_unavailable, 0x800, 0x100)
1327 EXC_VIRT_BEGIN(fp_unavailable, 0x4800, 0x100)
1328 INT_HANDLER fp_unavailable, 0x800, virt=1
1329 EXC_VIRT_END(fp_unavailable, 0x4800, 0x100)
1330 INT_KVM_HANDLER fp_unavailable, 0x800, EXC_STD, PACA_EXGEN, 0
1331 EXC_COMMON_BEGIN(fp_unavailable_common)
1332 INT_COMMON 0x800, PACA_EXGEN, 1, 1, 0, 0, 0
1333 bne 1f
1334 bl save_nvgprs
1335 RECONCILE_IRQ_STATE(r10, r11)
1336 addi r3,r1,STACK_FRAME_OVERHEAD
1337 bl kernel_fp_unavailable_exception
1338 0: trap
1339 EMIT_BUG_ENTRY 0b, __FILE__, __LINE__, 0
1340 1:
1341 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1342 BEGIN_FTR_SECTION
1343
1344
1345
1346 rldicl. r0, r12, (64-MSR_TS_LG), (64-2)
1347 bne- 2f
1348 END_FTR_SECTION_IFSET(CPU_FTR_TM)
1349 #endif
1350 bl load_up_fpu
1351 b fast_exception_return
1352 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1353 2:
1354 bl save_nvgprs
1355 RECONCILE_IRQ_STATE(r10, r11)
1356 addi r3,r1,STACK_FRAME_OVERHEAD
1357 bl fp_unavailable_tm
1358 b ret_from_except
1359 #endif
1360
1361
1362 EXC_REAL_BEGIN(decrementer, 0x900, 0x80)
1363 INT_HANDLER decrementer, 0x900, ool=1, bitmask=IRQS_DISABLED, kvm=1
1364 EXC_REAL_END(decrementer, 0x900, 0x80)
1365 EXC_VIRT_BEGIN(decrementer, 0x4900, 0x80)
1366 INT_HANDLER decrementer, 0x900, virt=1, bitmask=IRQS_DISABLED
1367 EXC_VIRT_END(decrementer, 0x4900, 0x80)
1368 INT_KVM_HANDLER decrementer, 0x900, EXC_STD, PACA_EXGEN, 0
1369 EXC_COMMON_ASYNC(decrementer_common, 0x900, timer_interrupt)
1370
1371
1372 EXC_REAL_BEGIN(hdecrementer, 0x980, 0x80)
1373 INT_HANDLER hdecrementer, 0x980, hsrr=EXC_HV, kvm=1
1374 EXC_REAL_END(hdecrementer, 0x980, 0x80)
1375 EXC_VIRT_BEGIN(hdecrementer, 0x4980, 0x80)
1376 INT_HANDLER hdecrementer, 0x980, virt=1, hsrr=EXC_HV, kvm=1
1377 EXC_VIRT_END(hdecrementer, 0x4980, 0x80)
1378 INT_KVM_HANDLER hdecrementer, 0x980, EXC_HV, PACA_EXGEN, 0
1379 EXC_COMMON(hdecrementer_common, 0x980, hdec_interrupt)
1380
1381
1382 EXC_REAL_BEGIN(doorbell_super, 0xa00, 0x100)
1383 INT_HANDLER doorbell_super, 0xa00, bitmask=IRQS_DISABLED, kvm=1
1384 EXC_REAL_END(doorbell_super, 0xa00, 0x100)
1385 EXC_VIRT_BEGIN(doorbell_super, 0x4a00, 0x100)
1386 INT_HANDLER doorbell_super, 0xa00, virt=1, bitmask=IRQS_DISABLED
1387 EXC_VIRT_END(doorbell_super, 0x4a00, 0x100)
1388 INT_KVM_HANDLER doorbell_super, 0xa00, EXC_STD, PACA_EXGEN, 0
1389 #ifdef CONFIG_PPC_DOORBELL
1390 EXC_COMMON_ASYNC(doorbell_super_common, 0xa00, doorbell_exception)
1391 #else
1392 EXC_COMMON_ASYNC(doorbell_super_common, 0xa00, unknown_exception)
1393 #endif
1394
1395
1396 EXC_REAL_NONE(0xb00, 0x100)
1397 EXC_VIRT_NONE(0x4b00, 0x100)
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433 .macro SYSTEM_CALL virt
1434 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
1435
1436
1437
1438
1439
1440
1441
1442
1443 mtctr r13
1444 GET_PACA(r13)
1445 std r10,PACA_EXGEN+EX_R10(r13)
1446 INTERRUPT_TO_KERNEL
1447 KVMTEST system_call EXC_STD 0xc00
1448 mfctr r9
1449 #else
1450 mr r9,r13
1451 GET_PACA(r13)
1452 INTERRUPT_TO_KERNEL
1453 #endif
1454
1455 #ifdef CONFIG_PPC_FAST_ENDIAN_SWITCH
1456 BEGIN_FTR_SECTION
1457 cmpdi r0,0x1ebe
1458 beq- 1f
1459 END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
1460 #endif
1461
1462
1463 mfspr r11,SPRN_SRR0
1464 mfspr r12,SPRN_SRR1
1465
1466 HMT_MEDIUM
1467
1468 .if ! \virt
1469 __LOAD_HANDLER(r10, system_call_common)
1470 mtspr SPRN_SRR0,r10
1471 ld r10,PACAKMSR(r13)
1472 mtspr SPRN_SRR1,r10
1473 RFI_TO_KERNEL
1474 b .
1475 .else
1476 li r10,MSR_RI
1477 mtmsrd r10,1
1478 #ifdef CONFIG_RELOCATABLE
1479 __LOAD_HANDLER(r10, system_call_common)
1480 mtctr r10
1481 bctr
1482 #else
1483 b system_call_common
1484 #endif
1485 .endif
1486
1487 #ifdef CONFIG_PPC_FAST_ENDIAN_SWITCH
1488
1489 1: mfspr r12,SPRN_SRR1
1490 xori r12,r12,MSR_LE
1491 mtspr SPRN_SRR1,r12
1492 mr r13,r9
1493 RFI_TO_USER
1494 b .
1495 #endif
1496 .endm
1497
1498 EXC_REAL_BEGIN(system_call, 0xc00, 0x100)
1499 SYSTEM_CALL 0
1500 EXC_REAL_END(system_call, 0xc00, 0x100)
1501 EXC_VIRT_BEGIN(system_call, 0x4c00, 0x100)
1502 SYSTEM_CALL 1
1503 EXC_VIRT_END(system_call, 0x4c00, 0x100)
1504
1505 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
1506
1507
1508
1509
1510
1511
1512
1513 TRAMP_KVM_BEGIN(system_call_kvm)
1514
1515
1516
1517
1518
1519 OPT_GET_SPR(r10, SPRN_PPR, CPU_FTR_HAS_PPR)
1520 HMT_MEDIUM
1521 OPT_SAVE_REG_TO_PACA(PACA_EXGEN+EX_PPR, r10, CPU_FTR_HAS_PPR)
1522 mfctr r10
1523 SET_SCRATCH0(r10)
1524 std r9,PACA_EXGEN+EX_R9(r13)
1525 mfcr r9
1526 KVM_HANDLER 0xc00, EXC_STD, PACA_EXGEN, 0
1527 #endif
1528
1529
1530 EXC_REAL_BEGIN(single_step, 0xd00, 0x100)
1531 INT_HANDLER single_step, 0xd00, kvm=1
1532 EXC_REAL_END(single_step, 0xd00, 0x100)
1533 EXC_VIRT_BEGIN(single_step, 0x4d00, 0x100)
1534 INT_HANDLER single_step, 0xd00, virt=1
1535 EXC_VIRT_END(single_step, 0x4d00, 0x100)
1536 INT_KVM_HANDLER single_step, 0xd00, EXC_STD, PACA_EXGEN, 0
1537 EXC_COMMON(single_step_common, 0xd00, single_step_exception)
1538
1539
1540 EXC_REAL_BEGIN(h_data_storage, 0xe00, 0x20)
1541 INT_HANDLER h_data_storage, 0xe00, ool=1, hsrr=EXC_HV, dar=1, dsisr=1, kvm=1
1542 EXC_REAL_END(h_data_storage, 0xe00, 0x20)
1543 EXC_VIRT_BEGIN(h_data_storage, 0x4e00, 0x20)
1544 INT_HANDLER h_data_storage, 0xe00, ool=1, virt=1, hsrr=EXC_HV, dar=1, dsisr=1, kvm=1
1545 EXC_VIRT_END(h_data_storage, 0x4e00, 0x20)
1546 INT_KVM_HANDLER h_data_storage, 0xe00, EXC_HV, PACA_EXGEN, 1
1547 EXC_COMMON_BEGIN(h_data_storage_common)
1548 INT_COMMON 0xe00, PACA_EXGEN, 1, 1, 1, 1, 1
1549 bl save_nvgprs
1550 addi r3,r1,STACK_FRAME_OVERHEAD
1551 BEGIN_MMU_FTR_SECTION
1552 ld r4,_DAR(r1)
1553 li r5,SIGSEGV
1554 bl bad_page_fault
1555 MMU_FTR_SECTION_ELSE
1556 bl unknown_exception
1557 ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_TYPE_RADIX)
1558 b ret_from_except
1559
1560
1561 EXC_REAL_BEGIN(h_instr_storage, 0xe20, 0x20)
1562 INT_HANDLER h_instr_storage, 0xe20, ool=1, hsrr=EXC_HV, kvm=1
1563 EXC_REAL_END(h_instr_storage, 0xe20, 0x20)
1564 EXC_VIRT_BEGIN(h_instr_storage, 0x4e20, 0x20)
1565 INT_HANDLER h_instr_storage, 0xe20, ool=1, virt=1, hsrr=EXC_HV, kvm=1
1566 EXC_VIRT_END(h_instr_storage, 0x4e20, 0x20)
1567 INT_KVM_HANDLER h_instr_storage, 0xe20, EXC_HV, PACA_EXGEN, 0
1568 EXC_COMMON(h_instr_storage_common, 0xe20, unknown_exception)
1569
1570
1571 EXC_REAL_BEGIN(emulation_assist, 0xe40, 0x20)
1572 INT_HANDLER emulation_assist, 0xe40, ool=1, hsrr=EXC_HV, kvm=1
1573 EXC_REAL_END(emulation_assist, 0xe40, 0x20)
1574 EXC_VIRT_BEGIN(emulation_assist, 0x4e40, 0x20)
1575 INT_HANDLER emulation_assist, 0xe40, ool=1, virt=1, hsrr=EXC_HV, kvm=1
1576 EXC_VIRT_END(emulation_assist, 0x4e40, 0x20)
1577 INT_KVM_HANDLER emulation_assist, 0xe40, EXC_HV, PACA_EXGEN, 0
1578 EXC_COMMON(emulation_assist_common, 0xe40, emulation_assist_interrupt)
1579
1580
1581
1582
1583
1584
1585
1586 EXC_REAL_BEGIN(hmi_exception, 0xe60, 0x20)
1587 INT_HANDLER hmi_exception, 0xe60, ool=1, early=1, hsrr=EXC_HV, ri=0, kvm=1
1588 EXC_REAL_END(hmi_exception, 0xe60, 0x20)
1589 EXC_VIRT_NONE(0x4e60, 0x20)
1590 INT_KVM_HANDLER hmi_exception, 0xe60, EXC_HV, PACA_EXGEN, 0
1591 EXC_COMMON_BEGIN(hmi_exception_early_common)
1592 mtctr r10
1593 mfspr r11,SPRN_HSRR0
1594 mfspr r12,SPRN_HSRR1
1595 mr r10,r1
1596 ld r1,PACAEMERGSP(r13)
1597 subi r1,r1,INT_FRAME_SIZE
1598
1599
1600 INT_COMMON 0xe60, PACA_EXGEN, 0, 0, 0, 0, 0
1601
1602 addi r3,r1,STACK_FRAME_OVERHEAD
1603 bl hmi_exception_realmode
1604 cmpdi cr0,r3,0
1605 bne 1f
1606
1607 EXCEPTION_RESTORE_REGS EXC_HV
1608 HRFI_TO_USER_OR_KERNEL
1609
1610 1:
1611
1612
1613
1614
1615 EXCEPTION_RESTORE_REGS EXC_HV
1616 INT_HANDLER hmi_exception, 0xe60, hsrr=EXC_HV, bitmask=IRQS_DISABLED, kvm=1
1617
1618 EXC_COMMON_BEGIN(hmi_exception_common)
1619 INT_COMMON 0xe60, PACA_EXGEN, 1, 1, 1, 0, 0
1620 FINISH_NAP
1621 RUNLATCH_ON
1622 bl save_nvgprs
1623 addi r3,r1,STACK_FRAME_OVERHEAD
1624 bl handle_hmi_exception
1625 b ret_from_except
1626
1627
1628 EXC_REAL_BEGIN(h_doorbell, 0xe80, 0x20)
1629 INT_HANDLER h_doorbell, 0xe80, ool=1, hsrr=EXC_HV, bitmask=IRQS_DISABLED, kvm=1
1630 EXC_REAL_END(h_doorbell, 0xe80, 0x20)
1631 EXC_VIRT_BEGIN(h_doorbell, 0x4e80, 0x20)
1632 INT_HANDLER h_doorbell, 0xe80, ool=1, virt=1, hsrr=EXC_HV, bitmask=IRQS_DISABLED, kvm=1
1633 EXC_VIRT_END(h_doorbell, 0x4e80, 0x20)
1634 INT_KVM_HANDLER h_doorbell, 0xe80, EXC_HV, PACA_EXGEN, 0
1635 #ifdef CONFIG_PPC_DOORBELL
1636 EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, doorbell_exception)
1637 #else
1638 EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, unknown_exception)
1639 #endif
1640
1641
1642 EXC_REAL_BEGIN(h_virt_irq, 0xea0, 0x20)
1643 INT_HANDLER h_virt_irq, 0xea0, ool=1, hsrr=EXC_HV, bitmask=IRQS_DISABLED, kvm=1
1644 EXC_REAL_END(h_virt_irq, 0xea0, 0x20)
1645 EXC_VIRT_BEGIN(h_virt_irq, 0x4ea0, 0x20)
1646 INT_HANDLER h_virt_irq, 0xea0, ool=1, virt=1, hsrr=EXC_HV, bitmask=IRQS_DISABLED, kvm=1
1647 EXC_VIRT_END(h_virt_irq, 0x4ea0, 0x20)
1648 INT_KVM_HANDLER h_virt_irq, 0xea0, EXC_HV, PACA_EXGEN, 0
1649 EXC_COMMON_ASYNC(h_virt_irq_common, 0xea0, do_IRQ)
1650
1651
1652 EXC_REAL_NONE(0xec0, 0x20)
1653 EXC_VIRT_NONE(0x4ec0, 0x20)
1654 EXC_REAL_NONE(0xee0, 0x20)
1655 EXC_VIRT_NONE(0x4ee0, 0x20)
1656
1657
1658 EXC_REAL_BEGIN(performance_monitor, 0xf00, 0x20)
1659 INT_HANDLER performance_monitor, 0xf00, ool=1, bitmask=IRQS_PMI_DISABLED, kvm=1
1660 EXC_REAL_END(performance_monitor, 0xf00, 0x20)
1661 EXC_VIRT_BEGIN(performance_monitor, 0x4f00, 0x20)
1662 INT_HANDLER performance_monitor, 0xf00, ool=1, virt=1, bitmask=IRQS_PMI_DISABLED
1663 EXC_VIRT_END(performance_monitor, 0x4f00, 0x20)
1664 INT_KVM_HANDLER performance_monitor, 0xf00, EXC_STD, PACA_EXGEN, 0
1665 EXC_COMMON_ASYNC(performance_monitor_common, 0xf00, performance_monitor_exception)
1666
1667
1668 EXC_REAL_BEGIN(altivec_unavailable, 0xf20, 0x20)
1669 INT_HANDLER altivec_unavailable, 0xf20, ool=1, kvm=1
1670 EXC_REAL_END(altivec_unavailable, 0xf20, 0x20)
1671 EXC_VIRT_BEGIN(altivec_unavailable, 0x4f20, 0x20)
1672 INT_HANDLER altivec_unavailable, 0xf20, ool=1, virt=1
1673 EXC_VIRT_END(altivec_unavailable, 0x4f20, 0x20)
1674 INT_KVM_HANDLER altivec_unavailable, 0xf20, EXC_STD, PACA_EXGEN, 0
1675 EXC_COMMON_BEGIN(altivec_unavailable_common)
1676 INT_COMMON 0xf20, PACA_EXGEN, 1, 1, 0, 0, 0
1677 #ifdef CONFIG_ALTIVEC
1678 BEGIN_FTR_SECTION
1679 beq 1f
1680 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1681 BEGIN_FTR_SECTION_NESTED(69)
1682
1683
1684
1685 rldicl. r0, r12, (64-MSR_TS_LG), (64-2)
1686 bne- 2f
1687 END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69)
1688 #endif
1689 bl load_up_altivec
1690 b fast_exception_return
1691 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1692 2:
1693 bl save_nvgprs
1694 RECONCILE_IRQ_STATE(r10, r11)
1695 addi r3,r1,STACK_FRAME_OVERHEAD
1696 bl altivec_unavailable_tm
1697 b ret_from_except
1698 #endif
1699 1:
1700 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
1701 #endif
1702 bl save_nvgprs
1703 RECONCILE_IRQ_STATE(r10, r11)
1704 addi r3,r1,STACK_FRAME_OVERHEAD
1705 bl altivec_unavailable_exception
1706 b ret_from_except
1707
1708
1709 EXC_REAL_BEGIN(vsx_unavailable, 0xf40, 0x20)
1710 INT_HANDLER vsx_unavailable, 0xf40, ool=1, kvm=1
1711 EXC_REAL_END(vsx_unavailable, 0xf40, 0x20)
1712 EXC_VIRT_BEGIN(vsx_unavailable, 0x4f40, 0x20)
1713 INT_HANDLER vsx_unavailable, 0xf40, ool=1, virt=1
1714 EXC_VIRT_END(vsx_unavailable, 0x4f40, 0x20)
1715 INT_KVM_HANDLER vsx_unavailable, 0xf40, EXC_STD, PACA_EXGEN, 0
1716 EXC_COMMON_BEGIN(vsx_unavailable_common)
1717 INT_COMMON 0xf40, PACA_EXGEN, 1, 1, 0, 0, 0
1718 #ifdef CONFIG_VSX
1719 BEGIN_FTR_SECTION
1720 beq 1f
1721 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1722 BEGIN_FTR_SECTION_NESTED(69)
1723
1724
1725
1726 rldicl. r0, r12, (64-MSR_TS_LG), (64-2)
1727 bne- 2f
1728 END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69)
1729 #endif
1730 b load_up_vsx
1731 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1732 2:
1733 bl save_nvgprs
1734 RECONCILE_IRQ_STATE(r10, r11)
1735 addi r3,r1,STACK_FRAME_OVERHEAD
1736 bl vsx_unavailable_tm
1737 b ret_from_except
1738 #endif
1739 1:
1740 END_FTR_SECTION_IFSET(CPU_FTR_VSX)
1741 #endif
1742 bl save_nvgprs
1743 RECONCILE_IRQ_STATE(r10, r11)
1744 addi r3,r1,STACK_FRAME_OVERHEAD
1745 bl vsx_unavailable_exception
1746 b ret_from_except
1747
1748
1749 EXC_REAL_BEGIN(facility_unavailable, 0xf60, 0x20)
1750 INT_HANDLER facility_unavailable, 0xf60, ool=1, kvm=1
1751 EXC_REAL_END(facility_unavailable, 0xf60, 0x20)
1752 EXC_VIRT_BEGIN(facility_unavailable, 0x4f60, 0x20)
1753 INT_HANDLER facility_unavailable, 0xf60, ool=1, virt=1
1754 EXC_VIRT_END(facility_unavailable, 0x4f60, 0x20)
1755 INT_KVM_HANDLER facility_unavailable, 0xf60, EXC_STD, PACA_EXGEN, 0
1756 EXC_COMMON(facility_unavailable_common, 0xf60, facility_unavailable_exception)
1757
1758
1759 EXC_REAL_BEGIN(h_facility_unavailable, 0xf80, 0x20)
1760 INT_HANDLER h_facility_unavailable, 0xf80, ool=1, hsrr=EXC_HV, kvm=1
1761 EXC_REAL_END(h_facility_unavailable, 0xf80, 0x20)
1762 EXC_VIRT_BEGIN(h_facility_unavailable, 0x4f80, 0x20)
1763 INT_HANDLER h_facility_unavailable, 0xf80, ool=1, virt=1, hsrr=EXC_HV, kvm=1
1764 EXC_VIRT_END(h_facility_unavailable, 0x4f80, 0x20)
1765 INT_KVM_HANDLER h_facility_unavailable, 0xf80, EXC_HV, PACA_EXGEN, 0
1766 EXC_COMMON(h_facility_unavailable_common, 0xf80, facility_unavailable_exception)
1767
1768
1769 EXC_REAL_NONE(0xfa0, 0x20)
1770 EXC_VIRT_NONE(0x4fa0, 0x20)
1771 EXC_REAL_NONE(0xfc0, 0x20)
1772 EXC_VIRT_NONE(0x4fc0, 0x20)
1773 EXC_REAL_NONE(0xfe0, 0x20)
1774 EXC_VIRT_NONE(0x4fe0, 0x20)
1775
1776 EXC_REAL_NONE(0x1000, 0x100)
1777 EXC_VIRT_NONE(0x5000, 0x100)
1778 EXC_REAL_NONE(0x1100, 0x100)
1779 EXC_VIRT_NONE(0x5100, 0x100)
1780
1781 #ifdef CONFIG_CBE_RAS
1782 EXC_REAL_BEGIN(cbe_system_error, 0x1200, 0x100)
1783 INT_HANDLER cbe_system_error, 0x1200, ool=1, hsrr=EXC_HV, kvm=1
1784 EXC_REAL_END(cbe_system_error, 0x1200, 0x100)
1785 EXC_VIRT_NONE(0x5200, 0x100)
1786 INT_KVM_HANDLER cbe_system_error, 0x1200, EXC_HV, PACA_EXGEN, 1
1787 EXC_COMMON(cbe_system_error_common, 0x1200, cbe_system_error_exception)
1788 #else
1789 EXC_REAL_NONE(0x1200, 0x100)
1790 EXC_VIRT_NONE(0x5200, 0x100)
1791 #endif
1792
1793
1794 EXC_REAL_BEGIN(instruction_breakpoint, 0x1300, 0x100)
1795 INT_HANDLER instruction_breakpoint, 0x1300, kvm=1
1796 EXC_REAL_END(instruction_breakpoint, 0x1300, 0x100)
1797 EXC_VIRT_BEGIN(instruction_breakpoint, 0x5300, 0x100)
1798 INT_HANDLER instruction_breakpoint, 0x1300, virt=1
1799 EXC_VIRT_END(instruction_breakpoint, 0x5300, 0x100)
1800 INT_KVM_HANDLER instruction_breakpoint, 0x1300, EXC_STD, PACA_EXGEN, 1
1801 EXC_COMMON(instruction_breakpoint_common, 0x1300, instruction_breakpoint_exception)
1802
1803
1804 EXC_REAL_NONE(0x1400, 0x100)
1805 EXC_VIRT_NONE(0x5400, 0x100)
1806
1807 EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100)
1808 INT_HANDLER denorm_exception_hv, 0x1500, early=2, hsrr=EXC_HV
1809 #ifdef CONFIG_PPC_DENORMALISATION
1810 mfspr r10,SPRN_HSRR1
1811 andis. r10,r10,(HSRR1_DENORM)@h
1812 bne+ denorm_assist
1813 #endif
1814 KVMTEST denorm_exception_hv, EXC_HV 0x1500
1815 INT_SAVE_SRR_AND_JUMP denorm_common, EXC_HV, 1
1816 EXC_REAL_END(denorm_exception_hv, 0x1500, 0x100)
1817
1818 #ifdef CONFIG_PPC_DENORMALISATION
1819 EXC_VIRT_BEGIN(denorm_exception, 0x5500, 0x100)
1820 INT_HANDLER denorm_exception, 0x1500, 0, 2, 1, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 0
1821 mfspr r10,SPRN_HSRR1
1822 andis. r10,r10,(HSRR1_DENORM)@h
1823 bne+ denorm_assist
1824 INT_VIRT_SAVE_SRR_AND_JUMP denorm_common, EXC_HV
1825 EXC_VIRT_END(denorm_exception, 0x5500, 0x100)
1826 #else
1827 EXC_VIRT_NONE(0x5500, 0x100)
1828 #endif
1829
1830 INT_KVM_HANDLER denorm_exception_hv, 0x1500, EXC_HV, PACA_EXGEN, 0
1831
1832 #ifdef CONFIG_PPC_DENORMALISATION
1833 TRAMP_REAL_BEGIN(denorm_assist)
1834 BEGIN_FTR_SECTION
1835
1836
1837
1838
1839 mfmsr r10
1840 ori r10,r10,(MSR_FP|MSR_FE0|MSR_FE1)
1841 xori r10,r10,(MSR_FE0|MSR_FE1)
1842 mtmsrd r10
1843 sync
1844
1845 .Lreg=0
1846 .rept 32
1847 fmr .Lreg,.Lreg
1848 .Lreg=.Lreg+1
1849 .endr
1850
1851 FTR_SECTION_ELSE
1852
1853
1854
1855
1856 mfmsr r10
1857 oris r10,r10,MSR_VSX@h
1858 mtmsrd r10
1859 sync
1860
1861 .Lreg=0
1862 .rept 32
1863 XVCPSGNDP(.Lreg,.Lreg,.Lreg)
1864 .Lreg=.Lreg+1
1865 .endr
1866
1867 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
1868
1869 BEGIN_FTR_SECTION
1870 b denorm_done
1871 END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
1872
1873
1874
1875
1876 .Lreg=32
1877 .rept 32
1878 XVCPSGNDP(.Lreg,.Lreg,.Lreg)
1879 .Lreg=.Lreg+1
1880 .endr
1881
1882 denorm_done:
1883 mfspr r11,SPRN_HSRR0
1884 subi r11,r11,4
1885 mtspr SPRN_HSRR0,r11
1886 mtcrf 0x80,r9
1887 ld r9,PACA_EXGEN+EX_R9(r13)
1888 RESTORE_PPR_PACA(PACA_EXGEN, r10)
1889 BEGIN_FTR_SECTION
1890 ld r10,PACA_EXGEN+EX_CFAR(r13)
1891 mtspr SPRN_CFAR,r10
1892 END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
1893 ld r10,PACA_EXGEN+EX_R10(r13)
1894 ld r11,PACA_EXGEN+EX_R11(r13)
1895 ld r12,PACA_EXGEN+EX_R12(r13)
1896 ld r13,PACA_EXGEN+EX_R13(r13)
1897 HRFI_TO_UNKNOWN
1898 b .
1899 #endif
1900
1901 EXC_COMMON(denorm_common, 0x1500, unknown_exception)
1902
1903
1904 #ifdef CONFIG_CBE_RAS
1905 EXC_REAL_BEGIN(cbe_maintenance, 0x1600, 0x100)
1906 INT_HANDLER cbe_maintenance, 0x1600, ool=1, hsrr=EXC_HV, kvm=1
1907 EXC_REAL_END(cbe_maintenance, 0x1600, 0x100)
1908 EXC_VIRT_NONE(0x5600, 0x100)
1909 INT_KVM_HANDLER cbe_maintenance, 0x1600, EXC_HV, PACA_EXGEN, 1
1910 EXC_COMMON(cbe_maintenance_common, 0x1600, cbe_maintenance_exception)
1911 #else
1912 EXC_REAL_NONE(0x1600, 0x100)
1913 EXC_VIRT_NONE(0x5600, 0x100)
1914 #endif
1915
1916
1917 EXC_REAL_BEGIN(altivec_assist, 0x1700, 0x100)
1918 INT_HANDLER altivec_assist, 0x1700, kvm=1
1919 EXC_REAL_END(altivec_assist, 0x1700, 0x100)
1920 EXC_VIRT_BEGIN(altivec_assist, 0x5700, 0x100)
1921 INT_HANDLER altivec_assist, 0x1700, virt=1
1922 EXC_VIRT_END(altivec_assist, 0x5700, 0x100)
1923 INT_KVM_HANDLER altivec_assist, 0x1700, EXC_STD, PACA_EXGEN, 0
1924 #ifdef CONFIG_ALTIVEC
1925 EXC_COMMON(altivec_assist_common, 0x1700, altivec_assist_exception)
1926 #else
1927 EXC_COMMON(altivec_assist_common, 0x1700, unknown_exception)
1928 #endif
1929
1930
1931 #ifdef CONFIG_CBE_RAS
1932 EXC_REAL_BEGIN(cbe_thermal, 0x1800, 0x100)
1933 INT_HANDLER cbe_thermal, 0x1800, ool=1, hsrr=EXC_HV, kvm=1
1934 EXC_REAL_END(cbe_thermal, 0x1800, 0x100)
1935 EXC_VIRT_NONE(0x5800, 0x100)
1936 INT_KVM_HANDLER cbe_thermal, 0x1800, EXC_HV, PACA_EXGEN, 1
1937 EXC_COMMON(cbe_thermal_common, 0x1800, cbe_thermal_exception)
1938 #else
1939 EXC_REAL_NONE(0x1800, 0x100)
1940 EXC_VIRT_NONE(0x5800, 0x100)
1941 #endif
1942
1943
1944 #ifdef CONFIG_PPC_WATCHDOG
1945
1946 #define MASKED_DEC_HANDLER_LABEL 3f
1947
1948 #define MASKED_DEC_HANDLER(_H) \
1949 3: \
1950 std r12,PACA_EXGEN+EX_R12(r13); \
1951 GET_SCRATCH0(r10); \
1952 std r10,PACA_EXGEN+EX_R13(r13); \
1953 INT_SAVE_SRR_AND_JUMP soft_nmi_common, _H, 1
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964 EXC_COMMON_BEGIN(soft_nmi_common)
1965 mr r10,r1
1966 ld r1,PACAEMERGSP(r13)
1967 subi r1,r1,INT_FRAME_SIZE
1968 INT_COMMON 0x900, PACA_EXGEN, 0, 1, 1, 0, 0
1969 bl save_nvgprs
1970 addi r3,r1,STACK_FRAME_OVERHEAD
1971 bl soft_nmi_interrupt
1972 b ret_from_except
1973
1974 #else
1975 #define MASKED_DEC_HANDLER_LABEL 2f
1976 #define MASKED_DEC_HANDLER(_H)
1977 #endif
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989 .macro MASKED_INTERRUPT hsrr
1990 .if \hsrr
1991 masked_Hinterrupt:
1992 .else
1993 masked_interrupt:
1994 .endif
1995 std r11,PACA_EXGEN+EX_R11(r13)
1996 lbz r11,PACAIRQHAPPENED(r13)
1997 or r11,r11,r10
1998 stb r11,PACAIRQHAPPENED(r13)
1999 cmpwi r10,PACA_IRQ_DEC
2000 bne 1f
2001 lis r10,0x7fff
2002 ori r10,r10,0xffff
2003 mtspr SPRN_DEC,r10
2004 b MASKED_DEC_HANDLER_LABEL
2005 1: andi. r10,r10,PACA_IRQ_MUST_HARD_MASK
2006 beq 2f
2007 .if \hsrr
2008 mfspr r10,SPRN_HSRR1
2009 xori r10,r10,MSR_EE
2010 mtspr SPRN_HSRR1,r10
2011 .else
2012 mfspr r10,SPRN_SRR1
2013 xori r10,r10,MSR_EE
2014 mtspr SPRN_SRR1,r10
2015 .endif
2016 ori r11,r11,PACA_IRQ_HARD_DIS
2017 stb r11,PACAIRQHAPPENED(r13)
2018 2:
2019 mtcrf 0x80,r9
2020 std r1,PACAR1(r13)
2021 ld r9,PACA_EXGEN+EX_R9(r13)
2022 ld r10,PACA_EXGEN+EX_R10(r13)
2023 ld r11,PACA_EXGEN+EX_R11(r13)
2024
2025 .if \hsrr
2026 HRFI_TO_KERNEL
2027 .else
2028 RFI_TO_KERNEL
2029 .endif
2030 b .
2031 MASKED_DEC_HANDLER(\hsrr\())
2032 .endm
2033
2034 TRAMP_REAL_BEGIN(stf_barrier_fallback)
2035 std r9,PACA_EXRFI+EX_R9(r13)
2036 std r10,PACA_EXRFI+EX_R10(r13)
2037 sync
2038 ld r9,PACA_EXRFI+EX_R9(r13)
2039 ld r10,PACA_EXRFI+EX_R10(r13)
2040 ori 31,31,0
2041 .rept 14
2042 b 1f
2043 1:
2044 .endr
2045 blr
2046
2047 TRAMP_REAL_BEGIN(rfi_flush_fallback)
2048 SET_SCRATCH0(r13);
2049 GET_PACA(r13);
2050 std r1,PACA_EXRFI+EX_R12(r13)
2051 ld r1,PACAKSAVE(r13)
2052 std r9,PACA_EXRFI+EX_R9(r13)
2053 std r10,PACA_EXRFI+EX_R10(r13)
2054 std r11,PACA_EXRFI+EX_R11(r13)
2055 mfctr r9
2056 ld r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
2057 ld r11,PACA_L1D_FLUSH_SIZE(r13)
2058 srdi r11,r11,(7 + 3)
2059 mtctr r11
2060 DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11)
2061
2062
2063 sync
2064
2065
2066
2067
2068
2069
2070 1:
2071 ld r11,(0x80 + 8)*0(r10)
2072 ld r11,(0x80 + 8)*1(r10)
2073 ld r11,(0x80 + 8)*2(r10)
2074 ld r11,(0x80 + 8)*3(r10)
2075 ld r11,(0x80 + 8)*4(r10)
2076 ld r11,(0x80 + 8)*5(r10)
2077 ld r11,(0x80 + 8)*6(r10)
2078 ld r11,(0x80 + 8)*7(r10)
2079 addi r10,r10,0x80*8
2080 bdnz 1b
2081
2082 mtctr r9
2083 ld r9,PACA_EXRFI+EX_R9(r13)
2084 ld r10,PACA_EXRFI+EX_R10(r13)
2085 ld r11,PACA_EXRFI+EX_R11(r13)
2086 ld r1,PACA_EXRFI+EX_R12(r13)
2087 GET_SCRATCH0(r13);
2088 rfid
2089
2090 TRAMP_REAL_BEGIN(hrfi_flush_fallback)
2091 SET_SCRATCH0(r13);
2092 GET_PACA(r13);
2093 std r1,PACA_EXRFI+EX_R12(r13)
2094 ld r1,PACAKSAVE(r13)
2095 std r9,PACA_EXRFI+EX_R9(r13)
2096 std r10,PACA_EXRFI+EX_R10(r13)
2097 std r11,PACA_EXRFI+EX_R11(r13)
2098 mfctr r9
2099 ld r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
2100 ld r11,PACA_L1D_FLUSH_SIZE(r13)
2101 srdi r11,r11,(7 + 3)
2102 mtctr r11
2103 DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11)
2104
2105
2106 sync
2107
2108
2109
2110
2111
2112
2113 1:
2114 ld r11,(0x80 + 8)*0(r10)
2115 ld r11,(0x80 + 8)*1(r10)
2116 ld r11,(0x80 + 8)*2(r10)
2117 ld r11,(0x80 + 8)*3(r10)
2118 ld r11,(0x80 + 8)*4(r10)
2119 ld r11,(0x80 + 8)*5(r10)
2120 ld r11,(0x80 + 8)*6(r10)
2121 ld r11,(0x80 + 8)*7(r10)
2122 addi r10,r10,0x80*8
2123 bdnz 1b
2124
2125 mtctr r9
2126 ld r9,PACA_EXRFI+EX_R9(r13)
2127 ld r10,PACA_EXRFI+EX_R10(r13)
2128 ld r11,PACA_EXRFI+EX_R11(r13)
2129 ld r1,PACA_EXRFI+EX_R12(r13)
2130 GET_SCRATCH0(r13);
2131 hrfid
2132
2133
2134
2135
2136
2137
2138 USE_FIXED_SECTION(virt_trampolines)
2139 MASKED_INTERRUPT EXC_STD
2140 MASKED_INTERRUPT EXC_HV
2141
2142 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
2143 TRAMP_REAL_BEGIN(kvmppc_skip_interrupt)
2144
2145
2146
2147
2148 mfspr r13, SPRN_SRR0
2149 addi r13, r13, 4
2150 mtspr SPRN_SRR0, r13
2151 GET_SCRATCH0(r13)
2152 RFI_TO_KERNEL
2153 b .
2154
2155 TRAMP_REAL_BEGIN(kvmppc_skip_Hinterrupt)
2156
2157
2158
2159
2160 mfspr r13, SPRN_HSRR0
2161 addi r13, r13, 4
2162 mtspr SPRN_HSRR0, r13
2163 GET_SCRATCH0(r13)
2164 HRFI_TO_KERNEL
2165 b .
2166 #endif
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194 EXC_COMMON_BEGIN(ppc64_runlatch_on_trampoline)
2195 b __ppc64_runlatch_on
2196
2197 USE_FIXED_SECTION(virt_trampolines)
2198
2199
2200
2201
2202
2203
2204
2205 .align 7
2206 .globl __end_interrupts
2207 __end_interrupts:
2208 DEFINE_FIXED_SYMBOL(__end_interrupts)
2209
2210 #ifdef CONFIG_PPC_970_NAP
2211 EXC_COMMON_BEGIN(power4_fixup_nap)
2212 andc r9,r9,r10
2213 std r9,TI_LOCAL_FLAGS(r11)
2214 ld r10,_LINK(r1)
2215 std r10,_NIP(r1)
2216 blr
2217 #endif
2218
2219 CLOSE_FIXED_SECTION(real_vectors);
2220 CLOSE_FIXED_SECTION(real_trampolines);
2221 CLOSE_FIXED_SECTION(virt_vectors);
2222 CLOSE_FIXED_SECTION(virt_trampolines);
2223
2224 USE_TEXT_SECTION()
2225
2226
2227 enable_machine_check:
2228 mflr r0
2229 bcl 20,31,$+4
2230 0: mflr r3
2231 addi r3,r3,(1f - 0b)
2232 mtspr SPRN_SRR0,r3
2233 mfmsr r3
2234 ori r3,r3,MSR_ME
2235 mtspr SPRN_SRR1,r3
2236 RFI_TO_KERNEL
2237 1: mtlr r0
2238 blr
2239
2240
2241 disable_machine_check:
2242 mflr r0
2243 bcl 20,31,$+4
2244 0: mflr r3
2245 addi r3,r3,(1f - 0b)
2246 mtspr SPRN_SRR0,r3
2247 mfmsr r3
2248 li r4,MSR_ME
2249 andc r3,r3,r4
2250 mtspr SPRN_SRR1,r3
2251 RFI_TO_KERNEL
2252 1: mtlr r0
2253 blr
2254
2255
2256
2257
2258 .balign IFETCH_ALIGN_BYTES
2259 do_hash_page:
2260 #ifdef CONFIG_PPC_BOOK3S_64
2261 lis r0,(DSISR_BAD_FAULT_64S | DSISR_DABRMATCH | DSISR_KEYFAULT)@h
2262 ori r0,r0,DSISR_BAD_FAULT_64S@l
2263 and. r0,r5,r0
2264 bne- handle_page_fault
2265 ld r11, PACA_THREAD_INFO(r13)
2266 lwz r0,TI_PREEMPT(r11)
2267 andis. r0,r0,NMI_MASK@h
2268 bne 77f
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278 bl __hash_page
2279 cmpdi r3,0
2280
2281
2282 beq fast_exc_return_irq
2283
2284
2285 blt- 13f
2286
2287
2288 ld r4,_DAR(r1)
2289 ld r5,_DSISR(r1)
2290 #endif
2291
2292
2293 handle_page_fault:
2294 11: andis. r0,r5,DSISR_DABRMATCH@h
2295 bne- handle_dabr_fault
2296 addi r3,r1,STACK_FRAME_OVERHEAD
2297 bl do_page_fault
2298 cmpdi r3,0
2299 beq+ ret_from_except_lite
2300 bl save_nvgprs
2301 mr r5,r3
2302 addi r3,r1,STACK_FRAME_OVERHEAD
2303 ld r4,_DAR(r1)
2304 bl bad_page_fault
2305 b ret_from_except
2306
2307
2308 handle_dabr_fault:
2309 bl save_nvgprs
2310 ld r4,_DAR(r1)
2311 ld r5,_DSISR(r1)
2312 addi r3,r1,STACK_FRAME_OVERHEAD
2313 bl do_break
2314
2315
2316
2317
2318
2319 b ret_from_except
2320
2321
2322 #ifdef CONFIG_PPC_BOOK3S_64
2323
2324
2325
2326 13: bl save_nvgprs
2327 mr r5,r3
2328 addi r3,r1,STACK_FRAME_OVERHEAD
2329 ld r4,_DAR(r1)
2330 bl low_hash_fault
2331 b ret_from_except
2332 #endif
2333
2334
2335
2336
2337
2338
2339
2340
2341 77: bl save_nvgprs
2342 addi r3,r1,STACK_FRAME_OVERHEAD
2343 li r5,SIGSEGV
2344 bl bad_page_fault
2345 b ret_from_except
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356 h_doorbell_common_msgclr:
2357 LOAD_REG_IMMEDIATE(r3, PPC_DBELL_MSGTYPE << (63-36))
2358 PPC_MSGCLR(3)
2359 b h_doorbell_common
2360
2361 doorbell_super_common_msgclr:
2362 LOAD_REG_IMMEDIATE(r3, PPC_DBELL_MSGTYPE << (63-36))
2363 PPC_MSGCLRP(3)
2364 b doorbell_super_common
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380 _GLOBAL(__replay_interrupt)
2381
2382
2383
2384
2385 mfmsr r12
2386 LOAD_REG_ADDR(r11, replay_interrupt_return)
2387 mfcr r9
2388 ori r12,r12,MSR_EE
2389 cmpwi r3,0x900
2390 beq decrementer_common
2391 cmpwi r3,0x500
2392 BEGIN_FTR_SECTION
2393 beq h_virt_irq_common
2394 FTR_SECTION_ELSE
2395 beq hardware_interrupt_common
2396 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_300)
2397 cmpwi r3,0xf00
2398 beq performance_monitor_common
2399 BEGIN_FTR_SECTION
2400 cmpwi r3,0xa00
2401 beq h_doorbell_common_msgclr
2402 cmpwi r3,0xe60
2403 beq hmi_exception_common
2404 FTR_SECTION_ELSE
2405 cmpwi r3,0xa00
2406 beq doorbell_super_common_msgclr
2407 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
2408 replay_interrupt_return:
2409 blr
2410
2411 _ASM_NOKPROBE_SYMBOL(__replay_interrupt)