Home | History | Annotate | Download | only in priv
      1 
      2 /*---------------------------------------------------------------*/
      3 /*--- begin                                 guest_mips_defs.h ---*/
      4 /*---------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2010-2015 RT-RK
     11       mips-valgrind (at) rt-rk.com
     12 
     13    This program is free software; you can redistribute it and/or
     14    modify it under the terms of the GNU General Public License as
     15    published by the Free Software Foundation; either version 2 of the
     16    License, or (at your option) any later version.
     17 
     18    This program is distributed in the hope that it will be useful, but
     19    WITHOUT ANY WARRANTY; without even the implied warranty of
     20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     21    General Public License for more details.
     22 
     23    You should have received a copy of the GNU General Public License
     24    along with this program; if not, write to the Free Software
     25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     26    02111-1307, USA.
     27 
     28    The GNU General Public License is contained in the file COPYING.
     29 */
     30 
     31 /* Only to be used within the guest-mips directory. */
     32 
     33 #ifndef __VEX_GUEST_MIPS_DEFS_H
     34 #define __VEX_GUEST_MIPS_DEFS_H
     35 
     36 #include "libvex_basictypes.h"
     37 #include "guest_generic_bb_to_IR.h"  /* DisResult */
     38 
     39 /*---------------------------------------------------------*/
     40 /*---               mips to IR conversion               ---*/
     41 /*---------------------------------------------------------*/
     42 
     43 /* Convert one MIPS insn to IR. See the type DisOneInstrFn in bb_to_IR.h. */
     44 extern DisResult disInstr_MIPS ( IRSB*        irbb,
     45                                  Bool         (*resteerOkFn) (void *, Addr),
     46                                  Bool         resteerCisOk,
     47                                  void*        callback_opaque,
     48                                  const UChar* guest_code,
     49                                  Long         delta,
     50                                  Addr         guest_IP,
     51                                  VexArch      guest_arch,
     52                                  const VexArchInfo* archinfo,
     53                                  const VexAbiInfo*  abiinfo,
     54                                  VexEndness   host_endness,
     55                                  Bool         sigill_diag );
     56 
     57 /* Used by the optimiser to specialise calls to helpers. */
     58 extern IRExpr *guest_mips32_spechelper ( const HChar * function_name,
     59                                          IRExpr ** args,
     60                                          IRStmt ** precedingStmts,
     61                                          Int n_precedingStmts );
     62 
     63 extern IRExpr *guest_mips64_spechelper ( const HChar * function_name,
     64                                          IRExpr ** args,
     65                                          IRStmt ** precedingStmts,
     66                                          Int n_precedingStmts);
     67 
     68 /* Describes to the optimser which part of the guest state require
     69    precise memory exceptions.  This is logically part of the guest
     70    state description. */
     71 extern
     72 Bool guest_mips32_state_requires_precise_mem_exns ( Int, Int,
     73                                                     VexRegisterUpdates );
     74 
     75 extern
     76 Bool guest_mips64_state_requires_precise_mem_exns ( Int, Int,
     77                                                     VexRegisterUpdates );
     78 
     79 extern VexGuestLayout mips32Guest_layout;
     80 extern VexGuestLayout mips64Guest_layout;
     81 
     82 /*---------------------------------------------------------*/
     83 /*---                mips guest helpers                 ---*/
     84 /*---------------------------------------------------------*/
     85 typedef enum {
     86    CEILWS=0, CEILWD,  CEILLS,  CEILLD,
     87    FLOORWS,  FLOORWD, FLOORLS, FLOORLD,
     88    ROUNDWS,  ROUNDWD, ROUNDLS, ROUNDLD,
     89    TRUNCWS,  TRUNCWD, TRUNCLS, TRUNCLD,
     90    CVTDS,    CVTDW,   CVTSD,   CVTSW,
     91    CVTWS,    CVTWD,   CVTDL,   CVTLS,
     92    CVTLD,    CVTSL,   ADDS,    ADDD,
     93    SUBS,     SUBD,    DIVS
     94 } flt_op;
     95 
     96 extern UInt mips32_dirtyhelper_mfc0 ( UInt rd, UInt sel );
     97 
     98 extern ULong mips64_dirtyhelper_dmfc0 ( UInt rd, UInt sel );
     99 
    100 
    101 #if defined(__mips__) && ((defined(__mips_isa_rev) && __mips_isa_rev >= 2))
    102 extern UInt mips32_dirtyhelper_rdhwr ( UInt rt, UInt rd );
    103 extern ULong mips64_dirtyhelper_rdhwr ( ULong rt, ULong rd );
    104 #endif
    105 
    106 /* Calculate FCSR in fp32 mode. */
    107 extern UInt mips_dirtyhelper_calculate_FCSR_fp32 ( void* guest_state, UInt fs,
    108                                                    UInt ft, flt_op op );
    109 /* Calculate FCSR in fp64 mode. */
    110 extern UInt mips_dirtyhelper_calculate_FCSR_fp64 ( void* guest_state, UInt fs,
    111                                                    UInt ft, flt_op op );
    112 
    113 /*---------------------------------------------------------*/
    114 /*---               Condition code stuff                ---*/
    115 /*---------------------------------------------------------*/
    116 
    117 typedef enum {
    118    MIPSCondEQ = 0,   /* equal                         : Z=1 */
    119    MIPSCondNE = 1,   /* not equal                     : Z=0 */
    120 
    121    MIPSCondHS = 2,   /* >=u (higher or same)          : C=1 */
    122    MIPSCondLO = 3,   /* <u  (lower)                   : C=0 */
    123 
    124    MIPSCondMI = 4,   /* minus (negative)              : N=1 */
    125    MIPSCondPL = 5,   /* plus (zero or +ve)            : N=0 */
    126 
    127    MIPSCondVS = 6,   /* overflow                      : V=1 */
    128    MIPSCondVC = 7,   /* no overflow                   : V=0 */
    129 
    130    MIPSCondHI = 8,   /* >u   (higher)                 : C=1 && Z=0 */
    131    MIPSCondLS = 9,   /* <=u  (lower or same)          : C=0 || Z=1 */
    132 
    133    MIPSCondGE = 10,  /* >=s (signed greater or equal) : N=V */
    134    MIPSCondLT = 11,  /* <s  (signed less than)        : N!=V */
    135 
    136    MIPSCondGT = 12,  /* >s  (signed greater)          : Z=0 && N=V */
    137    MIPSCondLE = 13,  /* <=s (signed less or equal)    : Z=1 || N!=V */
    138 
    139    MIPSCondAL = 14,  /* always (unconditional)        : 1 */
    140    MIPSCondNV = 15   /* never (unconditional):        : 0 */
    141 } MIPSCondcode;
    142 
    143 #endif            /* __VEX_GUEST_MIPS_DEFS_H */
    144 
    145 /*---------------------------------------------------------------*/
    146 /*--- end                                   guest_mips_defs.h ---*/
    147 /*---------------------------------------------------------------*/
    148