Home | History | Annotate | Download | only in priv
      1 /* -*- mode: C; c-basic-offset: 3; -*- */
      2 
      3 /*---------------------------------------------------------------*/
      4 /*--- begin                                 guest_s390_defs.h ---*/
      5 /*---------------------------------------------------------------*/
      6 
      7 /*
      8    This file is part of Valgrind, a dynamic binary instrumentation
      9    framework.
     10 
     11    Copyright IBM Corp. 2010-2015
     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., 51 Franklin Street, Fifth Floor, Boston, MA
     26    02110-1301, USA.
     27 
     28    The GNU General Public License is contained in the file COPYING.
     29 */
     30 
     31 /* Contributed by Florian Krohm */
     32 
     33 #ifndef __VEX_GUEST_S390_DEFS_H
     34 #define __VEX_GUEST_S390_DEFS_H
     35 
     36 #include "libvex_basictypes.h"        // offsetof
     37 #include "guest_generic_bb_to_IR.h"   // DisResult
     38 #include "libvex_guest_s390x.h"       // VexGuestS390XState
     39 
     40 
     41 /* Convert one s390 insn to IR.  See the type DisOneInstrFn in
     42    bb_to_IR.h. */
     43 DisResult disInstr_S390 ( IRSB*        irbb,
     44                           Bool         (*resteerOkFn) ( void*, Addr ),
     45                           Bool         resteerCisOk,
     46                           void*        callback_opaque,
     47                           const UChar* guest_code,
     48                           Long         delta,
     49                           Addr         guest_IP,
     50                           VexArch      guest_arch,
     51                           const VexArchInfo* archinfo,
     52                           const VexAbiInfo*  abiinfo,
     53                           VexEndness   host_endness,
     54                           Bool         sigill_diag );
     55 
     56 /* Used by the optimiser to specialise calls to helpers. */
     57 IRExpr* guest_s390x_spechelper ( const HChar *function_name,
     58                                  IRExpr **args,
     59                                  IRStmt **precedingStmts,
     60                                  Int n_precedingStmts);
     61 
     62 
     63 /* Describes to the optimiser which part of the guest state require
     64    precise memory exceptions.  This is logically part of the guest
     65    state description. */
     66 Bool guest_s390x_state_requires_precise_mem_exns ( Int, Int,
     67                                                    VexRegisterUpdates );
     68 
     69 extern VexGuestLayout s390xGuest_layout;
     70 
     71 
     72 #define S390X_GUEST_OFFSET(x)  offsetof(VexGuestS390XState, x)
     73 
     74 /*------------------------------------------------------------*/
     75 /*--- Helper functions.                                    ---*/
     76 /*------------------------------------------------------------*/
     77 void s390x_dirtyhelper_EX(ULong torun);
     78 ULong s390x_dirtyhelper_STCK(ULong *addr);
     79 ULong s390x_dirtyhelper_STCKF(ULong *addr);
     80 ULong s390x_dirtyhelper_STCKE(ULong *addr);
     81 ULong s390x_dirtyhelper_STFLE(VexGuestS390XState *guest_state, ULong *addr);
     82 void  s390x_dirtyhelper_CUxy(UChar *addr, ULong data, ULong num_bytes);
     83 
     84 ULong s390_do_cu12_cu14_helper1(UInt byte1, UInt etf3_and_m3_is_1);
     85 ULong s390_do_cu12_helper2(UInt byte1, UInt byte2, UInt byte3, UInt byte4,
     86                            ULong stuff);
     87 ULong s390_do_cu14_helper2(UInt byte1, UInt byte2, UInt byte3, UInt byte4,
     88                            ULong stuff);
     89 ULong s390_do_cu21(UInt srcvalue, UInt low_surrogate);
     90 ULong s390_do_cu24(UInt srcvalue, UInt low_surrogate);
     91 ULong s390_do_cu41(UInt srcvalue);
     92 ULong s390_do_cu42(UInt srcvalue);
     93 UInt  s390_do_cvb(ULong decimal);
     94 ULong s390_do_cvd(ULong binary);
     95 ULong s390_do_ecag(ULong op2addr);
     96 UInt  s390_do_pfpo(UInt gpr0);
     97 
     98 /* The various ways to compute the condition code. */
     99 enum {
    100    S390_CC_OP_BITWISE = 0,
    101    S390_CC_OP_SIGNED_COMPARE = 1,
    102    S390_CC_OP_UNSIGNED_COMPARE = 2,
    103    S390_CC_OP_SIGNED_ADD_32 = 3,
    104    S390_CC_OP_SIGNED_ADD_64 = 4,
    105    S390_CC_OP_UNSIGNED_ADD_32 = 5,
    106    S390_CC_OP_UNSIGNED_ADD_64 = 6,
    107    S390_CC_OP_UNSIGNED_ADDC_32 = 7,
    108    S390_CC_OP_UNSIGNED_ADDC_64 = 8,
    109    S390_CC_OP_SIGNED_SUB_32 = 9,
    110    S390_CC_OP_SIGNED_SUB_64 = 10,
    111    S390_CC_OP_UNSIGNED_SUB_32 = 11,
    112    S390_CC_OP_UNSIGNED_SUB_64 = 12,
    113    S390_CC_OP_UNSIGNED_SUBB_32 = 13,
    114    S390_CC_OP_UNSIGNED_SUBB_64 = 14,
    115    S390_CC_OP_LOAD_AND_TEST = 15,
    116    S390_CC_OP_LOAD_POSITIVE_32 = 16,
    117    S390_CC_OP_LOAD_POSITIVE_64 = 17,
    118    S390_CC_OP_TEST_UNDER_MASK_8 = 18,
    119    S390_CC_OP_TEST_UNDER_MASK_16 = 19,
    120    S390_CC_OP_SHIFT_LEFT_32 = 20,
    121    S390_CC_OP_SHIFT_LEFT_64 = 21,
    122    S390_CC_OP_INSERT_CHAR_MASK_32 = 22,
    123    S390_CC_OP_BFP_RESULT_32 = 23,
    124    S390_CC_OP_BFP_RESULT_64 = 24,
    125    S390_CC_OP_BFP_RESULT_128 = 25,
    126    S390_CC_OP_BFP_32_TO_INT_32 = 26,
    127    S390_CC_OP_BFP_64_TO_INT_32 = 27,
    128    S390_CC_OP_BFP_128_TO_INT_32 = 28,
    129    S390_CC_OP_BFP_32_TO_INT_64 = 29,
    130    S390_CC_OP_BFP_64_TO_INT_64 = 30,
    131    S390_CC_OP_BFP_128_TO_INT_64 = 31,
    132    S390_CC_OP_BFP_TDC_32 = 32,
    133    S390_CC_OP_BFP_TDC_64 = 33,
    134    S390_CC_OP_BFP_TDC_128 = 34,
    135    S390_CC_OP_SET = 35,
    136    S390_CC_OP_BFP_32_TO_UINT_32 = 36,
    137    S390_CC_OP_BFP_64_TO_UINT_32 = 37,
    138    S390_CC_OP_BFP_128_TO_UINT_32 = 38,
    139    S390_CC_OP_BFP_32_TO_UINT_64 = 39,
    140    S390_CC_OP_BFP_64_TO_UINT_64 = 40,
    141    S390_CC_OP_BFP_128_TO_UINT_64 = 41,
    142    S390_CC_OP_DFP_RESULT_64 = 42,
    143    S390_CC_OP_DFP_RESULT_128 = 43,
    144    S390_CC_OP_DFP_TDC_32 = 44,
    145    S390_CC_OP_DFP_TDC_64 = 45,
    146    S390_CC_OP_DFP_TDC_128 = 46,
    147    S390_CC_OP_DFP_TDG_32 = 47,
    148    S390_CC_OP_DFP_TDG_64 = 48,
    149    S390_CC_OP_DFP_TDG_128 = 49,
    150    S390_CC_OP_DFP_64_TO_UINT_32 = 50,
    151    S390_CC_OP_DFP_128_TO_UINT_32 = 51,
    152    S390_CC_OP_DFP_64_TO_UINT_64 = 52,
    153    S390_CC_OP_DFP_128_TO_UINT_64 = 53,
    154    S390_CC_OP_DFP_64_TO_INT_32 = 54,
    155    S390_CC_OP_DFP_128_TO_INT_32 = 55,
    156    S390_CC_OP_DFP_64_TO_INT_64 = 56,
    157    S390_CC_OP_DFP_128_TO_INT_64 = 57,
    158    S390_CC_OP_PFPO_32 = 58,
    159    S390_CC_OP_PFPO_64 = 59,
    160    S390_CC_OP_PFPO_128 = 60
    161 };
    162 
    163 /*------------------------------------------------------------*/
    164 /*--- Thunk layout                                         ---*/
    165 /*------------------------------------------------------------*/
    166 
    167 /*
    168    Z -- value is zero extended to 32 / 64 bit
    169    S -- value is sign extended to 32 / 64 bit
    170    F -- a binary floating point value
    171    D -- a decimal floating point value
    172 
    173    +--------------------------------+-----------------------+----------------------+-----------------+
    174    | op                             |   cc_dep1             |   cc_dep2            |   cc_ndep       |
    175    +--------------------------------+-----------------------+----------------------+-----------------+
    176    | S390_CC_OP_BITWISE             | Z result              |                      |                 |
    177    | S390_CC_OP_SIGNED_COMPARE      | S 1st operand         | S 2nd operand        |                 |
    178    | S390_CC_OP_UNSIGNED_COMPARE    | Z 1st operand         | Z 2nd operand        |                 |
    179    | S390_CC_OP_SIGNED_ADD_32       | S 1st operand         | S 2nd operand        |                 |
    180    | S390_CC_OP_SIGNED_ADD_64       | S 1st operand         | S 2nd operand        |                 |
    181    | S390_CC_OP_UNSIGNED_ADD_32     | Z 1st operand         | Z 2nd operand        |                 |
    182    | S390_CC_OP_UNSIGNED_ADD_64     | Z 1st operand         | Z 2nd operand        |                 |
    183    | S390_CC_OP_UNSIGNED_ADDC_32    | Z 1st operand         | Z 2nd operand        | Z carry in      |
    184    | S390_CC_OP_UNSIGNED_ADDC_64    | Z 1st operand         | Z 2nd operand        | Z carry in      |
    185    | S390_CC_OP_SIGNED_SUB_32       | S left operand        | S right operand      |                 |
    186    | S390_CC_OP_SIGNED_SUB_64       | S left operand        | S right operand      |                 |
    187    | S390_CC_OP_UNSIGNED_SUB_32     | Z left operand        | Z right operand      |                 |
    188    | S390_CC_OP_UNSIGNED_SUB_64     | Z left operand        | Z right operand      |                 |
    189    | S390_CC_OP_UNSIGNED_SUBB_32    | Z left operand        | Z right operand      | Z borrow in     |
    190    | S390_CC_OP_UNSIGNED_SUBB_64    | Z left operand        | Z right operand      | Z borrow in     |
    191    | S390_CC_OP_LOAD_AND_TEST       | S loaded value        |                      |                 |
    192    | S390_CC_OP_LOAD_POSITIVE_32    | S loaded value        |                      |                 |
    193    | S390_CC_OP_LOAD_POSITIVE_64    | S loaded value        |                      |                 |
    194    | S390_CC_OP_TEST_UNDER_MASK_8   | Z tested value        | Z mask               |                 |
    195    | S390_CC_OP_TEST_UNDER_MASK_16  | Z tested value        | Z mask               |                 |
    196    | S390_CC_OP_SHIFT_LEFT_32       | Z value to be shifted | Z shift amount       |                 |
    197    | S390_CC_OP_SHIFT_LEFT_64       | Z value to be shifted | Z shift amount       |                 |
    198    | S390_CC_OP_INSERT_CHAR_MASK_32 | Z result              | Z mask               |                 |
    199    | S390_CC_OP_BFP_RESULT_32       | F result              |                      |                 |
    200    | S390_CC_OP_BFP_RESULT_64       | F result              |                      |                 |
    201    | S390_CC_OP_BFP_RESULT_128      | F result hi 64 bits   | F result low 64 bits |                 |
    202    | S390_CC_OP_BFP_32_TO_INT_32    | F source              | Z rounding mode      |                 |
    203    | S390_CC_OP_BFP_64_TO_INT_32    | F source              | Z rounding mode      |                 |
    204    | S390_CC_OP_BFP_128_TO_INT_32   | F source hi 64 bits   | F source low 64 bits | Z rounding mode |
    205    | S390_CC_OP_BFP_32_TO_INT_64    | F source              | Z rounding mode      |                 |
    206    | S390_CC_OP_BFP_64_TO_INT_64    | F source              | Z rounding mode      |                 |
    207    | S390_CC_OP_BFP_128_TO_INT_64   | F source hi 64 bits   | F source low 64 bits | Z rounding mode |
    208    | S390_CC_OP_BFP_TDC_32          | F value               | Z class              |                 |
    209    | S390_CC_OP_BFP_TDC_64          | F value               | Z class              |                 |
    210    | S390_CC_OP_BFP_TDC_128         | F value hi 64 bits    | F value low 64 bits  | Z class         |
    211    | S390_CC_OP_SET                 | Z condition code      |                      |                 |
    212    | S390_CC_OP_BFP_32_TO_UINT_32   | F source              | Z rounding mode      |                 |
    213    | S390_CC_OP_BFP_64_TO_UINT_32   | F source              | Z rounding mode      |                 |
    214    | S390_CC_OP_BFP_128_TO_UINT_32  | F source hi 64 bits   | F source low 64 bits | Z rounding mode |
    215    | S390_CC_OP_BFP_32_TO_UINT_64   | F source              | Z rounding mode      |                 |
    216    | S390_CC_OP_BFP_64_TO_UINT_64   | F source              | Z rounding mode      |                 |
    217    | S390_CC_OP_BFP_128_TO_UINT_64  | F source hi 64 bits   | F source low 64 bits | Z rounding mode |
    218    | S390_CC_OP_DFP_RESULT_64       | D result              |                      |                 |
    219    | S390_CC_OP_DFP_RESULT_128      | D result hi 64 bits   | D result low 64 bits |                 |
    220    | S390_CC_OP_DFP_TDC_32          | D value               | Z class              |                 |
    221    | S390_CC_OP_DFP_TDC_64          | D value               | Z class              |                 |
    222    | S390_CC_OP_DFP_TDC_128         | D value hi 64 bits    | D value low 64 bits  | Z class         |
    223    | S390_CC_OP_DFP_TDG_32          | D value               | Z group              |                 |
    224    | S390_CC_OP_DFP_TDG_64          | D value               | Z group              |                 |
    225    | S390_CC_OP_DFP_TDG_128         | D value hi 64 bits    | D value low 64 bits  | Z group         |
    226    | S390_CC_OP_DFP_64_TO_UINT_32   | D source              | Z rounding mode      |                 |
    227    | S390_CC_OP_DFP_128_TO_UINT_32  | D source hi 64 bits   | D source low 64 bits | Z rounding mode |
    228    | S390_CC_OP_DFP_64_TO_UINT_64   | D source              | Z rounding mode      |                 |
    229    | S390_CC_OP_DFP_128_TO_UINT_64  | D source hi 64 bits   | D source low 64 bits | Z rounding mode |
    230    | S390_CC_OP_DFP_64_TO_INT_32    | D source              | Z rounding mode      |                 |
    231    | S390_CC_OP_DFP_128_TO_INT_32   | D source hi 64 bits   | D source low 64 bits | Z rounding mode |
    232    | S390_CC_OP_DFP_64_TO_INT_64    | D source              | Z rounding mode      |                 |
    233    | S390_CC_OP_DFP_128_TO_INT_64   | D source hi 64 bits   | D source low 64 bits | Z rounding mode |
    234    | S390_CC_OP_PFPO_32             | F|D source            | Z GR0 low 32 bits    |                 |
    235    | S390_CC_OP_PFPO_64             | F|D source            | Z GR0 low 32 bits    |                 |
    236    | S390_CC_OP_PFPO_128            | F|D source hi 64 bits | F|D src low 64 bits  | Z GR0 low 32 bits |
    237    +--------------------------------+-----------------------+----------------------+-----------------+
    238 */
    239 
    240 /*------------------------------------------------------------*/
    241 /*--- Condition code helpers.                             ---*/
    242 /*------------------------------------------------------------*/
    243 UInt s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2,
    244                        ULong cc_ndep);
    245 UInt s390_calculate_cond(ULong mask, ULong op, ULong dep1, ULong dep2,
    246                          ULong ndep);
    247 
    248 /* Size of special instruction preamble */
    249 #define S390_SPECIAL_OP_PREAMBLE_SIZE 8
    250 
    251 /* Size of special instructions */
    252 #define S390_SPECIAL_OP_SIZE 2
    253 
    254 /* Last target instruction for the EX helper */
    255 extern ULong last_execute_target;
    256 
    257 /*---------------------------------------------------------------*/
    258 /*--- end                                   guest_s390_defs.h ---*/
    259 /*---------------------------------------------------------------*/
    260 
    261 #endif /* __VEX_GUEST_S390_DEFS_H */
    262