1 2 /*---------------------------------------------------------------*/ 3 /*--- begin libvex_guest_mips32.h ---*/ 4 /*---------------------------------------------------------------*/ 5 6 /* 7 This file is part of Valgrind, a dynamic binary instrumentation 8 framework. 9 10 Copyright (C) 2010-2017 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 #ifndef __LIBVEX_PUB_GUEST_MIPS32_H 32 #define __LIBVEX_PUB_GUEST_MIPS32_H 33 34 #include "libvex_basictypes.h" 35 36 37 /*---------------------------------------------------------------*/ 38 /*--- Vex's representation of the MIPS32 CPU state. ---*/ 39 /*---------------------------------------------------------------*/ 40 41 typedef 42 struct { 43 /* 0 */ UInt host_EvC_FAILADDR; 44 /* 4 */ UInt host_EvC_COUNTER; 45 46 /* CPU Registers */ 47 /* 8 */ UInt guest_r0; /* Hardwired to 0. */ 48 /* 12 */ UInt guest_r1; /* Assembler temporary */ 49 /* 16 */ UInt guest_r2; /* Values for function returns ...*/ 50 /* 20 */ UInt guest_r3; /* ... and expression evaluation */ 51 /* 24 */ UInt guest_r4; /* Function arguments */ 52 /* 28 */ UInt guest_r5; 53 /* 32 */ UInt guest_r6; 54 /* 36 */ UInt guest_r7; 55 /* 40 */ UInt guest_r8; /* Temporaries */ 56 /* 44 */ UInt guest_r9; 57 /* 48 */ UInt guest_r10; 58 /* 52 */ UInt guest_r11; 59 /* 56 */ UInt guest_r12; 60 /* 60 */ UInt guest_r13; 61 /* 64 */ UInt guest_r14; 62 /* 68 */ UInt guest_r15; 63 /* 72 */ UInt guest_r16; /* Saved temporaries */ 64 /* 76 */ UInt guest_r17; 65 /* 80 */ UInt guest_r18; 66 /* 84 */ UInt guest_r19; 67 /* 88 */ UInt guest_r20; 68 /* 92 */ UInt guest_r21; 69 /* 96 */ UInt guest_r22; 70 /* 100 */ UInt guest_r23; 71 /* 104 */ UInt guest_r24; /* Temporaries */ 72 /* 108 */ UInt guest_r25; 73 /* 112 */ UInt guest_r26; /* Reserved for OS kernel */ 74 /* 116 */ UInt guest_r27; 75 /* 120 */ UInt guest_r28; /* Global pointer */ 76 /* 124 */ UInt guest_r29; /* Stack pointer */ 77 /* 128 */ UInt guest_r30; /* Frame pointer */ 78 /* 132 */ UInt guest_r31; /* Return address */ 79 /* 136 */ UInt guest_PC; /* Program counter */ 80 /* 140 */ UInt guest_HI; /* Multiply and divide reg higher result */ 81 /* 144 */ UInt guest_LO; /* Multiply and divide reg lower result */ 82 /* 148 */ UInt _padding1; 83 84 /* FPU Registers */ 85 /* 152 */ ULong guest_f0; /* Floating point general purpose registers */ 86 /* 160 */ ULong guest_f1; 87 /* 168 */ ULong guest_f2; 88 /* 176 */ ULong guest_f3; 89 /* 184 */ ULong guest_f4; 90 /* 192 */ ULong guest_f5; 91 /* 200 */ ULong guest_f6; 92 /* 208 */ ULong guest_f7; 93 /* 216 */ ULong guest_f8; 94 /* 224 */ ULong guest_f9; 95 /* 232 */ ULong guest_f10; 96 /* 240 */ ULong guest_f11; 97 /* 248 */ ULong guest_f12; 98 /* 256 */ ULong guest_f13; 99 /* 264 */ ULong guest_f14; 100 /* 272 */ ULong guest_f15; 101 /* 280 */ ULong guest_f16; 102 /* 288 */ ULong guest_f17; 103 /* 296 */ ULong guest_f18; 104 /* 304 */ ULong guest_f19; 105 /* 312 */ ULong guest_f20; 106 /* 320 */ ULong guest_f21; 107 /* 328 */ ULong guest_f22; 108 /* 336 */ ULong guest_f23; 109 /* 344 */ ULong guest_f24; 110 /* 352 */ ULong guest_f25; 111 /* 360 */ ULong guest_f26; 112 /* 368 */ ULong guest_f27; 113 /* 376 */ ULong guest_f28; 114 /* 384 */ ULong guest_f29; 115 /* 392 */ ULong guest_f30; 116 /* 400 */ ULong guest_f31; 117 118 /* 408 */ UInt guest_FIR; 119 /* 412 */ UInt guest_FCCR; 120 /* 416 */ UInt guest_FEXR; 121 /* 420 */ UInt guest_FENR; 122 /* 424 */ UInt guest_FCSR; 123 124 /* TLS pointer for the thread. It's read-only in user space. 125 On Linux it is set in user space by various thread-related 126 syscalls. 127 User Local Register. 128 This register provides read access to the coprocessor 0 129 UserLocal register, if it is implemented. In some operating 130 environments, the UserLocal register is a pointer to a 131 thread-specific storage block. 132 */ 133 /* 428 */ UInt guest_ULR; 134 135 /* Emulation notes */ 136 /* 432 */ UInt guest_EMNOTE; 137 138 /* For clflush: record start and length of area to invalidate. */ 139 /* 436 */ UInt guest_CMSTART; 140 /* 440 */ UInt guest_CMLEN; 141 /* 444 */ UInt guest_NRADDR; 142 143 /* 448 */ UInt guest_COND; 144 145 /* MIPS32 DSP ASE(r2) specific registers. */ 146 /* 452 */ UInt guest_DSPControl; 147 /* 456 */ ULong guest_ac0; 148 /* 464 */ ULong guest_ac1; 149 /* 472 */ ULong guest_ac2; 150 /* 480 */ ULong guest_ac3; 151 152 /* 488 */ UInt guest_CP0_status; 153 /* 492 */ UInt guest_CP0_Config5; 154 155 /* 496 */ UInt guest_LLaddr; 156 /* 500 */ UInt guest_LLdata; 157 158 /* MIPS32 MSA 128-bit vector registers */ 159 /* 504 */ V128 guest_w0; 160 /* 520 */ V128 guest_w1; 161 /* 536 */ V128 guest_w2; 162 /* 552 */ V128 guest_w3; 163 /* 568 */ V128 guest_w4; 164 /* 584 */ V128 guest_w5; 165 /* 600 */ V128 guest_w6; 166 /* 616 */ V128 guest_w7; 167 /* 632 */ V128 guest_w8; 168 /* 648 */ V128 guest_w9; 169 /* 664 */ V128 guest_w10; 170 /* 680 */ V128 guest_w11; 171 /* 696 */ V128 guest_w12; 172 /* 712 */ V128 guest_w13; 173 /* 728 */ V128 guest_w14; 174 /* 744 */ V128 guest_w15; 175 /* 760 */ V128 guest_w16; 176 /* 776 */ V128 guest_w17; 177 /* 792 */ V128 guest_w18; 178 /* 808 */ V128 guest_w19; 179 /* 824 */ V128 guest_w20; 180 /* 840 */ V128 guest_w21; 181 /* 856 */ V128 guest_w22; 182 /* 872 */ V128 guest_w23; 183 /* 888 */ V128 guest_w24; 184 /* 904 */ V128 guest_w25; 185 /* 920 */ V128 guest_w26; 186 /* 936 */ V128 guest_w27; 187 /* 952 */ V128 guest_w28; 188 /* 968 */ V128 guest_w29; 189 /* 984 */ V128 guest_w30; 190 /* 1000 */ V128 guest_w31; 191 192 /* 1016 */ UInt guest_MSACSR; 193 194 /* 1020 */ UInt _padding3; 195 } VexGuestMIPS32State; 196 /*---------------------------------------------------------------*/ 197 /*--- Utility functions for MIPS32 guest stuff. ---*/ 198 /*---------------------------------------------------------------*/ 199 200 /* ALL THE FOLLOWING ARE VISIBLE TO LIBRARY CLIENT. */ 201 202 /* Initialise all guest MIPS32 state. */ 203 204 extern 205 void LibVEX_GuestMIPS32_initialise ( /*OUT*/VexGuestMIPS32State* vex_state ); 206 207 /* FR bit of CP0_STATUS_FR register */ 208 #define MIPS_CP0_STATUS_FR (1ul << 26) 209 210 /* FRE bit of CP0_Config5 register */ 211 #define MIPS_CONF5_FRE (1ul << 8) 212 213 #endif /* ndef __LIBVEX_PUB_GUEST_MIPS32_H */ 214 215 216 /*---------------------------------------------------------------*/ 217 /*--- libvex_guest_mips32.h ---*/ 218 /*---------------------------------------------------------------*/ 219