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