diff options
author | Nicholas Piggin <npiggin@gmail.com> | 2016-09-21 03:43:54 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-10-03 22:07:09 -0400 |
commit | d1a0ca9c8bdadb76f08e80f6ebf9f64a69f5b6d1 (patch) | |
tree | 9b8cc5ada5049fe9d5ac13a4dc67122793212e53 /arch/powerpc/kernel/exceptions-64s.S | |
parent | b1c7f150a98ed6a55d8902dcda827b4aff1b33a7 (diff) |
powerpc/64s: Consolidate Vector Unavailable 0xf20 interrupt
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/kernel/exceptions-64s.S')
-rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 76 |
1 files changed, 37 insertions, 39 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 5566f218734a..5b81ecf7c1a7 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -1035,6 +1035,43 @@ EXC_COMMON_ASYNC(performance_monitor_common, 0xf00, performance_monitor_exceptio | |||
1035 | 1035 | ||
1036 | 1036 | ||
1037 | __EXC_REAL_OOL(altivec_unavailable, 0xf20, 0xf40) | 1037 | __EXC_REAL_OOL(altivec_unavailable, 0xf20, 0xf40) |
1038 | __TRAMP_REAL_REAL_OOL(altivec_unavailable, 0xf20) | ||
1039 | __EXC_VIRT_OOL(altivec_unavailable, 0x4f20, 0x4f40) | ||
1040 | __TRAMP_REAL_VIRT_OOL(altivec_unavailable, 0xf20) | ||
1041 | TRAMP_KVM(PACA_EXGEN, 0xf20) | ||
1042 | EXC_COMMON_BEGIN(altivec_unavailable_common) | ||
1043 | EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN) | ||
1044 | #ifdef CONFIG_ALTIVEC | ||
1045 | BEGIN_FTR_SECTION | ||
1046 | beq 1f | ||
1047 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1048 | BEGIN_FTR_SECTION_NESTED(69) | ||
1049 | /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in | ||
1050 | * transaction), go do TM stuff | ||
1051 | */ | ||
1052 | rldicl. r0, r12, (64-MSR_TS_LG), (64-2) | ||
1053 | bne- 2f | ||
1054 | END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69) | ||
1055 | #endif | ||
1056 | bl load_up_altivec | ||
1057 | b fast_exception_return | ||
1058 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1059 | 2: /* User process was in a transaction */ | ||
1060 | bl save_nvgprs | ||
1061 | RECONCILE_IRQ_STATE(r10, r11) | ||
1062 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1063 | bl altivec_unavailable_tm | ||
1064 | b ret_from_except | ||
1065 | #endif | ||
1066 | 1: | ||
1067 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | ||
1068 | #endif | ||
1069 | bl save_nvgprs | ||
1070 | RECONCILE_IRQ_STATE(r10, r11) | ||
1071 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1072 | bl altivec_unavailable_exception | ||
1073 | b ret_from_except | ||
1074 | |||
1038 | 1075 | ||
1039 | __EXC_REAL_OOL(vsx_unavailable, 0xf40, 0xf60) | 1076 | __EXC_REAL_OOL(vsx_unavailable, 0xf40, 0xf60) |
1040 | 1077 | ||
@@ -1168,9 +1205,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR) | |||
1168 | #endif | 1205 | #endif |
1169 | 1206 | ||
1170 | /* moved from 0xf00 */ | 1207 | /* moved from 0xf00 */ |
1171 | __TRAMP_REAL_REAL_OOL(altivec_unavailable, 0xf20) | ||
1172 | TRAMP_KVM(PACA_EXGEN, 0xf20) | ||
1173 | |||
1174 | __TRAMP_REAL_REAL_OOL(vsx_unavailable, 0xf40) | 1208 | __TRAMP_REAL_REAL_OOL(vsx_unavailable, 0xf40) |
1175 | TRAMP_KVM(PACA_EXGEN, 0xf40) | 1209 | TRAMP_KVM(PACA_EXGEN, 0xf40) |
1176 | 1210 | ||
@@ -1324,8 +1358,6 @@ EXC_COMMON(altivec_assist_common, 0x1700, unknown_exception) | |||
1324 | * come here. | 1358 | * come here. |
1325 | */ | 1359 | */ |
1326 | 1360 | ||
1327 | __EXC_VIRT_OOL(altivec_unavailable, 0x4f20, 0x4f40) | ||
1328 | |||
1329 | __EXC_VIRT_OOL(vsx_unavailable, 0x4f40, 0x4f60) | 1361 | __EXC_VIRT_OOL(vsx_unavailable, 0x4f40, 0x4f60) |
1330 | 1362 | ||
1331 | __EXC_VIRT_OOL(facility_unavailable, 0x4f60, 0x4f80) | 1363 | __EXC_VIRT_OOL(facility_unavailable, 0x4f60, 0x4f80) |
@@ -1355,39 +1387,6 @@ EXC_VIRT_NONE(0x5800, 0x5900) | |||
1355 | EXC_COMMON_BEGIN(ppc64_runlatch_on_trampoline) | 1387 | EXC_COMMON_BEGIN(ppc64_runlatch_on_trampoline) |
1356 | b __ppc64_runlatch_on | 1388 | b __ppc64_runlatch_on |
1357 | 1389 | ||
1358 | EXC_COMMON_BEGIN(altivec_unavailable_common) | ||
1359 | EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN) | ||
1360 | #ifdef CONFIG_ALTIVEC | ||
1361 | BEGIN_FTR_SECTION | ||
1362 | beq 1f | ||
1363 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1364 | BEGIN_FTR_SECTION_NESTED(69) | ||
1365 | /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in | ||
1366 | * transaction), go do TM stuff | ||
1367 | */ | ||
1368 | rldicl. r0, r12, (64-MSR_TS_LG), (64-2) | ||
1369 | bne- 2f | ||
1370 | END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69) | ||
1371 | #endif | ||
1372 | bl load_up_altivec | ||
1373 | b fast_exception_return | ||
1374 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1375 | 2: /* User process was in a transaction */ | ||
1376 | bl save_nvgprs | ||
1377 | RECONCILE_IRQ_STATE(r10, r11) | ||
1378 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1379 | bl altivec_unavailable_tm | ||
1380 | b ret_from_except | ||
1381 | #endif | ||
1382 | 1: | ||
1383 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | ||
1384 | #endif | ||
1385 | bl save_nvgprs | ||
1386 | RECONCILE_IRQ_STATE(r10, r11) | ||
1387 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1388 | bl altivec_unavailable_exception | ||
1389 | b ret_from_except | ||
1390 | |||
1391 | EXC_COMMON_BEGIN(vsx_unavailable_common) | 1390 | EXC_COMMON_BEGIN(vsx_unavailable_common) |
1392 | EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN) | 1391 | EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN) |
1393 | #ifdef CONFIG_VSX | 1392 | #ifdef CONFIG_VSX |
@@ -1421,7 +1420,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) | |||
1421 | b ret_from_except | 1420 | b ret_from_except |
1422 | 1421 | ||
1423 | /* Equivalents to the above handlers for relocation-on interrupt vectors */ | 1422 | /* Equivalents to the above handlers for relocation-on interrupt vectors */ |
1424 | __TRAMP_REAL_VIRT_OOL(altivec_unavailable, 0xf20) | ||
1425 | __TRAMP_REAL_VIRT_OOL(vsx_unavailable, 0xf40) | 1423 | __TRAMP_REAL_VIRT_OOL(vsx_unavailable, 0xf40) |
1426 | __TRAMP_REAL_VIRT_OOL(facility_unavailable, 0xf60) | 1424 | __TRAMP_REAL_VIRT_OOL(facility_unavailable, 0xf60) |
1427 | __TRAMP_REAL_VIRT_OOL_HV(h_facility_unavailable, 0xf80) | 1425 | __TRAMP_REAL_VIRT_OOL_HV(h_facility_unavailable, 0xf80) |