aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/exceptions-64s.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/exceptions-64s.S')
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S148
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
344facility_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
350hv_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
489FTR_SECTION_ELSE 472FTR_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)
530ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) 489ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
490
491BEGIN_FTR_SECTION
492 b denorm_done
493END_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)
499denorm_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
876tm_unavailable_relon_pSeries_1: 841facility_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
847hv_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
1208tm_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/*