aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Munsie <imunsie@au1.ibm.com>2012-11-14 13:49:45 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2013-01-09 23:09:06 -0500
commit655bb3f4e89225354b668dcef53fa39da02fb1d0 (patch)
treea7604032891e379f447b2e921743a06257a2be4e
parent42d02b81f265b77be39262666c888d50cb488fc5 (diff)
powerpc: Add book3s hypervisor doorbell exception vectors
Directed Hypervisor Doorbell Interrupts come in at 0xe80 (or 0xc000000000004e80 if relocation on exceptions is enabled), so add exception vectors at these locations. If doorbell support is not compiled in we handle it as an unknown_exception. Signed-off-by: Ian Munsie <imunsie@au1.ibm.com> Tested-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/include/asm/exception-64s.h2
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S16
2 files changed, 15 insertions, 3 deletions
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index ad708dda3ba3..9d5367e7e19b 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -305,6 +305,8 @@ label##_relon_hv: \
305#define SOFTEN_VALUE_0x502 PACA_IRQ_EE 305#define SOFTEN_VALUE_0x502 PACA_IRQ_EE
306#define SOFTEN_VALUE_0x900 PACA_IRQ_DEC 306#define SOFTEN_VALUE_0x900 PACA_IRQ_DEC
307#define SOFTEN_VALUE_0x982 PACA_IRQ_DEC 307#define SOFTEN_VALUE_0x982 PACA_IRQ_DEC
308#define SOFTEN_VALUE_0xe80 PACA_IRQ_DBELL
309#define SOFTEN_VALUE_0xe82 PACA_IRQ_DBELL
308 310
309#define __SOFTEN_TEST(h, vec) \ 311#define __SOFTEN_TEST(h, vec) \
310 lbz r10,PACASOFTIRQEN(r13); \ 312 lbz r10,PACASOFTIRQEN(r13); \
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 4665e82fa377..d08a3cdb7cbe 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -293,6 +293,8 @@ hv_exception_trampoline:
293 b hmi_exception_hv 293 b hmi_exception_hv
294 . = 0xe60 294 . = 0xe60
295 b hmi_exception_hv 295 b hmi_exception_hv
296 . = 0xe80
297 b h_doorbell_hv
296 298
297 /* We need to deal with the Altivec unavailable exception 299 /* We need to deal with the Altivec unavailable exception
298 * here which is at 0xf20, thus in the middle of the 300 * here which is at 0xf20, thus in the middle of the
@@ -514,6 +516,8 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
514 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42) 516 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42)
515 STD_EXCEPTION_HV(., 0xe62, hmi_exception) /* need to flush cache ? */ 517 STD_EXCEPTION_HV(., 0xe62, hmi_exception) /* need to flush cache ? */
516 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62) 518 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62)
519 MASKABLE_EXCEPTION_HV(., 0xe82, h_doorbell)
520 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe82)
517 521
518 /* moved from 0xf00 */ 522 /* moved from 0xf00 */
519 STD_EXCEPTION_PSERIES(., 0xf00, performance_monitor) 523 STD_EXCEPTION_PSERIES(., 0xf00, performance_monitor)
@@ -657,6 +661,11 @@ machine_check_common:
657 STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) 661 STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)
658 STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception) 662 STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception)
659 STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) 663 STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception)
664#ifdef CONFIG_PPC_DOORBELL
665 STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception)
666#else
667 STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .unknown_exception)
668#endif
660 STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception) 669 STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception)
661 STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception) 670 STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)
662 STD_EXCEPTION_COMMON(0x1502, denorm, .unknown_exception) 671 STD_EXCEPTION_COMMON(0x1502, denorm, .unknown_exception)
@@ -773,9 +782,8 @@ system_call_relon_pSeries:
773 . = 0x4e60 782 . = 0x4e60
774 b hmi_exception_relon_hv 783 b hmi_exception_relon_hv
775 784
776 /* For when we support the doorbell interrupt: 785 . = 0x4e80
777 STD_RELON_EXCEPTION_HYPERVISOR(0x4e80, 0xe80, doorbell_hyper) 786 b h_doorbell_relon_hv
778 */
779 787
780performance_monitor_relon_pSeries_1: 788performance_monitor_relon_pSeries_1:
781 . = 0x4f00 789 . = 0x4f00
@@ -1355,6 +1363,8 @@ _GLOBAL(do_stab_bolted)
1355 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40) 1363 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40)
1356 STD_RELON_EXCEPTION_HV(., 0xe60, hmi_exception) 1364 STD_RELON_EXCEPTION_HV(., 0xe60, hmi_exception)
1357 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60) 1365 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60)
1366 MASKABLE_RELON_EXCEPTION_HV(., 0xe80, h_doorbell)
1367 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe80)
1358 1368
1359 STD_RELON_EXCEPTION_PSERIES(., 0xf00, performance_monitor) 1369 STD_RELON_EXCEPTION_PSERIES(., 0xf00, performance_monitor)
1360 STD_RELON_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable) 1370 STD_RELON_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable)