aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/kernel/exceptions-64e.S63
1 files changed, 33 insertions, 30 deletions
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 0204c39f438e..2beb5bd0728b 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -148,10 +148,8 @@
148 std r15,PACA_EXMC+EX_R15(r13) 148 std r15,PACA_EXMC+EX_R15(r13)
149 149
150 150
151/* Core exception code for all exceptions except TLB misses. 151/* Core exception code for all exceptions except TLB misses. */
152 * XXX: Needs to make SPRN_SPRG_GEN depend on exception type 152#define EXCEPTION_COMMON_LVL(n, scratch, excf) \
153 */
154#define EXCEPTION_COMMON(n, excf) \
155exc_##n##_common: \ 153exc_##n##_common: \
156 std r0,GPR0(r1); /* save r0 in stackframe */ \ 154 std r0,GPR0(r1); /* save r0 in stackframe */ \
157 std r2,GPR2(r1); /* save r2 in stackframe */ \ 155 std r2,GPR2(r1); /* save r2 in stackframe */ \
@@ -164,7 +162,7 @@ exc_##n##_common: \
164 ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \ 162 ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \
1652: ld r3,excf+EX_R10(r13); /* get back r10 */ \ 1632: ld r3,excf+EX_R10(r13); /* get back r10 */ \
166 ld r4,excf+EX_R11(r13); /* get back r11 */ \ 164 ld r4,excf+EX_R11(r13); /* get back r11 */ \
167 mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 */ \ 165 mfspr r5,scratch; /* get back r13 */ \
168 std r12,GPR12(r1); /* save r12 in stackframe */ \ 166 std r12,GPR12(r1); /* save r12 in stackframe */ \
169 ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ 167 ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \
170 mflr r6; /* save LR in stackframe */ \ 168 mflr r6; /* save LR in stackframe */ \
@@ -190,6 +188,15 @@ exc_##n##_common: \
190 std r3,_TRAP(r1); /* set trap number */ \ 188 std r3,_TRAP(r1); /* set trap number */ \
191 std r0,RESULT(r1); /* clear regs->result */ 189 std r0,RESULT(r1); /* clear regs->result */
192 190
191#define EXCEPTION_COMMON(n) \
192 EXCEPTION_COMMON_LVL(n, SPRN_SPRG_GEN_SCRATCH, PACA_EXGEN)
193#define EXCEPTION_COMMON_CRIT(n) \
194 EXCEPTION_COMMON_LVL(n, SPRN_SPRG_CRIT_SCRATCH, PACA_EXCRIT)
195#define EXCEPTION_COMMON_MC(n) \
196 EXCEPTION_COMMON_LVL(n, SPRN_SPRG_MC_SCRATCH, PACA_EXMC)
197#define EXCEPTION_COMMON_DBG(n) \
198 EXCEPTION_COMMON_LVL(n, SPRN_SPRG_DBG_SCRATCH, PACA_EXDBG)
199
193/* 200/*
194 * This is meant for exceptions that don't immediately hard-enable. We 201 * This is meant for exceptions that don't immediately hard-enable. We
195 * set a bit in paca->irq_happened to ensure that a subsequent call to 202 * set a bit in paca->irq_happened to ensure that a subsequent call to
@@ -259,7 +266,7 @@ exc_##n##_bad_stack: \
259#define MASKABLE_EXCEPTION(trapnum, intnum, label, hdlr, ack) \ 266#define MASKABLE_EXCEPTION(trapnum, intnum, label, hdlr, ack) \
260 START_EXCEPTION(label); \ 267 START_EXCEPTION(label); \
261 NORMAL_EXCEPTION_PROLOG(trapnum, intnum, PROLOG_ADDITION_MASKABLE)\ 268 NORMAL_EXCEPTION_PROLOG(trapnum, intnum, PROLOG_ADDITION_MASKABLE)\
262 EXCEPTION_COMMON(trapnum, PACA_EXGEN) \ 269 EXCEPTION_COMMON(trapnum) \
263 INTS_DISABLE; \ 270 INTS_DISABLE; \
264 ack(r8); \ 271 ack(r8); \
265 CHECK_NAPPING(); \ 272 CHECK_NAPPING(); \
@@ -315,7 +322,7 @@ interrupt_end_book3e:
315 START_EXCEPTION(critical_input); 322 START_EXCEPTION(critical_input);
316 CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL, 323 CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL,
317 PROLOG_ADDITION_NONE) 324 PROLOG_ADDITION_NONE)
318// EXCEPTION_COMMON(0x100, PACA_EXCRIT) 325// EXCEPTION_COMMON_CRIT(0x100)
319// INTS_DISABLE 326// INTS_DISABLE
320// bl special_reg_save_crit 327// bl special_reg_save_crit
321// CHECK_NAPPING(); 328// CHECK_NAPPING();
@@ -328,7 +335,7 @@ interrupt_end_book3e:
328 START_EXCEPTION(machine_check); 335 START_EXCEPTION(machine_check);
329 MC_EXCEPTION_PROLOG(0x000, BOOKE_INTERRUPT_MACHINE_CHECK, 336 MC_EXCEPTION_PROLOG(0x000, BOOKE_INTERRUPT_MACHINE_CHECK,
330 PROLOG_ADDITION_NONE) 337 PROLOG_ADDITION_NONE)
331// EXCEPTION_COMMON(0x000, PACA_EXMC) 338// EXCEPTION_COMMON_MC(0x000)
332// INTS_DISABLE 339// INTS_DISABLE
333// bl special_reg_save_mc 340// bl special_reg_save_mc
334// addi r3,r1,STACK_FRAME_OVERHEAD 341// addi r3,r1,STACK_FRAME_OVERHEAD
@@ -343,7 +350,7 @@ interrupt_end_book3e:
343 PROLOG_ADDITION_2REGS) 350 PROLOG_ADDITION_2REGS)
344 mfspr r14,SPRN_DEAR 351 mfspr r14,SPRN_DEAR
345 mfspr r15,SPRN_ESR 352 mfspr r15,SPRN_ESR
346 EXCEPTION_COMMON(0x300, PACA_EXGEN) 353 EXCEPTION_COMMON(0x300)
347 INTS_DISABLE 354 INTS_DISABLE
348 b storage_fault_common 355 b storage_fault_common
349 356
@@ -353,7 +360,7 @@ interrupt_end_book3e:
353 PROLOG_ADDITION_2REGS) 360 PROLOG_ADDITION_2REGS)
354 li r15,0 361 li r15,0
355 mr r14,r10 362 mr r14,r10
356 EXCEPTION_COMMON(0x400, PACA_EXGEN) 363 EXCEPTION_COMMON(0x400)
357 INTS_DISABLE 364 INTS_DISABLE
358 b storage_fault_common 365 b storage_fault_common
359 366
@@ -367,7 +374,7 @@ interrupt_end_book3e:
367 PROLOG_ADDITION_2REGS) 374 PROLOG_ADDITION_2REGS)
368 mfspr r14,SPRN_DEAR 375 mfspr r14,SPRN_DEAR
369 mfspr r15,SPRN_ESR 376 mfspr r15,SPRN_ESR
370 EXCEPTION_COMMON(0x600, PACA_EXGEN) 377 EXCEPTION_COMMON(0x600)
371 b alignment_more /* no room, go out of line */ 378 b alignment_more /* no room, go out of line */
372 379
373/* Program Interrupt */ 380/* Program Interrupt */
@@ -375,7 +382,7 @@ interrupt_end_book3e:
375 NORMAL_EXCEPTION_PROLOG(0x700, BOOKE_INTERRUPT_PROGRAM, 382 NORMAL_EXCEPTION_PROLOG(0x700, BOOKE_INTERRUPT_PROGRAM,
376 PROLOG_ADDITION_1REG) 383 PROLOG_ADDITION_1REG)
377 mfspr r14,SPRN_ESR 384 mfspr r14,SPRN_ESR
378 EXCEPTION_COMMON(0x700, PACA_EXGEN) 385 EXCEPTION_COMMON(0x700)
379 INTS_DISABLE 386 INTS_DISABLE
380 std r14,_DSISR(r1) 387 std r14,_DSISR(r1)
381 addi r3,r1,STACK_FRAME_OVERHEAD 388 addi r3,r1,STACK_FRAME_OVERHEAD
@@ -389,7 +396,7 @@ interrupt_end_book3e:
389 NORMAL_EXCEPTION_PROLOG(0x800, BOOKE_INTERRUPT_FP_UNAVAIL, 396 NORMAL_EXCEPTION_PROLOG(0x800, BOOKE_INTERRUPT_FP_UNAVAIL,
390 PROLOG_ADDITION_NONE) 397 PROLOG_ADDITION_NONE)
391 /* we can probably do a shorter exception entry for that one... */ 398 /* we can probably do a shorter exception entry for that one... */
392 EXCEPTION_COMMON(0x800, PACA_EXGEN) 399 EXCEPTION_COMMON(0x800)
393 ld r12,_MSR(r1) 400 ld r12,_MSR(r1)
394 andi. r0,r12,MSR_PR; 401 andi. r0,r12,MSR_PR;
395 beq- 1f 402 beq- 1f
@@ -406,7 +413,7 @@ interrupt_end_book3e:
406 NORMAL_EXCEPTION_PROLOG(0x200, BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL, 413 NORMAL_EXCEPTION_PROLOG(0x200, BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL,
407 PROLOG_ADDITION_NONE) 414 PROLOG_ADDITION_NONE)
408 /* we can probably do a shorter exception entry for that one... */ 415 /* we can probably do a shorter exception entry for that one... */
409 EXCEPTION_COMMON(0x200, PACA_EXGEN) 416 EXCEPTION_COMMON(0x200)
410#ifdef CONFIG_ALTIVEC 417#ifdef CONFIG_ALTIVEC
411BEGIN_FTR_SECTION 418BEGIN_FTR_SECTION
412 ld r12,_MSR(r1) 419 ld r12,_MSR(r1)
@@ -428,7 +435,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
428 NORMAL_EXCEPTION_PROLOG(0x220, 435 NORMAL_EXCEPTION_PROLOG(0x220,
429 BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST, 436 BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST,
430 PROLOG_ADDITION_NONE) 437 PROLOG_ADDITION_NONE)
431 EXCEPTION_COMMON(0x220, PACA_EXGEN) 438 EXCEPTION_COMMON(0x220)
432 INTS_DISABLE 439 INTS_DISABLE
433 bl .save_nvgprs 440 bl .save_nvgprs
434 addi r3,r1,STACK_FRAME_OVERHEAD 441 addi r3,r1,STACK_FRAME_OVERHEAD
@@ -454,7 +461,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
454 START_EXCEPTION(watchdog); 461 START_EXCEPTION(watchdog);
455 CRIT_EXCEPTION_PROLOG(0x9f0, BOOKE_INTERRUPT_WATCHDOG, 462 CRIT_EXCEPTION_PROLOG(0x9f0, BOOKE_INTERRUPT_WATCHDOG,
456 PROLOG_ADDITION_NONE) 463 PROLOG_ADDITION_NONE)
457// EXCEPTION_COMMON(0x9f0, PACA_EXCRIT) 464// EXCEPTION_COMMON_CRIT(0x9f0)
458// INTS_DISABLE 465// INTS_DISABLE
459// bl special_reg_save_crit 466// bl special_reg_save_crit
460// CHECK_NAPPING(); 467// CHECK_NAPPING();
@@ -475,7 +482,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
475 START_EXCEPTION(ap_unavailable); 482 START_EXCEPTION(ap_unavailable);
476 NORMAL_EXCEPTION_PROLOG(0xf20, BOOKE_INTERRUPT_AP_UNAVAIL, 483 NORMAL_EXCEPTION_PROLOG(0xf20, BOOKE_INTERRUPT_AP_UNAVAIL,
477 PROLOG_ADDITION_NONE) 484 PROLOG_ADDITION_NONE)
478 EXCEPTION_COMMON(0xf20, PACA_EXGEN) 485 EXCEPTION_COMMON(0xf20)
479 INTS_DISABLE 486 INTS_DISABLE
480 bl .save_nvgprs 487 bl .save_nvgprs
481 addi r3,r1,STACK_FRAME_OVERHEAD 488 addi r3,r1,STACK_FRAME_OVERHEAD
@@ -532,10 +539,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
532 /* Now we mash up things to make it look like we are coming on a 539 /* Now we mash up things to make it look like we are coming on a
533 * normal exception 540 * normal exception
534 */ 541 */
535 mfspr r15,SPRN_SPRG_CRIT_SCRATCH
536 mtspr SPRN_SPRG_GEN_SCRATCH,r15
537 mfspr r14,SPRN_DBSR 542 mfspr r14,SPRN_DBSR
538 EXCEPTION_COMMON(0xd00, PACA_EXCRIT) 543 EXCEPTION_COMMON_CRIT(0xd00)
539 INTS_DISABLE 544 INTS_DISABLE
540 std r14,_DSISR(r1) 545 std r14,_DSISR(r1)
541 addi r3,r1,STACK_FRAME_OVERHEAD 546 addi r3,r1,STACK_FRAME_OVERHEAD
@@ -599,10 +604,8 @@ kernel_dbg_exc:
599 /* Now we mash up things to make it look like we are coming on a 604 /* Now we mash up things to make it look like we are coming on a
600 * normal exception 605 * normal exception
601 */ 606 */
602 mfspr r15,SPRN_SPRG_DBG_SCRATCH
603 mtspr SPRN_SPRG_GEN_SCRATCH,r15
604 mfspr r14,SPRN_DBSR 607 mfspr r14,SPRN_DBSR
605 EXCEPTION_COMMON(0xd08, PACA_EXDBG) 608 EXCEPTION_COMMON_DBG(0xd08)
606 INTS_DISABLE 609 INTS_DISABLE
607 std r14,_DSISR(r1) 610 std r14,_DSISR(r1)
608 addi r3,r1,STACK_FRAME_OVERHEAD 611 addi r3,r1,STACK_FRAME_OVERHEAD
@@ -616,7 +619,7 @@ kernel_dbg_exc:
616 START_EXCEPTION(perfmon); 619 START_EXCEPTION(perfmon);
617 NORMAL_EXCEPTION_PROLOG(0x260, BOOKE_INTERRUPT_PERFORMANCE_MONITOR, 620 NORMAL_EXCEPTION_PROLOG(0x260, BOOKE_INTERRUPT_PERFORMANCE_MONITOR,
618 PROLOG_ADDITION_NONE) 621 PROLOG_ADDITION_NONE)
619 EXCEPTION_COMMON(0x260, PACA_EXGEN) 622 EXCEPTION_COMMON(0x260)
620 INTS_DISABLE 623 INTS_DISABLE
621 CHECK_NAPPING() 624 CHECK_NAPPING()
622 addi r3,r1,STACK_FRAME_OVERHEAD 625 addi r3,r1,STACK_FRAME_OVERHEAD
@@ -631,7 +634,7 @@ kernel_dbg_exc:
631 START_EXCEPTION(doorbell_crit); 634 START_EXCEPTION(doorbell_crit);
632 CRIT_EXCEPTION_PROLOG(0x2a0, BOOKE_INTERRUPT_DOORBELL_CRITICAL, 635 CRIT_EXCEPTION_PROLOG(0x2a0, BOOKE_INTERRUPT_DOORBELL_CRITICAL,
633 PROLOG_ADDITION_NONE) 636 PROLOG_ADDITION_NONE)
634// EXCEPTION_COMMON(0x2a0, PACA_EXCRIT) 637// EXCEPTION_COMMON_CRIT(0x2a0)
635// INTS_DISABLE 638// INTS_DISABLE
636// bl special_reg_save_crit 639// bl special_reg_save_crit
637// CHECK_NAPPING(); 640// CHECK_NAPPING();
@@ -647,7 +650,7 @@ kernel_dbg_exc:
647 START_EXCEPTION(guest_doorbell); 650 START_EXCEPTION(guest_doorbell);
648 GDBELL_EXCEPTION_PROLOG(0x2c0, BOOKE_INTERRUPT_GUEST_DBELL, 651 GDBELL_EXCEPTION_PROLOG(0x2c0, BOOKE_INTERRUPT_GUEST_DBELL,
649 PROLOG_ADDITION_NONE) 652 PROLOG_ADDITION_NONE)
650 EXCEPTION_COMMON(0x2c0, PACA_EXGEN) 653 EXCEPTION_COMMON(0x2c0)
651 addi r3,r1,STACK_FRAME_OVERHEAD 654 addi r3,r1,STACK_FRAME_OVERHEAD
652 bl .save_nvgprs 655 bl .save_nvgprs
653 INTS_RESTORE_HARD 656 INTS_RESTORE_HARD
@@ -658,7 +661,7 @@ kernel_dbg_exc:
658 START_EXCEPTION(guest_doorbell_crit); 661 START_EXCEPTION(guest_doorbell_crit);
659 CRIT_EXCEPTION_PROLOG(0x2e0, BOOKE_INTERRUPT_GUEST_DBELL_CRIT, 662 CRIT_EXCEPTION_PROLOG(0x2e0, BOOKE_INTERRUPT_GUEST_DBELL_CRIT,
660 PROLOG_ADDITION_NONE) 663 PROLOG_ADDITION_NONE)
661// EXCEPTION_COMMON(0x2e0, PACA_EXCRIT) 664// EXCEPTION_COMMON_CRIT(0x2e0)
662// INTS_DISABLE 665// INTS_DISABLE
663// bl special_reg_save_crit 666// bl special_reg_save_crit
664// CHECK_NAPPING(); 667// CHECK_NAPPING();
@@ -671,7 +674,7 @@ kernel_dbg_exc:
671 START_EXCEPTION(hypercall); 674 START_EXCEPTION(hypercall);
672 NORMAL_EXCEPTION_PROLOG(0x310, BOOKE_INTERRUPT_HV_SYSCALL, 675 NORMAL_EXCEPTION_PROLOG(0x310, BOOKE_INTERRUPT_HV_SYSCALL,
673 PROLOG_ADDITION_NONE) 676 PROLOG_ADDITION_NONE)
674 EXCEPTION_COMMON(0x310, PACA_EXGEN) 677 EXCEPTION_COMMON(0x310)
675 addi r3,r1,STACK_FRAME_OVERHEAD 678 addi r3,r1,STACK_FRAME_OVERHEAD
676 bl .save_nvgprs 679 bl .save_nvgprs
677 INTS_RESTORE_HARD 680 INTS_RESTORE_HARD
@@ -682,7 +685,7 @@ kernel_dbg_exc:
682 START_EXCEPTION(ehpriv); 685 START_EXCEPTION(ehpriv);
683 NORMAL_EXCEPTION_PROLOG(0x320, BOOKE_INTERRUPT_HV_PRIV, 686 NORMAL_EXCEPTION_PROLOG(0x320, BOOKE_INTERRUPT_HV_PRIV,
684 PROLOG_ADDITION_NONE) 687 PROLOG_ADDITION_NONE)
685 EXCEPTION_COMMON(0x320, PACA_EXGEN) 688 EXCEPTION_COMMON(0x320)
686 addi r3,r1,STACK_FRAME_OVERHEAD 689 addi r3,r1,STACK_FRAME_OVERHEAD
687 bl .save_nvgprs 690 bl .save_nvgprs
688 INTS_RESTORE_HARD 691 INTS_RESTORE_HARD
@@ -693,7 +696,7 @@ kernel_dbg_exc:
693 START_EXCEPTION(lrat_error); 696 START_EXCEPTION(lrat_error);
694 NORMAL_EXCEPTION_PROLOG(0x340, BOOKE_INTERRUPT_LRAT_ERROR, 697 NORMAL_EXCEPTION_PROLOG(0x340, BOOKE_INTERRUPT_LRAT_ERROR,
695 PROLOG_ADDITION_NONE) 698 PROLOG_ADDITION_NONE)
696 EXCEPTION_COMMON(0x340, PACA_EXGEN) 699 EXCEPTION_COMMON(0x340)
697 addi r3,r1,STACK_FRAME_OVERHEAD 700 addi r3,r1,STACK_FRAME_OVERHEAD
698 bl .save_nvgprs 701 bl .save_nvgprs
699 INTS_RESTORE_HARD 702 INTS_RESTORE_HARD