cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fp_emu.h (4266B)


      1/*
      2 * fp_emu.h
      3 *
      4 * Copyright Roman Zippel, 1997.  All rights reserved.
      5 *
      6 * Redistribution and use in source and binary forms, with or without
      7 * modification, are permitted provided that the following conditions
      8 * are met:
      9 * 1. Redistributions of source code must retain the above copyright
     10 *    notice, and the entire permission notice in its entirety,
     11 *    including the disclaimer of warranties.
     12 * 2. Redistributions in binary form must reproduce the above copyright
     13 *    notice, this list of conditions and the following disclaimer in the
     14 *    documentation and/or other materials provided with the distribution.
     15 * 3. The name of the author may not be used to endorse or promote
     16 *    products derived from this software without specific prior
     17 *    written permission.
     18 *
     19 * ALTERNATIVELY, this product may be distributed under the terms of
     20 * the GNU General Public License, in which case the provisions of the GPL are
     21 * required INSTEAD OF the above restrictions.  (This clause is
     22 * necessary due to a potential bad interaction between the GPL and
     23 * the restrictions contained in a BSD-style copyright.)
     24 *
     25 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
     26 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     27 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     28 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     29 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     35 * OF THE POSSIBILITY OF SUCH DAMAGE.
     36 */
     37
     38#ifndef _FP_EMU_H
     39#define _FP_EMU_H
     40
     41#ifdef __ASSEMBLY__
     42#include <asm/asm-offsets.h>
     43#endif
     44#include <asm/math-emu.h>
     45
     46#ifndef __ASSEMBLY__
     47
     48#define IS_INF(a) ((a)->exp == 0x7fff)
     49#define IS_ZERO(a) ((a)->mant.m64 == 0)
     50
     51
     52#define fp_set_sr(bit) ({					\
     53	FPDATA->fpsr |= 1 << (bit);				\
     54})
     55
     56#define fp_set_quotient(quotient) ({				\
     57	FPDATA->fpsr &= 0xff00ffff;				\
     58	FPDATA->fpsr |= ((quotient) & 0xff) << 16;		\
     59})
     60
     61/* linkage for several useful functions */
     62
     63/* Normalize the extended struct, return 0 for a NaN */
     64#define fp_normalize_ext(fpreg) ({				\
     65	register struct fp_ext *reg asm ("a0") = fpreg;		\
     66	register int res asm ("d0");				\
     67								\
     68	asm volatile ("jsr fp_conv_ext2ext"			\
     69			: "=d" (res) : "a" (reg)		\
     70			: "a1", "d1", "d2", "memory");		\
     71	res;							\
     72})
     73
     74#define fp_copy_ext(dest, src) ({				\
     75	*dest = *src;						\
     76})
     77
     78#define fp_monadic_check(dest, src) ({				\
     79	fp_copy_ext(dest, src);					\
     80	if (!fp_normalize_ext(dest))				\
     81		return dest;					\
     82})
     83
     84#define fp_dyadic_check(dest, src) ({				\
     85	if (!fp_normalize_ext(dest))				\
     86		return dest;					\
     87	if (!fp_normalize_ext(src)) {				\
     88		fp_copy_ext(dest, src);				\
     89		return dest;					\
     90	}							\
     91})
     92
     93extern const struct fp_ext fp_QNaN;
     94extern const struct fp_ext fp_Inf;
     95
     96#define fp_set_nan(dest) ({					\
     97	fp_set_sr(FPSR_EXC_OPERR);				\
     98	*dest = fp_QNaN;					\
     99})
    100
    101/* TODO check rounding mode? */
    102#define fp_set_ovrflw(dest) ({					\
    103	fp_set_sr(FPSR_EXC_OVFL);				\
    104	dest->exp = 0x7fff;					\
    105	dest->mant.m64 = 0;					\
    106})
    107
    108#define fp_conv_ext2long(src) ({				\
    109	register struct fp_ext *__src asm ("a0") = src;		\
    110	register int __res asm ("d0");				\
    111								\
    112	asm volatile ("jsr fp_conv_ext2long"			\
    113			: "=d" (__res) : "a" (__src)		\
    114			: "a1", "d1", "d2", "memory");		\
    115	__res;							\
    116})
    117
    118#define fp_conv_long2ext(dest, src) ({				\
    119	register struct fp_ext *__dest asm ("a0") = dest;	\
    120	register int __src asm ("d0") = src;			\
    121								\
    122	asm volatile ("jsr fp_conv_ext2long"			\
    123			: : "d" (__src), "a" (__dest)		\
    124			: "a1", "d1", "d2", "memory");		\
    125})
    126
    127#else /* __ASSEMBLY__ */
    128
    129/*
    130 * set, reset or clear a bit in the fp status register
    131 */
    132.macro	fp_set_sr	bit
    133	bset	#(\bit&7),(FPD_FPSR+3-(\bit/8),FPDATA)
    134.endm
    135
    136.macro	fp_clr_sr	bit
    137	bclr	#(\bit&7),(FPD_FPSR+3-(\bit/8),FPDATA)
    138.endm
    139
    140.macro	fp_tst_sr	bit
    141	btst	#(\bit&7),(FPD_FPSR+3-(\bit/8),FPDATA)
    142.endm
    143
    144#endif /* __ASSEMBLY__ */
    145
    146#endif /* _FP_EMU_H */