diff options
Diffstat (limited to 'arch/powerpc/kernel/head_64.S')
-rw-r--r-- | arch/powerpc/kernel/head_64.S | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index b7d140430a41..831acbdf2592 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -316,6 +316,21 @@ label##_pSeries: \ | |||
316 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | 316 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ |
317 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | 317 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) |
318 | 318 | ||
319 | #define HSTD_EXCEPTION_PSERIES(n, label) \ | ||
320 | . = n; \ | ||
321 | .globl label##_pSeries; \ | ||
322 | label##_pSeries: \ | ||
323 | HMT_MEDIUM; \ | ||
324 | mtspr SPRN_SPRG1,r20; /* save r20 */ \ | ||
325 | mfspr r20,SPRN_HSRR0; /* copy HSRR0 to SRR0 */ \ | ||
326 | mtspr SPRN_SRR0,r20; \ | ||
327 | mfspr r20,SPRN_HSRR1; /* copy HSRR0 to SRR0 */ \ | ||
328 | mtspr SPRN_SRR1,r20; \ | ||
329 | mfspr r20,SPRN_SPRG1; /* restore r20 */ \ | ||
330 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | ||
331 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | ||
332 | |||
333 | |||
319 | #define STD_EXCEPTION_ISERIES(n, label, area) \ | 334 | #define STD_EXCEPTION_ISERIES(n, label, area) \ |
320 | .globl label##_iSeries; \ | 335 | .globl label##_iSeries; \ |
321 | label##_iSeries: \ | 336 | label##_iSeries: \ |
@@ -544,8 +559,17 @@ system_call_pSeries: | |||
544 | 559 | ||
545 | STD_EXCEPTION_PSERIES(0xf20, altivec_unavailable) | 560 | STD_EXCEPTION_PSERIES(0xf20, altivec_unavailable) |
546 | 561 | ||
562 | #ifdef CONFIG_CBE_RAS | ||
563 | HSTD_EXCEPTION_PSERIES(0x1200, cbe_system_error) | ||
564 | #endif /* CONFIG_CBE_RAS */ | ||
547 | STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint) | 565 | STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint) |
566 | #ifdef CONFIG_CBE_RAS | ||
567 | HSTD_EXCEPTION_PSERIES(0x1600, cbe_maintenance) | ||
568 | #endif /* CONFIG_CBE_RAS */ | ||
548 | STD_EXCEPTION_PSERIES(0x1700, altivec_assist) | 569 | STD_EXCEPTION_PSERIES(0x1700, altivec_assist) |
570 | #ifdef CONFIG_CBE_RAS | ||
571 | HSTD_EXCEPTION_PSERIES(0x1800, cbe_thermal) | ||
572 | #endif /* CONFIG_CBE_RAS */ | ||
549 | 573 | ||
550 | . = 0x3000 | 574 | . = 0x3000 |
551 | 575 | ||
@@ -827,6 +851,11 @@ machine_check_common: | |||
827 | #else | 851 | #else |
828 | STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception) | 852 | STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception) |
829 | #endif | 853 | #endif |
854 | #ifdef CONFIG_CBE_RAS | ||
855 | STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception) | ||
856 | STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception) | ||
857 | STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception) | ||
858 | #endif /* CONFIG_CBE_RAS */ | ||
830 | 859 | ||
831 | /* | 860 | /* |
832 | * Here we have detected that the kernel stack pointer is bad. | 861 | * Here we have detected that the kernel stack pointer is bad. |