blob: fe411f73d8438708b4441442effa5740feffc266 [file] [log] [blame]
cerion896a1372005-01-25 12:24:25 +00001
2/*---------------------------------------------------------------*/
sewardj752f9062010-05-03 21:38:49 +00003/*--- begin guest_ppc_defs.h ---*/
cerion896a1372005-01-25 12:24:25 +00004/*---------------------------------------------------------------*/
5
6/*
sewardj752f9062010-05-03 21:38:49 +00007 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
cerion896a1372005-01-25 12:24:25 +00009
Elliott Hughesed398002017-06-21 14:41:24 -070010 Copyright (C) 2004-2017 OpenWorks LLP
sewardj752f9062010-05-03 21:38:49 +000011 info@open-works.net
cerion896a1372005-01-25 12:24:25 +000012
sewardj752f9062010-05-03 21:38:49 +000013 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.
cerion896a1372005-01-25 12:24:25 +000017
sewardj752f9062010-05-03 21:38:49 +000018 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
sewardj7bd6ffe2005-08-03 16:07:36 +000026 02110-1301, USA.
27
sewardj752f9062010-05-03 21:38:49 +000028 The GNU General Public License is contained in the file COPYING.
cerion896a1372005-01-25 12:24:25 +000029
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.
cerion896a1372005-01-25 12:24:25 +000034*/
35
ceriond0eae2d2005-12-23 11:43:01 +000036/* Only to be used within the guest-ppc directory. */
cerion896a1372005-01-25 12:24:25 +000037
38
sewardjcef7d3e2009-07-02 12:21:59 +000039#ifndef __VEX_GUEST_PPC_DEFS_H
40#define __VEX_GUEST_PPC_DEFS_H
cerion896a1372005-01-25 12:24:25 +000041
florian58a637b2012-09-30 20:30:17 +000042#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
sewardj9e6491a2005-07-02 19:24:10 +000046
47/*---------------------------------------------------------*/
cerion5b2325f2005-12-23 00:55:09 +000048/*--- ppc to IR conversion ---*/
sewardj9e6491a2005-07-02 19:24:10 +000049/*---------------------------------------------------------*/
50
cerion5b2325f2005-12-23 00:55:09 +000051/* Convert one ppc insn to IR. See the type DisOneInstrFn in
Elliott Hughesed398002017-06-21 14:41:24 -070052 guest_generic_bb_to_IR.h. */
sewardj9e6491a2005-07-02 19:24:10 +000053extern
sewardjdd40fdf2006-12-24 02:20:24 +000054DisResult disInstr_PPC ( IRSB* irbb,
florianbeac5302014-12-31 12:09:38 +000055 Bool (*resteerOkFn) ( void*, Addr ),
sewardj984d9b12010-01-15 10:53:21 +000056 Bool resteerCisOk,
sewardjc716aea2006-01-17 01:48:46 +000057 void* callback_opaque,
florian8462d112014-09-24 15:18:09 +000058 const UChar* guest_code,
cerion5b2325f2005-12-23 00:55:09 +000059 Long delta,
floriand4cc0de2015-01-02 11:44:12 +000060 Addr guest_IP,
sewardja5f55da2006-04-30 23:37:32 +000061 VexArch guest_arch,
floriancacba8e2014-12-15 18:58:07 +000062 const VexArchInfo* archinfo,
63 const VexAbiInfo* abiinfo,
sewardj9b769162014-07-24 12:42:03 +000064 VexEndness host_endness,
sewardj442e51a2012-12-06 18:08:04 +000065 Bool sigill_diag );
sewardj9e6491a2005-07-02 19:24:10 +000066
67/* Used by the optimiser to specialise calls to helpers. */
68extern
florian1ff47562012-10-21 02:09:51 +000069IRExpr* guest_ppc32_spechelper ( const HChar* function_name,
sewardjbe917912010-08-22 12:38:53 +000070 IRExpr** args,
71 IRStmt** precedingStmts,
72 Int n_precedingStmts );
sewardj9e6491a2005-07-02 19:24:10 +000073
cerionf0de28c2005-12-13 20:21:11 +000074extern
florian1ff47562012-10-21 02:09:51 +000075IRExpr* guest_ppc64_spechelper ( const HChar* function_name,
sewardjbe917912010-08-22 12:38:53 +000076 IRExpr** args,
77 IRStmt** precedingStmts,
78 Int n_precedingStmts );
cerionf0de28c2005-12-13 20:21:11 +000079
sewardj9e6491a2005-07-02 19:24:10 +000080/* 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. */
83extern
sewardjca2c3c72015-02-05 12:53:20 +000084Bool guest_ppc32_state_requires_precise_mem_exns ( Int, Int,
85 VexRegisterUpdates );
sewardj9e6491a2005-07-02 19:24:10 +000086
cerionf0de28c2005-12-13 20:21:11 +000087extern
sewardjca2c3c72015-02-05 12:53:20 +000088Bool guest_ppc64_state_requires_precise_mem_exns ( Int, Int,
89 VexRegisterUpdates );
cerionf0de28c2005-12-13 20:21:11 +000090
sewardj9e6491a2005-07-02 19:24:10 +000091extern
92VexGuestLayout ppc32Guest_layout;
93
cerionf0de28c2005-12-13 20:21:11 +000094extern
95VexGuestLayout ppc64Guest_layout;
96
sewardj9e6491a2005-07-02 19:24:10 +000097
cerion094d1392005-06-20 13:45:57 +000098/* FP Rounding mode - different encoding to IR */
99typedef
100 enum {
cerion5b2325f2005-12-23 00:55:09 +0000101 PPCrm_NEAREST = 0,
102 PPCrm_NegINF = 1,
103 PPCrm_PosINF = 2,
104 PPCrm_ZERO = 3
105 } PPCRoundingMode;
cerion094d1392005-06-20 13:45:57 +0000106
107/* Floating point comparison values - different encoding to IR */
108typedef
109 enum {
cerion5b2325f2005-12-23 00:55:09 +0000110 PPCcr_LT = 0x8,
111 PPCcr_GT = 0x4,
112 PPCcr_EQ = 0x2,
113 PPCcr_UN = 0x1
cerion094d1392005-06-20 13:45:57 +0000114 }
cerion5b2325f2005-12-23 00:55:09 +0000115 PPCCmpF64Result;
cerion896a1372005-01-25 12:24:25 +0000116
cerionae694622005-01-28 17:52:47 +0000117/*
cerione9d361a2005-03-04 17:35:29 +0000118 Enumeration for xer_ca/ov calculation helper functions
119*/
cerionae694622005-01-28 17:52:47 +0000120enum {
cerion5b2325f2005-12-23 00:55:09 +0000121 /* 0 */ PPCG_FLAG_OP_ADD=0, // addc[o], addic
122 /* 1 */ PPCG_FLAG_OP_ADDE, // adde[o], addme[o], addze[o]
123 /* 2 */ PPCG_FLAG_OP_DIVW, // divwo
124 /* 3 */ PPCG_FLAG_OP_DIVWU, // divwuo
125 /* 4 */ PPCG_FLAG_OP_MULLW, // mullwo
126 /* 5 */ PPCG_FLAG_OP_NEG, // nego
127 /* 6 */ PPCG_FLAG_OP_SUBF, // subfo
128 /* 7 */ PPCG_FLAG_OP_SUBFC, // subfc[o]
129 /* 8 */ PPCG_FLAG_OP_SUBFE, // subfe[o], subfme[o], subfze[o]
130 /* 9 */ PPCG_FLAG_OP_SUBFI, // subfic
131 /* 10 */ PPCG_FLAG_OP_SRAW, // sraw
132 /* 11 */ PPCG_FLAG_OP_SRAWI, // srawi
133 /* 12 */ PPCG_FLAG_OP_SRAD, // srad
134 /* 13 */ PPCG_FLAG_OP_SRADI, // sradi
sewardj4aa412a2011-07-24 14:13:21 +0000135 /* 14 */ PPCG_FLAG_OP_DIVDE, // divdeo
136 /* 15 */ PPCG_FLAG_OP_DIVWEU, // divweuo
sewardje71e56a2011-09-05 12:11:06 +0000137 /* 16 */ PPCG_FLAG_OP_DIVWE, // divweo
138 /* 17 */ PPCG_FLAG_OP_DIVDEU, // divdeuo
carll38b79ac2013-09-06 22:27:34 +0000139 /* 18 */ PPCG_FLAG_OP_MULLD, // mulldo
cerion5b2325f2005-12-23 00:55:09 +0000140 PPCG_FLAG_OP_NUMBER
cerionae694622005-01-28 17:52:47 +0000141};
142
cerion896a1372005-01-25 12:24:25 +0000143
sewardj73a91972005-09-06 10:25:46 +0000144/*---------------------------------------------------------*/
cerion5b2325f2005-12-23 00:55:09 +0000145/*--- ppc guest helpers ---*/
sewardj73a91972005-09-06 10:25:46 +0000146/*---------------------------------------------------------*/
147
148/* --- CLEAN HELPERS --- */
149
Elliott Hughesa0664b92017-04-18 17:46:52 -0700150extern ULong is_BCDstring128_helper( ULong Signed, ULong hi64, ULong low64 );
151extern ULong increment_BCDstring32_helper( ULong Signed,
152 ULong bcd_string, ULong carry_in );
153extern ULong convert_to_zoned_helper( ULong src_hi, ULong src_low,
154 ULong upper_byte,
155 ULong return_upper );
156extern ULong convert_to_national_helper( ULong src, ULong return_upper );
157extern ULong convert_from_zoned_helper( ULong src_hi, ULong src_low );
158extern ULong convert_from_national_helper( ULong src_hi, ULong src_low );
159
sewardj73a91972005-09-06 10:25:46 +0000160
161/* --- DIRTY HELPERS --- */
162
cerion5b2325f2005-12-23 00:55:09 +0000163extern ULong ppcg_dirtyhelper_MFTB ( void );
sewardj73a91972005-09-06 10:25:46 +0000164
sewardjabb321c2006-12-27 18:39:46 +0000165extern UInt ppc32g_dirtyhelper_MFSPR_268_269 ( UInt );
166
sewardj37b2ee82009-08-02 14:35:45 +0000167extern UInt ppc32g_dirtyhelper_MFSPR_287 ( void );
168
cerion6f6c6a02005-09-13 18:41:09 +0000169extern void ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst,
170 UInt vD_idx, UInt sh,
sewardjd1470942005-10-22 02:01:16 +0000171 UInt shift_right );
sewardj73a91972005-09-06 10:25:46 +0000172
cerion5b2325f2005-12-23 00:55:09 +0000173extern void ppc64g_dirtyhelper_LVS ( VexGuestPPC64State* gst,
174 UInt vD_idx, UInt sh,
carll1f5fe1f2014-08-07 23:25:23 +0000175 UInt shift_right,
176 UInt endness );
cerion5b2325f2005-12-23 00:55:09 +0000177
sewardjcef7d3e2009-07-02 12:21:59 +0000178#endif /* ndef __VEX_GUEST_PPC_DEFS_H */
cerion896a1372005-01-25 12:24:25 +0000179
180/*---------------------------------------------------------------*/
sewardjcef7d3e2009-07-02 12:21:59 +0000181/*--- end guest_ppc_defs.h ---*/
cerion896a1372005-01-25 12:24:25 +0000182/*---------------------------------------------------------------*/