guest_mips_defs.h revision c36ed7a14ec92dee029d0fa5918afc71a475432b
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-2013 RT-RK
11      mips-valgrind@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. */
44extern 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. */
58extern IRExpr *guest_mips32_spechelper ( const HChar * function_name,
59                                         IRExpr ** args,
60                                         IRStmt ** precedingStmts,
61                                         Int n_precedingStmts );
62
63extern 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. */
71extern
72Bool guest_mips32_state_requires_precise_mem_exns ( Int, Int,
73                                                    VexRegisterUpdates );
74
75extern
76Bool guest_mips64_state_requires_precise_mem_exns ( Int, Int,
77                                                    VexRegisterUpdates );
78
79extern VexGuestLayout mips32Guest_layout;
80extern VexGuestLayout mips64Guest_layout;
81
82/*---------------------------------------------------------*/
83/*---                mips guest helpers                 ---*/
84/*---------------------------------------------------------*/
85typedef 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
96extern UInt mips32_dirtyhelper_mfc0 ( UInt rd, UInt sel );
97
98extern ULong mips64_dirtyhelper_dmfc0 ( UInt rd, UInt sel );
99
100
101#if defined(__mips__) && ((defined(__mips_isa_rev) && __mips_isa_rev >= 2))
102extern UInt mips32_dirtyhelper_rdhwr ( UInt rt, UInt rd );
103extern ULong mips64_dirtyhelper_rdhwr ( ULong rt, ULong rd );
104#endif
105
106/* Calculate FCSR in fp32 mode. */
107extern UInt mips_dirtyhelper_calculate_FCSR_fp32 ( void* guest_state, UInt fs,
108                                                   UInt ft, flt_op op );
109/* Calculate FCSR in fp64 mode. */
110extern 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
117typedef 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