blob: d04d542d14ee7054a85c8ec89f4b0576f65d4d09 [file] [log] [blame]
sewardj7cf4e6b2008-05-01 20:24:26 +00001
2/*--------------------------------------------------------------------*/
3/*--- Contains machine-specific (guest-state-layout-specific) ---*/
4/*--- support for origin tracking. ---*/
5/*--- mc_machine.c ---*/
6/*--------------------------------------------------------------------*/
7
8/*
9 This file is part of MemCheck, a heavyweight Valgrind tool for
10 detecting memory errors.
11
sewardj0f157dd2013-10-18 14:27:36 +000012 Copyright (C) 2008-2013 OpenWorks Ltd
sewardj7cf4e6b2008-05-01 20:24:26 +000013 info@open-works.co.uk
14
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License as
17 published by the Free Software Foundation; either version 2 of the
18 License, or (at your option) any later version.
19
20 This program is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28 02111-1307, USA.
29
30 The GNU General Public License is contained in the file COPYING.
31
32 Neither the names of the U.S. Department of Energy nor the
33 University of California nor the names of its contributors may be
34 used to endorse or promote products derived from this software
35 without prior written permission.
36*/
37
38#include "pub_tool_basics.h"
philippe6643e962012-01-17 21:16:30 +000039#include "pub_tool_poolalloc.h" // For mc_include.h
sewardj7cf4e6b2008-05-01 20:24:26 +000040#include "pub_tool_hashtable.h" // For mc_include.h
41#include "pub_tool_libcassert.h"
42#include "pub_tool_libcprint.h"
43#include "pub_tool_tooliface.h"
44
45#include "mc_include.h"
46
47#undef MC_SIZEOF_GUEST_STATE
48
49#if defined(VGA_x86)
50# include "libvex_guest_x86.h"
51# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestX86State)
52#endif
53
54#if defined(VGA_amd64)
55# include "libvex_guest_amd64.h"
56# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestAMD64State)
57#endif
58
59#if defined(VGA_ppc32)
60# include "libvex_guest_ppc32.h"
61# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestPPC32State)
62#endif
63
64#if defined(VGA_ppc64)
65# include "libvex_guest_ppc64.h"
66# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestPPC64State)
67#endif
68
sewardjb5b87402011-03-07 16:05:35 +000069#if defined(VGA_s390x)
70# include "libvex_guest_s390x.h"
71# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestS390XState)
72#endif
73
sewardj59570ff2010-01-01 11:59:33 +000074#if defined(VGA_arm)
75# include "libvex_guest_arm.h"
76# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestARMState)
77#endif
78
sewardjf0c12502014-01-12 12:54:00 +000079#if defined(VGA_arm64)
80# include "libvex_guest_arm64.h"
81# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestARM64State)
82#endif
83
sewardj5db15402012-06-07 09:13:21 +000084#if defined(VGA_mips32)
85# include "libvex_guest_mips32.h"
86# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestMIPS32State)
87#endif
88
petarj4df0bfc2013-02-27 23:17:33 +000089#if defined(VGA_mips64)
90# include "libvex_guest_mips64.h"
91# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestMIPS64State)
92#endif
93
sewardj7cf4e6b2008-05-01 20:24:26 +000094static inline Bool host_is_big_endian ( void ) {
95 UInt x = 0x11223344;
96 return 0x1122 == *(UShort*)(&x);
97}
98static inline Bool host_is_little_endian ( void ) {
99 UInt x = 0x11223344;
100 return 0x3344 == *(UShort*)(&x);
101}
102
103
104/* Let (offset,szB) describe a reference to the guest state section
105 [offset, offset+szB).
106
107 This function returns the corresponding guest state reference to be
108 used for the origin tag (which of course will be in the second
109 shadow area), or -1 if this piece of guest state is not to be
110 tracked.
111
112 Since origin tags are 32-bits long, we expect any returned value
113 (except -1) to be a multiple of 4, between 0 and
114 sizeof(guest-state)-4 inclusive.
115
116 This is inherently (guest-)architecture specific. For x86 and
117 amd64 we do some somewhat tricky things to give %AH .. %DH their
118 own tags. On ppc32/64 we do some marginally tricky things to give
119 all 16 %CR components their own tags.
120
121 This function only deals with references to the guest state whose
122 offsets are known at translation time (that is, references arising
123 from Put and Get). References whose offset is not known until run
124 time (that is, arise from PutI and GetI) are handled by
125 MC_(get_otrack_reg_array_equiv_int_type) below.
126
127 Note that since some guest state arrays (eg, the x86 FP reg stack)
128 are accessed both as arrays (eg, x87 insns) and directly (eg, MMX
129 insns), the two functions must be consistent for those sections of
130 guest state -- that is, they must both say the area is shadowed, or
131 both say it is not.
132
133 This function is dependent on the host's endianness, hence we
134 assert that the use case is supported.
135*/
136static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB ); /*fwds*/
137
138Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB )
139{
140 Int cand = get_otrack_shadow_offset_wrk( offset, szB );
141 if (cand == -1)
142 return cand;
143 tl_assert(0 == (cand & 3));
144 tl_assert(cand <= MC_SIZEOF_GUEST_STATE-4);
145 return cand;
146}
147
148
149static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
150{
151 /* -------------------- ppc64 -------------------- */
152
153# if defined(VGA_ppc64)
154
155# define GOF(_fieldname) \
156 (offsetof(VexGuestPPC64State,guest_##_fieldname))
157# define SZB(_fieldname) \
158 (sizeof(((VexGuestPPC64State*)0)->guest_##_fieldname))
159
160 Int sz = szB;
161 Int o = offset;
162 tl_assert(sz > 0);
163 tl_assert(host_is_big_endian());
164
165 if (sz == 8 || sz == 4) {
166 /* The point of this is to achieve
167 if ((o == GOF(GPRn) && sz == 8) || (o == 4+GOF(GPRn) && sz == 4))
168 return GOF(GPRn);
169 by testing ox instead of o, and setting ox back 4 bytes when sz == 4.
170 */
sewardj85857ab2008-05-06 15:40:32 +0000171 Int ox = sz == 8 ? o : (o - 4);
sewardj7cf4e6b2008-05-01 20:24:26 +0000172 if (ox == GOF(GPR0)) return ox;
173 if (ox == GOF(GPR1)) return ox;
174 if (ox == GOF(GPR2)) return ox;
175 if (ox == GOF(GPR3)) return ox;
176 if (ox == GOF(GPR4)) return ox;
177 if (ox == GOF(GPR5)) return ox;
178 if (ox == GOF(GPR6)) return ox;
179 if (ox == GOF(GPR7)) return ox;
180 if (ox == GOF(GPR8)) return ox;
181 if (ox == GOF(GPR9)) return ox;
182 if (ox == GOF(GPR10)) return ox;
183 if (ox == GOF(GPR11)) return ox;
184 if (ox == GOF(GPR12)) return ox;
185 if (ox == GOF(GPR13)) return ox;
186 if (ox == GOF(GPR14)) return ox;
187 if (ox == GOF(GPR15)) return ox;
188 if (ox == GOF(GPR16)) return ox;
189 if (ox == GOF(GPR17)) return ox;
190 if (ox == GOF(GPR18)) return ox;
191 if (ox == GOF(GPR19)) return ox;
192 if (ox == GOF(GPR20)) return ox;
193 if (ox == GOF(GPR21)) return ox;
194 if (ox == GOF(GPR22)) return ox;
195 if (ox == GOF(GPR23)) return ox;
196 if (ox == GOF(GPR24)) return ox;
197 if (ox == GOF(GPR25)) return ox;
198 if (ox == GOF(GPR26)) return ox;
199 if (ox == GOF(GPR27)) return ox;
200 if (ox == GOF(GPR28)) return ox;
201 if (ox == GOF(GPR29)) return ox;
202 if (ox == GOF(GPR30)) return ox;
203 if (ox == GOF(GPR31)) return ox;
204 }
205
206 if (o == GOF(LR) && sz == 8) return o;
207 if (o == GOF(CTR) && sz == 8) return o;
208
209 if (o == GOF(CIA) && sz == 8) return -1;
sewardj71633b12009-03-30 02:27:29 +0000210 if (o == GOF(IP_AT_SYSCALL) && sz == 8) return -1; /* slot unused */
sewardjb0ccb4d2012-04-02 10:22:05 +0000211 if (o == GOF(FPROUND) && sz == 1) return -1;
212 if (o == GOF(DFPROUND) && sz == 1) return -1;
florian2e497412012-08-26 03:22:09 +0000213 if (o == GOF(EMNOTE) && sz == 4) return -1;
sewardj7cf4e6b2008-05-01 20:24:26 +0000214 if (o == GOF(TISTART) && sz == 8) return -1;
215 if (o == GOF(TILEN) && sz == 8) return -1;
216 if (o == GOF(VSCR) && sz == 4) return -1;
217 if (o == GOF(VRSAVE) && sz == 4) return -1;
218 if (o == GOF(REDIR_SP) && sz == 8) return -1;
219
sewardjf34eb492011-04-15 11:57:05 +0000220 // With ISA 2.06, the "Vector-Scalar Floating-point" category
221 // provides facilities to support vector and scalar binary floating-
222 // point operations. A unified register file is an integral part
223 // of this new facility, combining floating point and vector registers
224 // using a 64x128-bit vector. These are referred to as VSR[0..63].
225 // The floating point registers are now mapped into double word element 0
226 // of VSR[0..31]. The 32x128-bit vector registers defined by the "Vector
227 // Facility [Category: Vector]" are now mapped to VSR[32..63].
228
229 // Floating point registers . . .
230 if (o == GOF(VSR0) && sz == 8) return o;
231 if (o == GOF(VSR1) && sz == 8) return o;
232 if (o == GOF(VSR2) && sz == 8) return o;
233 if (o == GOF(VSR3) && sz == 8) return o;
234 if (o == GOF(VSR4) && sz == 8) return o;
235 if (o == GOF(VSR5) && sz == 8) return o;
236 if (o == GOF(VSR6) && sz == 8) return o;
237 if (o == GOF(VSR7) && sz == 8) return o;
238 if (o == GOF(VSR8) && sz == 8) return o;
239 if (o == GOF(VSR9) && sz == 8) return o;
240 if (o == GOF(VSR10) && sz == 8) return o;
241 if (o == GOF(VSR11) && sz == 8) return o;
242 if (o == GOF(VSR12) && sz == 8) return o;
243 if (o == GOF(VSR13) && sz == 8) return o;
244 if (o == GOF(VSR14) && sz == 8) return o;
245 if (o == GOF(VSR15) && sz == 8) return o;
246 if (o == GOF(VSR16) && sz == 8) return o;
247 if (o == GOF(VSR17) && sz == 8) return o;
248 if (o == GOF(VSR18) && sz == 8) return o;
249 if (o == GOF(VSR19) && sz == 8) return o;
250 if (o == GOF(VSR20) && sz == 8) return o;
251 if (o == GOF(VSR21) && sz == 8) return o;
252 if (o == GOF(VSR22) && sz == 8) return o;
253 if (o == GOF(VSR23) && sz == 8) return o;
254 if (o == GOF(VSR24) && sz == 8) return o;
255 if (o == GOF(VSR25) && sz == 8) return o;
256 if (o == GOF(VSR26) && sz == 8) return o;
257 if (o == GOF(VSR27) && sz == 8) return o;
258 if (o == GOF(VSR28) && sz == 8) return o;
259 if (o == GOF(VSR29) && sz == 8) return o;
260 if (o == GOF(VSR30) && sz == 8) return o;
261 if (o == GOF(VSR31) && sz == 8) return o;
sewardj7cf4e6b2008-05-01 20:24:26 +0000262
263 /* For the various byte sized XER/CR pieces, use offset 8
sewardjf34eb492011-04-15 11:57:05 +0000264 in VSR0 .. VSR19. */
265 tl_assert(SZB(VSR0) == 16);
266 if (o == GOF(XER_SO) && sz == 1) return 8 +GOF(VSR0);
267 if (o == GOF(XER_OV) && sz == 1) return 8 +GOF(VSR1);
268 if (o == GOF(XER_CA) && sz == 1) return 8 +GOF(VSR2);
269 if (o == GOF(XER_BC) && sz == 1) return 8 +GOF(VSR3);
sewardj7cf4e6b2008-05-01 20:24:26 +0000270
sewardjf34eb492011-04-15 11:57:05 +0000271 if (o == GOF(CR0_321) && sz == 1) return 8 +GOF(VSR4);
272 if (o == GOF(CR0_0) && sz == 1) return 8 +GOF(VSR5);
273 if (o == GOF(CR1_321) && sz == 1) return 8 +GOF(VSR6);
274 if (o == GOF(CR1_0) && sz == 1) return 8 +GOF(VSR7);
275 if (o == GOF(CR2_321) && sz == 1) return 8 +GOF(VSR8);
276 if (o == GOF(CR2_0) && sz == 1) return 8 +GOF(VSR9);
277 if (o == GOF(CR3_321) && sz == 1) return 8 +GOF(VSR10);
278 if (o == GOF(CR3_0) && sz == 1) return 8 +GOF(VSR11);
279 if (o == GOF(CR4_321) && sz == 1) return 8 +GOF(VSR12);
280 if (o == GOF(CR4_0) && sz == 1) return 8 +GOF(VSR13);
281 if (o == GOF(CR5_321) && sz == 1) return 8 +GOF(VSR14);
282 if (o == GOF(CR5_0) && sz == 1) return 8 +GOF(VSR15);
283 if (o == GOF(CR6_321) && sz == 1) return 8 +GOF(VSR16);
284 if (o == GOF(CR6_0) && sz == 1) return 8 +GOF(VSR17);
285 if (o == GOF(CR7_321) && sz == 1) return 8 +GOF(VSR18);
286 if (o == GOF(CR7_0) && sz == 1) return 8 +GOF(VSR19);
sewardj7cf4e6b2008-05-01 20:24:26 +0000287
sewardjf34eb492011-04-15 11:57:05 +0000288 /* Vector registers .. use offset 0 in VSR0 .. VSR63. */
289 if (o >= GOF(VSR0) && o+sz <= GOF(VSR0) +SZB(VSR0)) return 0+ GOF(VSR0);
290 if (o >= GOF(VSR1) && o+sz <= GOF(VSR1) +SZB(VSR1)) return 0+ GOF(VSR1);
291 if (o >= GOF(VSR2) && o+sz <= GOF(VSR2) +SZB(VSR2)) return 0+ GOF(VSR2);
292 if (o >= GOF(VSR3) && o+sz <= GOF(VSR3) +SZB(VSR3)) return 0+ GOF(VSR3);
293 if (o >= GOF(VSR4) && o+sz <= GOF(VSR4) +SZB(VSR4)) return 0+ GOF(VSR4);
294 if (o >= GOF(VSR5) && o+sz <= GOF(VSR5) +SZB(VSR5)) return 0+ GOF(VSR5);
295 if (o >= GOF(VSR6) && o+sz <= GOF(VSR6) +SZB(VSR6)) return 0+ GOF(VSR6);
296 if (o >= GOF(VSR7) && o+sz <= GOF(VSR7) +SZB(VSR7)) return 0+ GOF(VSR7);
297 if (o >= GOF(VSR8) && o+sz <= GOF(VSR8) +SZB(VSR8)) return 0+ GOF(VSR8);
298 if (o >= GOF(VSR9) && o+sz <= GOF(VSR9) +SZB(VSR9)) return 0+ GOF(VSR9);
299 if (o >= GOF(VSR10) && o+sz <= GOF(VSR10)+SZB(VSR10)) return 0+ GOF(VSR10);
300 if (o >= GOF(VSR11) && o+sz <= GOF(VSR11)+SZB(VSR11)) return 0+ GOF(VSR11);
301 if (o >= GOF(VSR12) && o+sz <= GOF(VSR12)+SZB(VSR12)) return 0+ GOF(VSR12);
302 if (o >= GOF(VSR13) && o+sz <= GOF(VSR13)+SZB(VSR13)) return 0+ GOF(VSR13);
303 if (o >= GOF(VSR14) && o+sz <= GOF(VSR14)+SZB(VSR14)) return 0+ GOF(VSR14);
304 if (o >= GOF(VSR15) && o+sz <= GOF(VSR15)+SZB(VSR15)) return 0+ GOF(VSR15);
305 if (o >= GOF(VSR16) && o+sz <= GOF(VSR16)+SZB(VSR16)) return 0+ GOF(VSR16);
306 if (o >= GOF(VSR17) && o+sz <= GOF(VSR17)+SZB(VSR17)) return 0+ GOF(VSR17);
307 if (o >= GOF(VSR18) && o+sz <= GOF(VSR18)+SZB(VSR18)) return 0+ GOF(VSR18);
308 if (o >= GOF(VSR19) && o+sz <= GOF(VSR19)+SZB(VSR19)) return 0+ GOF(VSR19);
309 if (o >= GOF(VSR20) && o+sz <= GOF(VSR20)+SZB(VSR20)) return 0+ GOF(VSR20);
310 if (o >= GOF(VSR21) && o+sz <= GOF(VSR21)+SZB(VSR21)) return 0+ GOF(VSR21);
311 if (o >= GOF(VSR22) && o+sz <= GOF(VSR22)+SZB(VSR22)) return 0+ GOF(VSR22);
312 if (o >= GOF(VSR23) && o+sz <= GOF(VSR23)+SZB(VSR23)) return 0+ GOF(VSR23);
313 if (o >= GOF(VSR24) && o+sz <= GOF(VSR24)+SZB(VSR24)) return 0+ GOF(VSR24);
314 if (o >= GOF(VSR25) && o+sz <= GOF(VSR25)+SZB(VSR25)) return 0+ GOF(VSR25);
315 if (o >= GOF(VSR26) && o+sz <= GOF(VSR26)+SZB(VSR26)) return 0+ GOF(VSR26);
316 if (o >= GOF(VSR27) && o+sz <= GOF(VSR27)+SZB(VSR27)) return 0+ GOF(VSR27);
317 if (o >= GOF(VSR28) && o+sz <= GOF(VSR28)+SZB(VSR28)) return 0+ GOF(VSR28);
318 if (o >= GOF(VSR29) && o+sz <= GOF(VSR29)+SZB(VSR29)) return 0+ GOF(VSR29);
319 if (o >= GOF(VSR30) && o+sz <= GOF(VSR30)+SZB(VSR30)) return 0+ GOF(VSR30);
320 if (o >= GOF(VSR31) && o+sz <= GOF(VSR31)+SZB(VSR31)) return 0+ GOF(VSR31);
321 if (o >= GOF(VSR32) && o+sz <= GOF(VSR32)+SZB(VSR32)) return 0+ GOF(VSR32);
322 if (o >= GOF(VSR33) && o+sz <= GOF(VSR33)+SZB(VSR33)) return 0+ GOF(VSR33);
323 if (o >= GOF(VSR34) && o+sz <= GOF(VSR34)+SZB(VSR34)) return 0+ GOF(VSR34);
324 if (o >= GOF(VSR35) && o+sz <= GOF(VSR35)+SZB(VSR35)) return 0+ GOF(VSR35);
325 if (o >= GOF(VSR36) && o+sz <= GOF(VSR36)+SZB(VSR36)) return 0+ GOF(VSR36);
326 if (o >= GOF(VSR37) && o+sz <= GOF(VSR37)+SZB(VSR37)) return 0+ GOF(VSR37);
327 if (o >= GOF(VSR38) && o+sz <= GOF(VSR38)+SZB(VSR38)) return 0+ GOF(VSR38);
328 if (o >= GOF(VSR39) && o+sz <= GOF(VSR39)+SZB(VSR39)) return 0+ GOF(VSR39);
329 if (o >= GOF(VSR40) && o+sz <= GOF(VSR40)+SZB(VSR40)) return 0+ GOF(VSR40);
330 if (o >= GOF(VSR41) && o+sz <= GOF(VSR41)+SZB(VSR41)) return 0+ GOF(VSR41);
331 if (o >= GOF(VSR42) && o+sz <= GOF(VSR42)+SZB(VSR42)) return 0+ GOF(VSR42);
332 if (o >= GOF(VSR43) && o+sz <= GOF(VSR43)+SZB(VSR43)) return 0+ GOF(VSR43);
333 if (o >= GOF(VSR44) && o+sz <= GOF(VSR44)+SZB(VSR44)) return 0+ GOF(VSR44);
334 if (o >= GOF(VSR45) && o+sz <= GOF(VSR45)+SZB(VSR45)) return 0+ GOF(VSR45);
335 if (o >= GOF(VSR46) && o+sz <= GOF(VSR46)+SZB(VSR46)) return 0+ GOF(VSR46);
336 if (o >= GOF(VSR47) && o+sz <= GOF(VSR47)+SZB(VSR47)) return 0+ GOF(VSR47);
337 if (o >= GOF(VSR48) && o+sz <= GOF(VSR48)+SZB(VSR48)) return 0+ GOF(VSR48);
338 if (o >= GOF(VSR49) && o+sz <= GOF(VSR49)+SZB(VSR49)) return 0+ GOF(VSR49);
339 if (o >= GOF(VSR50) && o+sz <= GOF(VSR50)+SZB(VSR50)) return 0+ GOF(VSR50);
340 if (o >= GOF(VSR51) && o+sz <= GOF(VSR51)+SZB(VSR51)) return 0+ GOF(VSR51);
341 if (o >= GOF(VSR52) && o+sz <= GOF(VSR52)+SZB(VSR52)) return 0+ GOF(VSR52);
342 if (o >= GOF(VSR53) && o+sz <= GOF(VSR53)+SZB(VSR53)) return 0+ GOF(VSR53);
343 if (o >= GOF(VSR54) && o+sz <= GOF(VSR54)+SZB(VSR54)) return 0+ GOF(VSR54);
344 if (o >= GOF(VSR55) && o+sz <= GOF(VSR55)+SZB(VSR55)) return 0+ GOF(VSR55);
345 if (o >= GOF(VSR56) && o+sz <= GOF(VSR56)+SZB(VSR56)) return 0+ GOF(VSR56);
346 if (o >= GOF(VSR57) && o+sz <= GOF(VSR57)+SZB(VSR57)) return 0+ GOF(VSR57);
347 if (o >= GOF(VSR58) && o+sz <= GOF(VSR58)+SZB(VSR58)) return 0+ GOF(VSR58);
348 if (o >= GOF(VSR59) && o+sz <= GOF(VSR59)+SZB(VSR59)) return 0+ GOF(VSR59);
349 if (o >= GOF(VSR60) && o+sz <= GOF(VSR60)+SZB(VSR60)) return 0+ GOF(VSR60);
350 if (o >= GOF(VSR61) && o+sz <= GOF(VSR61)+SZB(VSR61)) return 0+ GOF(VSR61);
351 if (o >= GOF(VSR62) && o+sz <= GOF(VSR62)+SZB(VSR62)) return 0+ GOF(VSR62);
352 if (o >= GOF(VSR63) && o+sz <= GOF(VSR63)+SZB(VSR63)) return 0+ GOF(VSR63);
sewardj7cf4e6b2008-05-01 20:24:26 +0000353
354 VG_(printf)("MC_(get_otrack_shadow_offset)(ppc64)(off=%d,sz=%d)\n",
355 offset,szB);
356 tl_assert(0);
357# undef GOF
358# undef SZB
359
360 /* -------------------- ppc32 -------------------- */
361
362# elif defined(VGA_ppc32)
363
364# define GOF(_fieldname) \
365 (offsetof(VexGuestPPC32State,guest_##_fieldname))
366# define SZB(_fieldname) \
367 (sizeof(((VexGuestPPC32State*)0)->guest_##_fieldname))
368 Int o = offset;
369 Int sz = szB;
370 tl_assert(sz > 0);
371 tl_assert(host_is_big_endian());
372
373 if (o == GOF(GPR0) && sz == 4) return o;
374 if (o == GOF(GPR1) && sz == 4) return o;
375 if (o == GOF(GPR2) && sz == 4) return o;
376 if (o == GOF(GPR3) && sz == 4) return o;
377 if (o == GOF(GPR4) && sz == 4) return o;
378 if (o == GOF(GPR5) && sz == 4) return o;
379 if (o == GOF(GPR6) && sz == 4) return o;
380 if (o == GOF(GPR7) && sz == 4) return o;
381 if (o == GOF(GPR8) && sz == 4) return o;
382 if (o == GOF(GPR9) && sz == 4) return o;
383 if (o == GOF(GPR10) && sz == 4) return o;
384 if (o == GOF(GPR11) && sz == 4) return o;
385 if (o == GOF(GPR12) && sz == 4) return o;
386 if (o == GOF(GPR13) && sz == 4) return o;
387 if (o == GOF(GPR14) && sz == 4) return o;
388 if (o == GOF(GPR15) && sz == 4) return o;
389 if (o == GOF(GPR16) && sz == 4) return o;
390 if (o == GOF(GPR17) && sz == 4) return o;
391 if (o == GOF(GPR18) && sz == 4) return o;
392 if (o == GOF(GPR19) && sz == 4) return o;
393 if (o == GOF(GPR20) && sz == 4) return o;
394 if (o == GOF(GPR21) && sz == 4) return o;
395 if (o == GOF(GPR22) && sz == 4) return o;
396 if (o == GOF(GPR23) && sz == 4) return o;
397 if (o == GOF(GPR24) && sz == 4) return o;
398 if (o == GOF(GPR25) && sz == 4) return o;
399 if (o == GOF(GPR26) && sz == 4) return o;
400 if (o == GOF(GPR27) && sz == 4) return o;
401 if (o == GOF(GPR28) && sz == 4) return o;
402 if (o == GOF(GPR29) && sz == 4) return o;
403 if (o == GOF(GPR30) && sz == 4) return o;
404 if (o == GOF(GPR31) && sz == 4) return o;
405
406 if (o == GOF(LR) && sz == 4) return o;
407 if (o == GOF(CTR) && sz == 4) return o;
408
409 if (o == GOF(CIA) && sz == 4) return -1;
sewardj71633b12009-03-30 02:27:29 +0000410 if (o == GOF(IP_AT_SYSCALL) && sz == 4) return -1; /* slot unused */
sewardjf06eabf2012-04-02 15:10:37 +0000411 if (o == GOF(FPROUND) && sz == 1) return -1;
412 if (o == GOF(DFPROUND) && sz == 1) return -1;
sewardj3b507352009-02-14 15:28:46 +0000413 if (o == GOF(VRSAVE) && sz == 4) return -1;
florian2e497412012-08-26 03:22:09 +0000414 if (o == GOF(EMNOTE) && sz == 4) return -1;
sewardj7cf4e6b2008-05-01 20:24:26 +0000415 if (o == GOF(TISTART) && sz == 4) return -1;
416 if (o == GOF(TILEN) && sz == 4) return -1;
417 if (o == GOF(VSCR) && sz == 4) return -1;
418 if (o == GOF(REDIR_SP) && sz == 4) return -1;
419 if (o == GOF(SPRG3_RO) && sz == 4) return -1;
420
sewardjf34eb492011-04-15 11:57:05 +0000421 // With ISA 2.06, the "Vector-Scalar Floating-point" category
422 // provides facilities to support vector and scalar binary floating-
423 // point operations. A unified register file is an integral part
424 // of this new facility, combining floating point and vector registers
425 // using a 64x128-bit vector. These are referred to as VSR[0..63].
426 // The floating point registers are now mapped into double word element 0
427 // of VSR[0..31]. The 32x128-bit vector registers defined by the "Vector
428 // Facility [Category: Vector]" are now mapped to VSR[32..63].
429
430 // Floating point registers . . .
431 if (o == GOF(VSR0) && sz == 8) return o;
432 if (o == GOF(VSR1) && sz == 8) return o;
433 if (o == GOF(VSR2) && sz == 8) return o;
434 if (o == GOF(VSR3) && sz == 8) return o;
435 if (o == GOF(VSR4) && sz == 8) return o;
436 if (o == GOF(VSR5) && sz == 8) return o;
437 if (o == GOF(VSR6) && sz == 8) return o;
438 if (o == GOF(VSR7) && sz == 8) return o;
439 if (o == GOF(VSR8) && sz == 8) return o;
440 if (o == GOF(VSR9) && sz == 8) return o;
441 if (o == GOF(VSR10) && sz == 8) return o;
442 if (o == GOF(VSR11) && sz == 8) return o;
443 if (o == GOF(VSR12) && sz == 8) return o;
444 if (o == GOF(VSR13) && sz == 8) return o;
445 if (o == GOF(VSR14) && sz == 8) return o;
446 if (o == GOF(VSR15) && sz == 8) return o;
447 if (o == GOF(VSR16) && sz == 8) return o;
448 if (o == GOF(VSR17) && sz == 8) return o;
449 if (o == GOF(VSR18) && sz == 8) return o;
450 if (o == GOF(VSR19) && sz == 8) return o;
451 if (o == GOF(VSR20) && sz == 8) return o;
452 if (o == GOF(VSR21) && sz == 8) return o;
453 if (o == GOF(VSR22) && sz == 8) return o;
454 if (o == GOF(VSR23) && sz == 8) return o;
455 if (o == GOF(VSR24) && sz == 8) return o;
456 if (o == GOF(VSR25) && sz == 8) return o;
457 if (o == GOF(VSR26) && sz == 8) return o;
458 if (o == GOF(VSR27) && sz == 8) return o;
459 if (o == GOF(VSR28) && sz == 8) return o;
460 if (o == GOF(VSR29) && sz == 8) return o;
461 if (o == GOF(VSR30) && sz == 8) return o;
462 if (o == GOF(VSR31) && sz == 8) return o;
sewardj7cf4e6b2008-05-01 20:24:26 +0000463
464 /* For the various byte sized XER/CR pieces, use offset 8
sewardjf34eb492011-04-15 11:57:05 +0000465 in VSR0 .. VSR19. */
466 tl_assert(SZB(VSR0) == 16);
467 if (o == GOF(XER_SO) && sz == 1) return 8 +GOF(VSR0);
468 if (o == GOF(XER_OV) && sz == 1) return 8 +GOF(VSR1);
469 if (o == GOF(XER_CA) && sz == 1) return 8 +GOF(VSR2);
470 if (o == GOF(XER_BC) && sz == 1) return 8 +GOF(VSR3);
sewardj7cf4e6b2008-05-01 20:24:26 +0000471
sewardjf34eb492011-04-15 11:57:05 +0000472 if (o == GOF(CR0_321) && sz == 1) return 8 +GOF(VSR4);
473 if (o == GOF(CR0_0) && sz == 1) return 8 +GOF(VSR5);
474 if (o == GOF(CR1_321) && sz == 1) return 8 +GOF(VSR6);
475 if (o == GOF(CR1_0) && sz == 1) return 8 +GOF(VSR7);
476 if (o == GOF(CR2_321) && sz == 1) return 8 +GOF(VSR8);
477 if (o == GOF(CR2_0) && sz == 1) return 8 +GOF(VSR9);
478 if (o == GOF(CR3_321) && sz == 1) return 8 +GOF(VSR10);
479 if (o == GOF(CR3_0) && sz == 1) return 8 +GOF(VSR11);
480 if (o == GOF(CR4_321) && sz == 1) return 8 +GOF(VSR12);
481 if (o == GOF(CR4_0) && sz == 1) return 8 +GOF(VSR13);
482 if (o == GOF(CR5_321) && sz == 1) return 8 +GOF(VSR14);
483 if (o == GOF(CR5_0) && sz == 1) return 8 +GOF(VSR15);
484 if (o == GOF(CR6_321) && sz == 1) return 8 +GOF(VSR16);
485 if (o == GOF(CR6_0) && sz == 1) return 8 +GOF(VSR17);
486 if (o == GOF(CR7_321) && sz == 1) return 8 +GOF(VSR18);
487 if (o == GOF(CR7_0) && sz == 1) return 8 +GOF(VSR19);
sewardj7cf4e6b2008-05-01 20:24:26 +0000488
sewardjf34eb492011-04-15 11:57:05 +0000489 /* Vector registers .. use offset 0 in VSR0 .. VSR63. */
490 if (o >= GOF(VSR0) && o+sz <= GOF(VSR0) +SZB(VSR0)) return 0+ GOF(VSR0);
491 if (o >= GOF(VSR1) && o+sz <= GOF(VSR1) +SZB(VSR1)) return 0+ GOF(VSR1);
492 if (o >= GOF(VSR2) && o+sz <= GOF(VSR2) +SZB(VSR2)) return 0+ GOF(VSR2);
493 if (o >= GOF(VSR3) && o+sz <= GOF(VSR3) +SZB(VSR3)) return 0+ GOF(VSR3);
494 if (o >= GOF(VSR4) && o+sz <= GOF(VSR4) +SZB(VSR4)) return 0+ GOF(VSR4);
495 if (o >= GOF(VSR5) && o+sz <= GOF(VSR5) +SZB(VSR5)) return 0+ GOF(VSR5);
496 if (o >= GOF(VSR6) && o+sz <= GOF(VSR6) +SZB(VSR6)) return 0+ GOF(VSR6);
497 if (o >= GOF(VSR7) && o+sz <= GOF(VSR7) +SZB(VSR7)) return 0+ GOF(VSR7);
498 if (o >= GOF(VSR8) && o+sz <= GOF(VSR8) +SZB(VSR8)) return 0+ GOF(VSR8);
499 if (o >= GOF(VSR9) && o+sz <= GOF(VSR9) +SZB(VSR9)) return 0+ GOF(VSR9);
500 if (o >= GOF(VSR10) && o+sz <= GOF(VSR10)+SZB(VSR10)) return 0+ GOF(VSR10);
501 if (o >= GOF(VSR11) && o+sz <= GOF(VSR11)+SZB(VSR11)) return 0+ GOF(VSR11);
502 if (o >= GOF(VSR12) && o+sz <= GOF(VSR12)+SZB(VSR12)) return 0+ GOF(VSR12);
503 if (o >= GOF(VSR13) && o+sz <= GOF(VSR13)+SZB(VSR13)) return 0+ GOF(VSR13);
504 if (o >= GOF(VSR14) && o+sz <= GOF(VSR14)+SZB(VSR14)) return 0+ GOF(VSR14);
505 if (o >= GOF(VSR15) && o+sz <= GOF(VSR15)+SZB(VSR15)) return 0+ GOF(VSR15);
506 if (o >= GOF(VSR16) && o+sz <= GOF(VSR16)+SZB(VSR16)) return 0+ GOF(VSR16);
507 if (o >= GOF(VSR17) && o+sz <= GOF(VSR17)+SZB(VSR17)) return 0+ GOF(VSR17);
508 if (o >= GOF(VSR18) && o+sz <= GOF(VSR18)+SZB(VSR18)) return 0+ GOF(VSR18);
509 if (o >= GOF(VSR19) && o+sz <= GOF(VSR19)+SZB(VSR19)) return 0+ GOF(VSR19);
510 if (o >= GOF(VSR20) && o+sz <= GOF(VSR20)+SZB(VSR20)) return 0+ GOF(VSR20);
511 if (o >= GOF(VSR21) && o+sz <= GOF(VSR21)+SZB(VSR21)) return 0+ GOF(VSR21);
512 if (o >= GOF(VSR22) && o+sz <= GOF(VSR22)+SZB(VSR22)) return 0+ GOF(VSR22);
513 if (o >= GOF(VSR23) && o+sz <= GOF(VSR23)+SZB(VSR23)) return 0+ GOF(VSR23);
514 if (o >= GOF(VSR24) && o+sz <= GOF(VSR24)+SZB(VSR24)) return 0+ GOF(VSR24);
515 if (o >= GOF(VSR25) && o+sz <= GOF(VSR25)+SZB(VSR25)) return 0+ GOF(VSR25);
516 if (o >= GOF(VSR26) && o+sz <= GOF(VSR26)+SZB(VSR26)) return 0+ GOF(VSR26);
517 if (o >= GOF(VSR27) && o+sz <= GOF(VSR27)+SZB(VSR27)) return 0+ GOF(VSR27);
518 if (o >= GOF(VSR28) && o+sz <= GOF(VSR28)+SZB(VSR28)) return 0+ GOF(VSR28);
519 if (o >= GOF(VSR29) && o+sz <= GOF(VSR29)+SZB(VSR29)) return 0+ GOF(VSR29);
520 if (o >= GOF(VSR30) && o+sz <= GOF(VSR30)+SZB(VSR30)) return 0+ GOF(VSR30);
521 if (o >= GOF(VSR31) && o+sz <= GOF(VSR31)+SZB(VSR31)) return 0+ GOF(VSR31);
522 if (o >= GOF(VSR32) && o+sz <= GOF(VSR32)+SZB(VSR32)) return 0+ GOF(VSR32);
523 if (o >= GOF(VSR33) && o+sz <= GOF(VSR33)+SZB(VSR33)) return 0+ GOF(VSR33);
524 if (o >= GOF(VSR34) && o+sz <= GOF(VSR34)+SZB(VSR34)) return 0+ GOF(VSR34);
525 if (o >= GOF(VSR35) && o+sz <= GOF(VSR35)+SZB(VSR35)) return 0+ GOF(VSR35);
526 if (o >= GOF(VSR36) && o+sz <= GOF(VSR36)+SZB(VSR36)) return 0+ GOF(VSR36);
527 if (o >= GOF(VSR37) && o+sz <= GOF(VSR37)+SZB(VSR37)) return 0+ GOF(VSR37);
528 if (o >= GOF(VSR38) && o+sz <= GOF(VSR38)+SZB(VSR38)) return 0+ GOF(VSR38);
529 if (o >= GOF(VSR39) && o+sz <= GOF(VSR39)+SZB(VSR39)) return 0+ GOF(VSR39);
530 if (o >= GOF(VSR40) && o+sz <= GOF(VSR40)+SZB(VSR40)) return 0+ GOF(VSR40);
531 if (o >= GOF(VSR41) && o+sz <= GOF(VSR41)+SZB(VSR41)) return 0+ GOF(VSR41);
532 if (o >= GOF(VSR42) && o+sz <= GOF(VSR42)+SZB(VSR42)) return 0+ GOF(VSR42);
533 if (o >= GOF(VSR43) && o+sz <= GOF(VSR43)+SZB(VSR43)) return 0+ GOF(VSR43);
534 if (o >= GOF(VSR44) && o+sz <= GOF(VSR44)+SZB(VSR44)) return 0+ GOF(VSR44);
535 if (o >= GOF(VSR45) && o+sz <= GOF(VSR45)+SZB(VSR45)) return 0+ GOF(VSR45);
536 if (o >= GOF(VSR46) && o+sz <= GOF(VSR46)+SZB(VSR46)) return 0+ GOF(VSR46);
537 if (o >= GOF(VSR47) && o+sz <= GOF(VSR47)+SZB(VSR47)) return 0+ GOF(VSR47);
538 if (o >= GOF(VSR48) && o+sz <= GOF(VSR48)+SZB(VSR48)) return 0+ GOF(VSR48);
539 if (o >= GOF(VSR49) && o+sz <= GOF(VSR49)+SZB(VSR49)) return 0+ GOF(VSR49);
540 if (o >= GOF(VSR50) && o+sz <= GOF(VSR50)+SZB(VSR50)) return 0+ GOF(VSR50);
541 if (o >= GOF(VSR51) && o+sz <= GOF(VSR51)+SZB(VSR51)) return 0+ GOF(VSR51);
542 if (o >= GOF(VSR52) && o+sz <= GOF(VSR52)+SZB(VSR52)) return 0+ GOF(VSR52);
543 if (o >= GOF(VSR53) && o+sz <= GOF(VSR53)+SZB(VSR53)) return 0+ GOF(VSR53);
544 if (o >= GOF(VSR54) && o+sz <= GOF(VSR54)+SZB(VSR54)) return 0+ GOF(VSR54);
545 if (o >= GOF(VSR55) && o+sz <= GOF(VSR55)+SZB(VSR55)) return 0+ GOF(VSR55);
546 if (o >= GOF(VSR56) && o+sz <= GOF(VSR56)+SZB(VSR56)) return 0+ GOF(VSR56);
547 if (o >= GOF(VSR57) && o+sz <= GOF(VSR57)+SZB(VSR57)) return 0+ GOF(VSR57);
548 if (o >= GOF(VSR58) && o+sz <= GOF(VSR58)+SZB(VSR58)) return 0+ GOF(VSR58);
549 if (o >= GOF(VSR59) && o+sz <= GOF(VSR59)+SZB(VSR59)) return 0+ GOF(VSR59);
550 if (o >= GOF(VSR60) && o+sz <= GOF(VSR60)+SZB(VSR60)) return 0+ GOF(VSR60);
551 if (o >= GOF(VSR61) && o+sz <= GOF(VSR61)+SZB(VSR61)) return 0+ GOF(VSR61);
552 if (o >= GOF(VSR62) && o+sz <= GOF(VSR62)+SZB(VSR62)) return 0+ GOF(VSR62);
553 if (o >= GOF(VSR63) && o+sz <= GOF(VSR63)+SZB(VSR63)) return 0+ GOF(VSR63);
sewardj7cf4e6b2008-05-01 20:24:26 +0000554
555 VG_(printf)("MC_(get_otrack_shadow_offset)(ppc32)(off=%d,sz=%d)\n",
556 offset,szB);
557 tl_assert(0);
558# undef GOF
559# undef SZB
560
561 /* -------------------- amd64 -------------------- */
562
563# elif defined(VGA_amd64)
564
565# define GOF(_fieldname) \
566 (offsetof(VexGuestAMD64State,guest_##_fieldname))
567# define SZB(_fieldname) \
568 (sizeof(((VexGuestAMD64State*)0)->guest_##_fieldname))
569 Int o = offset;
570 Int sz = szB;
571 Bool is1248 = sz == 8 || sz == 4 || sz == 2 || sz == 1;
572 tl_assert(sz > 0);
573 tl_assert(host_is_little_endian());
574
575 if (o == GOF(RAX) && is1248) return o;
576 if (o == GOF(RCX) && is1248) return o;
577 if (o == GOF(RDX) && is1248) return o;
578 if (o == GOF(RBX) && is1248) return o;
579 if (o == GOF(RSP) && is1248) return o;
580 if (o == GOF(RBP) && is1248) return o;
581 if (o == GOF(RSI) && is1248) return o;
582 if (o == GOF(RDI) && is1248) return o;
583 if (o == GOF(R8) && is1248) return o;
584 if (o == GOF(R9) && is1248) return o;
585 if (o == GOF(R10) && is1248) return o;
586 if (o == GOF(R11) && is1248) return o;
587 if (o == GOF(R12) && is1248) return o;
588 if (o == GOF(R13) && is1248) return o;
589 if (o == GOF(R14) && is1248) return o;
590 if (o == GOF(R15) && is1248) return o;
591
592 if (o == GOF(CC_DEP1) && sz == 8) return o;
593 if (o == GOF(CC_DEP2) && sz == 8) return o;
594
595 if (o == GOF(CC_OP) && sz == 8) return -1; /* slot used for %AH */
596 if (o == GOF(CC_NDEP) && sz == 8) return -1; /* slot used for %BH */
597 if (o == GOF(DFLAG) && sz == 8) return -1; /* slot used for %CH */
598 if (o == GOF(RIP) && sz == 8) return -1; /* slot unused */
sewardj71633b12009-03-30 02:27:29 +0000599 if (o == GOF(IP_AT_SYSCALL) && sz == 8) return -1; /* slot unused */
sewardj7cf4e6b2008-05-01 20:24:26 +0000600 if (o == GOF(IDFLAG) && sz == 8) return -1; /* slot used for %DH */
sewardj65864932010-09-28 16:00:11 +0000601 if (o == GOF(ACFLAG) && sz == 8) return -1; /* slot unused */
sewardj7cf4e6b2008-05-01 20:24:26 +0000602 if (o == GOF(FS_ZERO) && sz == 8) return -1; /* slot unused */
njnf76d27a2009-05-28 01:53:07 +0000603 if (o == GOF(GS_0x60) && sz == 8) return -1; /* slot unused */
sewardj105e69c2008-05-09 23:26:19 +0000604 if (o == GOF(TISTART) && sz == 8) return -1; /* slot unused */
605 if (o == GOF(TILEN) && sz == 8) return -1; /* slot unused */
sewardj3d5246f2013-01-29 21:13:00 +0000606 if (o == GOF(NRADDR) && sz == 8) return -1; /* slot unused */
sewardj7cf4e6b2008-05-01 20:24:26 +0000607
608 /* Treat %AH, %BH, %CH, %DH as independent registers. To do this
609 requires finding 4 unused 32-bit slots in the second-shadow
610 guest state, respectively: CC_OP CC_NDEP DFLAG IDFLAG, since
611 none of those are tracked. */
612 tl_assert(SZB(CC_OP) == 8);
613 tl_assert(SZB(CC_NDEP) == 8);
614 tl_assert(SZB(IDFLAG) == 8);
615 tl_assert(SZB(DFLAG) == 8);
616
617 if (o == 1+ GOF(RAX) && szB == 1) return GOF(CC_OP);
618 if (o == 1+ GOF(RBX) && szB == 1) return GOF(CC_NDEP);
619 if (o == 1+ GOF(RCX) && szB == 1) return GOF(DFLAG);
620 if (o == 1+ GOF(RDX) && szB == 1) return GOF(IDFLAG);
621
622 /* skip XMM and FP admin stuff */
623 if (o == GOF(SSEROUND) && szB == 8) return -1;
624 if (o == GOF(FTOP) && szB == 4) return -1;
625 if (o == GOF(FPROUND) && szB == 8) return -1;
florian2e497412012-08-26 03:22:09 +0000626 if (o == GOF(EMNOTE) && szB == 4) return -1;
sewardj89ea7ab2008-05-27 16:08:24 +0000627 if (o == GOF(FC3210) && szB == 8) return -1;
sewardj7cf4e6b2008-05-01 20:24:26 +0000628
629 /* XMM registers */
sewardj45fa9f42012-05-21 10:18:10 +0000630 if (o >= GOF(YMM0) && o+sz <= GOF(YMM0) +SZB(YMM0)) return GOF(YMM0);
631 if (o >= GOF(YMM1) && o+sz <= GOF(YMM1) +SZB(YMM1)) return GOF(YMM1);
632 if (o >= GOF(YMM2) && o+sz <= GOF(YMM2) +SZB(YMM2)) return GOF(YMM2);
633 if (o >= GOF(YMM3) && o+sz <= GOF(YMM3) +SZB(YMM3)) return GOF(YMM3);
634 if (o >= GOF(YMM4) && o+sz <= GOF(YMM4) +SZB(YMM4)) return GOF(YMM4);
635 if (o >= GOF(YMM5) && o+sz <= GOF(YMM5) +SZB(YMM5)) return GOF(YMM5);
636 if (o >= GOF(YMM6) && o+sz <= GOF(YMM6) +SZB(YMM6)) return GOF(YMM6);
637 if (o >= GOF(YMM7) && o+sz <= GOF(YMM7) +SZB(YMM7)) return GOF(YMM7);
638 if (o >= GOF(YMM8) && o+sz <= GOF(YMM8) +SZB(YMM8)) return GOF(YMM8);
639 if (o >= GOF(YMM9) && o+sz <= GOF(YMM9) +SZB(YMM9)) return GOF(YMM9);
640 if (o >= GOF(YMM10) && o+sz <= GOF(YMM10)+SZB(YMM10)) return GOF(YMM10);
641 if (o >= GOF(YMM11) && o+sz <= GOF(YMM11)+SZB(YMM11)) return GOF(YMM11);
642 if (o >= GOF(YMM12) && o+sz <= GOF(YMM12)+SZB(YMM12)) return GOF(YMM12);
643 if (o >= GOF(YMM13) && o+sz <= GOF(YMM13)+SZB(YMM13)) return GOF(YMM13);
644 if (o >= GOF(YMM14) && o+sz <= GOF(YMM14)+SZB(YMM14)) return GOF(YMM14);
645 if (o >= GOF(YMM15) && o+sz <= GOF(YMM15)+SZB(YMM15)) return GOF(YMM15);
646 if (o >= GOF(YMM16) && o+sz <= GOF(YMM16)+SZB(YMM16)) return GOF(YMM16);
sewardj7cf4e6b2008-05-01 20:24:26 +0000647
sewardjf1a483a2008-06-13 07:44:02 +0000648 /* MMX accesses to FP regs. Need to allow for 32-bit references
649 due to dirty helpers for frstor etc, which reference the entire
650 64-byte block in one go. */
651 if (o >= GOF(FPREG[0])
652 && o+sz <= GOF(FPREG[0])+SZB(FPREG[0])) return GOF(FPREG[0]);
653 if (o >= GOF(FPREG[1])
654 && o+sz <= GOF(FPREG[1])+SZB(FPREG[1])) return GOF(FPREG[1]);
655 if (o >= GOF(FPREG[2])
656 && o+sz <= GOF(FPREG[2])+SZB(FPREG[2])) return GOF(FPREG[2]);
657 if (o >= GOF(FPREG[3])
658 && o+sz <= GOF(FPREG[3])+SZB(FPREG[3])) return GOF(FPREG[3]);
659 if (o >= GOF(FPREG[4])
660 && o+sz <= GOF(FPREG[4])+SZB(FPREG[4])) return GOF(FPREG[4]);
661 if (o >= GOF(FPREG[5])
662 && o+sz <= GOF(FPREG[5])+SZB(FPREG[5])) return GOF(FPREG[5]);
663 if (o >= GOF(FPREG[6])
664 && o+sz <= GOF(FPREG[6])+SZB(FPREG[6])) return GOF(FPREG[6]);
665 if (o >= GOF(FPREG[7])
666 && o+sz <= GOF(FPREG[7])+SZB(FPREG[7])) return GOF(FPREG[7]);
sewardj7cf4e6b2008-05-01 20:24:26 +0000667
668 /* Map high halves of %RAX,%RCX,%RDX,%RBX to the whole register.
669 This is needed because the general handling of dirty helper
670 calls is done in 4 byte chunks. Hence we will see these.
671 Currently we only expect to see artefacts from CPUID. */
672 if (o == 4+ GOF(RAX) && sz == 4) return GOF(RAX);
673 if (o == 4+ GOF(RCX) && sz == 4) return GOF(RCX);
674 if (o == 4+ GOF(RDX) && sz == 4) return GOF(RDX);
675 if (o == 4+ GOF(RBX) && sz == 4) return GOF(RBX);
676
677 VG_(printf)("MC_(get_otrack_shadow_offset)(amd64)(off=%d,sz=%d)\n",
678 offset,szB);
679 tl_assert(0);
680# undef GOF
681# undef SZB
682
683 /* --------------------- x86 --------------------- */
684
685# elif defined(VGA_x86)
686
687# define GOF(_fieldname) \
688 (offsetof(VexGuestX86State,guest_##_fieldname))
689# define SZB(_fieldname) \
690 (sizeof(((VexGuestX86State*)0)->guest_##_fieldname))
691
692 Int o = offset;
693 Int sz = szB;
694 Bool is124 = sz == 4 || sz == 2 || sz == 1;
695 tl_assert(sz > 0);
696 tl_assert(host_is_little_endian());
697
698 if (o == GOF(EAX) && is124) return o;
699 if (o == GOF(ECX) && is124) return o;
700 if (o == GOF(EDX) && is124) return o;
701 if (o == GOF(EBX) && is124) return o;
702 if (o == GOF(ESP) && is124) return o;
703 if (o == GOF(EBP) && is124) return o;
704 if (o == GOF(ESI) && is124) return o;
705 if (o == GOF(EDI) && is124) return o;
706
707 if (o == GOF(CC_DEP1) && sz == 4) return o;
708 if (o == GOF(CC_DEP2) && sz == 4) return o;
709
710 if (o == GOF(CC_OP) && sz == 4) return -1; /* slot used for %AH */
711 if (o == GOF(CC_NDEP) && sz == 4) return -1; /* slot used for %BH */
712 if (o == GOF(DFLAG) && sz == 4) return -1; /* slot used for %CH */
713 if (o == GOF(EIP) && sz == 4) return -1; /* slot unused */
sewardj71633b12009-03-30 02:27:29 +0000714 if (o == GOF(IP_AT_SYSCALL) && sz == 4) return -1; /* slot unused */
sewardj7cf4e6b2008-05-01 20:24:26 +0000715 if (o == GOF(IDFLAG) && sz == 4) return -1; /* slot used for %DH */
716 if (o == GOF(ACFLAG) && sz == 4) return -1; /* slot unused */
sewardj105e69c2008-05-09 23:26:19 +0000717 if (o == GOF(TISTART) && sz == 4) return -1; /* slot unused */
718 if (o == GOF(TILEN) && sz == 4) return -1; /* slot unused */
sewardj5575f052011-01-28 00:53:37 +0000719 if (o == GOF(NRADDR) && sz == 4) return -1; /* slot unused */
sewardj7cf4e6b2008-05-01 20:24:26 +0000720
721 /* Treat %AH, %BH, %CH, %DH as independent registers. To do this
722 requires finding 4 unused 32-bit slots in the second-shadow
723 guest state, respectively: CC_OP CC_NDEP DFLAG IDFLAG since none
724 of those are tracked. */
725 tl_assert(SZB(CC_OP) == 4);
726 tl_assert(SZB(CC_NDEP) == 4);
727 tl_assert(SZB(DFLAG) == 4);
728 tl_assert(SZB(IDFLAG) == 4);
729 if (o == 1+ GOF(EAX) && szB == 1) return GOF(CC_OP);
730 if (o == 1+ GOF(EBX) && szB == 1) return GOF(CC_NDEP);
731 if (o == 1+ GOF(ECX) && szB == 1) return GOF(DFLAG);
732 if (o == 1+ GOF(EDX) && szB == 1) return GOF(IDFLAG);
733
734 /* skip XMM and FP admin stuff */
735 if (o == GOF(SSEROUND) && szB == 4) return -1;
736 if (o == GOF(FTOP) && szB == 4) return -1;
737 if (o == GOF(FPROUND) && szB == 4) return -1;
florian2e497412012-08-26 03:22:09 +0000738 if (o == GOF(EMNOTE) && szB == 4) return -1;
sewardj7cf4e6b2008-05-01 20:24:26 +0000739 if (o == GOF(FC3210) && szB == 4) return -1;
740
741 /* XMM registers */
742 if (o >= GOF(XMM0) && o+sz <= GOF(XMM0)+SZB(XMM0)) return GOF(XMM0);
743 if (o >= GOF(XMM1) && o+sz <= GOF(XMM1)+SZB(XMM1)) return GOF(XMM1);
744 if (o >= GOF(XMM2) && o+sz <= GOF(XMM2)+SZB(XMM2)) return GOF(XMM2);
745 if (o >= GOF(XMM3) && o+sz <= GOF(XMM3)+SZB(XMM3)) return GOF(XMM3);
746 if (o >= GOF(XMM4) && o+sz <= GOF(XMM4)+SZB(XMM4)) return GOF(XMM4);
747 if (o >= GOF(XMM5) && o+sz <= GOF(XMM5)+SZB(XMM5)) return GOF(XMM5);
748 if (o >= GOF(XMM6) && o+sz <= GOF(XMM6)+SZB(XMM6)) return GOF(XMM6);
749 if (o >= GOF(XMM7) && o+sz <= GOF(XMM7)+SZB(XMM7)) return GOF(XMM7);
750
751 /* MMX accesses to FP regs. Need to allow for 32-bit references
752 due to dirty helpers for frstor etc, which reference the entire
753 64-byte block in one go. */
754 if (o >= GOF(FPREG[0])
755 && o+sz <= GOF(FPREG[0])+SZB(FPREG[0])) return GOF(FPREG[0]);
756 if (o >= GOF(FPREG[1])
757 && o+sz <= GOF(FPREG[1])+SZB(FPREG[1])) return GOF(FPREG[1]);
758 if (o >= GOF(FPREG[2])
759 && o+sz <= GOF(FPREG[2])+SZB(FPREG[2])) return GOF(FPREG[2]);
760 if (o >= GOF(FPREG[3])
761 && o+sz <= GOF(FPREG[3])+SZB(FPREG[3])) return GOF(FPREG[3]);
762 if (o >= GOF(FPREG[4])
763 && o+sz <= GOF(FPREG[4])+SZB(FPREG[4])) return GOF(FPREG[4]);
764 if (o >= GOF(FPREG[5])
765 && o+sz <= GOF(FPREG[5])+SZB(FPREG[5])) return GOF(FPREG[5]);
766 if (o >= GOF(FPREG[6])
767 && o+sz <= GOF(FPREG[6])+SZB(FPREG[6])) return GOF(FPREG[6]);
768 if (o >= GOF(FPREG[7])
769 && o+sz <= GOF(FPREG[7])+SZB(FPREG[7])) return GOF(FPREG[7]);
770
771 /* skip %GS and other segment related stuff. We could shadow
772 guest_LDT and guest_GDT, although it seems pointless.
773 guest_CS .. guest_SS are too small to shadow directly and it
774 also seems pointless to shadow them indirectly (that is, in
775 the style of %AH .. %DH). */
776 if (o == GOF(CS) && sz == 2) return -1;
777 if (o == GOF(DS) && sz == 2) return -1;
778 if (o == GOF(ES) && sz == 2) return -1;
779 if (o == GOF(FS) && sz == 2) return -1;
780 if (o == GOF(GS) && sz == 2) return -1;
781 if (o == GOF(SS) && sz == 2) return -1;
782 if (o == GOF(LDT) && sz == 4) return -1;
783 if (o == GOF(GDT) && sz == 4) return -1;
784
785 VG_(printf)("MC_(get_otrack_shadow_offset)(x86)(off=%d,sz=%d)\n",
786 offset,szB);
787 tl_assert(0);
788# undef GOF
789# undef SZB
790
sewardjb5b87402011-03-07 16:05:35 +0000791 /* -------------------- s390x -------------------- */
792
793# elif defined(VGA_s390x)
794# define GOF(_fieldname) \
795 (offsetof(VexGuestS390XState,guest_##_fieldname))
796 Int o = offset;
797 Int sz = szB;
798 tl_assert(sz > 0);
799 tl_assert(host_is_big_endian());
800
801 /* no matter what byte(s) we change, we have changed the full 8 byte value
802 and need to track this change for the whole register */
803 if (o >= GOF(r0) && sz <= 8 && o <= (GOF(r15) + 8 - sz))
804 return GOF(r0) + ((o-GOF(r0)) & -8) ;
805
806
807 /* fprs are accessed 4 or 8 byte at once. Again, we track that change for
808 the full register */
809 if ((sz == 8 || sz == 4) && o >= GOF(f0) && o <= GOF(f15)+8-sz)
810 return GOF(f0) + ((o-GOF(f0)) & -8) ;
811
812 /* access registers are accessed 4 bytes at once */
813 if (sz == 4 && o >= GOF(a0) && o <= GOF(a15))
florian30e2d652012-09-03 17:34:22 +0000814 return o;
sewardjb5b87402011-03-07 16:05:35 +0000815
816 /* we access the guest counter either fully or one of the 4byte words */
817 if (o == GOF(counter) && (sz == 8 || sz ==4))
818 return o;
819 if (o == GOF(counter) + 4 && sz == 4)
820 return o;
821
florian30e2d652012-09-03 17:34:22 +0000822 if (o == GOF(EMNOTE) && sz == 4) return -1;
823
824 if (o == GOF(CC_OP) && sz == 8) return -1;
florian234955d2013-05-31 15:44:06 +0000825 /* We access CC_DEP1 either fully or bits [0:31] */
826 if (o == GOF(CC_DEP1) && (sz == 8 || sz ==4))
827 return o;
florian30e2d652012-09-03 17:34:22 +0000828 if (o == GOF(CC_DEP2) && sz == 8) return o;
829 if (o == GOF(CC_NDEP) && sz == 8) return -1;
830 if (o == GOF(TISTART) && sz == 8) return -1;
831 if (o == GOF(TILEN) && sz == 8) return -1;
832 if (o == GOF(NRADDR) && sz == 8) return -1;
833 if (o == GOF(IP_AT_SYSCALL) && sz == 8) return -1;
florian4fea8402012-09-11 23:06:02 +0000834 if (o == GOF(fpc) && sz == 4) return -1;
florian30e2d652012-09-03 17:34:22 +0000835 if (o == GOF(IA) && sz == 8) return -1;
836 if (o == (GOF(IA) + 4) && sz == 4) return -1;
837 if (o == GOF(SYSNO) && sz == 8) return -1;
sewardjb5b87402011-03-07 16:05:35 +0000838 VG_(printf)("MC_(get_otrack_shadow_offset)(s390x)(off=%d,sz=%d)\n",
839 offset,szB);
840 tl_assert(0);
841# undef GOF
842
843
sewardj59570ff2010-01-01 11:59:33 +0000844 /* --------------------- arm --------------------- */
845
846# elif defined(VGA_arm)
847
848# define GOF(_fieldname) \
849 (offsetof(VexGuestARMState,guest_##_fieldname))
850# define SZB(_fieldname) \
851 (sizeof(((VexGuestARMState*)0)->guest_##_fieldname))
852
853 Int o = offset;
854 Int sz = szB;
855 tl_assert(sz > 0);
856 tl_assert(host_is_little_endian());
857
858 if (o == GOF(R0) && sz == 4) return o;
859 if (o == GOF(R1) && sz == 4) return o;
860 if (o == GOF(R2) && sz == 4) return o;
861 if (o == GOF(R3) && sz == 4) return o;
862 if (o == GOF(R4) && sz == 4) return o;
863 if (o == GOF(R5) && sz == 4) return o;
864 if (o == GOF(R6) && sz == 4) return o;
865 if (o == GOF(R7) && sz == 4) return o;
866 if (o == GOF(R8) && sz == 4) return o;
867 if (o == GOF(R9) && sz == 4) return o;
868 if (o == GOF(R10) && sz == 4) return o;
869 if (o == GOF(R11) && sz == 4) return o;
870 if (o == GOF(R12) && sz == 4) return o;
871 if (o == GOF(R13) && sz == 4) return o;
872 if (o == GOF(R14) && sz == 4) return o;
873
874 /* EAZG: These may be completely wrong. */
sewardjca9054a2010-08-22 12:16:25 +0000875 if (o == GOF(R15T) && sz == 4) return -1; /* slot unused */
sewardj59570ff2010-01-01 11:59:33 +0000876 if (o == GOF(CC_OP) && sz == 4) return -1; /* slot unused */
877
878 if (o == GOF(CC_DEP1) && sz == 4) return o;
879 if (o == GOF(CC_DEP2) && sz == 4) return o;
880
881 if (o == GOF(CC_NDEP) && sz == 4) return -1; /* slot unused */
882
sewardjca9054a2010-08-22 12:16:25 +0000883 if (o == GOF(QFLAG32) && sz == 4) return o;
884
sewardj6fede422010-09-22 22:27:41 +0000885 if (o == GOF(GEFLAG0) && sz == 4) return o;
886 if (o == GOF(GEFLAG1) && sz == 4) return o;
887 if (o == GOF(GEFLAG2) && sz == 4) return o;
888 if (o == GOF(GEFLAG3) && sz == 4) return o;
889
sewardj59570ff2010-01-01 11:59:33 +0000890 //if (o == GOF(SYSCALLNO) && sz == 4) return -1; /* slot unused */
891 //if (o == GOF(CC) && sz == 4) return -1; /* slot unused */
florian2e497412012-08-26 03:22:09 +0000892 //if (o == GOF(EMNOTE) && sz == 4) return -1; /* slot unused */
sewardj59570ff2010-01-01 11:59:33 +0000893 //if (o == GOF(TISTART) && sz == 4) return -1; /* slot unused */
894 //if (o == GOF(NRADDR) && sz == 4) return -1; /* slot unused */
895
896 if (o == GOF(FPSCR) && sz == 4) return -1;
897 if (o == GOF(TPIDRURO) && sz == 4) return -1;
sewardjca9054a2010-08-22 12:16:25 +0000898 if (o == GOF(ITSTATE) && sz == 4) return -1;
sewardj59570ff2010-01-01 11:59:33 +0000899
sewardj8f6ec702010-09-29 21:40:44 +0000900 /* Accesses to F or D registers */
901 if (sz == 4 || sz == 8) {
902 if (o >= GOF(D0) && o+sz <= GOF(D0) +SZB(D0)) return GOF(D0);
903 if (o >= GOF(D1) && o+sz <= GOF(D1) +SZB(D1)) return GOF(D1);
904 if (o >= GOF(D2) && o+sz <= GOF(D2) +SZB(D2)) return GOF(D2);
905 if (o >= GOF(D3) && o+sz <= GOF(D3) +SZB(D3)) return GOF(D3);
906 if (o >= GOF(D4) && o+sz <= GOF(D4) +SZB(D4)) return GOF(D4);
907 if (o >= GOF(D5) && o+sz <= GOF(D5) +SZB(D5)) return GOF(D5);
908 if (o >= GOF(D6) && o+sz <= GOF(D6) +SZB(D6)) return GOF(D6);
909 if (o >= GOF(D7) && o+sz <= GOF(D7) +SZB(D7)) return GOF(D7);
910 if (o >= GOF(D8) && o+sz <= GOF(D8) +SZB(D8)) return GOF(D8);
911 if (o >= GOF(D9) && o+sz <= GOF(D9) +SZB(D9)) return GOF(D9);
912 if (o >= GOF(D10) && o+sz <= GOF(D10)+SZB(D10)) return GOF(D10);
913 if (o >= GOF(D11) && o+sz <= GOF(D11)+SZB(D11)) return GOF(D11);
914 if (o >= GOF(D12) && o+sz <= GOF(D12)+SZB(D12)) return GOF(D12);
915 if (o >= GOF(D13) && o+sz <= GOF(D13)+SZB(D13)) return GOF(D13);
916 if (o >= GOF(D14) && o+sz <= GOF(D14)+SZB(D14)) return GOF(D14);
917 if (o >= GOF(D15) && o+sz <= GOF(D15)+SZB(D15)) return GOF(D15);
918 if (o >= GOF(D16) && o+sz <= GOF(D16)+SZB(D16)) return GOF(D16);
919 if (o >= GOF(D17) && o+sz <= GOF(D17)+SZB(D17)) return GOF(D17);
920 if (o >= GOF(D18) && o+sz <= GOF(D18)+SZB(D18)) return GOF(D18);
921 if (o >= GOF(D19) && o+sz <= GOF(D19)+SZB(D19)) return GOF(D19);
922 if (o >= GOF(D20) && o+sz <= GOF(D20)+SZB(D20)) return GOF(D20);
923 if (o >= GOF(D21) && o+sz <= GOF(D21)+SZB(D21)) return GOF(D21);
924 if (o >= GOF(D22) && o+sz <= GOF(D22)+SZB(D22)) return GOF(D22);
925 if (o >= GOF(D23) && o+sz <= GOF(D23)+SZB(D23)) return GOF(D23);
926 if (o >= GOF(D24) && o+sz <= GOF(D24)+SZB(D24)) return GOF(D24);
927 if (o >= GOF(D25) && o+sz <= GOF(D25)+SZB(D25)) return GOF(D25);
928 if (o >= GOF(D26) && o+sz <= GOF(D26)+SZB(D26)) return GOF(D26);
929 if (o >= GOF(D27) && o+sz <= GOF(D27)+SZB(D27)) return GOF(D27);
930 if (o >= GOF(D28) && o+sz <= GOF(D28)+SZB(D28)) return GOF(D28);
931 if (o >= GOF(D29) && o+sz <= GOF(D29)+SZB(D29)) return GOF(D29);
932 if (o >= GOF(D30) && o+sz <= GOF(D30)+SZB(D30)) return GOF(D30);
933 if (o >= GOF(D31) && o+sz <= GOF(D31)+SZB(D31)) return GOF(D31);
934 }
935
936 /* Accesses to Q registers */
937 if (sz == 16) {
938 if (o >= GOF(D0) && o+sz <= GOF(D0) +2*SZB(D0)) return GOF(D0); // Q0
939 if (o >= GOF(D2) && o+sz <= GOF(D2) +2*SZB(D2)) return GOF(D2); // Q1
940 if (o >= GOF(D4) && o+sz <= GOF(D4) +2*SZB(D4)) return GOF(D4); // Q2
941 if (o >= GOF(D6) && o+sz <= GOF(D6) +2*SZB(D6)) return GOF(D6); // Q3
942 if (o >= GOF(D8) && o+sz <= GOF(D8) +2*SZB(D8)) return GOF(D8); // Q4
943 if (o >= GOF(D10) && o+sz <= GOF(D10)+2*SZB(D10)) return GOF(D10); // Q5
944 if (o >= GOF(D12) && o+sz <= GOF(D12)+2*SZB(D12)) return GOF(D12); // Q6
945 if (o >= GOF(D14) && o+sz <= GOF(D14)+2*SZB(D14)) return GOF(D14); // Q7
946 if (o >= GOF(D16) && o+sz <= GOF(D16)+2*SZB(D16)) return GOF(D16); // Q8
947 if (o >= GOF(D18) && o+sz <= GOF(D18)+2*SZB(D18)) return GOF(D18); // Q9
948 if (o >= GOF(D20) && o+sz <= GOF(D20)+2*SZB(D20)) return GOF(D20); // Q10
949 if (o >= GOF(D22) && o+sz <= GOF(D22)+2*SZB(D22)) return GOF(D22); // Q11
950 if (o >= GOF(D24) && o+sz <= GOF(D24)+2*SZB(D24)) return GOF(D24); // Q12
951 if (o >= GOF(D26) && o+sz <= GOF(D26)+2*SZB(D26)) return GOF(D26); // Q13
952 if (o >= GOF(D28) && o+sz <= GOF(D28)+2*SZB(D28)) return GOF(D28); // Q14
953 if (o >= GOF(D30) && o+sz <= GOF(D30)+2*SZB(D30)) return GOF(D30); // Q15
954 }
sewardj59570ff2010-01-01 11:59:33 +0000955
sewardjb29b6492012-12-13 15:17:40 +0000956 if (o == GOF(TISTART) && sz == 4) return -1;
957 if (o == GOF(TILEN) && sz == 4) return -1;
958
sewardj59570ff2010-01-01 11:59:33 +0000959 VG_(printf)("MC_(get_otrack_shadow_offset)(arm)(off=%d,sz=%d)\n",
960 offset,szB);
961 tl_assert(0);
962# undef GOF
963# undef SZB
964
sewardjf0c12502014-01-12 12:54:00 +0000965 /* --------------------- arm64 --------------------- */
966
967# elif defined(VGA_arm64)
968
969# define GOF(_fieldname) \
970 (offsetof(VexGuestARM64State,guest_##_fieldname))
971# define SZB(_fieldname) \
972 (sizeof(((VexGuestARM64State*)0)->guest_##_fieldname))
973
974 Int o = offset;
975 Int sz = szB;
976 tl_assert(sz > 0);
977 tl_assert(host_is_little_endian());
978 (void)o; // RMME -- just to stop gcc warning that o is unused
979
980 VG_(printf)("MC_(get_otrack_shadow_offset)(arm64)(off=%d,sz=%d)\n",
981 offset,szB);
982 tl_assert(0);
983# undef GOF
984# undef SZB
985
sewardj5db15402012-06-07 09:13:21 +0000986 /* --------------------- mips32 --------------------- */
987
988# elif defined(VGA_mips32)
989
990# define GOF(_fieldname) \
991 (offsetof(VexGuestMIPS32State,guest_##_fieldname))
992# define SZB(_fieldname) \
993 (sizeof(((VexGuestMIPS32State*)0)->guest_##_fieldname))
994
995 Int o = offset;
996 Int sz = szB;
997 tl_assert(sz > 0);
998# if defined (VG_LITTLEENDIAN)
999 tl_assert(host_is_little_endian());
1000# elif defined (VG_BIGENDIAN)
1001 tl_assert(host_is_big_endian());
1002# else
1003# error "Unknown endianness"
1004# endif
1005
1006 if (o == GOF(r0) && sz == 4) return o;
1007 if (o == GOF(r1) && sz == 4) return o;
1008 if (o == GOF(r2) && sz == 4) return o;
1009 if (o == GOF(r3) && sz == 4) return o;
1010 if (o == GOF(r4) && sz == 4) return o;
1011 if (o == GOF(r5) && sz == 4) return o;
1012 if (o == GOF(r6) && sz == 4) return o;
1013 if (o == GOF(r7) && sz == 4) return o;
1014 if (o == GOF(r8) && sz == 4) return o;
1015 if (o == GOF(r9) && sz == 4) return o;
1016 if (o == GOF(r10) && sz == 4) return o;
1017 if (o == GOF(r11) && sz == 4) return o;
1018 if (o == GOF(r12) && sz == 4) return o;
1019 if (o == GOF(r13) && sz == 4) return o;
1020 if (o == GOF(r14) && sz == 4) return o;
1021 if (o == GOF(r15) && sz == 4) return o;
1022 if (o == GOF(r16) && sz == 4) return o;
1023 if (o == GOF(r17) && sz == 4) return o;
1024 if (o == GOF(r18) && sz == 4) return o;
1025 if (o == GOF(r19) && sz == 4) return o;
1026 if (o == GOF(r20) && sz == 4) return o;
1027 if (o == GOF(r21) && sz == 4) return o;
1028 if (o == GOF(r22) && sz == 4) return o;
1029 if (o == GOF(r23) && sz == 4) return o;
1030 if (o == GOF(r24) && sz == 4) return o;
1031 if (o == GOF(r25) && sz == 4) return o;
1032 if (o == GOF(r26) && sz == 4) return o;
1033 if (o == GOF(r27) && sz == 4) return o;
1034 if (o == GOF(r28) && sz == 4) return o;
1035 if (o == GOF(r29) && sz == 4) return o;
1036 if (o == GOF(r30) && sz == 4) return o;
1037 if (o == GOF(r31) && sz == 4) return o;
1038 if (o == GOF(PC) && sz == 4) return -1; /* slot unused */
1039
1040 if (o == GOF(HI) && sz == 4) return o;
1041 if (o == GOF(LO) && sz == 4) return o;
1042
1043 if (o == GOF(FIR) && sz == 4) return -1; /* slot unused */
1044 if (o == GOF(FCCR) && sz == 4) return -1; /* slot unused */
1045 if (o == GOF(FEXR) && sz == 4) return -1; /* slot unused */
1046 if (o == GOF(FENR) && sz == 4) return -1; /* slot unused */
1047 if (o == GOF(FCSR) && sz == 4) return -1; /* slot unused */
1048 if (o == GOF(ULR) && sz == 4) return -1;
1049
florian2e497412012-08-26 03:22:09 +00001050 if (o == GOF(EMNOTE) && sz == 4) return -1; /* slot unused */
sewardj5db15402012-06-07 09:13:21 +00001051 if (o == GOF(TISTART) && sz == 4) return -1; /* slot unused */
1052 if (o == GOF(TILEN) && sz == 4) return -1; /* slot unused */
1053 if (o == GOF(NRADDR) && sz == 4) return -1; /* slot unused */
1054
1055 if (o >= GOF(f0) && o+sz <= GOF(f0) +SZB(f0)) return GOF(f0);
1056 if (o >= GOF(f1) && o+sz <= GOF(f1) +SZB(f1)) return GOF(f1);
1057 if (o >= GOF(f2) && o+sz <= GOF(f2) +SZB(f2)) return GOF(f2);
1058 if (o >= GOF(f3) && o+sz <= GOF(f3) +SZB(f3)) return GOF(f3);
1059 if (o >= GOF(f4) && o+sz <= GOF(f4) +SZB(f4)) return GOF(f4);
1060 if (o >= GOF(f5) && o+sz <= GOF(f5) +SZB(f5)) return GOF(f5);
1061 if (o >= GOF(f6) && o+sz <= GOF(f6) +SZB(f6)) return GOF(f6);
1062 if (o >= GOF(f7) && o+sz <= GOF(f7) +SZB(f7)) return GOF(f7);
1063 if (o >= GOF(f8) && o+sz <= GOF(f8) +SZB(f8)) return GOF(f8);
1064 if (o >= GOF(f9) && o+sz <= GOF(f9) +SZB(f9)) return GOF(f9);
1065 if (o >= GOF(f10) && o+sz <= GOF(f10)+SZB(f10)) return GOF(f10);
1066 if (o >= GOF(f11) && o+sz <= GOF(f11)+SZB(f11)) return GOF(f11);
1067 if (o >= GOF(f12) && o+sz <= GOF(f12)+SZB(f12)) return GOF(f12);
1068 if (o >= GOF(f13) && o+sz <= GOF(f13)+SZB(f13)) return GOF(f13);
1069 if (o >= GOF(f14) && o+sz <= GOF(f14)+SZB(f14)) return GOF(f14);
1070 if (o >= GOF(f15) && o+sz <= GOF(f15)+SZB(f15)) return GOF(f15);
1071
1072 if (o >= GOF(f16) && o+sz <= GOF(f16)+SZB(f16)) return GOF(f16);
1073 if (o >= GOF(f17) && o+sz <= GOF(f17) +SZB(f17)) return GOF(f17);
1074 if (o >= GOF(f18) && o+sz <= GOF(f18) +SZB(f18)) return GOF(f18);
1075 if (o >= GOF(f19) && o+sz <= GOF(f19) +SZB(f19)) return GOF(f19);
1076 if (o >= GOF(f20) && o+sz <= GOF(f20) +SZB(f20)) return GOF(f20);
1077 if (o >= GOF(f21) && o+sz <= GOF(f21) +SZB(f21)) return GOF(f21);
1078 if (o >= GOF(f22) && o+sz <= GOF(f22) +SZB(f22)) return GOF(f22);
1079 if (o >= GOF(f23) && o+sz <= GOF(f23) +SZB(f23)) return GOF(f23);
1080 if (o >= GOF(f24) && o+sz <= GOF(f24) +SZB(f24)) return GOF(f24);
1081 if (o >= GOF(f25) && o+sz <= GOF(f25) +SZB(f25)) return GOF(f25);
1082 if (o >= GOF(f26) && o+sz <= GOF(f26)+SZB(f26)) return GOF(f26);
1083 if (o >= GOF(f27) && o+sz <= GOF(f27)+SZB(f27)) return GOF(f27);
1084 if (o >= GOF(f28) && o+sz <= GOF(f28)+SZB(f28)) return GOF(f28);
1085 if (o >= GOF(f29) && o+sz <= GOF(f29)+SZB(f29)) return GOF(f29);
1086 if (o >= GOF(f30) && o+sz <= GOF(f30)+SZB(f30)) return GOF(f30);
1087 if (o >= GOF(f31) && o+sz <= GOF(f31)+SZB(f31)) return GOF(f31);
1088
dejanj5f790e82013-07-25 08:22:08 +00001089 /* Slot unused. */
1090 if ((o > GOF(NRADDR)) && (o <= GOF(NRADDR) +12 )) return -1;
1091
1092 /* MIPS32 DSP ASE(r2) specific registers. */
1093 if (o == GOF(DSPControl) && sz == 4) return o;
1094 if (o == GOF(ac0) && sz == 8) return o;
1095 if (o == GOF(ac1) && sz == 8) return o;
1096 if (o == GOF(ac2) && sz == 8) return o;
1097 if (o == GOF(ac3) && sz == 8) return o;
sewardj5db15402012-06-07 09:13:21 +00001098
1099 VG_(printf)("MC_(get_otrack_shadow_offset)(mips)(off=%d,sz=%d)\n",
1100 offset,szB);
1101 tl_assert(0);
1102# undef GOF
1103# undef SZB
1104
petarj4df0bfc2013-02-27 23:17:33 +00001105 /* --------------------- mips64 --------------------- */
1106
1107# elif defined(VGA_mips64)
1108
1109# define GOF(_fieldname) \
1110 (offsetof(VexGuestMIPS64State,guest_##_fieldname))
1111# define SZB(_fieldname) \
1112 (sizeof(((VexGuestMIPS64State*)0)->guest_##_fieldname))
1113
1114 Int o = offset;
1115 Int sz = szB;
1116 tl_assert(sz > 0);
1117#if defined (VG_LITTLEENDIAN)
1118 tl_assert(host_is_little_endian());
1119#elif defined (VG_BIGENDIAN)
1120 tl_assert(host_is_big_endian());
1121#endif
1122
1123 if (o >= GOF(r0) && sz <= 8 && o <= (GOF(r31) + 8 - sz))
1124 return GOF(r0) + ((o-GOF(r0)) & -8) ;
1125
1126 if (o == GOF(PC) && sz == 8) return -1; /* slot unused */
1127
1128 if (o == GOF(HI) && sz == 8) return o;
1129 if (o == GOF(LO) && sz == 8) return o;
1130
1131 if (o == GOF(FIR) && sz == 4) return -1; /* slot unused */
1132 if (o == GOF(FCCR) && sz == 4) return -1; /* slot unused */
1133 if (o == GOF(FEXR) && sz == 4) return -1; /* slot unused */
1134 if (o == GOF(FENR) && sz == 4) return -1; /* slot unused */
1135 if (o == GOF(FCSR) && sz == 4) return -1; /* slot unused */
1136 if (o == GOF(ULR) && sz == 8) return o;
1137
1138 if (o == GOF(EMNOTE) && sz == 4) return -1; /* slot unused */
1139 if (o == GOF(TISTART) && sz == 4) return -1; /* slot unused */
1140 if (o == GOF(TILEN) && sz == 4) return -1; /* slot unused */
1141 if (o == GOF(NRADDR) && sz == 4) return -1; /* slot unused */
1142
1143 if (o >= GOF(f0) && o+sz <= GOF(f0) +SZB(f0)) return GOF(f0);
1144 if (o >= GOF(f1) && o+sz <= GOF(f1) +SZB(f1)) return GOF(f1);
1145 if (o >= GOF(f2) && o+sz <= GOF(f2) +SZB(f2)) return GOF(f2);
1146 if (o >= GOF(f3) && o+sz <= GOF(f3) +SZB(f3)) return GOF(f3);
1147 if (o >= GOF(f4) && o+sz <= GOF(f4) +SZB(f4)) return GOF(f4);
1148 if (o >= GOF(f5) && o+sz <= GOF(f5) +SZB(f5)) return GOF(f5);
1149 if (o >= GOF(f6) && o+sz <= GOF(f6) +SZB(f6)) return GOF(f6);
1150 if (o >= GOF(f7) && o+sz <= GOF(f7) +SZB(f7)) return GOF(f7);
1151 if (o >= GOF(f8) && o+sz <= GOF(f8) +SZB(f8)) return GOF(f8);
1152 if (o >= GOF(f9) && o+sz <= GOF(f9) +SZB(f9)) return GOF(f9);
1153 if (o >= GOF(f10) && o+sz <= GOF(f10)+SZB(f10)) return GOF(f10);
1154 if (o >= GOF(f11) && o+sz <= GOF(f11)+SZB(f11)) return GOF(f11);
1155 if (o >= GOF(f12) && o+sz <= GOF(f12)+SZB(f12)) return GOF(f12);
1156 if (o >= GOF(f13) && o+sz <= GOF(f13)+SZB(f13)) return GOF(f13);
1157 if (o >= GOF(f14) && o+sz <= GOF(f14)+SZB(f14)) return GOF(f14);
1158 if (o >= GOF(f15) && o+sz <= GOF(f15)+SZB(f15)) return GOF(f15);
1159 if (o >= GOF(f16) && o+sz <= GOF(f16)+SZB(f16)) return GOF(f16);
1160 if (o >= GOF(f17) && o+sz <= GOF(f17)+SZB(f17)) return GOF(f17);
1161 if (o >= GOF(f18) && o+sz <= GOF(f18)+SZB(f18)) return GOF(f18);
1162 if (o >= GOF(f19) && o+sz <= GOF(f19)+SZB(f19)) return GOF(f19);
1163 if (o >= GOF(f20) && o+sz <= GOF(f20)+SZB(f20)) return GOF(f20);
1164 if (o >= GOF(f21) && o+sz <= GOF(f21)+SZB(f21)) return GOF(f21);
1165 if (o >= GOF(f22) && o+sz <= GOF(f22)+SZB(f22)) return GOF(f22);
1166 if (o >= GOF(f23) && o+sz <= GOF(f23)+SZB(f23)) return GOF(f23);
1167 if (o >= GOF(f24) && o+sz <= GOF(f24)+SZB(f24)) return GOF(f24);
1168 if (o >= GOF(f25) && o+sz <= GOF(f25)+SZB(f25)) return GOF(f25);
1169 if (o >= GOF(f26) && o+sz <= GOF(f26)+SZB(f26)) return GOF(f26);
1170 if (o >= GOF(f27) && o+sz <= GOF(f27)+SZB(f27)) return GOF(f27);
1171 if (o >= GOF(f28) && o+sz <= GOF(f28)+SZB(f28)) return GOF(f28);
1172 if (o >= GOF(f29) && o+sz <= GOF(f29)+SZB(f29)) return GOF(f29);
1173 if (o >= GOF(f30) && o+sz <= GOF(f30)+SZB(f30)) return GOF(f30);
1174 if (o >= GOF(f31) && o+sz <= GOF(f31)+SZB(f31)) return GOF(f31);
1175
1176 if ((o > GOF(NRADDR)) && (o <= GOF(NRADDR) +12 )) return -1;
1177
1178 VG_(printf)("MC_(get_otrack_shadow_offset)(mips)(off=%d,sz=%d)\n",
1179 offset,szB);
1180 tl_assert(0);
1181# undef GOF
1182# undef SZB
1183
sewardj7cf4e6b2008-05-01 20:24:26 +00001184# else
1185# error "FIXME: not implemented for this architecture"
1186# endif
1187}
1188
1189
1190/* Let 'arr' describe an indexed reference to a guest state section
1191 (guest state array).
1192
1193 This function returns the corresponding guest state type to be used
1194 when indexing the corresponding array in the second shadow (origin
1195 tracking) area. If the array is not to be origin-tracked, return
1196 Ity_INVALID.
1197
1198 This function must agree with MC_(get_otrack_shadow_offset) above.
1199 See comments at the start of MC_(get_otrack_shadow_offset).
1200*/
1201IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr )
1202{
1203 /* -------------------- ppc64 -------------------- */
1204# if defined(VGA_ppc64)
1205 /* The redir stack. */
1206 if (arr->base == offsetof(VexGuestPPC64State,guest_REDIR_STACK[0])
1207 && arr->elemTy == Ity_I64
1208 && arr->nElems == VEX_GUEST_PPC64_REDIR_STACK_SIZE)
1209 return Ity_I64;
1210
1211 VG_(printf)("get_reg_array_equiv_int_type(ppc64): unhandled: ");
1212 ppIRRegArray(arr);
1213 VG_(printf)("\n");
1214 tl_assert(0);
1215
1216 /* -------------------- ppc32 -------------------- */
1217# elif defined(VGA_ppc32)
1218 /* The redir stack. */
1219 if (arr->base == offsetof(VexGuestPPC32State,guest_REDIR_STACK[0])
1220 && arr->elemTy == Ity_I32
1221 && arr->nElems == VEX_GUEST_PPC32_REDIR_STACK_SIZE)
1222 return Ity_I32;
1223
1224 VG_(printf)("get_reg_array_equiv_int_type(ppc32): unhandled: ");
1225 ppIRRegArray(arr);
1226 VG_(printf)("\n");
1227 tl_assert(0);
1228
1229 /* -------------------- amd64 -------------------- */
1230# elif defined(VGA_amd64)
1231 /* Ignore the FP tag array - pointless to shadow, and in any case
1232 the elements are too small */
1233 if (arr->base == offsetof(VexGuestAMD64State,guest_FPTAG)
1234 && arr->elemTy == Ity_I8 && arr->nElems == 8)
1235 return Ity_INVALID;
1236
1237 /* The FP register array */
1238 if (arr->base == offsetof(VexGuestAMD64State,guest_FPREG[0])
1239 && arr->elemTy == Ity_F64 && arr->nElems == 8)
1240 return Ity_I64;
1241
1242 VG_(printf)("get_reg_array_equiv_int_type(amd64): unhandled: ");
1243 ppIRRegArray(arr);
1244 VG_(printf)("\n");
1245 tl_assert(0);
1246
1247 /* --------------------- x86 --------------------- */
1248# elif defined(VGA_x86)
1249 /* Ignore the FP tag array - pointless to shadow, and in any case
1250 the elements are too small */
1251 if (arr->base == offsetof(VexGuestX86State,guest_FPTAG)
1252 && arr->elemTy == Ity_I8 && arr->nElems == 8)
1253 return Ity_INVALID;
1254
1255 /* The FP register array */
1256 if (arr->base == offsetof(VexGuestX86State,guest_FPREG[0])
1257 && arr->elemTy == Ity_F64 && arr->nElems == 8)
1258 return Ity_I64;
1259
1260 VG_(printf)("get_reg_array_equiv_int_type(x86): unhandled: ");
1261 ppIRRegArray(arr);
1262 VG_(printf)("\n");
1263 tl_assert(0);
1264
sewardj59570ff2010-01-01 11:59:33 +00001265 /* --------------------- arm --------------------- */
1266# elif defined(VGA_arm)
sewardj59570ff2010-01-01 11:59:33 +00001267 VG_(printf)("get_reg_array_equiv_int_type(arm): unhandled: ");
1268 ppIRRegArray(arr);
1269 VG_(printf)("\n");
1270 tl_assert(0);
1271
sewardjf0c12502014-01-12 12:54:00 +00001272 /* --------------------- arm64 --------------------- */
1273# elif defined(VGA_arm64)
1274 VG_(printf)("get_reg_array_equiv_int_type(arm64): unhandled: ");
1275 ppIRRegArray(arr);
1276 VG_(printf)("\n");
1277 tl_assert(0);
1278
sewardjb5b87402011-03-07 16:05:35 +00001279 /* --------------------- s390x --------------------- */
1280# elif defined(VGA_s390x)
1281 /* Should never het here because s390x does not use Ist_PutI
1282 and Iex_GetI. */
1283 tl_assert(0);
sewardj5db15402012-06-07 09:13:21 +00001284
1285/* --------------------- mips32 --------------------- */
1286# elif defined(VGA_mips32)
1287 VG_(printf)("get_reg_array_equiv_int_type(mips32): unhandled: ");
1288 ppIRRegArray(arr);
1289 VG_(printf)("\n");
1290 tl_assert(0);
1291
petarj4df0bfc2013-02-27 23:17:33 +00001292 /* --------------------- mips64 --------------------- */
1293# elif defined(VGA_mips64)
1294 VG_(printf)("get_reg_array_equiv_int_type(mips64): unhandled: ");
1295 ppIRRegArray(arr);
1296 VG_(printf)("\n");
1297 tl_assert(0);
sewardj7cf4e6b2008-05-01 20:24:26 +00001298# else
1299# error "FIXME: not implemented for this architecture"
1300# endif
1301}
1302
1303
1304/*--------------------------------------------------------------------*/
1305/*--- end mc_machine.c ---*/
1306/*--------------------------------------------------------------------*/