aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/exceptions-64s.S
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2016-09-21 03:43:55 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2016-10-03 22:07:10 -0400
commit792cbddd628282027f99f5499f2899613e07f8f9 (patch)
treee211722373d03f45b577a29660c3f194402f3352 /arch/powerpc/kernel/exceptions-64s.S
parentd1a0ca9c8bdadb76f08e80f6ebf9f64a69f5b6d1 (diff)
powerpc/64s: Consolidate VSX Unavailable 0xf40 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.S74
1 files changed, 36 insertions, 38 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 5b81ecf7c1a7..f8015d22657f 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1074,6 +1074,42 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
1074 1074
1075 1075
1076__EXC_REAL_OOL(vsx_unavailable, 0xf40, 0xf60) 1076__EXC_REAL_OOL(vsx_unavailable, 0xf40, 0xf60)
1077__TRAMP_REAL_REAL_OOL(vsx_unavailable, 0xf40)
1078__EXC_VIRT_OOL(vsx_unavailable, 0x4f40, 0x4f60)
1079__TRAMP_REAL_VIRT_OOL(vsx_unavailable, 0xf40)
1080TRAMP_KVM(PACA_EXGEN, 0xf40)
1081EXC_COMMON_BEGIN(vsx_unavailable_common)
1082 EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN)
1083#ifdef CONFIG_VSX
1084BEGIN_FTR_SECTION
1085 beq 1f
1086#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1087 BEGIN_FTR_SECTION_NESTED(69)
1088 /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in
1089 * transaction), go do TM stuff
1090 */
1091 rldicl. r0, r12, (64-MSR_TS_LG), (64-2)
1092 bne- 2f
1093 END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69)
1094#endif
1095 b load_up_vsx
1096#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
10972: /* User process was in a transaction */
1098 bl save_nvgprs
1099 RECONCILE_IRQ_STATE(r10, r11)
1100 addi r3,r1,STACK_FRAME_OVERHEAD
1101 bl vsx_unavailable_tm
1102 b ret_from_except
1103#endif
11041:
1105END_FTR_SECTION_IFSET(CPU_FTR_VSX)
1106#endif
1107 bl save_nvgprs
1108 RECONCILE_IRQ_STATE(r10, r11)
1109 addi r3,r1,STACK_FRAME_OVERHEAD
1110 bl vsx_unavailable_exception
1111 b ret_from_except
1112
1077 1113
1078__EXC_REAL_OOL(facility_unavailable, 0xf60, 0xf80) 1114__EXC_REAL_OOL(facility_unavailable, 0xf60, 0xf80)
1079 1115
@@ -1205,9 +1241,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
1205#endif 1241#endif
1206 1242
1207 /* moved from 0xf00 */ 1243 /* moved from 0xf00 */
1208__TRAMP_REAL_REAL_OOL(vsx_unavailable, 0xf40)
1209TRAMP_KVM(PACA_EXGEN, 0xf40)
1210
1211__TRAMP_REAL_REAL_OOL(facility_unavailable, 0xf60) 1244__TRAMP_REAL_REAL_OOL(facility_unavailable, 0xf60)
1212TRAMP_KVM(PACA_EXGEN, 0xf60) 1245TRAMP_KVM(PACA_EXGEN, 0xf60)
1213 1246
@@ -1358,8 +1391,6 @@ EXC_COMMON(altivec_assist_common, 0x1700, unknown_exception)
1358 * come here. 1391 * come here.
1359 */ 1392 */
1360 1393
1361__EXC_VIRT_OOL(vsx_unavailable, 0x4f40, 0x4f60)
1362
1363__EXC_VIRT_OOL(facility_unavailable, 0x4f60, 0x4f80) 1394__EXC_VIRT_OOL(facility_unavailable, 0x4f60, 0x4f80)
1364 1395
1365__EXC_VIRT_OOL_HV(h_facility_unavailable, 0x4f80, 0x4fa0) 1396__EXC_VIRT_OOL_HV(h_facility_unavailable, 0x4f80, 0x4fa0)
@@ -1387,40 +1418,7 @@ EXC_VIRT_NONE(0x5800, 0x5900)
1387EXC_COMMON_BEGIN(ppc64_runlatch_on_trampoline) 1418EXC_COMMON_BEGIN(ppc64_runlatch_on_trampoline)
1388 b __ppc64_runlatch_on 1419 b __ppc64_runlatch_on
1389 1420
1390EXC_COMMON_BEGIN(vsx_unavailable_common)
1391 EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN)
1392#ifdef CONFIG_VSX
1393BEGIN_FTR_SECTION
1394 beq 1f
1395#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1396 BEGIN_FTR_SECTION_NESTED(69)
1397 /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in
1398 * transaction), go do TM stuff
1399 */
1400 rldicl. r0, r12, (64-MSR_TS_LG), (64-2)
1401 bne- 2f
1402 END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69)
1403#endif
1404 b load_up_vsx
1405#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
14062: /* User process was in a transaction */
1407 bl save_nvgprs
1408 RECONCILE_IRQ_STATE(r10, r11)
1409 addi r3,r1,STACK_FRAME_OVERHEAD
1410 bl vsx_unavailable_tm
1411 b ret_from_except
1412#endif
14131:
1414END_FTR_SECTION_IFSET(CPU_FTR_VSX)
1415#endif
1416 bl save_nvgprs
1417 RECONCILE_IRQ_STATE(r10, r11)
1418 addi r3,r1,STACK_FRAME_OVERHEAD
1419 bl vsx_unavailable_exception
1420 b ret_from_except
1421
1422 /* Equivalents to the above handlers for relocation-on interrupt vectors */ 1421 /* Equivalents to the above handlers for relocation-on interrupt vectors */
1423__TRAMP_REAL_VIRT_OOL(vsx_unavailable, 0xf40)
1424__TRAMP_REAL_VIRT_OOL(facility_unavailable, 0xf60) 1422__TRAMP_REAL_VIRT_OOL(facility_unavailable, 0xf60)
1425__TRAMP_REAL_VIRT_OOL_HV(h_facility_unavailable, 0xf80) 1423__TRAMP_REAL_VIRT_OOL_HV(h_facility_unavailable, 0xf80)
1426 1424