xref: /openbmc/linux/arch/mips/kvm/fpu.S (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
198e91b84SJames Hogan/*
298e91b84SJames Hogan * This file is subject to the terms and conditions of the GNU General Public
398e91b84SJames Hogan * License.  See the file "COPYING" in the main directory of this archive
498e91b84SJames Hogan * for more details.
598e91b84SJames Hogan *
698e91b84SJames Hogan * FPU context handling code for KVM.
798e91b84SJames Hogan *
898e91b84SJames Hogan * Copyright (C) 2015 Imagination Technologies Ltd.
998e91b84SJames Hogan */
1098e91b84SJames Hogan
1198e91b84SJames Hogan#include <asm/asm.h>
1298e91b84SJames Hogan#include <asm/asm-offsets.h>
1398e91b84SJames Hogan#include <asm/fpregdef.h>
1498e91b84SJames Hogan#include <asm/mipsregs.h>
1598e91b84SJames Hogan#include <asm/regdef.h>
1698e91b84SJames Hogan
17d14740feSJames Hogan/* preprocessor replaces the fp in ".set fp=64" with $30 otherwise */
18d14740feSJames Hogan#undef fp
19d14740feSJames Hogan
2098e91b84SJames Hogan	.set	noreorder
2198e91b84SJames Hogan	.set	noat
2298e91b84SJames Hogan
2398e91b84SJames HoganLEAF(__kvm_save_fpu)
2498e91b84SJames Hogan	.set	push
25*80a20d2fSNathan Chancellor	.set	hardfloat
26d14740feSJames Hogan	.set	fp=64
2798e91b84SJames Hogan	mfc0	t0, CP0_STATUS
2898e91b84SJames Hogan	sll     t0, t0, 5			# is Status.FR set?
2998e91b84SJames Hogan	bgez    t0, 1f				# no: skip odd doubles
3098e91b84SJames Hogan	 nop
3198e91b84SJames Hogan	sdc1	$f1,  VCPU_FPR1(a0)
3298e91b84SJames Hogan	sdc1	$f3,  VCPU_FPR3(a0)
3398e91b84SJames Hogan	sdc1	$f5,  VCPU_FPR5(a0)
3498e91b84SJames Hogan	sdc1	$f7,  VCPU_FPR7(a0)
3598e91b84SJames Hogan	sdc1	$f9,  VCPU_FPR9(a0)
3698e91b84SJames Hogan	sdc1	$f11, VCPU_FPR11(a0)
3798e91b84SJames Hogan	sdc1	$f13, VCPU_FPR13(a0)
3898e91b84SJames Hogan	sdc1	$f15, VCPU_FPR15(a0)
3998e91b84SJames Hogan	sdc1	$f17, VCPU_FPR17(a0)
4098e91b84SJames Hogan	sdc1	$f19, VCPU_FPR19(a0)
4198e91b84SJames Hogan	sdc1	$f21, VCPU_FPR21(a0)
4298e91b84SJames Hogan	sdc1	$f23, VCPU_FPR23(a0)
4398e91b84SJames Hogan	sdc1	$f25, VCPU_FPR25(a0)
4498e91b84SJames Hogan	sdc1	$f27, VCPU_FPR27(a0)
4598e91b84SJames Hogan	sdc1	$f29, VCPU_FPR29(a0)
4698e91b84SJames Hogan	sdc1	$f31, VCPU_FPR31(a0)
4798e91b84SJames Hogan1:	sdc1	$f0,  VCPU_FPR0(a0)
4898e91b84SJames Hogan	sdc1	$f2,  VCPU_FPR2(a0)
4998e91b84SJames Hogan	sdc1	$f4,  VCPU_FPR4(a0)
5098e91b84SJames Hogan	sdc1	$f6,  VCPU_FPR6(a0)
5198e91b84SJames Hogan	sdc1	$f8,  VCPU_FPR8(a0)
5298e91b84SJames Hogan	sdc1	$f10, VCPU_FPR10(a0)
5398e91b84SJames Hogan	sdc1	$f12, VCPU_FPR12(a0)
5498e91b84SJames Hogan	sdc1	$f14, VCPU_FPR14(a0)
5598e91b84SJames Hogan	sdc1	$f16, VCPU_FPR16(a0)
5698e91b84SJames Hogan	sdc1	$f18, VCPU_FPR18(a0)
5798e91b84SJames Hogan	sdc1	$f20, VCPU_FPR20(a0)
5898e91b84SJames Hogan	sdc1	$f22, VCPU_FPR22(a0)
5998e91b84SJames Hogan	sdc1	$f24, VCPU_FPR24(a0)
6098e91b84SJames Hogan	sdc1	$f26, VCPU_FPR26(a0)
6198e91b84SJames Hogan	sdc1	$f28, VCPU_FPR28(a0)
6298e91b84SJames Hogan	jr	ra
6398e91b84SJames Hogan	 sdc1	$f30, VCPU_FPR30(a0)
6498e91b84SJames Hogan	.set	pop
6598e91b84SJames Hogan	END(__kvm_save_fpu)
6698e91b84SJames Hogan
6798e91b84SJames HoganLEAF(__kvm_restore_fpu)
6898e91b84SJames Hogan	.set	push
69*80a20d2fSNathan Chancellor	.set	hardfloat
70d14740feSJames Hogan	.set	fp=64
7198e91b84SJames Hogan	mfc0	t0, CP0_STATUS
7298e91b84SJames Hogan	sll     t0, t0, 5			# is Status.FR set?
7398e91b84SJames Hogan	bgez    t0, 1f				# no: skip odd doubles
7498e91b84SJames Hogan	 nop
7598e91b84SJames Hogan	ldc1	$f1,  VCPU_FPR1(a0)
7698e91b84SJames Hogan	ldc1	$f3,  VCPU_FPR3(a0)
7798e91b84SJames Hogan	ldc1	$f5,  VCPU_FPR5(a0)
7898e91b84SJames Hogan	ldc1	$f7,  VCPU_FPR7(a0)
7998e91b84SJames Hogan	ldc1	$f9,  VCPU_FPR9(a0)
8098e91b84SJames Hogan	ldc1	$f11, VCPU_FPR11(a0)
8198e91b84SJames Hogan	ldc1	$f13, VCPU_FPR13(a0)
8298e91b84SJames Hogan	ldc1	$f15, VCPU_FPR15(a0)
8398e91b84SJames Hogan	ldc1	$f17, VCPU_FPR17(a0)
8498e91b84SJames Hogan	ldc1	$f19, VCPU_FPR19(a0)
8598e91b84SJames Hogan	ldc1	$f21, VCPU_FPR21(a0)
8698e91b84SJames Hogan	ldc1	$f23, VCPU_FPR23(a0)
8798e91b84SJames Hogan	ldc1	$f25, VCPU_FPR25(a0)
8898e91b84SJames Hogan	ldc1	$f27, VCPU_FPR27(a0)
8998e91b84SJames Hogan	ldc1	$f29, VCPU_FPR29(a0)
9098e91b84SJames Hogan	ldc1	$f31, VCPU_FPR31(a0)
9198e91b84SJames Hogan1:	ldc1	$f0,  VCPU_FPR0(a0)
9298e91b84SJames Hogan	ldc1	$f2,  VCPU_FPR2(a0)
9398e91b84SJames Hogan	ldc1	$f4,  VCPU_FPR4(a0)
9498e91b84SJames Hogan	ldc1	$f6,  VCPU_FPR6(a0)
9598e91b84SJames Hogan	ldc1	$f8,  VCPU_FPR8(a0)
9698e91b84SJames Hogan	ldc1	$f10, VCPU_FPR10(a0)
9798e91b84SJames Hogan	ldc1	$f12, VCPU_FPR12(a0)
9898e91b84SJames Hogan	ldc1	$f14, VCPU_FPR14(a0)
9998e91b84SJames Hogan	ldc1	$f16, VCPU_FPR16(a0)
10098e91b84SJames Hogan	ldc1	$f18, VCPU_FPR18(a0)
10198e91b84SJames Hogan	ldc1	$f20, VCPU_FPR20(a0)
10298e91b84SJames Hogan	ldc1	$f22, VCPU_FPR22(a0)
10398e91b84SJames Hogan	ldc1	$f24, VCPU_FPR24(a0)
10498e91b84SJames Hogan	ldc1	$f26, VCPU_FPR26(a0)
10598e91b84SJames Hogan	ldc1	$f28, VCPU_FPR28(a0)
10698e91b84SJames Hogan	jr	ra
10798e91b84SJames Hogan	 ldc1	$f30, VCPU_FPR30(a0)
10898e91b84SJames Hogan	.set	pop
10998e91b84SJames Hogan	END(__kvm_restore_fpu)
11098e91b84SJames Hogan
11198e91b84SJames HoganLEAF(__kvm_restore_fcsr)
11298e91b84SJames Hogan	.set	push
113*80a20d2fSNathan Chancellor	.set	hardfloat
11498e91b84SJames Hogan	lw	t0, VCPU_FCR31(a0)
11598e91b84SJames Hogan	/*
11698e91b84SJames Hogan	 * The ctc1 must stay at this offset in __kvm_restore_fcsr.
11798e91b84SJames Hogan	 * See kvm_mips_csr_die_notify() which handles t0 containing a value
11898e91b84SJames Hogan	 * which triggers an FP Exception, which must be stepped over and
11998e91b84SJames Hogan	 * ignored since the set cause bits must remain there for the guest.
12098e91b84SJames Hogan	 */
12198e91b84SJames Hogan	ctc1	t0, fcr31
12298e91b84SJames Hogan	jr	ra
12398e91b84SJames Hogan	 nop
12498e91b84SJames Hogan	.set	pop
12598e91b84SJames Hogan	END(__kvm_restore_fcsr)
126