1/* 2 * Copyright (c) 2011 Aeroflex Gaisler 3 * 4 * BSD license: 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 26#include <asm-leon/asmmacro.h> 27#include <asm-leon/leonstack.h> 28#include <asm-leon/winmacros.h> 29#include <asm-leon/leon.h> 30 31#ifndef _SOFT_FLOAT 32 33 .seg "text" 34 /* ------- */ 35 .weak _fpdis_enable_svt 36 .set _fpdis_enable_svt,__fpdis_enable_svt 37 .weak _fpdis_enable 38 .set _fpdis_enable,__fpdis_enable 39 /* ------- */ 40 !.global _fpdis_enable,_fpdis_enable_svt 41__fpdis_enable_svt: 42__fpdis_enable: 43 44 set SPARC_PSR_EF_MASK,%l3 45 or %l0,%l3,%l0 46 or %l0,0xf00, %l3 ! PIL up to 15, enable fpu 47 wr %l3,0, %psr ! restore the condition flags, enable fpu 48 nop 49 nop 50 nop 51 52 mov %psr, %l3 ! check if fpu is present 53 set SPARC_PSR_EF_MASK,%l4 54 andcc %l3, %l4, %l3 55 bne 4f 56 nop 57 58 ta 0 ! no fpu present, halt 59 604: 61 set fpustate_current,%l4 62 63 ld [%l4],%l4 64 set fpustate_owner,%l5 65 ld [%l5],%l5 66 cmp %l4,%l5 67 beq mpfnostore 68 nop 69 cmp %g0,%l5 70 beq mpfstore 71 nop 72 73 FW_STORE(%l5) 74 75mpfstore: 76 set fpustate_owner,%l6 77 st %l4,[%l6] 78 cmp %g0,%l4 79 beq mpfnostore 80 nop 81 82 FW_LOAD(%l4) 83 84mpfnostore: 85 wr %l0,0, %psr ! restore the condition flags, enable fpu 86 nop 87 nop 88 nop 89 90 jmpl %l1, %g0 91 rett %l2 92 93 .seg "data" 94 95 .global fpustate_default 96 .align 8 97fpustate_default: 98 .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; 99 .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; 100 .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; 101 .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; 102 .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; 103 .global fpustate_owner 104fpustate_owner: 105 .word fpustate_default ! pointer to FPU owning context 106 107 .global fpustate_current 108fpustate_current: 109 .word fpustate_default ! pointer to current threads FPU context 110 111#endif 112