11da177e4SLinus Torvalds/* 21da177e4SLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 31da177e4SLinus Torvalds * License. See the file "COPYING" in the main directory of this archive 41da177e4SLinus Torvalds * for more details. 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Copyright (C) 1996, 1998 by Ralf Baechle 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * Multi-arch abstraction and asm macros for easier reading: 979add627SJustin P. Mattock * Copyright (C) 1996 David S. Miller (davem@davemloft.net) 101da177e4SLinus Torvalds * 111da177e4SLinus Torvalds * Further modifications to make this work: 121da177e4SLinus Torvalds * Copyright (c) 1998 Harald Koerfgen 131da177e4SLinus Torvalds */ 14*9259e15bSMasahiro Yamada#include <linux/export.h> 151da177e4SLinus Torvalds#include <asm/asm.h> 16423fb0d5SPaul Burton#include <asm/asmmacro.h> 171da177e4SLinus Torvalds#include <asm/errno.h> 181da177e4SLinus Torvalds#include <asm/fpregdef.h> 191da177e4SLinus Torvalds#include <asm/mipsregs.h> 20048eb582SSam Ravnborg#include <asm/asm-offsets.h> 211da177e4SLinus Torvalds#include <asm/regdef.h> 221da177e4SLinus Torvalds 231da177e4SLinus Torvalds#define EX(a,b) \ 241da177e4SLinus Torvalds9: a,##b; \ 251da177e4SLinus Torvalds .section __ex_table,"a"; \ 26fa62f39dSThomas Bogendoerfer PTR_WD 9b,fault; \ 271da177e4SLinus Torvalds .previous 281da177e4SLinus Torvalds 29f92722dcSMaciej W. Rozycki#define EX2(a,b) \ 30f92722dcSMaciej W. Rozycki9: a,##b; \ 31f92722dcSMaciej W. Rozycki .section __ex_table,"a"; \ 32fa62f39dSThomas Bogendoerfer PTR_WD 9b,fault; \ 33fa62f39dSThomas Bogendoerfer PTR_WD 9b+4,fault; \ 34f92722dcSMaciej W. Rozycki .previous 35f92722dcSMaciej W. Rozycki 361da177e4SLinus Torvalds .set mips1 37758ef0a9SMaciej W. Rozycki 38423fb0d5SPaul Burton/* 39423fb0d5SPaul Burton * Save a thread's fp context. 40423fb0d5SPaul Burton */ 41423fb0d5SPaul BurtonLEAF(_save_fp) 42423fb0d5SPaul BurtonEXPORT_SYMBOL(_save_fp) 43423fb0d5SPaul Burton fpu_save_single a0, t1 # clobbers t1 44423fb0d5SPaul Burton jr ra 45423fb0d5SPaul Burton END(_save_fp) 46423fb0d5SPaul Burton 47423fb0d5SPaul Burton/* 48423fb0d5SPaul Burton * Restore a thread's fp context. 49423fb0d5SPaul Burton */ 50423fb0d5SPaul BurtonLEAF(_restore_fp) 51423fb0d5SPaul Burton fpu_restore_single a0, t1 # clobbers t1 52423fb0d5SPaul Burton jr ra 53423fb0d5SPaul Burton END(_restore_fp) 54423fb0d5SPaul Burton 55423fb0d5SPaul Burton .set noreorder 56423fb0d5SPaul Burton 57758ef0a9SMaciej W. Rozycki/** 58758ef0a9SMaciej W. Rozycki * _save_fp_context() - save FP context from the FPU 59758ef0a9SMaciej W. Rozycki * @a0 - pointer to fpregs field of sigcontext 60758ef0a9SMaciej W. Rozycki * @a1 - pointer to fpc_csr field of sigcontext 61758ef0a9SMaciej W. Rozycki * 62758ef0a9SMaciej W. Rozycki * Save FP context, including the 32 FP data registers and the FP 63758ef0a9SMaciej W. Rozycki * control & status register, from the FPU to signal context. 64758ef0a9SMaciej W. Rozycki */ 651da177e4SLinus TorvaldsLEAF(_save_fp_context) 66842dfc11SManuel Lauss .set push 6780a20d2fSNathan Chancellor .set hardfloat 681da177e4SLinus Torvalds li v0, 0 # assume success 691da177e4SLinus Torvalds cfc1 t1, fcr31 70f92722dcSMaciej W. Rozycki EX2(s.d $f0, 0(a0)) 71f92722dcSMaciej W. Rozycki EX2(s.d $f2, 16(a0)) 72f92722dcSMaciej W. Rozycki EX2(s.d $f4, 32(a0)) 73f92722dcSMaciej W. Rozycki EX2(s.d $f6, 48(a0)) 74f92722dcSMaciej W. Rozycki EX2(s.d $f8, 64(a0)) 75f92722dcSMaciej W. Rozycki EX2(s.d $f10, 80(a0)) 76f92722dcSMaciej W. Rozycki EX2(s.d $f12, 96(a0)) 77f92722dcSMaciej W. Rozycki EX2(s.d $f14, 112(a0)) 78f92722dcSMaciej W. Rozycki EX2(s.d $f16, 128(a0)) 79f92722dcSMaciej W. Rozycki EX2(s.d $f18, 144(a0)) 80f92722dcSMaciej W. Rozycki EX2(s.d $f20, 160(a0)) 81f92722dcSMaciej W. Rozycki EX2(s.d $f22, 176(a0)) 82f92722dcSMaciej W. Rozycki EX2(s.d $f24, 192(a0)) 83f92722dcSMaciej W. Rozycki EX2(s.d $f26, 208(a0)) 84f92722dcSMaciej W. Rozycki EX2(s.d $f28, 224(a0)) 85f92722dcSMaciej W. Rozycki EX2(s.d $f30, 240(a0)) 861da177e4SLinus Torvalds jr ra 87758ef0a9SMaciej W. Rozycki EX(sw t1, (a1)) 88842dfc11SManuel Lauss .set pop 891da177e4SLinus Torvalds END(_save_fp_context) 901da177e4SLinus Torvalds 91758ef0a9SMaciej W. Rozycki/** 92758ef0a9SMaciej W. Rozycki * _restore_fp_context() - restore FP context to the FPU 93758ef0a9SMaciej W. Rozycki * @a0 - pointer to fpregs field of sigcontext 94758ef0a9SMaciej W. Rozycki * @a1 - pointer to fpc_csr field of sigcontext 951da177e4SLinus Torvalds * 96758ef0a9SMaciej W. Rozycki * Restore FP context, including the 32 FP data registers and the FP 97758ef0a9SMaciej W. Rozycki * control & status register, from signal context to the FPU. 981da177e4SLinus Torvalds */ 991da177e4SLinus TorvaldsLEAF(_restore_fp_context) 100842dfc11SManuel Lauss .set push 10180a20d2fSNathan Chancellor .set hardfloat 1021da177e4SLinus Torvalds li v0, 0 # assume success 103758ef0a9SMaciej W. Rozycki EX(lw t0, (a1)) 104f92722dcSMaciej W. Rozycki EX2(l.d $f0, 0(a0)) 105f92722dcSMaciej W. Rozycki EX2(l.d $f2, 16(a0)) 106f92722dcSMaciej W. Rozycki EX2(l.d $f4, 32(a0)) 107f92722dcSMaciej W. Rozycki EX2(l.d $f6, 48(a0)) 108f92722dcSMaciej W. Rozycki EX2(l.d $f8, 64(a0)) 109f92722dcSMaciej W. Rozycki EX2(l.d $f10, 80(a0)) 110f92722dcSMaciej W. Rozycki EX2(l.d $f12, 96(a0)) 111f92722dcSMaciej W. Rozycki EX2(l.d $f14, 112(a0)) 112f92722dcSMaciej W. Rozycki EX2(l.d $f16, 128(a0)) 113f92722dcSMaciej W. Rozycki EX2(l.d $f18, 144(a0)) 114f92722dcSMaciej W. Rozycki EX2(l.d $f20, 160(a0)) 115f92722dcSMaciej W. Rozycki EX2(l.d $f22, 176(a0)) 116f92722dcSMaciej W. Rozycki EX2(l.d $f24, 192(a0)) 117f92722dcSMaciej W. Rozycki EX2(l.d $f26, 208(a0)) 118f92722dcSMaciej W. Rozycki EX2(l.d $f28, 224(a0)) 119f92722dcSMaciej W. Rozycki EX2(l.d $f30, 240(a0)) 1201da177e4SLinus Torvalds jr ra 1211da177e4SLinus Torvalds ctc1 t0, fcr31 122842dfc11SManuel Lauss .set pop 1231da177e4SLinus Torvalds END(_restore_fp_context) 1241da177e4SLinus Torvalds .set reorder 1251da177e4SLinus Torvalds 12651ff5d77SDaniel Sanders .type fault, @function 1271da177e4SLinus Torvalds .ent fault 1281da177e4SLinus Torvaldsfault: li v0, -EFAULT 1291da177e4SLinus Torvalds jr ra 1301da177e4SLinus Torvalds .end fault 131