diff options
Diffstat (limited to 'arch/powerpc/kernel/exceptions-64s.S')
-rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 148 |
1 files changed, 52 insertions, 96 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index e6eba1bf61ad..4e00d223b2e3 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -341,10 +341,17 @@ vsx_unavailable_pSeries_1: | |||
341 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 341 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
342 | b vsx_unavailable_pSeries | 342 | b vsx_unavailable_pSeries |
343 | 343 | ||
344 | facility_unavailable_trampoline: | ||
344 | . = 0xf60 | 345 | . = 0xf60 |
345 | SET_SCRATCH0(r13) | 346 | SET_SCRATCH0(r13) |
346 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 347 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
347 | b tm_unavailable_pSeries | 348 | b facility_unavailable_pSeries |
349 | |||
350 | hv_facility_unavailable_trampoline: | ||
351 | . = 0xf80 | ||
352 | SET_SCRATCH0(r13) | ||
353 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
354 | b facility_unavailable_hv | ||
348 | 355 | ||
349 | #ifdef CONFIG_CBE_RAS | 356 | #ifdef CONFIG_CBE_RAS |
350 | STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) | 357 | STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) |
@@ -454,38 +461,14 @@ BEGIN_FTR_SECTION | |||
454 | xori r10,r10,(MSR_FE0|MSR_FE1) | 461 | xori r10,r10,(MSR_FE0|MSR_FE1) |
455 | mtmsrd r10 | 462 | mtmsrd r10 |
456 | sync | 463 | sync |
457 | fmr 0,0 | 464 | |
458 | fmr 1,1 | 465 | #define FMR2(n) fmr (n), (n) ; fmr n+1, n+1 |
459 | fmr 2,2 | 466 | #define FMR4(n) FMR2(n) ; FMR2(n+2) |
460 | fmr 3,3 | 467 | #define FMR8(n) FMR4(n) ; FMR4(n+4) |
461 | fmr 4,4 | 468 | #define FMR16(n) FMR8(n) ; FMR8(n+8) |
462 | fmr 5,5 | 469 | #define FMR32(n) FMR16(n) ; FMR16(n+16) |
463 | fmr 6,6 | 470 | FMR32(0) |
464 | fmr 7,7 | 471 | |
465 | fmr 8,8 | ||
466 | fmr 9,9 | ||
467 | fmr 10,10 | ||
468 | fmr 11,11 | ||
469 | fmr 12,12 | ||
470 | fmr 13,13 | ||
471 | fmr 14,14 | ||
472 | fmr 15,15 | ||
473 | fmr 16,16 | ||
474 | fmr 17,17 | ||
475 | fmr 18,18 | ||
476 | fmr 19,19 | ||
477 | fmr 20,20 | ||
478 | fmr 21,21 | ||
479 | fmr 22,22 | ||
480 | fmr 23,23 | ||
481 | fmr 24,24 | ||
482 | fmr 25,25 | ||
483 | fmr 26,26 | ||
484 | fmr 27,27 | ||
485 | fmr 28,28 | ||
486 | fmr 29,29 | ||
487 | fmr 30,30 | ||
488 | fmr 31,31 | ||
489 | FTR_SECTION_ELSE | 472 | FTR_SECTION_ELSE |
490 | /* | 473 | /* |
491 | * To denormalise we need to move a copy of the register to itself. | 474 | * To denormalise we need to move a copy of the register to itself. |
@@ -495,39 +478,25 @@ FTR_SECTION_ELSE | |||
495 | oris r10,r10,MSR_VSX@h | 478 | oris r10,r10,MSR_VSX@h |
496 | mtmsrd r10 | 479 | mtmsrd r10 |
497 | sync | 480 | sync |
498 | XVCPSGNDP(0,0,0) | 481 | |
499 | XVCPSGNDP(1,1,1) | 482 | #define XVCPSGNDP2(n) XVCPSGNDP(n,n,n) ; XVCPSGNDP(n+1,n+1,n+1) |
500 | XVCPSGNDP(2,2,2) | 483 | #define XVCPSGNDP4(n) XVCPSGNDP2(n) ; XVCPSGNDP2(n+2) |
501 | XVCPSGNDP(3,3,3) | 484 | #define XVCPSGNDP8(n) XVCPSGNDP4(n) ; XVCPSGNDP4(n+4) |
502 | XVCPSGNDP(4,4,4) | 485 | #define XVCPSGNDP16(n) XVCPSGNDP8(n) ; XVCPSGNDP8(n+8) |
503 | XVCPSGNDP(5,5,5) | 486 | #define XVCPSGNDP32(n) XVCPSGNDP16(n) ; XVCPSGNDP16(n+16) |
504 | XVCPSGNDP(6,6,6) | 487 | XVCPSGNDP32(0) |
505 | XVCPSGNDP(7,7,7) | 488 | |
506 | XVCPSGNDP(8,8,8) | ||
507 | XVCPSGNDP(9,9,9) | ||
508 | XVCPSGNDP(10,10,10) | ||
509 | XVCPSGNDP(11,11,11) | ||
510 | XVCPSGNDP(12,12,12) | ||
511 | XVCPSGNDP(13,13,13) | ||
512 | XVCPSGNDP(14,14,14) | ||
513 | XVCPSGNDP(15,15,15) | ||
514 | XVCPSGNDP(16,16,16) | ||
515 | XVCPSGNDP(17,17,17) | ||
516 | XVCPSGNDP(18,18,18) | ||
517 | XVCPSGNDP(19,19,19) | ||
518 | XVCPSGNDP(20,20,20) | ||
519 | XVCPSGNDP(21,21,21) | ||
520 | XVCPSGNDP(22,22,22) | ||
521 | XVCPSGNDP(23,23,23) | ||
522 | XVCPSGNDP(24,24,24) | ||
523 | XVCPSGNDP(25,25,25) | ||
524 | XVCPSGNDP(26,26,26) | ||
525 | XVCPSGNDP(27,27,27) | ||
526 | XVCPSGNDP(28,28,28) | ||
527 | XVCPSGNDP(29,29,29) | ||
528 | XVCPSGNDP(30,30,30) | ||
529 | XVCPSGNDP(31,31,31) | ||
530 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) | 489 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) |
490 | |||
491 | BEGIN_FTR_SECTION | ||
492 | b denorm_done | ||
493 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | ||
494 | /* | ||
495 | * To denormalise we need to move a copy of the register to itself. | ||
496 | * For POWER8 we need to do that for all 64 VSX registers | ||
497 | */ | ||
498 | XVCPSGNDP32(32) | ||
499 | denorm_done: | ||
531 | mtspr SPRN_HSRR0,r11 | 500 | mtspr SPRN_HSRR0,r11 |
532 | mtcrf 0x80,r9 | 501 | mtcrf 0x80,r9 |
533 | ld r9,PACA_EXGEN+EX_R9(r13) | 502 | ld r9,PACA_EXGEN+EX_R9(r13) |
@@ -560,8 +529,10 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) | |||
560 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) | 529 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) |
561 | STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) | 530 | STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) |
562 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) | 531 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) |
563 | STD_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) | 532 | STD_EXCEPTION_PSERIES_OOL(0xf60, facility_unavailable) |
564 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf60) | 533 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf60) |
534 | STD_EXCEPTION_HV_OOL(0xf82, facility_unavailable) | ||
535 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xf82) | ||
565 | 536 | ||
566 | /* | 537 | /* |
567 | * An interrupt came in while soft-disabled. We set paca->irq_happened, then: | 538 | * An interrupt came in while soft-disabled. We set paca->irq_happened, then: |
@@ -721,7 +692,7 @@ machine_check_common: | |||
721 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) | 692 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) |
722 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) | 693 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) |
723 | STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) | 694 | STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) |
724 | STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception) | 695 | STD_EXCEPTION_COMMON(0xe40, emulation_assist, .emulation_assist_interrupt) |
725 | STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) | 696 | STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) |
726 | #ifdef CONFIG_PPC_DOORBELL | 697 | #ifdef CONFIG_PPC_DOORBELL |
727 | STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception) | 698 | STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception) |
@@ -831,14 +802,10 @@ system_call_relon_pSeries: | |||
831 | STD_RELON_EXCEPTION_PSERIES(0x4d00, 0xd00, single_step) | 802 | STD_RELON_EXCEPTION_PSERIES(0x4d00, 0xd00, single_step) |
832 | 803 | ||
833 | . = 0x4e00 | 804 | . = 0x4e00 |
834 | SET_SCRATCH0(r13) | 805 | b . /* Can't happen, see v2.07 Book III-S section 6.5 */ |
835 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
836 | b h_data_storage_relon_hv | ||
837 | 806 | ||
838 | . = 0x4e20 | 807 | . = 0x4e20 |
839 | SET_SCRATCH0(r13) | 808 | b . /* Can't happen, see v2.07 Book III-S section 6.5 */ |
840 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
841 | b h_instr_storage_relon_hv | ||
842 | 809 | ||
843 | . = 0x4e40 | 810 | . = 0x4e40 |
844 | SET_SCRATCH0(r13) | 811 | SET_SCRATCH0(r13) |
@@ -846,9 +813,7 @@ system_call_relon_pSeries: | |||
846 | b emulation_assist_relon_hv | 813 | b emulation_assist_relon_hv |
847 | 814 | ||
848 | . = 0x4e60 | 815 | . = 0x4e60 |
849 | SET_SCRATCH0(r13) | 816 | b . /* Can't happen, see v2.07 Book III-S section 6.5 */ |
850 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
851 | b hmi_exception_relon_hv | ||
852 | 817 | ||
853 | . = 0x4e80 | 818 | . = 0x4e80 |
854 | SET_SCRATCH0(r13) | 819 | SET_SCRATCH0(r13) |
@@ -873,11 +838,17 @@ vsx_unavailable_relon_pSeries_1: | |||
873 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 838 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
874 | b vsx_unavailable_relon_pSeries | 839 | b vsx_unavailable_relon_pSeries |
875 | 840 | ||
876 | tm_unavailable_relon_pSeries_1: | 841 | facility_unavailable_relon_trampoline: |
877 | . = 0x4f60 | 842 | . = 0x4f60 |
878 | SET_SCRATCH0(r13) | 843 | SET_SCRATCH0(r13) |
879 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 844 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
880 | b tm_unavailable_relon_pSeries | 845 | b facility_unavailable_relon_pSeries |
846 | |||
847 | hv_facility_unavailable_relon_trampoline: | ||
848 | . = 0x4f80 | ||
849 | SET_SCRATCH0(r13) | ||
850 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
851 | b facility_unavailable_relon_hv | ||
881 | 852 | ||
882 | STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint) | 853 | STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint) |
883 | #ifdef CONFIG_PPC_DENORMALISATION | 854 | #ifdef CONFIG_PPC_DENORMALISATION |
@@ -1203,36 +1174,21 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) | |||
1203 | bl .vsx_unavailable_exception | 1174 | bl .vsx_unavailable_exception |
1204 | b .ret_from_except | 1175 | b .ret_from_except |
1205 | 1176 | ||
1206 | .align 7 | 1177 | STD_EXCEPTION_COMMON(0xf60, facility_unavailable, .facility_unavailable_exception) |
1207 | .globl tm_unavailable_common | ||
1208 | tm_unavailable_common: | ||
1209 | EXCEPTION_PROLOG_COMMON(0xf60, PACA_EXGEN) | ||
1210 | bl .save_nvgprs | ||
1211 | DISABLE_INTS | ||
1212 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1213 | bl .tm_unavailable_exception | ||
1214 | b .ret_from_except | ||
1215 | 1178 | ||
1216 | .align 7 | 1179 | .align 7 |
1217 | .globl __end_handlers | 1180 | .globl __end_handlers |
1218 | __end_handlers: | 1181 | __end_handlers: |
1219 | 1182 | ||
1220 | /* Equivalents to the above handlers for relocation-on interrupt vectors */ | 1183 | /* Equivalents to the above handlers for relocation-on interrupt vectors */ |
1221 | STD_RELON_EXCEPTION_HV_OOL(0xe00, h_data_storage) | ||
1222 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe00) | ||
1223 | STD_RELON_EXCEPTION_HV_OOL(0xe20, h_instr_storage) | ||
1224 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe20) | ||
1225 | STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist) | 1184 | STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist) |
1226 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40) | ||
1227 | STD_RELON_EXCEPTION_HV_OOL(0xe60, hmi_exception) | ||
1228 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60) | ||
1229 | MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell) | 1185 | MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell) |
1230 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe80) | ||
1231 | 1186 | ||
1232 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) | 1187 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) |
1233 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) | 1188 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) |
1234 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) | 1189 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) |
1235 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) | 1190 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, facility_unavailable) |
1191 | STD_RELON_EXCEPTION_HV_OOL(0xf80, facility_unavailable) | ||
1236 | 1192 | ||
1237 | #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) | 1193 | #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) |
1238 | /* | 1194 | /* |