/* -*- mode: C; c-basic-offset: 3; -*- */

/*---------------------------------------------------------------*/
/*--- begin                              libvex_guest_s390x.h ---*/
/*---------------------------------------------------------------*/

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

   Copyright IBM Corp. 2010-2015

   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., 51 Franklin Street, Fifth Floor, Boston, MA
   02110-1301, USA.

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

#ifndef __LIBVEX_PUB_GUEST_S390X_H
#define __LIBVEX_PUB_GUEST_S390X_H

#include "libvex_basictypes.h"

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

typedef struct {

/*------------------------------------------------------------*/
/*--- ar registers                                         ---*/
/*------------------------------------------------------------*/

   /*    0 */  UInt guest_a0;
   /*    4 */  UInt guest_a1;
   /*    8 */  UInt guest_a2;
   /*   12 */  UInt guest_a3;
   /*   16 */  UInt guest_a4;
   /*   20 */  UInt guest_a5;
   /*   24 */  UInt guest_a6;
   /*   28 */  UInt guest_a7;
   /*   32 */  UInt guest_a8;
   /*   36 */  UInt guest_a9;
   /*   40 */  UInt guest_a10;
   /*   44 */  UInt guest_a11;
   /*   48 */  UInt guest_a12;
   /*   52 */  UInt guest_a13;
   /*   56 */  UInt guest_a14;
   /*   60 */  UInt guest_a15;

/*------------------------------------------------------------*/
/*--- fpr registers                                        ---*/
/*------------------------------------------------------------*/

   /*   64 */  ULong guest_f0;
   /*   72 */  ULong guest_f1;
   /*   80 */  ULong guest_f2;
   /*   88 */  ULong guest_f3;
   /*   96 */  ULong guest_f4;
   /*  104 */  ULong guest_f5;
   /*  112 */  ULong guest_f6;
   /*  120 */  ULong guest_f7;
   /*  128 */  ULong guest_f8;
   /*  136 */  ULong guest_f9;
   /*  144 */  ULong guest_f10;
   /*  152 */  ULong guest_f11;
   /*  160 */  ULong guest_f12;
   /*  168 */  ULong guest_f13;
   /*  176 */  ULong guest_f14;
   /*  184 */  ULong guest_f15;

/*------------------------------------------------------------*/
/*--- gpr registers                                        ---*/
/*------------------------------------------------------------*/

   /*  192 */  ULong guest_r0;
   /*  200 */  ULong guest_r1;
   /*  208 */  ULong guest_r2;
   /*  216 */  ULong guest_r3;
   /*  224 */  ULong guest_r4;
   /*  232 */  ULong guest_r5;
   /*  240 */  ULong guest_r6;
   /*  248 */  ULong guest_r7;
   /*  256 */  ULong guest_r8;
   /*  264 */  ULong guest_r9;
   /*  272 */  ULong guest_r10;
   /*  280 */  ULong guest_r11;
   /*  288 */  ULong guest_r12;
   /*  296 */  ULong guest_r13;
   /*  304 */  ULong guest_r14;
   /*  312 */  ULong guest_r15;

/*------------------------------------------------------------*/
/*--- S390 miscellaneous registers                         ---*/
/*------------------------------------------------------------*/

   /*  320 */  ULong guest_counter;
   /*  328 */  UInt guest_fpc;
   /*  332 */  UChar unused[4]; /* 4-byte hole to get 8-byte alignment */
   /*  336 */  ULong guest_IA;

/*------------------------------------------------------------*/
/*--- S390 pseudo registers                                ---*/
/*------------------------------------------------------------*/

   /*  344 */  ULong guest_SYSNO;

/*------------------------------------------------------------*/
/*--- 4-word thunk used to calculate the condition code    ---*/
/*------------------------------------------------------------*/

   /*  352 */  ULong guest_CC_OP;
   /*  360 */  ULong guest_CC_DEP1;
   /*  368 */  ULong guest_CC_DEP2;
   /*  376 */  ULong guest_CC_NDEP;

/*------------------------------------------------------------*/
/*--- Pseudo registers. Required by all architectures      ---*/
/*------------------------------------------------------------*/

   /* See comments at bottom of libvex.h */
   /*  384 */  ULong guest_NRADDR;
   /*  392 */  ULong guest_CMSTART;
   /*  400 */  ULong guest_CMLEN;

   /* Used when backing up to restart a syscall that has
      been interrupted by a signal. See also comment in
      libvex_ir.h */
   /*  408 */  ULong guest_IP_AT_SYSCALL;

   /* Emulation notes; see comments in libvex_emnote.h */
   /*  416 */  UInt guest_EMNOTE;

   /* For translation chaining */
   /*  420 */  UInt  host_EvC_COUNTER;
   /*  424 */  ULong host_EvC_FAILADDR;

/*------------------------------------------------------------*/
/*--- Force alignment to 16 bytes                          ---*/
/*------------------------------------------------------------*/
   /*  432 */  UChar padding[0];

   /*  432 */  /* This is the size of the guest state */
} VexGuestS390XState;


/*------------------------------------------------------------*/
/*--- Function prototypes                                  ---*/
/*------------------------------------------------------------*/

void LibVEX_GuestS390X_initialise(VexGuestS390XState *);

/*------------------------------------------------------------*/
/*--- Dedicated registers                                  ---*/
/*------------------------------------------------------------*/

#define guest_LR guest_r14  /* Link register */
#define guest_SP guest_r15  /* Stack pointer */
#define guest_FP guest_r11  /* Frame pointer */

/*---------------------------------------------------------------*/
/*--- end                                libvex_guest_s390x.h ---*/
/*---------------------------------------------------------------*/

#endif /* __LIBVEX_PUB_GUEST_S390X_H */
