1 2 /*---------------------------------------------------------------*/ 3 /*--- begin guest_ppc_defs.h ---*/ 4 /*---------------------------------------------------------------*/ 5 6 /* 7 This file is part of Valgrind, a dynamic binary instrumentation 8 framework. 9 10 Copyright (C) 2004-2013 OpenWorks LLP 11 info@open-works.net 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 Neither the names of the U.S. Department of Energy nor the 31 University of California nor the names of its contributors may be 32 used to endorse or promote products derived from this software 33 without prior written permission. 34 */ 35 36 /* Only to be used within the guest-ppc directory. */ 37 38 39 #ifndef __VEX_GUEST_PPC_DEFS_H 40 #define __VEX_GUEST_PPC_DEFS_H 41 42 #include "libvex_basictypes.h" 43 #include "libvex_guest_ppc32.h" // VexGuestPPC32State 44 #include "libvex_guest_ppc64.h" // VexGuestPPC64State 45 #include "guest_generic_bb_to_IR.h" // DisResult 46 47 /*---------------------------------------------------------*/ 48 /*--- ppc to IR conversion ---*/ 49 /*---------------------------------------------------------*/ 50 51 /* Convert one ppc insn to IR. See the type DisOneInstrFn in 52 bb_to_IR.h. */ 53 extern 54 DisResult disInstr_PPC ( IRSB* irbb, 55 Bool (*resteerOkFn) ( void*, Addr64 ), 56 Bool resteerCisOk, 57 void* callback_opaque, 58 UChar* guest_code, 59 Long delta, 60 Addr64 guest_IP, 61 VexArch guest_arch, 62 VexArchInfo* archinfo, 63 VexAbiInfo* abiinfo, 64 Bool host_bigendian, 65 Bool sigill_diag ); 66 67 /* Used by the optimiser to specialise calls to helpers. */ 68 extern 69 IRExpr* guest_ppc32_spechelper ( const HChar* function_name, 70 IRExpr** args, 71 IRStmt** precedingStmts, 72 Int n_precedingStmts ); 73 74 extern 75 IRExpr* guest_ppc64_spechelper ( const HChar* function_name, 76 IRExpr** args, 77 IRStmt** precedingStmts, 78 Int n_precedingStmts ); 79 80 /* Describes to the optimser which part of the guest state require 81 precise memory exceptions. This is logically part of the guest 82 state description. */ 83 extern 84 Bool guest_ppc32_state_requires_precise_mem_exns ( Int, Int ); 85 86 extern 87 Bool guest_ppc64_state_requires_precise_mem_exns ( Int, Int ); 88 89 extern 90 VexGuestLayout ppc32Guest_layout; 91 92 extern 93 VexGuestLayout ppc64Guest_layout; 94 95 96 /* FP Rounding mode - different encoding to IR */ 97 typedef 98 enum { 99 PPCrm_NEAREST = 0, 100 PPCrm_NegINF = 1, 101 PPCrm_PosINF = 2, 102 PPCrm_ZERO = 3 103 } PPCRoundingMode; 104 105 /* Floating point comparison values - different encoding to IR */ 106 typedef 107 enum { 108 PPCcr_LT = 0x8, 109 PPCcr_GT = 0x4, 110 PPCcr_EQ = 0x2, 111 PPCcr_UN = 0x1 112 } 113 PPCCmpF64Result; 114 115 /* 116 Enumeration for xer_ca/ov calculation helper functions 117 */ 118 enum { 119 /* 0 */ PPCG_FLAG_OP_ADD=0, // addc[o], addic 120 /* 1 */ PPCG_FLAG_OP_ADDE, // adde[o], addme[o], addze[o] 121 /* 2 */ PPCG_FLAG_OP_DIVW, // divwo 122 /* 3 */ PPCG_FLAG_OP_DIVWU, // divwuo 123 /* 4 */ PPCG_FLAG_OP_MULLW, // mullwo 124 /* 5 */ PPCG_FLAG_OP_NEG, // nego 125 /* 6 */ PPCG_FLAG_OP_SUBF, // subfo 126 /* 7 */ PPCG_FLAG_OP_SUBFC, // subfc[o] 127 /* 8 */ PPCG_FLAG_OP_SUBFE, // subfe[o], subfme[o], subfze[o] 128 /* 9 */ PPCG_FLAG_OP_SUBFI, // subfic 129 /* 10 */ PPCG_FLAG_OP_SRAW, // sraw 130 /* 11 */ PPCG_FLAG_OP_SRAWI, // srawi 131 /* 12 */ PPCG_FLAG_OP_SRAD, // srad 132 /* 13 */ PPCG_FLAG_OP_SRADI, // sradi 133 /* 14 */ PPCG_FLAG_OP_DIVDE, // divdeo 134 /* 15 */ PPCG_FLAG_OP_DIVWEU, // divweuo 135 /* 16 */ PPCG_FLAG_OP_DIVWE, // divweo 136 /* 17 */ PPCG_FLAG_OP_DIVDEU, // divdeuo 137 /* 18 */ PPCG_FLAG_OP_MULLD, // mulldo 138 PPCG_FLAG_OP_NUMBER 139 }; 140 141 142 /*---------------------------------------------------------*/ 143 /*--- ppc guest helpers ---*/ 144 /*---------------------------------------------------------*/ 145 146 /* --- CLEAN HELPERS --- */ 147 148 /* none, right now */ 149 150 /* --- DIRTY HELPERS --- */ 151 152 extern ULong ppcg_dirtyhelper_MFTB ( void ); 153 154 extern UInt ppc32g_dirtyhelper_MFSPR_268_269 ( UInt ); 155 156 extern UInt ppc32g_dirtyhelper_MFSPR_287 ( void ); 157 158 extern void ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst, 159 UInt vD_idx, UInt sh, 160 UInt shift_right ); 161 162 extern void ppc64g_dirtyhelper_LVS ( VexGuestPPC64State* gst, 163 UInt vD_idx, UInt sh, 164 UInt shift_right ); 165 166 #endif /* ndef __VEX_GUEST_PPC_DEFS_H */ 167 168 /*---------------------------------------------------------------*/ 169 /*--- end guest_ppc_defs.h ---*/ 170 /*---------------------------------------------------------------*/ 171