18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * VISsave.S: Code for saving FPU register state for
48c2ecf20Sopenharmony_ci *            VIS routines. One should not call this directly,
58c2ecf20Sopenharmony_ci *            but use macros provided in <asm/visasm.h>.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz)
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/linkage.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <asm/asi.h>
138c2ecf20Sopenharmony_ci#include <asm/page.h>
148c2ecf20Sopenharmony_ci#include <asm/ptrace.h>
158c2ecf20Sopenharmony_ci#include <asm/visasm.h>
168c2ecf20Sopenharmony_ci#include <asm/thread_info.h>
178c2ecf20Sopenharmony_ci#include <asm/export.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	/* On entry: %o5=current FPRS value, %g7 is callers address */
208c2ecf20Sopenharmony_ci	/* May clobber %o5, %g1, %g2, %g3, %g7, %icc, %xcc */
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	/* Nothing special need be done here to handle pre-emption, this
238c2ecf20Sopenharmony_ci	 * FPU save/restore mechanism is already preemption safe.
248c2ecf20Sopenharmony_ci	 */
258c2ecf20Sopenharmony_ci	.text
268c2ecf20Sopenharmony_ci	.align		32
278c2ecf20Sopenharmony_ciENTRY(VISenter)
288c2ecf20Sopenharmony_ci	ldub		[%g6 + TI_FPDEPTH], %g1
298c2ecf20Sopenharmony_ci	brnz,a,pn	%g1, 1f
308c2ecf20Sopenharmony_ci	 cmp		%g1, 1
318c2ecf20Sopenharmony_ci	stb		%g0, [%g6 + TI_FPSAVED]
328c2ecf20Sopenharmony_ci	stx		%fsr, [%g6 + TI_XFSR]
338c2ecf20Sopenharmony_ci9:	jmpl		%g7 + %g0, %g0
348c2ecf20Sopenharmony_ci	 nop
358c2ecf20Sopenharmony_ci1:	bne,pn		%icc, 2f
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	 srl		%g1, 1, %g1
388c2ecf20Sopenharmony_civis1:	ldub		[%g6 + TI_FPSAVED], %g3
398c2ecf20Sopenharmony_ci	stx		%fsr, [%g6 + TI_XFSR]
408c2ecf20Sopenharmony_ci	or		%g3, %o5, %g3
418c2ecf20Sopenharmony_ci	stb		%g3, [%g6 + TI_FPSAVED]
428c2ecf20Sopenharmony_ci	rd		%gsr, %g3
438c2ecf20Sopenharmony_ci	clr		%g1
448c2ecf20Sopenharmony_ci	ba,pt		%xcc, 3f
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	 stx		%g3, [%g6 + TI_GSR]
478c2ecf20Sopenharmony_ci2:	add		%g6, %g1, %g3
488c2ecf20Sopenharmony_ci	mov		FPRS_DU | FPRS_DL | FPRS_FEF, %o5
498c2ecf20Sopenharmony_ci	sll		%g1, 3, %g1
508c2ecf20Sopenharmony_ci	stb		%o5, [%g3 + TI_FPSAVED]
518c2ecf20Sopenharmony_ci	rd		%gsr, %g2
528c2ecf20Sopenharmony_ci	add		%g6, %g1, %g3
538c2ecf20Sopenharmony_ci	stx		%g2, [%g3 + TI_GSR]
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	add		%g6, %g1, %g2
568c2ecf20Sopenharmony_ci	stx		%fsr, [%g2 + TI_XFSR]
578c2ecf20Sopenharmony_ci	sll		%g1, 5, %g1
588c2ecf20Sopenharmony_ci3:	andcc		%o5, FPRS_DL|FPRS_DU, %g0
598c2ecf20Sopenharmony_ci	be,pn		%icc, 9b
608c2ecf20Sopenharmony_ci	 add		%g6, TI_FPREGS, %g2
618c2ecf20Sopenharmony_ci	andcc		%o5, FPRS_DL, %g0
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	be,pn		%icc, 4f
648c2ecf20Sopenharmony_ci	 add		%g6, TI_FPREGS+0x40, %g3
658c2ecf20Sopenharmony_ci	membar		#Sync
668c2ecf20Sopenharmony_ci	stda		%f0, [%g2 + %g1] ASI_BLK_P
678c2ecf20Sopenharmony_ci	stda		%f16, [%g3 + %g1] ASI_BLK_P
688c2ecf20Sopenharmony_ci	membar		#Sync
698c2ecf20Sopenharmony_ci	andcc		%o5, FPRS_DU, %g0
708c2ecf20Sopenharmony_ci	be,pn		%icc, 5f
718c2ecf20Sopenharmony_ci4:	 add		%g1, 128, %g1
728c2ecf20Sopenharmony_ci	membar		#Sync
738c2ecf20Sopenharmony_ci	stda		%f32, [%g2 + %g1] ASI_BLK_P
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci	stda		%f48, [%g3 + %g1] ASI_BLK_P
768c2ecf20Sopenharmony_ci5:	membar		#Sync
778c2ecf20Sopenharmony_ci	ba,pt		%xcc, 80f
788c2ecf20Sopenharmony_ci	 nop
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	.align		32
818c2ecf20Sopenharmony_ci80:	jmpl		%g7 + %g0, %g0
828c2ecf20Sopenharmony_ci	 nop
838c2ecf20Sopenharmony_ciENDPROC(VISenter)
848c2ecf20Sopenharmony_ciEXPORT_SYMBOL(VISenter)
85