/*---------------------------------------------------------------*/
/*--- begin                             libvex_guest_mips32.h ---*/
/*---------------------------------------------------------------*/

/*
   This file is part of Valgrind, a dynamic binary instrumentation
   framework.

   Copyright (C) 2010-2015 RT-RK
      mips-valgrind@rt-rk.com

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307, USA.

   The GNU General Public License is contained in the file COPYING.
*/

#ifndef __LIBVEX_PUB_GUEST_MIPS32_H
#define __LIBVEX_PUB_GUEST_MIPS32_H

#include "libvex_basictypes.h"


/*---------------------------------------------------------------*/
/*--- Vex's representation of the MIPS32 CPU state.           ---*/
/*---------------------------------------------------------------*/

typedef
   struct {
      /* CPU Registers */
      /* 0 */ UInt guest_r0;   /* Hardwired to 0 */
      /* 4 */ UInt guest_r1;   /* Assembler temporary */
      /* 8 */ UInt guest_r2;   /* Values for function returns ...*/
      /* 12 */ UInt guest_r3;  /* ...and expression evaluation */
      /* 16 */ UInt guest_r4;  /* Function arguments */
      /* 20 */ UInt guest_r5;
      /* 24 */ UInt guest_r6;
      /* 28 */ UInt guest_r7;
      /* 32 */ UInt guest_r8;  /* Temporaries */
      /* 36 */ UInt guest_r9;
      /* 40 */ UInt guest_r10;
      /* 44 */ UInt guest_r11;
      /* 48 */ UInt guest_r12;
      /* 52 */ UInt guest_r13;
      /* 56 */ UInt guest_r14;
      /* 60 */ UInt guest_r15;
      /* 64 */ UInt guest_r16;  /* Saved temporaries */
      /* 68 */ UInt guest_r17;
      /* 72 */ UInt guest_r18;
      /* 76 */ UInt guest_r19;
      /* 80 */ UInt guest_r20;
      /* 84 */ UInt guest_r21;
      /* 88 */ UInt guest_r22;
      /* 92 */ UInt guest_r23;
      /* 96 */ UInt guest_r24;  /* Temporaries */
      /* 100 */ UInt guest_r25;
      /* 104 */ UInt guest_r26;  /* Reserved for OS kernel */
      /* 108 */ UInt guest_r27;
      /* 112 */ UInt guest_r28;  /* Global pointer */
      /* 116 */ UInt guest_r29;  /* Stack pointer */
      /* 120 */ UInt guest_r30;  /* Frame pointer */
      /* 124 */ UInt guest_r31;  /* Return address */
      /* 128 */ UInt guest_PC;  /* Program counter */
      /* 132 */ UInt guest_HI;  /* Multiply and divide register higher result */
      /* 136 */ UInt guest_LO;  /* Multiply and divide register lower result */

      /* FPU Registers */
      /* 144 */ ULong guest_f0;  /* Floating point general purpose registers */
      /* 152 */ ULong guest_f1;
      /* 160 */ ULong guest_f2;
      /* 168 */ ULong guest_f3;
      /* 176 */ ULong guest_f4;
      /* 184 */ ULong guest_f5;
      /* 192 */ ULong guest_f6;
      /* 200 */ ULong guest_f7;
      /* 208 */ ULong guest_f8;
      /* 216 */ ULong guest_f9;
      /* 224 */ ULong guest_f10;
      /* 232 */ ULong guest_f11;
      /* 240 */ ULong guest_f12;
      /* 248 */ ULong guest_f13;
      /* 256 */ ULong guest_f14;
      /* 264 */ ULong guest_f15;
      /* 272 */ ULong guest_f16;
      /* 280 */ ULong guest_f17;
      /* 288 */ ULong guest_f18;
      /* 296 */ ULong guest_f19;
      /* 304 */ ULong guest_f20;
      /* 312 */ ULong guest_f21;
      /* 320 */ ULong guest_f22;
      /* 328 */ ULong guest_f23;
      /* 336 */ ULong guest_f24;
      /* 344 */ ULong guest_f25;
      /* 352 */ ULong guest_f26;
      /* 360 */ ULong guest_f27;
      /* 368 */ ULong guest_f28;
      /* 376 */ ULong guest_f29;
      /* 384 */ ULong guest_f30;
      /* 392 */ ULong guest_f31;

      /* 400 */ UInt guest_FIR;
      /* 404 */ UInt guest_FCCR;
      /* 408 */ UInt guest_FEXR;
      /* 412 */ UInt guest_FENR;
      /* 416 */ UInt guest_FCSR;

      /* TLS pointer for the thread. It's read-only in user space.
         On Linux it is set in user space by various thread-related
         syscalls.
         User Local Register.
         This register provides read access to the coprocessor 0
         UserLocal register, if it is implemented. In some operating
         environments, the UserLocal register is a pointer to a
         thread-specific storage block.
      */
      /* 420 */ UInt guest_ULR;

      /* Emulation notes */
      /* 424 */ UInt guest_EMNOTE;

      /* For clflush: record start and length of area to invalidate */
      /* 428 */ UInt guest_CMSTART;
      /* 432 */ UInt guest_CMLEN;
      /* 436 */ UInt guest_NRADDR;

      /* 440 */ UInt host_EvC_FAILADDR;
      /* 444 */ UInt host_EvC_COUNTER;
      /* 448 */ UInt guest_COND;

      /* MIPS32 DSP ASE(r2) specific registers. */
      /* 452 */ UInt guest_DSPControl;
      /* 456 */ ULong guest_ac0;
      /* 464 */ ULong guest_ac1;
      /* 472 */ ULong guest_ac2;
      /* 480 */ ULong guest_ac3;

        UInt padding;
} VexGuestMIPS32State;
/*---------------------------------------------------------------*/
/*--- Utility functions for MIPS32 guest stuff.               ---*/
/*---------------------------------------------------------------*/

/* ALL THE FOLLOWING ARE VISIBLE TO LIBRARY CLIENT */

/* Initialise all guest MIPS32 state. */

extern
void LibVEX_GuestMIPS32_initialise ( /*OUT*/VexGuestMIPS32State* vex_state );


#endif /* ndef __LIBVEX_PUB_GUEST_MIPS32_H */


/*---------------------------------------------------------------*/
/*---                                   libvex_guest_mips32.h ---*/
/*---------------------------------------------------------------*/