diff options
author | Scott Wood <scottwood@freescale.com> | 2011-06-22 07:19:49 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2011-06-29 02:40:59 -0400 |
commit | 3d97a619acbb2c8a7a9a7da08c2d3041dfdd241f (patch) | |
tree | 68902bf78013899166e6ec5f248380e45c49e7d5 /arch/powerpc/kernel/exceptions-64e.S | |
parent | 3c350a1a554eeb4b4ae7389e9d9b76f137c35071 (diff) |
powerpc/book3e-64: Reraise doorbell when masked by soft-irq-disable
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/exceptions-64e.S')
-rw-r--r-- | arch/powerpc/kernel/exceptions-64e.S | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S index d24d4400cc79..429983c06f91 100644 --- a/arch/powerpc/kernel/exceptions-64e.S +++ b/arch/powerpc/kernel/exceptions-64e.S | |||
@@ -120,6 +120,12 @@ | |||
120 | std r14,PACA_EXMC+EX_R14(r13); \ | 120 | std r14,PACA_EXMC+EX_R14(r13); \ |
121 | std r15,PACA_EXMC+EX_R15(r13) | 121 | std r15,PACA_EXMC+EX_R15(r13) |
122 | 122 | ||
123 | #define PROLOG_ADDITION_DOORBELL_GEN \ | ||
124 | lbz r11,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */ \ | ||
125 | cmpwi cr0,r11,0; /* yes -> go out of line */ \ | ||
126 | beq masked_doorbell_book3e | ||
127 | |||
128 | |||
123 | /* Core exception code for all exceptions except TLB misses. | 129 | /* Core exception code for all exceptions except TLB misses. |
124 | * XXX: Needs to make SPRN_SPRG_GEN depend on exception type | 130 | * XXX: Needs to make SPRN_SPRG_GEN depend on exception type |
125 | */ | 131 | */ |
@@ -522,7 +528,13 @@ kernel_dbg_exc: | |||
522 | MASKABLE_EXCEPTION(0x260, perfmon, .performance_monitor_exception, ACK_NONE) | 528 | MASKABLE_EXCEPTION(0x260, perfmon, .performance_monitor_exception, ACK_NONE) |
523 | 529 | ||
524 | /* Doorbell interrupt */ | 530 | /* Doorbell interrupt */ |
525 | MASKABLE_EXCEPTION(0x2070, doorbell, .doorbell_exception, ACK_NONE) | 531 | START_EXCEPTION(doorbell) |
532 | NORMAL_EXCEPTION_PROLOG(0x2070, PROLOG_ADDITION_DOORBELL) | ||
533 | EXCEPTION_COMMON(0x2070, PACA_EXGEN, INTS_DISABLE_ALL) | ||
534 | CHECK_NAPPING() | ||
535 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
536 | bl .doorbell_exception | ||
537 | b .ret_from_except_lite | ||
526 | 538 | ||
527 | /* Doorbell critical Interrupt */ | 539 | /* Doorbell critical Interrupt */ |
528 | START_EXCEPTION(doorbell_crit); | 540 | START_EXCEPTION(doorbell_crit); |
@@ -545,8 +557,16 @@ kernel_dbg_exc: | |||
545 | * An interrupt came in while soft-disabled; clear EE in SRR1, | 557 | * An interrupt came in while soft-disabled; clear EE in SRR1, |
546 | * clear paca->hard_enabled and return. | 558 | * clear paca->hard_enabled and return. |
547 | */ | 559 | */ |
560 | masked_doorbell_book3e: | ||
561 | mtcr r10 | ||
562 | /* Resend the doorbell to fire again when ints enabled */ | ||
563 | mfspr r10,SPRN_PIR | ||
564 | PPC_MSGSND(r10) | ||
565 | b masked_interrupt_book3e_common | ||
566 | |||
548 | masked_interrupt_book3e: | 567 | masked_interrupt_book3e: |
549 | mtcr r10 | 568 | mtcr r10 |
569 | masked_interrupt_book3e_common: | ||
550 | stb r11,PACAHARDIRQEN(r13) | 570 | stb r11,PACAHARDIRQEN(r13) |
551 | mfspr r10,SPRN_SRR1 | 571 | mfspr r10,SPRN_SRR1 |
552 | rldicl r11,r10,48,1 /* clear MSR_EE */ | 572 | rldicl r11,r10,48,1 /* clear MSR_EE */ |