2020#include <asm/page.h>
2121#include <asm/sigp.h>
2222#include <asm/irq.h>
23- #include <asm/fpu-internal.h>
2423#include <asm/vx-insn.h>
2524
2625__PT_R0 = __PT_GPRS
@@ -748,15 +747,12 @@ ENTRY(psw_idle)
748747 br %r14
749748.Lpsw_idle_end:
750749
751- /* Store floating-point controls and floating-point or vector extension
752- * registers instead. A critical section cleanup assures that the registers
753- * are stored even if interrupted for some other work. The register %r2
754- * designates a struct fpu to store register contents. If the specified
755- * structure does not contain a register save area, the register store is
756- * omitted (see also comments in arch_dup_task_struct()).
757- *
758- * The CIF_FPU flag is set in any case. The CIF_FPU triggers a lazy restore
759- * of the register contents at system call or io return.
750+ /*
751+ * Store floating-point controls and floating-point or vector register
752+ * depending whether the vector facility is available. A critical section
753+ * cleanup assures that the registers are stored even if interrupted for
754+ * some other work. The CIF_FPU flag is set to trigger a lazy restore
755+ * of the register contents at return from io or a system call.
760756 */
761757ENTRY(save_fpu_regs)
762758 lg %r2,__LC_CURRENT
@@ -768,7 +764,7 @@ ENTRY(save_fpu_regs)
768764 lg %r3,__THREAD_FPU_regs(%r2)
769765 ltgr %r3,%r3
770766 jz .Lsave_fpu_regs_done # no save area -> set CIF_FPU
771- tm __THREAD_FPU_flags+ 3 (%r2),FPU_USE_VX
767+ tm __LC_MACHINE_FLAGS+ 5 , 4 # MACHINE_HAS_VX
772768 jz .Lsave_fpu_regs_fp # no -> store FP regs
773769.Lsave_fpu_regs_vx_low:
774770 VSTM %v0,%v15,0 ,%r3 # vstm 0,15,0(3)
@@ -797,41 +793,30 @@ ENTRY(save_fpu_regs)
797793 br %r14
798794.Lsave_fpu_regs_end:
799795
800- /* Load floating-point controls and floating-point or vector extension
801- * registers. A critical section cleanup assures that the register contents
802- * are loaded even if interrupted for some other work. Depending on the saved
803- * FP/VX state, the vector-enablement control, CR0.46, is either set or cleared .
796+ /*
797+ * Load floating-point controls and floating-point or vector registers.
798+ * A critical section cleanup assures that the register contents are
799+ * loaded even if interrupted for some other work .
804800 *
805801 * There are special calling conventions to fit into sysc and io return work:
806802 * %r15: <kernel stack>
807803 * The function requires:
808- * %r4 and __SF_EMPTY+32(%r15)
804+ * %r4
809805 */
810806load_fpu_regs:
811807 lg %r4,__LC_CURRENT
812808 aghi %r4,__TASK_thread
813809 tm __LC_CPU_FLAGS+7 ,_CIF_FPU
814810 bnor %r14
815811 lfpc __THREAD_FPU_fpc(%r4)
816- stctg %c0,%c0,__SF_EMPTY+32 (%r15 ) # store CR0
817- tm __THREAD_FPU_flags+3 (%r4),FPU_USE_VX # VX-enabled task ?
812+ tm __LC_MACHINE_FLAGS+5 ,4 # MACHINE_HAS_VX
818813 lg %r4,__THREAD_FPU_regs(%r4) # %r4 <- reg save area
819- jz .Lload_fpu_regs_fp_ctl # -> no VX, load FP regs
820- .Lload_fpu_regs_vx_ctl:
821- tm __SF_EMPTY+32 +5 (%r15 ),2 # test VX control
822- jo .Lload_fpu_regs_vx
823- oi __SF_EMPTY+32 +5 (%r15 ),2 # set VX control
824- lctlg %c0,%c0,__SF_EMPTY+32 (%r15 )
814+ jz .Lload_fpu_regs_fp # -> no VX, load FP regs
825815.Lload_fpu_regs_vx:
826816 VLM %v0,%v15,0 ,%r4
827817.Lload_fpu_regs_vx_high:
828818 VLM %v16,%v31,256 ,%r4
829819 j .Lload_fpu_regs_done
830- .Lload_fpu_regs_fp_ctl:
831- tm __SF_EMPTY+32 +5 (%r15 ),2 # test VX control
832- jz .Lload_fpu_regs_fp
833- ni __SF_EMPTY+32 +5 (%r15 ),253 # clear VX control
834- lctlg %c0,%c0,__SF_EMPTY+32 (%r15 )
835820.Lload_fpu_regs_fp:
836821 ld 0 ,0 (%r4)
837822 ld 1 ,8 (%r4)
@@ -854,16 +839,6 @@ load_fpu_regs:
854839 br %r14
855840.Lload_fpu_regs_end:
856841
857- /* Test and set the vector enablement control in CR0.46 */
858- ENTRY(__ctl_set_vx)
859- stctg %c0,%c0,__SF_EMPTY(%r15 )
860- tm __SF_EMPTY+5 (%r15 ),2
861- bor %r14
862- oi __SF_EMPTY+5 (%r15 ),2
863- lctlg %c0,%c0,__SF_EMPTY(%r15 )
864- br %r14
865- .L__ctl_set_vx_end:
866-
867842.L__critical_end:
868843
869844/*
@@ -1019,10 +994,6 @@ cleanup_critical:
1019994 jl 0f
1020995 clg %r9 ,BASED(.Lcleanup_table+104 ) # .Lload_fpu_regs_end
1021996 jl .Lcleanup_load_fpu_regs
1022- clg %r9 ,BASED(.Lcleanup_table+112 ) # __ctl_set_vx
1023- jl 0f
1024- clg %r9 ,BASED(.Lcleanup_table+120 ) # .L__ctl_set_vx_end
1025- jl .Lcleanup___ctl_set_vx
10269970: br %r14
1027998
1028999 .align 8
@@ -1041,8 +1012,6 @@ cleanup_critical:
10411012 .quad .Lsave_fpu_regs_end
10421013 .quad load_fpu_regs
10431014 .quad .Lload_fpu_regs_end
1044- .quad __ctl_set_vx
1045- .quad .L__ctl_set_vx_end
10461015
10471016#if IS_ENABLED(CONFIG_KVM)
10481017.Lcleanup_table_sie:
@@ -1226,7 +1195,7 @@ cleanup_critical:
12261195 lg %r3,__THREAD_FPU_regs(%r2)
12271196 ltgr %r3,%r3
12281197 jz 5f # no save area -> set CIF_FPU
1229- tm __THREAD_FPU_flags+ 3 (%r2),FPU_USE_VX
1198+ tm __LC_MACHINE_FLAGS+ 5 , 4 # MACHINE_HAS_VX
12301199 jz 4f # no VX -> store FP regs
123112002: # Store vector registers (V0-V15)
12321201 VSTM %v0,%v15,0 ,%r3 # vstm 0,15,0(3)
@@ -1272,37 +1241,21 @@ cleanup_critical:
12721241 jhe 1f
12731242 clg %r9 ,BASED(.Lcleanup_load_fpu_regs_fp)
12741243 jhe 2f
1275- clg %r9 ,BASED(.Lcleanup_load_fpu_regs_fp_ctl)
1276- jhe 3f
12771244 clg %r9 ,BASED(.Lcleanup_load_fpu_regs_vx_high)
1278- jhe 4f
1245+ jhe 3f
12791246 clg %r9 ,BASED(.Lcleanup_load_fpu_regs_vx)
1280- jhe 5f
1281- clg %r9 ,BASED(.Lcleanup_load_fpu_regs_vx_ctl)
1282- jhe 6f
1247+ jhe 4f
12831248 lg %r4,__LC_CURRENT
12841249 aghi %r4,__TASK_thread
12851250 lfpc __THREAD_FPU_fpc(%r4)
1286- tm __THREAD_FPU_flags+ 3 (%r4),FPU_USE_VX # VX-enabled task ?
1251+ tm __LC_MACHINE_FLAGS+ 5 , 4 # MACHINE_HAS_VX
12871252 lg %r4,__THREAD_FPU_regs(%r4) # %r4 <- reg save area
1288- jz 3f # -> no VX, load FP regs
1289- 6: # Set VX-enablement control
1290- stctg %c0,%c0,__SF_EMPTY+32 (%r15 ) # store CR0
1291- tm __SF_EMPTY+32 +5 (%r15 ),2 # test VX control
1292- jo 5f
1293- oi __SF_EMPTY+32 +5 (%r15 ),2 # set VX control
1294- lctlg %c0,%c0,__SF_EMPTY+32 (%r15 )
1295- 5: # Load V0 ..V15 registers
1253+ jz 2f # -> no VX, load FP regs
1254+ 4: # Load V0 ..V15 registers
12961255 VLM %v0,%v15,0 ,%r4
1297- 4 : # Load V16..V31 registers
1256+ 3 : # Load V16..V31 registers
12981257 VLM %v16,%v31,256 ,%r4
12991258 j 1f
1300- 3: # Clear VX-enablement control for FP
1301- stctg %c0,%c0,__SF_EMPTY+32 (%r15 ) # store CR0
1302- tm __SF_EMPTY+32 +5 (%r15 ),2 # test VX control
1303- jz 2f
1304- ni __SF_EMPTY+32 +5 (%r15 ),253 # clear VX control
1305- lctlg %c0,%c0,__SF_EMPTY+32 (%r15 )
130612592: # Load floating-point registers
13071260 ld 0 ,0 (%r4)
13081261 ld 1 ,8 (%r4)
@@ -1324,28 +1277,15 @@ cleanup_critical:
13241277 ni __LC_CPU_FLAGS+7 ,255 -_CIF_FPU
13251278 lg %r9 ,48 (%r11 ) # return from load_fpu_regs
13261279 br %r14
1327- .Lcleanup_load_fpu_regs_vx_ctl:
1328- .quad .Lload_fpu_regs_vx_ctl
13291280.Lcleanup_load_fpu_regs_vx:
13301281 .quad .Lload_fpu_regs_vx
13311282.Lcleanup_load_fpu_regs_vx_high:
13321283 .quad .Lload_fpu_regs_vx_high
1333- .Lcleanup_load_fpu_regs_fp_ctl:
1334- .quad .Lload_fpu_regs_fp_ctl
13351284.Lcleanup_load_fpu_regs_fp:
13361285 .quad .Lload_fpu_regs_fp
13371286.Lcleanup_load_fpu_regs_done:
13381287 .quad .Lload_fpu_regs_done
13391288
1340- .Lcleanup___ctl_set_vx:
1341- stctg %c0,%c0,__SF_EMPTY(%r15 )
1342- tm __SF_EMPTY+5 (%r15 ),2
1343- bor %r14
1344- oi __SF_EMPTY+5 (%r15 ),2
1345- lctlg %c0,%c0,__SF_EMPTY(%r15 )
1346- lg %r9 ,48 (%r11 ) # return from __ctl_set_vx
1347- br %r14
1348-
13491289/*
13501290 * Integer constants
13511291 */
0 commit comments