• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
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 
12    Copyright (C) 2008-2013 OpenWorks Ltd
13       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"
39 #include "pub_tool_poolalloc.h"     // For mc_include.h
40 #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 
69 #if defined(VGA_s390x)
70 # include "libvex_guest_s390x.h"
71 # define MC_SIZEOF_GUEST_STATE sizeof(VexGuestS390XState)
72 #endif
73 
74 #if defined(VGA_arm)
75 # include "libvex_guest_arm.h"
76 # define MC_SIZEOF_GUEST_STATE sizeof(VexGuestARMState)
77 #endif
78 
79 #if defined(VGA_arm64)
80 # include "libvex_guest_arm64.h"
81 # define MC_SIZEOF_GUEST_STATE sizeof(VexGuestARM64State)
82 #endif
83 
84 #if defined(VGA_mips32)
85 # include "libvex_guest_mips32.h"
86 # define MC_SIZEOF_GUEST_STATE sizeof(VexGuestMIPS32State)
87 #endif
88 
89 #if defined(VGA_mips64)
90 # include "libvex_guest_mips64.h"
91 # define MC_SIZEOF_GUEST_STATE sizeof(VexGuestMIPS64State)
92 #endif
93 
host_is_big_endian(void)94 static inline Bool host_is_big_endian ( void ) {
95    UInt x = 0x11223344;
96    return 0x1122 == *(UShort*)(&x);
97 }
host_is_little_endian(void)98 static 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 */
136 static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB ); /*fwds*/
137 
MC_(get_otrack_shadow_offset)138 Int 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 
get_otrack_shadow_offset_wrk(Int offset,Int szB)149 static 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       */
171       Int ox = sz == 8 ? o : (o - 4);
172       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;
210    if (o == GOF(IP_AT_SYSCALL) && sz == 8) return -1; /* slot unused */
211    if (o == GOF(FPROUND)   && sz == 1) return -1;
212    if (o == GOF(DFPROUND)  && sz == 1) return -1;
213    if (o == GOF(EMNOTE)    && sz == 4) return -1;
214    if (o == GOF(CMSTART)   && sz == 8) return -1;
215    if (o == GOF(CMLEN)     && 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 
220    // 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;
262 
263    /* For the various byte sized XER/CR pieces, use offset 8
264       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);
270 
271    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);
287 
288    /* 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);
353 
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;
410    if (o == GOF(IP_AT_SYSCALL) && sz == 4) return -1; /* slot unused */
411    if (o == GOF(FPROUND)   && sz == 1) return -1;
412    if (o == GOF(DFPROUND)  && sz == 1) return -1;
413    if (o == GOF(VRSAVE)    && sz == 4) return -1;
414    if (o == GOF(EMNOTE)    && sz == 4) return -1;
415    if (o == GOF(CMSTART)   && sz == 4) return -1;
416    if (o == GOF(CMLEN)     && 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 
421    // 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;
463 
464    /* For the various byte sized XER/CR pieces, use offset 8
465       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);
471 
472    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);
488 
489    /* 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);
554 
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 */
599    if (o == GOF(IP_AT_SYSCALL) && sz == 8) return -1; /* slot unused */
600    if (o == GOF(IDFLAG)  && sz == 8) return -1; /* slot used for %DH */
601    if (o == GOF(ACFLAG)  && sz == 8) return -1; /* slot unused */
602    if (o == GOF(FS_ZERO) && sz == 8) return -1; /* slot unused */
603    if (o == GOF(GS_0x60) && sz == 8) return -1; /* slot unused */
604    if (o == GOF(CMSTART) && sz == 8) return -1; /* slot unused */
605    if (o == GOF(CMLEN)   && sz == 8) return -1; /* slot unused */
606    if (o == GOF(NRADDR)  && sz == 8) return -1; /* slot unused */
607 
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;
626    if (o == GOF(EMNOTE)   && szB == 4) return -1;
627    if (o == GOF(FC3210)   && szB == 8) return -1;
628 
629    /* XMM registers */
630    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);
647 
648    /* 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]);
667 
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 */
714    if (o == GOF(IP_AT_SYSCALL) && sz == 4) return -1; /* slot unused */
715    if (o == GOF(IDFLAG)  && sz == 4) return -1; /* slot used for %DH */
716    if (o == GOF(ACFLAG)  && sz == 4) return -1; /* slot unused */
717    if (o == GOF(CMSTART) && sz == 4) return -1; /* slot unused */
718    if (o == GOF(CMLEN)   && sz == 4) return -1; /* slot unused */
719    if (o == GOF(NRADDR)  && sz == 4) return -1; /* slot unused */
720 
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;
738    if (o == GOF(EMNOTE)   && szB == 4) return -1;
739    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 
791    /* -------------------- 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))
814       return o;
815 
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 
822    if (o == GOF(EMNOTE) && sz == 4) return -1;
823 
824    if (o == GOF(CC_OP)    && sz == 8) return -1;
825    /* We access CC_DEP1 either fully or bits [0:31] */
826    if (o == GOF(CC_DEP1)  && (sz == 8 || sz ==4))
827       return o;
828    if (o == GOF(CC_DEP2)  && sz == 8) return o;
829    if (o == GOF(CC_NDEP)  && sz == 8) return -1;
830    if (o == GOF(CMSTART)  && sz == 8) return -1;
831    if (o == GOF(CMLEN)    && sz == 8) return -1;
832    if (o == GOF(NRADDR)   && sz == 8) return -1;
833    if (o == GOF(IP_AT_SYSCALL) && sz == 8) return -1;
834    if (o == GOF(fpc)      && sz == 4) return -1;
835    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;
838    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 
844    /* --------------------- 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. */
875    if (o == GOF(R15T)  && sz == 4) return -1; /* slot unused */
876    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 
883    if (o == GOF(QFLAG32) && sz == 4) return o;
884 
885    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 
890    //if (o == GOF(SYSCALLNO)     && sz == 4) return -1; /* slot unused */
891    //if (o == GOF(CC)     && sz == 4) return -1; /* slot unused */
892    //if (o == GOF(EMNOTE)     && sz == 4) return -1; /* slot unused */
893    //if (o == GOF(CMSTART)     && 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;
898    if (o == GOF(ITSTATE)  && sz == 4) return -1;
899 
900    /* 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    }
955 
956    if (o == GOF(CMSTART) && sz == 4) return -1;
957    if (o == GOF(CMLEN)   && sz == 4) return -1;
958 
959    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 
965    /* --------------------- 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    Bool is48 = sz == 8 || sz == 4;
977 
978    tl_assert(sz > 0);
979    tl_assert(host_is_little_endian());
980 
981    if (o == GOF(X0)  && is48) return o;
982    if (o == GOF(X1)  && is48) return o;
983    if (o == GOF(X2)  && is48) return o;
984    if (o == GOF(X3)  && is48) return o;
985    if (o == GOF(X4)  && is48) return o;
986    if (o == GOF(X5)  && is48) return o;
987    if (o == GOF(X6)  && is48) return o;
988    if (o == GOF(X7)  && is48) return o;
989    if (o == GOF(X8)  && is48) return o;
990    if (o == GOF(X9)  && is48) return o;
991    if (o == GOF(X10) && is48) return o;
992    if (o == GOF(X11) && is48) return o;
993    if (o == GOF(X12) && is48) return o;
994    if (o == GOF(X13) && is48) return o;
995    if (o == GOF(X14) && is48) return o;
996    if (o == GOF(X15) && is48) return o;
997    if (o == GOF(X16) && is48) return o;
998    if (o == GOF(X17) && is48) return o;
999    if (o == GOF(X18) && is48) return o;
1000    if (o == GOF(X19) && is48) return o;
1001    if (o == GOF(X20) && is48) return o;
1002    if (o == GOF(X21) && is48) return o;
1003    if (o == GOF(X22) && is48) return o;
1004    if (o == GOF(X23) && is48) return o;
1005    if (o == GOF(X24) && is48) return o;
1006    if (o == GOF(X25) && is48) return o;
1007    if (o == GOF(X26) && is48) return o;
1008    if (o == GOF(X27) && is48) return o;
1009    if (o == GOF(X28) && is48) return o;
1010    if (o == GOF(X29) && is48) return o;
1011    if (o == GOF(X30) && is48) return o;
1012    if (o == GOF(XSP) && is48) return o;
1013 
1014    if (o == GOF(PC)  && is48) return -1; // untracked
1015    if (o == GOF(CC_DEP1) && sz == 8) return o;
1016    if (o == GOF(CC_DEP2) && sz == 8) return o;
1017 
1018    if (o == GOF(CC_OP)     && sz == 8) return -1; // untracked
1019    if (o == GOF(CC_NDEP)   && sz == 8) return -1; // untracked
1020    if (o == GOF(TPIDR_EL0) && sz == 8) return -1; // untracked
1021 
1022    if (o >= GOF(Q0)   && o+sz <= GOF(Q0) +SZB(Q0))  return GOF(Q0);
1023    if (o >= GOF(Q1)   && o+sz <= GOF(Q1) +SZB(Q1))  return GOF(Q1);
1024    if (o >= GOF(Q2)   && o+sz <= GOF(Q2) +SZB(Q2))  return GOF(Q2);
1025    if (o >= GOF(Q3)   && o+sz <= GOF(Q3) +SZB(Q3))  return GOF(Q3);
1026    if (o >= GOF(Q4)   && o+sz <= GOF(Q4) +SZB(Q4))  return GOF(Q4);
1027    if (o >= GOF(Q5)   && o+sz <= GOF(Q5) +SZB(Q5))  return GOF(Q5);
1028    if (o >= GOF(Q6)   && o+sz <= GOF(Q6) +SZB(Q6))  return GOF(Q6);
1029    if (o >= GOF(Q7)   && o+sz <= GOF(Q7) +SZB(Q7))  return GOF(Q7);
1030    if (o >= GOF(Q8)   && o+sz <= GOF(Q8) +SZB(Q8))  return GOF(Q8);
1031    if (o >= GOF(Q9)   && o+sz <= GOF(Q9) +SZB(Q9))  return GOF(Q9);
1032    if (o >= GOF(Q10)  && o+sz <= GOF(Q10)+SZB(Q10)) return GOF(Q10);
1033    if (o >= GOF(Q11)  && o+sz <= GOF(Q11)+SZB(Q11)) return GOF(Q11);
1034    if (o >= GOF(Q12)  && o+sz <= GOF(Q12)+SZB(Q12)) return GOF(Q12);
1035    if (o >= GOF(Q13)  && o+sz <= GOF(Q13)+SZB(Q13)) return GOF(Q13);
1036    if (o >= GOF(Q14)  && o+sz <= GOF(Q14)+SZB(Q14)) return GOF(Q14);
1037    if (o >= GOF(Q15)  && o+sz <= GOF(Q15)+SZB(Q15)) return GOF(Q15);
1038    if (o >= GOF(Q16)  && o+sz <= GOF(Q16)+SZB(Q16)) return GOF(Q16);
1039    if (o >= GOF(Q17)  && o+sz <= GOF(Q17)+SZB(Q17)) return GOF(Q17);
1040    if (o >= GOF(Q18)  && o+sz <= GOF(Q18)+SZB(Q18)) return GOF(Q18);
1041    if (o >= GOF(Q19)  && o+sz <= GOF(Q19)+SZB(Q19)) return GOF(Q19);
1042    if (o >= GOF(Q20)  && o+sz <= GOF(Q20)+SZB(Q20)) return GOF(Q20);
1043    if (o >= GOF(Q21)  && o+sz <= GOF(Q21)+SZB(Q21)) return GOF(Q21);
1044    if (o >= GOF(Q22)  && o+sz <= GOF(Q22)+SZB(Q22)) return GOF(Q22);
1045    if (o >= GOF(Q23)  && o+sz <= GOF(Q23)+SZB(Q23)) return GOF(Q23);
1046    if (o >= GOF(Q24)  && o+sz <= GOF(Q24)+SZB(Q24)) return GOF(Q24);
1047    if (o >= GOF(Q25)  && o+sz <= GOF(Q25)+SZB(Q25)) return GOF(Q25);
1048    if (o >= GOF(Q26)  && o+sz <= GOF(Q26)+SZB(Q26)) return GOF(Q26);
1049    if (o >= GOF(Q27)  && o+sz <= GOF(Q27)+SZB(Q27)) return GOF(Q27);
1050    if (o >= GOF(Q28)  && o+sz <= GOF(Q28)+SZB(Q28)) return GOF(Q28);
1051    if (o >= GOF(Q29)  && o+sz <= GOF(Q29)+SZB(Q29)) return GOF(Q29);
1052    if (o >= GOF(Q30)  && o+sz <= GOF(Q30)+SZB(Q30)) return GOF(Q30);
1053    if (o >= GOF(Q31)  && o+sz <= GOF(Q31)+SZB(Q31)) return GOF(Q31);
1054 
1055    if (o == GOF(FPCR) && sz == 4) return -1; // untracked
1056    if (o == GOF(FPSR) && sz == 4) return -1; // untracked
1057 
1058    if (o == GOF(CMSTART) && sz == 8) return -1; // untracked
1059    if (o == GOF(CMLEN)   && sz == 8) return -1; // untracked
1060 
1061    VG_(printf)("MC_(get_otrack_shadow_offset)(arm64)(off=%d,sz=%d)\n",
1062                offset,szB);
1063    tl_assert(0);
1064 #  undef GOF
1065 #  undef SZB
1066 
1067    /* --------------------- mips32 --------------------- */
1068 
1069 #  elif defined(VGA_mips32)
1070 
1071 #  define GOF(_fieldname) \
1072       (offsetof(VexGuestMIPS32State,guest_##_fieldname))
1073 #  define SZB(_fieldname) \
1074       (sizeof(((VexGuestMIPS32State*)0)->guest_##_fieldname))
1075 
1076    Int  o     = offset;
1077    Int  sz    = szB;
1078    tl_assert(sz > 0);
1079 #  if defined (VG_LITTLEENDIAN)
1080    tl_assert(host_is_little_endian());
1081 #  elif defined (VG_BIGENDIAN)
1082    tl_assert(host_is_big_endian());
1083 #  else
1084 #     error "Unknown endianness"
1085 #  endif
1086 
1087    if (o == GOF(r0)  && sz == 4) return o;
1088    if (o == GOF(r1)  && sz == 4) return o;
1089    if (o == GOF(r2)  && sz == 4) return o;
1090    if (o == GOF(r3)  && sz == 4) return o;
1091    if (o == GOF(r4)  && sz == 4) return o;
1092    if (o == GOF(r5)  && sz == 4) return o;
1093    if (o == GOF(r6)  && sz == 4) return o;
1094    if (o == GOF(r7)  && sz == 4) return o;
1095    if (o == GOF(r8)  && sz == 4) return o;
1096    if (o == GOF(r9)  && sz == 4) return o;
1097    if (o == GOF(r10)  && sz == 4) return o;
1098    if (o == GOF(r11)  && sz == 4) return o;
1099    if (o == GOF(r12)  && sz == 4) return o;
1100    if (o == GOF(r13)  && sz == 4) return o;
1101    if (o == GOF(r14)  && sz == 4) return o;
1102    if (o == GOF(r15)  && sz == 4) return o;
1103    if (o == GOF(r16)  && sz == 4) return o;
1104    if (o == GOF(r17)  && sz == 4) return o;
1105    if (o == GOF(r18)  && sz == 4) return o;
1106    if (o == GOF(r19)  && sz == 4) return o;
1107    if (o == GOF(r20)  && sz == 4) return o;
1108    if (o == GOF(r21)  && sz == 4) return o;
1109    if (o == GOF(r22)  && sz == 4) return o;
1110    if (o == GOF(r23)  && sz == 4) return o;
1111    if (o == GOF(r24)  && sz == 4) return o;
1112    if (o == GOF(r25)  && sz == 4) return o;
1113    if (o == GOF(r26)  && sz == 4) return o;
1114    if (o == GOF(r27)  && sz == 4) return o;
1115    if (o == GOF(r28)  && sz == 4) return o;
1116    if (o == GOF(r29)  && sz == 4) return o;
1117    if (o == GOF(r30)  && sz == 4) return o;
1118    if (o == GOF(r31)  && sz == 4) return o;
1119    if (o == GOF(PC)  && sz == 4) return -1; /* slot unused */
1120 
1121    if (o == GOF(HI)  && sz == 4) return o;
1122    if (o == GOF(LO)  && sz == 4) return o;
1123 
1124    if (o == GOF(FIR)     && sz == 4) return -1; /* slot unused */
1125    if (o == GOF(FCCR)     && sz == 4) return -1; /* slot unused */
1126    if (o == GOF(FEXR)     && sz == 4) return -1; /* slot unused */
1127    if (o == GOF(FENR)     && sz == 4) return -1; /* slot unused */
1128    if (o == GOF(FCSR)     && sz == 4) return -1; /* slot unused */
1129    if (o == GOF(ULR) && sz == 4) return -1;
1130 
1131    if (o == GOF(EMNOTE)     && sz == 4) return -1; /* slot unused */
1132    if (o == GOF(CMSTART)     && sz == 4) return -1; /* slot unused */
1133    if (o == GOF(CMLEN)     && sz == 4) return -1; /* slot unused */
1134    if (o == GOF(NRADDR)     && sz == 4) return -1; /* slot unused */
1135 
1136    if (o >= GOF(f0)  && o+sz <= GOF(f0) +SZB(f0))  return GOF(f0);
1137    if (o >= GOF(f1)  && o+sz <= GOF(f1) +SZB(f1))  return GOF(f1);
1138    if (o >= GOF(f2)  && o+sz <= GOF(f2) +SZB(f2))  return GOF(f2);
1139    if (o >= GOF(f3)  && o+sz <= GOF(f3) +SZB(f3))  return GOF(f3);
1140    if (o >= GOF(f4)  && o+sz <= GOF(f4) +SZB(f4))  return GOF(f4);
1141    if (o >= GOF(f5)  && o+sz <= GOF(f5) +SZB(f5))  return GOF(f5);
1142    if (o >= GOF(f6)  && o+sz <= GOF(f6) +SZB(f6))  return GOF(f6);
1143    if (o >= GOF(f7)  && o+sz <= GOF(f7) +SZB(f7))  return GOF(f7);
1144    if (o >= GOF(f8)  && o+sz <= GOF(f8) +SZB(f8))  return GOF(f8);
1145    if (o >= GOF(f9)  && o+sz <= GOF(f9) +SZB(f9))  return GOF(f9);
1146    if (o >= GOF(f10) && o+sz <= GOF(f10)+SZB(f10)) return GOF(f10);
1147    if (o >= GOF(f11) && o+sz <= GOF(f11)+SZB(f11)) return GOF(f11);
1148    if (o >= GOF(f12) && o+sz <= GOF(f12)+SZB(f12)) return GOF(f12);
1149    if (o >= GOF(f13) && o+sz <= GOF(f13)+SZB(f13)) return GOF(f13);
1150    if (o >= GOF(f14) && o+sz <= GOF(f14)+SZB(f14)) return GOF(f14);
1151    if (o >= GOF(f15) && o+sz <= GOF(f15)+SZB(f15)) return GOF(f15);
1152 
1153    if (o >= GOF(f16) && o+sz <= GOF(f16)+SZB(f16)) return GOF(f16);
1154    if (o >= GOF(f17)  && o+sz <= GOF(f17) +SZB(f17))  return GOF(f17);
1155    if (o >= GOF(f18)  && o+sz <= GOF(f18) +SZB(f18))  return GOF(f18);
1156    if (o >= GOF(f19)  && o+sz <= GOF(f19) +SZB(f19))  return GOF(f19);
1157    if (o >= GOF(f20)  && o+sz <= GOF(f20) +SZB(f20))  return GOF(f20);
1158    if (o >= GOF(f21)  && o+sz <= GOF(f21) +SZB(f21))  return GOF(f21);
1159    if (o >= GOF(f22)  && o+sz <= GOF(f22) +SZB(f22))  return GOF(f22);
1160    if (o >= GOF(f23)  && o+sz <= GOF(f23) +SZB(f23))  return GOF(f23);
1161    if (o >= GOF(f24)  && o+sz <= GOF(f24) +SZB(f24))  return GOF(f24);
1162    if (o >= GOF(f25)  && o+sz <= GOF(f25) +SZB(f25))  return GOF(f25);
1163    if (o >= GOF(f26) && o+sz <= GOF(f26)+SZB(f26)) return GOF(f26);
1164    if (o >= GOF(f27) && o+sz <= GOF(f27)+SZB(f27)) return GOF(f27);
1165    if (o >= GOF(f28) && o+sz <= GOF(f28)+SZB(f28)) return GOF(f28);
1166    if (o >= GOF(f29) && o+sz <= GOF(f29)+SZB(f29)) return GOF(f29);
1167    if (o >= GOF(f30) && o+sz <= GOF(f30)+SZB(f30)) return GOF(f30);
1168    if (o >= GOF(f31) && o+sz <= GOF(f31)+SZB(f31)) return GOF(f31);
1169 
1170    /* Slot unused. */
1171    if ((o > GOF(NRADDR)) && (o <= GOF(NRADDR) +12 )) return -1;
1172 
1173    /* MIPS32 DSP ASE(r2) specific registers. */
1174    if (o == GOF(DSPControl)  && sz == 4) return o;
1175    if (o == GOF(ac0)  && sz == 8) return o;
1176    if (o == GOF(ac1)  && sz == 8) return o;
1177    if (o == GOF(ac2)  && sz == 8) return o;
1178    if (o == GOF(ac3)  && sz == 8) return o;
1179 
1180    VG_(printf)("MC_(get_otrack_shadow_offset)(mips)(off=%d,sz=%d)\n",
1181                offset,szB);
1182    tl_assert(0);
1183 #  undef GOF
1184 #  undef SZB
1185 
1186    /* --------------------- mips64 --------------------- */
1187 
1188 #  elif defined(VGA_mips64)
1189 
1190 #  define GOF(_fieldname) \
1191       (offsetof(VexGuestMIPS64State,guest_##_fieldname))
1192 #  define SZB(_fieldname) \
1193       (sizeof(((VexGuestMIPS64State*)0)->guest_##_fieldname))
1194 
1195    Int  o     = offset;
1196    Int  sz    = szB;
1197    tl_assert(sz > 0);
1198 #if defined (VG_LITTLEENDIAN)
1199    tl_assert(host_is_little_endian());
1200 #elif defined (VG_BIGENDIAN)
1201    tl_assert(host_is_big_endian());
1202 #endif
1203 
1204    if (o >= GOF(r0) && sz <= 8 && o <= (GOF(r31) + 8 - sz))
1205       return GOF(r0) + ((o-GOF(r0)) & -8) ;
1206 
1207    if (o == GOF(PC) && sz == 8) return -1;  /* slot unused */
1208 
1209    if (o == GOF(HI) && sz == 8) return o;
1210    if (o == GOF(LO) && sz == 8) return o;
1211 
1212    if (o == GOF(FIR)  && sz == 4) return -1;  /* slot unused */
1213    if (o == GOF(FCCR) && sz == 4) return -1;  /* slot unused */
1214    if (o == GOF(FEXR) && sz == 4) return -1;  /* slot unused */
1215    if (o == GOF(FENR) && sz == 4) return -1;  /* slot unused */
1216    if (o == GOF(FCSR) && sz == 4) return -1;  /* slot unused */
1217    if (o == GOF(ULR)  && sz == 8) return o;
1218 
1219    if (o == GOF(EMNOTE)  && sz == 4) return -1;  /* slot unused */
1220    if (o == GOF(CMSTART) && sz == 4) return -1;  /* slot unused */
1221    if (o == GOF(CMLEN)   && sz == 4) return -1;  /* slot unused */
1222    if (o == GOF(NRADDR)  && sz == 4) return -1;  /* slot unused */
1223 
1224    if (o >= GOF(f0)  && o+sz <= GOF(f0) +SZB(f0))  return GOF(f0);
1225    if (o >= GOF(f1)  && o+sz <= GOF(f1) +SZB(f1))  return GOF(f1);
1226    if (o >= GOF(f2)  && o+sz <= GOF(f2) +SZB(f2))  return GOF(f2);
1227    if (o >= GOF(f3)  && o+sz <= GOF(f3) +SZB(f3))  return GOF(f3);
1228    if (o >= GOF(f4)  && o+sz <= GOF(f4) +SZB(f4))  return GOF(f4);
1229    if (o >= GOF(f5)  && o+sz <= GOF(f5) +SZB(f5))  return GOF(f5);
1230    if (o >= GOF(f6)  && o+sz <= GOF(f6) +SZB(f6))  return GOF(f6);
1231    if (o >= GOF(f7)  && o+sz <= GOF(f7) +SZB(f7))  return GOF(f7);
1232    if (o >= GOF(f8)  && o+sz <= GOF(f8) +SZB(f8))  return GOF(f8);
1233    if (o >= GOF(f9)  && o+sz <= GOF(f9) +SZB(f9))  return GOF(f9);
1234    if (o >= GOF(f10) && o+sz <= GOF(f10)+SZB(f10)) return GOF(f10);
1235    if (o >= GOF(f11) && o+sz <= GOF(f11)+SZB(f11)) return GOF(f11);
1236    if (o >= GOF(f12) && o+sz <= GOF(f12)+SZB(f12)) return GOF(f12);
1237    if (o >= GOF(f13) && o+sz <= GOF(f13)+SZB(f13)) return GOF(f13);
1238    if (o >= GOF(f14) && o+sz <= GOF(f14)+SZB(f14)) return GOF(f14);
1239    if (o >= GOF(f15) && o+sz <= GOF(f15)+SZB(f15)) return GOF(f15);
1240    if (o >= GOF(f16) && o+sz <= GOF(f16)+SZB(f16)) return GOF(f16);
1241    if (o >= GOF(f17) && o+sz <= GOF(f17)+SZB(f17)) return GOF(f17);
1242    if (o >= GOF(f18) && o+sz <= GOF(f18)+SZB(f18)) return GOF(f18);
1243    if (o >= GOF(f19) && o+sz <= GOF(f19)+SZB(f19)) return GOF(f19);
1244    if (o >= GOF(f20) && o+sz <= GOF(f20)+SZB(f20)) return GOF(f20);
1245    if (o >= GOF(f21) && o+sz <= GOF(f21)+SZB(f21)) return GOF(f21);
1246    if (o >= GOF(f22) && o+sz <= GOF(f22)+SZB(f22)) return GOF(f22);
1247    if (o >= GOF(f23) && o+sz <= GOF(f23)+SZB(f23)) return GOF(f23);
1248    if (o >= GOF(f24) && o+sz <= GOF(f24)+SZB(f24)) return GOF(f24);
1249    if (o >= GOF(f25) && o+sz <= GOF(f25)+SZB(f25)) return GOF(f25);
1250    if (o >= GOF(f26) && o+sz <= GOF(f26)+SZB(f26)) return GOF(f26);
1251    if (o >= GOF(f27) && o+sz <= GOF(f27)+SZB(f27)) return GOF(f27);
1252    if (o >= GOF(f28) && o+sz <= GOF(f28)+SZB(f28)) return GOF(f28);
1253    if (o >= GOF(f29) && o+sz <= GOF(f29)+SZB(f29)) return GOF(f29);
1254    if (o >= GOF(f30) && o+sz <= GOF(f30)+SZB(f30)) return GOF(f30);
1255    if (o >= GOF(f31) && o+sz <= GOF(f31)+SZB(f31)) return GOF(f31);
1256 
1257    if ((o > GOF(NRADDR)) && (o <= GOF(NRADDR) +12 )) return -1;
1258 
1259    VG_(printf)("MC_(get_otrack_shadow_offset)(mips)(off=%d,sz=%d)\n",
1260                offset,szB);
1261    tl_assert(0);
1262 #  undef GOF
1263 #  undef SZB
1264 
1265 #  else
1266 #    error "FIXME: not implemented for this architecture"
1267 #  endif
1268 }
1269 
1270 
1271 /* Let 'arr' describe an indexed reference to a guest state section
1272    (guest state array).
1273 
1274    This function returns the corresponding guest state type to be used
1275    when indexing the corresponding array in the second shadow (origin
1276    tracking) area.  If the array is not to be origin-tracked, return
1277    Ity_INVALID.
1278 
1279    This function must agree with MC_(get_otrack_shadow_offset) above.
1280    See comments at the start of MC_(get_otrack_shadow_offset).
1281 */
MC_(get_otrack_reg_array_equiv_int_type)1282 IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr )
1283 {
1284    /* -------------------- ppc64 -------------------- */
1285 #  if defined(VGA_ppc64)
1286    /* The redir stack. */
1287    if (arr->base == offsetof(VexGuestPPC64State,guest_REDIR_STACK[0])
1288        && arr->elemTy == Ity_I64
1289        && arr->nElems == VEX_GUEST_PPC64_REDIR_STACK_SIZE)
1290       return Ity_I64;
1291 
1292    VG_(printf)("get_reg_array_equiv_int_type(ppc64): unhandled: ");
1293    ppIRRegArray(arr);
1294    VG_(printf)("\n");
1295    tl_assert(0);
1296 
1297    /* -------------------- ppc32 -------------------- */
1298 #  elif defined(VGA_ppc32)
1299    /* The redir stack. */
1300    if (arr->base == offsetof(VexGuestPPC32State,guest_REDIR_STACK[0])
1301        && arr->elemTy == Ity_I32
1302        && arr->nElems == VEX_GUEST_PPC32_REDIR_STACK_SIZE)
1303       return Ity_I32;
1304 
1305    VG_(printf)("get_reg_array_equiv_int_type(ppc32): unhandled: ");
1306    ppIRRegArray(arr);
1307    VG_(printf)("\n");
1308    tl_assert(0);
1309 
1310    /* -------------------- amd64 -------------------- */
1311 #  elif defined(VGA_amd64)
1312    /* Ignore the FP tag array - pointless to shadow, and in any case
1313       the elements are too small */
1314    if (arr->base == offsetof(VexGuestAMD64State,guest_FPTAG)
1315        && arr->elemTy == Ity_I8 && arr->nElems == 8)
1316       return Ity_INVALID;
1317 
1318    /* The FP register array */
1319    if (arr->base == offsetof(VexGuestAMD64State,guest_FPREG[0])
1320        && arr->elemTy == Ity_F64 && arr->nElems == 8)
1321       return Ity_I64;
1322 
1323    VG_(printf)("get_reg_array_equiv_int_type(amd64): unhandled: ");
1324    ppIRRegArray(arr);
1325    VG_(printf)("\n");
1326    tl_assert(0);
1327 
1328    /* --------------------- x86 --------------------- */
1329 #  elif defined(VGA_x86)
1330    /* Ignore the FP tag array - pointless to shadow, and in any case
1331       the elements are too small */
1332    if (arr->base == offsetof(VexGuestX86State,guest_FPTAG)
1333        && arr->elemTy == Ity_I8 && arr->nElems == 8)
1334       return Ity_INVALID;
1335 
1336    /* The FP register array */
1337    if (arr->base == offsetof(VexGuestX86State,guest_FPREG[0])
1338        && arr->elemTy == Ity_F64 && arr->nElems == 8)
1339       return Ity_I64;
1340 
1341    VG_(printf)("get_reg_array_equiv_int_type(x86): unhandled: ");
1342    ppIRRegArray(arr);
1343    VG_(printf)("\n");
1344    tl_assert(0);
1345 
1346    /* --------------------- arm --------------------- */
1347 #  elif defined(VGA_arm)
1348    VG_(printf)("get_reg_array_equiv_int_type(arm): unhandled: ");
1349    ppIRRegArray(arr);
1350    VG_(printf)("\n");
1351    tl_assert(0);
1352 
1353    /* --------------------- arm64 --------------------- */
1354 #  elif defined(VGA_arm64)
1355    VG_(printf)("get_reg_array_equiv_int_type(arm64): unhandled: ");
1356    ppIRRegArray(arr);
1357    VG_(printf)("\n");
1358    tl_assert(0);
1359 
1360    /* --------------------- s390x --------------------- */
1361 #  elif defined(VGA_s390x)
1362    /* Should never het here because s390x does not use Ist_PutI
1363       and Iex_GetI. */
1364    tl_assert(0);
1365 
1366 /* --------------------- mips32 --------------------- */
1367 #  elif defined(VGA_mips32)
1368    VG_(printf)("get_reg_array_equiv_int_type(mips32): unhandled: ");
1369    ppIRRegArray(arr);
1370    VG_(printf)("\n");
1371    tl_assert(0);
1372 
1373    /* --------------------- mips64 --------------------- */
1374 #  elif defined(VGA_mips64)
1375    VG_(printf)("get_reg_array_equiv_int_type(mips64): unhandled: ");
1376    ppIRRegArray(arr);
1377    VG_(printf)("\n");
1378    tl_assert(0);
1379 #  else
1380 #    error "FIXME: not implemented for this architecture"
1381 #  endif
1382 }
1383 
1384 
1385 /*--------------------------------------------------------------------*/
1386 /*--- end                                             mc_machine.c ---*/
1387 /*--------------------------------------------------------------------*/
1388