guest_ppc_helpers.c revision c7cd2142ff0172bd3702d0607426a8014d8842e5
1896a1373cfdbaa25f4ab73ed4f27554016defecccerion
2896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---------------------------------------------------------------*/
3896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---                                                         ---*/
41515db99ce1abcd2147ac54aea1a7090c7895a43cerion/*--- This file (guest-ppc32/ghelpers.c) is                   ---*/
5dbcfae724d5338205befbcd379a48f2303658198sewardj/*--- Copyright (C) OpenWorks LLP.  All rights reserved.      ---*/
6896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---                                                         ---*/
7896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---------------------------------------------------------------*/
8896a1373cfdbaa25f4ab73ed4f27554016defecccerion
9896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*
10896a1373cfdbaa25f4ab73ed4f27554016defecccerion   This file is part of LibVEX, a library for dynamic binary
11896a1373cfdbaa25f4ab73ed4f27554016defecccerion   instrumentation and translation.
12896a1373cfdbaa25f4ab73ed4f27554016defecccerion
137bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   Copyright (C) 2004-2005 OpenWorks LLP.  All rights reserved.
147bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
157bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   This library is made available under a dual licensing scheme.
167bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   If you link LibVEX against other code all of which is itself
187bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   licensed under the GNU General Public License, version 2 dated June
197bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   1991 ("GPL v2"), then you may use LibVEX under the terms of the GPL
207bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   v2, as appearing in the file LICENSE.GPL.  If the file LICENSE.GPL
217bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   is missing, you can obtain a copy of the GPL v2 from the Free
227bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   Software Foundation Inc., 51 Franklin St, Fifth Floor, Boston, MA
237bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
247bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
257bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   For any other uses of LibVEX, you must first obtain a commercial
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   license from OpenWorks LLP.  Please contact info@open-works.co.uk
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   for information about commercial licensing.
287bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
297bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   This software is provided by OpenWorks LLP "as is" and any express
307bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   or implied warranties, including, but not limited to, the implied
317bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   warranties of merchantability and fitness for a particular purpose
327bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   are disclaimed.  In no event shall OpenWorks LLP be liable for any
337bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   direct, indirect, incidental, special, exemplary, or consequential
347bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   damages (including, but not limited to, procurement of substitute
357bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   goods or services; loss of use, data, or profits; or business
367bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   interruption) however caused and on any theory of liability,
377bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   whether in contract, strict liability, or tort (including
387bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   negligence or otherwise) arising in any way out of the use of this
397bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   software, even if advised of the possibility of such damage.
40896a1373cfdbaa25f4ab73ed4f27554016defecccerion
41896a1373cfdbaa25f4ab73ed4f27554016defecccerion   Neither the names of the U.S. Department of Energy nor the
42896a1373cfdbaa25f4ab73ed4f27554016defecccerion   University of California nor the names of its contributors may be
43896a1373cfdbaa25f4ab73ed4f27554016defecccerion   used to endorse or promote products derived from this software
44896a1373cfdbaa25f4ab73ed4f27554016defecccerion   without prior written permission.
45896a1373cfdbaa25f4ab73ed4f27554016defecccerion*/
46896a1373cfdbaa25f4ab73ed4f27554016defecccerion
47896a1373cfdbaa25f4ab73ed4f27554016defecccerion#include "libvex_basictypes.h"
48094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion#include "libvex_emwarn.h"
491515db99ce1abcd2147ac54aea1a7090c7895a43cerion#include "libvex_guest_ppc32.h"
50896a1373cfdbaa25f4ab73ed4f27554016defecccerion#include "libvex_ir.h"
51896a1373cfdbaa25f4ab73ed4f27554016defecccerion#include "libvex.h"
52896a1373cfdbaa25f4ab73ed4f27554016defecccerion
53896a1373cfdbaa25f4ab73ed4f27554016defecccerion#include "main/vex_util.h"
549e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj#include "guest-generic/bb_to_IR.h"
551515db99ce1abcd2147ac54aea1a7090c7895a43cerion#include "guest-ppc32/gdefs.h"
56896a1373cfdbaa25f4ab73ed4f27554016defecccerion
57896a1373cfdbaa25f4ab73ed4f27554016defecccerion
581515db99ce1abcd2147ac54aea1a7090c7895a43cerion/* This file contains helper functions for ppc32 guest code.
59896a1373cfdbaa25f4ab73ed4f27554016defecccerion   Calls to these functions are generated by the back end.
60896a1373cfdbaa25f4ab73ed4f27554016defecccerion   These calls are of course in the host machine code and
61896a1373cfdbaa25f4ab73ed4f27554016defecccerion   this file will be compiled to host machine code, so that
62896a1373cfdbaa25f4ab73ed4f27554016defecccerion   all makes sense.
63896a1373cfdbaa25f4ab73ed4f27554016defecccerion
64896a1373cfdbaa25f4ab73ed4f27554016defecccerion   Only change the signatures of these helper functions very
65896a1373cfdbaa25f4ab73ed4f27554016defecccerion   carefully.  If you change the signature here, you'll have to change
66896a1373cfdbaa25f4ab73ed4f27554016defecccerion   the parameters passed to it in the IR calls constructed by
671515db99ce1abcd2147ac54aea1a7090c7895a43cerion   guest-ppc32/toIR.c.
68896a1373cfdbaa25f4ab73ed4f27554016defecccerion*/
69896a1373cfdbaa25f4ab73ed4f27554016defecccerion
70896a1373cfdbaa25f4ab73ed4f27554016defecccerion
7173a9197285975856fd3cc577216237afb3612b09sewardj/*---------------------------------------------------------------*/
7273a9197285975856fd3cc577216237afb3612b09sewardj/*--- Misc integer helpers.                                   ---*/
7373a9197285975856fd3cc577216237afb3612b09sewardj/*---------------------------------------------------------------*/
7473a9197285975856fd3cc577216237afb3612b09sewardj
7573a9197285975856fd3cc577216237afb3612b09sewardj/* CALLED FROM GENERATED CODE */
7673a9197285975856fd3cc577216237afb3612b09sewardj/* DIRTY HELPER (non-referentially-transparent) */
7773a9197285975856fd3cc577216237afb3612b09sewardj/* Horrible hack.  On non-ppc32 platforms, return 1. */
7873a9197285975856fd3cc577216237afb3612b09sewardj/* Reads a complete, consistent 64-bit TB value. */
7973a9197285975856fd3cc577216237afb3612b09sewardjULong ppc32g_dirtyhelper_MFTB ( void )
8073a9197285975856fd3cc577216237afb3612b09sewardj{
8173a9197285975856fd3cc577216237afb3612b09sewardj#  if defined(__powerpc__)
8273a9197285975856fd3cc577216237afb3612b09sewardj   ULong res;
8373a9197285975856fd3cc577216237afb3612b09sewardj   UInt  lo, hi1, hi2;
8473a9197285975856fd3cc577216237afb3612b09sewardj   while (1) {
8573a9197285975856fd3cc577216237afb3612b09sewardj      __asm__ __volatile__ ("\n"
8673a9197285975856fd3cc577216237afb3612b09sewardj         "\tmftbu %0\n"
8773a9197285975856fd3cc577216237afb3612b09sewardj         "\tmftb %1\n"
8873a9197285975856fd3cc577216237afb3612b09sewardj         "\tmftbu %2\n"
8973a9197285975856fd3cc577216237afb3612b09sewardj         : "=r" (hi1), "=r" (lo), "=r" (hi2)
9073a9197285975856fd3cc577216237afb3612b09sewardj      );
9173a9197285975856fd3cc577216237afb3612b09sewardj      if (hi1 == hi2) break;
9273a9197285975856fd3cc577216237afb3612b09sewardj   }
9373a9197285975856fd3cc577216237afb3612b09sewardj   res = ((ULong)hi1) << 32;
9473a9197285975856fd3cc577216237afb3612b09sewardj   res |= (ULong)lo;
9573a9197285975856fd3cc577216237afb3612b09sewardj   return res;
9673a9197285975856fd3cc577216237afb3612b09sewardj#  else
9773a9197285975856fd3cc577216237afb3612b09sewardj   return 1ULL;
9873a9197285975856fd3cc577216237afb3612b09sewardj#  endif
9973a9197285975856fd3cc577216237afb3612b09sewardj}
10073a9197285975856fd3cc577216237afb3612b09sewardj
10173a9197285975856fd3cc577216237afb3612b09sewardj
10273a9197285975856fd3cc577216237afb3612b09sewardj/* Helper-function specialiser. */
103896a1373cfdbaa25f4ab73ed4f27554016defecccerion
1045827784e6bb74e2a032b66ec310776c24fd88729sewardjIRExpr* guest_ppc32_spechelper ( HChar* function_name,
1055827784e6bb74e2a032b66ec310776c24fd88729sewardj                                 IRExpr** args )
106896a1373cfdbaa25f4ab73ed4f27554016defecccerion{
107896a1373cfdbaa25f4ab73ed4f27554016defecccerion   return NULL;
108896a1373cfdbaa25f4ab73ed4f27554016defecccerion}
109896a1373cfdbaa25f4ab73ed4f27554016defecccerion
110896a1373cfdbaa25f4ab73ed4f27554016defecccerion
111896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*----------------------------------------------*/
112896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*--- The exported fns ..                    ---*/
113896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*----------------------------------------------*/
114896a1373cfdbaa25f4ab73ed4f27554016defecccerion
115896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* VISIBLE TO LIBVEX CLIENT */
116b51f0f4f33256638ed953156a2635aa739b232f1sewardjUInt LibVEX_GuestPPC32_get_CR ( /*IN*/VexGuestPPC32State* vex_state )
117896a1373cfdbaa25f4ab73ed4f27554016defecccerion{
118b51f0f4f33256638ed953156a2635aa739b232f1sewardj#  define FIELD(_n)                                    \
119b51f0f4f33256638ed953156a2635aa739b232f1sewardj      ( ( (UInt)                                       \
120b51f0f4f33256638ed953156a2635aa739b232f1sewardj           ( (vex_state->guest_CR##_n##_321 & (7<<1))  \
121b51f0f4f33256638ed953156a2635aa739b232f1sewardj             | (vex_state->guest_CR##_n##_0 & 1)       \
122b51f0f4f33256638ed953156a2635aa739b232f1sewardj           )                                           \
123b51f0f4f33256638ed953156a2635aa739b232f1sewardj        )                                              \
124b51f0f4f33256638ed953156a2635aa739b232f1sewardj        << (4 * (7-(_n)))                              \
125b51f0f4f33256638ed953156a2635aa739b232f1sewardj      )
126b51f0f4f33256638ed953156a2635aa739b232f1sewardj
127b51f0f4f33256638ed953156a2635aa739b232f1sewardj   return
128b51f0f4f33256638ed953156a2635aa739b232f1sewardj      FIELD(0) | FIELD(1) | FIELD(2) | FIELD(3)
129b51f0f4f33256638ed953156a2635aa739b232f1sewardj      | FIELD(4) | FIELD(5) | FIELD(6) | FIELD(7);
130b51f0f4f33256638ed953156a2635aa739b232f1sewardj
131b51f0f4f33256638ed953156a2635aa739b232f1sewardj#  undef FIELD
132900f6b52087bf8a46de43a446eb24e4425c24130cerion}
133900f6b52087bf8a46de43a446eb24e4425c24130cerion
134b51f0f4f33256638ed953156a2635aa739b232f1sewardj
135900f6b52087bf8a46de43a446eb24e4425c24130cerion/* VISIBLE TO LIBVEX CLIENT */
136b51f0f4f33256638ed953156a2635aa739b232f1sewardjvoid LibVEX_GuestPPC32_put_CR ( UInt cr_native,
137900f6b52087bf8a46de43a446eb24e4425c24130cerion                                /*OUT*/VexGuestPPC32State* vex_state )
138900f6b52087bf8a46de43a446eb24e4425c24130cerion{
139b51f0f4f33256638ed953156a2635aa739b232f1sewardj   UInt t;
140b51f0f4f33256638ed953156a2635aa739b232f1sewardj
141b51f0f4f33256638ed953156a2635aa739b232f1sewardj#  define FIELD(_n)                                           \
142b51f0f4f33256638ed953156a2635aa739b232f1sewardj      do {                                                    \
143b51f0f4f33256638ed953156a2635aa739b232f1sewardj         t = cr_native >> (4*(7-(_n)));                       \
144c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj         vex_state->guest_CR##_n##_0 = toUChar(t & 1);        \
145c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj         vex_state->guest_CR##_n##_321 = toUChar(t & (7<<1)); \
146b51f0f4f33256638ed953156a2635aa739b232f1sewardj      } while (0)
147b51f0f4f33256638ed953156a2635aa739b232f1sewardj
148b51f0f4f33256638ed953156a2635aa739b232f1sewardj   FIELD(0);
149b51f0f4f33256638ed953156a2635aa739b232f1sewardj   FIELD(1);
150b51f0f4f33256638ed953156a2635aa739b232f1sewardj   FIELD(2);
151b51f0f4f33256638ed953156a2635aa739b232f1sewardj   FIELD(3);
152b51f0f4f33256638ed953156a2635aa739b232f1sewardj   FIELD(4);
153b51f0f4f33256638ed953156a2635aa739b232f1sewardj   FIELD(5);
154b51f0f4f33256638ed953156a2635aa739b232f1sewardj   FIELD(6);
155b51f0f4f33256638ed953156a2635aa739b232f1sewardj   FIELD(7);
156b51f0f4f33256638ed953156a2635aa739b232f1sewardj
157b51f0f4f33256638ed953156a2635aa739b232f1sewardj#  undef FIELD
158896a1373cfdbaa25f4ab73ed4f27554016defecccerion}
159896a1373cfdbaa25f4ab73ed4f27554016defecccerion
160b51f0f4f33256638ed953156a2635aa739b232f1sewardj
161896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* VISIBLE TO LIBVEX CLIENT */
162b51f0f4f33256638ed953156a2635aa739b232f1sewardjUInt LibVEX_GuestPPC32_get_XER ( /*IN*/VexGuestPPC32State* vex_state )
163896a1373cfdbaa25f4ab73ed4f27554016defecccerion{
164b51f0f4f33256638ed953156a2635aa739b232f1sewardj   UInt w = 0;
165b51f0f4f33256638ed953156a2635aa739b232f1sewardj   w |= ( ((UInt)vex_state->guest_XER_BC) & 0xFF );
166b51f0f4f33256638ed953156a2635aa739b232f1sewardj   w |= ( (((UInt)vex_state->guest_XER_SO) & 0x1) << 31 );
167b51f0f4f33256638ed953156a2635aa739b232f1sewardj   w |= ( (((UInt)vex_state->guest_XER_OV) & 0x1) << 30 );
168b51f0f4f33256638ed953156a2635aa739b232f1sewardj   w |= ( (((UInt)vex_state->guest_XER_CA) & 0x1) << 29 );
169b51f0f4f33256638ed953156a2635aa739b232f1sewardj   return w;
170896a1373cfdbaa25f4ab73ed4f27554016defecccerion}
171896a1373cfdbaa25f4ab73ed4f27554016defecccerion
172b51f0f4f33256638ed953156a2635aa739b232f1sewardj
173896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* VISIBLE TO LIBVEX CLIENT */
174b51f0f4f33256638ed953156a2635aa739b232f1sewardjvoid LibVEX_GuestPPC32_put_XER ( UInt xer_native,
175b51f0f4f33256638ed953156a2635aa739b232f1sewardj                                 /*OUT*/VexGuestPPC32State* vex_state )
17651900a2deba4c16728d2b5ab40477def5362a4f0cerion{
177c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj   vex_state->guest_XER_BC = toUChar(xer_native & 0xFF);
178c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj   vex_state->guest_XER_SO = toUChar((xer_native >> 31) & 0x1);
179c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj   vex_state->guest_XER_OV = toUChar((xer_native >> 30) & 0x1);
180c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj   vex_state->guest_XER_CA = toUChar((xer_native >> 29) & 0x1);
18151900a2deba4c16728d2b5ab40477def5362a4f0cerion}
18251900a2deba4c16728d2b5ab40477def5362a4f0cerion
183b51f0f4f33256638ed953156a2635aa739b232f1sewardj
18451900a2deba4c16728d2b5ab40477def5362a4f0cerion/* VISIBLE TO LIBVEX CLIENT */
1851515db99ce1abcd2147ac54aea1a7090c7895a43cerionvoid LibVEX_GuestPPC32_initialise ( /*OUT*/VexGuestPPC32State* vex_state )
186896a1373cfdbaa25f4ab73ed4f27554016defecccerion{
187896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR0  = 0;
188896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR1  = 0;
189896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR2  = 0;
190896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR3  = 0;
191896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR4  = 0;
192896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR5  = 0;
193896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR6  = 0;
194896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR7  = 0;
195896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR8  = 0;
196896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR9  = 0;
197896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR10 = 0;
198896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR11 = 0;
199896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR12 = 0;
200896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR13 = 0;
201896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR14 = 0;
202896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR15 = 0;
203896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR16 = 0;
204896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR17 = 0;
205896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR18 = 0;
206896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR19 = 0;
207896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR20 = 0;
208896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR21 = 0;
209896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR22 = 0;
210896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR23 = 0;
211896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR24 = 0;
212896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR25 = 0;
213896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR26 = 0;
214896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR27 = 0;
215896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR28 = 0;
216896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR29 = 0;
217896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR30 = 0;
218896a1373cfdbaa25f4ab73ed4f27554016defecccerion   vex_state->guest_GPR31 = 0;
219896a1373cfdbaa25f4ab73ed4f27554016defecccerion
22051900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR0  = 0;
22151900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR1  = 0;
22251900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR2  = 0;
22351900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR3  = 0;
22451900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR4  = 0;
22551900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR5  = 0;
22651900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR6  = 0;
22751900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR7  = 0;
22851900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR8  = 0;
22951900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR9  = 0;
23051900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR10 = 0;
23151900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR11 = 0;
23251900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR12 = 0;
23351900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR13 = 0;
23451900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR14 = 0;
23551900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR15 = 0;
23651900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR16 = 0;
23751900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR17 = 0;
23851900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR18 = 0;
23951900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR19 = 0;
24051900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR20 = 0;
24151900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR21 = 0;
24251900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR22 = 0;
24351900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR23 = 0;
24451900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR24 = 0;
24551900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR25 = 0;
24651900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR26 = 0;
24751900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR27 = 0;
24851900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR28 = 0;
24951900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR29 = 0;
25051900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR30 = 0;
25151900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_FPR31 = 0;
25251900a2deba4c16728d2b5ab40477def5362a4f0cerion
25351900a2deba4c16728d2b5ab40477def5362a4f0cerion   /* Initialise the vector state. */
254b51f0f4f33256638ed953156a2635aa739b232f1sewardj#  define VECZERO(_vr) _vr[0]=_vr[1]=_vr[2]=_vr[3] = 0;
255b51f0f4f33256638ed953156a2635aa739b232f1sewardj
256b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR0 );
257b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR1 );
258b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR2 );
259b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR3 );
260b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR4 );
261b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR5 );
262b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR6 );
263b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR7 );
264b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR8 );
265b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR9 );
266b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR10);
267b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR11);
268b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR12);
269b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR13);
270b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR14);
271b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR15);
272b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR16);
273b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR17);
274b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR18);
275b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR19);
276b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR20);
277b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR21);
278b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR22);
279b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR23);
280b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR24);
281b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR25);
282b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR26);
283b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR27);
284b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR28);
285b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR29);
286b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR30);
287b51f0f4f33256638ed953156a2635aa739b232f1sewardj   VECZERO(vex_state->guest_VR31);
288b51f0f4f33256638ed953156a2635aa739b232f1sewardj
289b51f0f4f33256638ed953156a2635aa739b232f1sewardj#  undef VECZERO
29051900a2deba4c16728d2b5ab40477def5362a4f0cerion
291db1941aff78d331d5eed56091a9dc861414654ebcerion   vex_state->guest_CIA  = 0;
29291ad5368eb6354ad4fabc86f2b2e641736997a38cerion   vex_state->guest_LR   = 0;
29391ad5368eb6354ad4fabc86f2b2e641736997a38cerion   vex_state->guest_CTR  = 0;
294896a1373cfdbaa25f4ab73ed4f27554016defecccerion
295b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_XER_SO = 0;
296b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_XER_OV = 0;
297b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_XER_CA = 0;
298b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_XER_BC = 0;
299b51f0f4f33256638ed953156a2635aa739b232f1sewardj
300b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR0_321 = 0;
301b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR0_0   = 0;
302b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR1_321 = 0;
303b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR1_0   = 0;
304b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR2_321 = 0;
305b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR2_0   = 0;
306b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR3_321 = 0;
307b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR3_0   = 0;
308b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR4_321 = 0;
309b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR4_0   = 0;
310b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR5_321 = 0;
311b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR5_0   = 0;
312b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR6_321 = 0;
313b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR6_0   = 0;
314b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR7_321 = 0;
315b51f0f4f33256638ed953156a2635aa739b232f1sewardj   vex_state->guest_CR7_0   = 0;
316db1941aff78d331d5eed56091a9dc861414654ebcerion
317094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion   vex_state->guest_FPROUND = (UInt)PPC32rm_NEAREST;
318094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion
31951900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_VRSAVE = 0;
32051900a2deba4c16728d2b5ab40477def5362a4f0cerion
32151900a2deba4c16728d2b5ab40477def5362a4f0cerion   vex_state->guest_VSCR = 0;
32251900a2deba4c16728d2b5ab40477def5362a4f0cerion
323094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion   vex_state->guest_EMWARN = EmWarn_NONE;
324094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion
3257ce9d15f4208aa08dfb1e605b3cad53ff03a84e4sewardj   vex_state->guest_TISTART = 0;
3267ce9d15f4208aa08dfb1e605b3cad53ff03a84e4sewardj   vex_state->guest_TILEN   = 0;
3277787af415a9104b601c2f0ce5b56749e4fd86691sewardj
3287787af415a9104b601c2f0ce5b56749e4fd86691sewardj   vex_state->guest_RESVN   = 0;
329896a1373cfdbaa25f4ab73ed4f27554016defecccerion}
330896a1373cfdbaa25f4ab73ed4f27554016defecccerion
331896a1373cfdbaa25f4ab73ed4f27554016defecccerion
332896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*-----------------------------------------------------------*/
333b51f0f4f33256638ed953156a2635aa739b232f1sewardj/*--- Describing the ppc32 guest state, for the benefit   ---*/
334896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*--- of iropt and instrumenters.                         ---*/
335896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*-----------------------------------------------------------*/
336896a1373cfdbaa25f4ab73ed4f27554016defecccerion
337896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* Figure out if any part of the guest state contained in minoff
338896a1373cfdbaa25f4ab73ed4f27554016defecccerion   .. maxoff requires precise memory exceptions.  If in doubt return
339896a1373cfdbaa25f4ab73ed4f27554016defecccerion   True (but this is generates significantly slower code).
340e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj
341e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   By default we enforce precise exns for guest R1 (stack pointer),
342e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   CIA (current insn address) and LR (link register).  These are the
343e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   minimum needed to extract correct stack backtraces from ppc32
344e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   code. [[NB: not sure if keeping LR up to date is actually
345e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   necessary.]]
346896a1373cfdbaa25f4ab73ed4f27554016defecccerion*/
3471515db99ce1abcd2147ac54aea1a7090c7895a43cerionBool guest_ppc32_state_requires_precise_mem_exns ( Int minoff,
348e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj                                                   Int maxoff )
349896a1373cfdbaa25f4ab73ed4f27554016defecccerion{
350e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   Int lr_min  = offsetof(VexGuestPPC32State, guest_LR);
351e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   Int lr_max  = lr_min + 4 - 1;
352e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   Int r1_min  = offsetof(VexGuestPPC32State, guest_GPR1);
353e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   Int r1_max  = r1_min + 4 - 1;
354e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   Int cia_min = offsetof(VexGuestPPC32State, guest_CIA);
355e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   Int cia_max = cia_min + 4 - 1;
356e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj
357e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   if (maxoff < lr_min || minoff > lr_max) {
358e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj      /* no overlap with LR */
359e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   } else {
360e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj      return True;
361e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   }
362e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj
363e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   if (maxoff < r1_min || minoff > r1_max) {
364e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj      /* no overlap with R1 */
365e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   } else {
366e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj      return True;
367e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   }
368e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj
369e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   if (maxoff < cia_min || minoff > cia_max) {
370e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj      /* no overlap with CIA */
371e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   } else {
372e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj      return True;
373e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   }
374896a1373cfdbaa25f4ab73ed4f27554016defecccerion
375e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj   return False;
376e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj}
377896a1373cfdbaa25f4ab73ed4f27554016defecccerion
378896a1373cfdbaa25f4ab73ed4f27554016defecccerion
379e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj#define ALWAYSDEFD(field)                             \
3801515db99ce1abcd2147ac54aea1a7090c7895a43cerion    { offsetof(VexGuestPPC32State, field),            \
3811515db99ce1abcd2147ac54aea1a7090c7895a43cerion      (sizeof ((VexGuestPPC32State*)0)->field) }
382896a1373cfdbaa25f4ab73ed4f27554016defecccerion
383896a1373cfdbaa25f4ab73ed4f27554016defecccerionVexGuestLayout
3841515db99ce1abcd2147ac54aea1a7090c7895a43cerion   ppc32Guest_layout
385896a1373cfdbaa25f4ab73ed4f27554016defecccerion      = {
386896a1373cfdbaa25f4ab73ed4f27554016defecccerion          /* Total size of the guest state, in bytes. */
3871515db99ce1abcd2147ac54aea1a7090c7895a43cerion          .total_sizeB = sizeof(VexGuestPPC32State),
388896a1373cfdbaa25f4ab73ed4f27554016defecccerion
389896a1373cfdbaa25f4ab73ed4f27554016defecccerion          /* Describe the stack pointer. */
3901515db99ce1abcd2147ac54aea1a7090c7895a43cerion          .offset_SP = offsetof(VexGuestPPC32State,guest_GPR1),
391896a1373cfdbaa25f4ab73ed4f27554016defecccerion          .sizeof_SP = 4,
392896a1373cfdbaa25f4ab73ed4f27554016defecccerion
393896a1373cfdbaa25f4ab73ed4f27554016defecccerion          /* Describe the instruction pointer. */
3941515db99ce1abcd2147ac54aea1a7090c7895a43cerion          .offset_IP = offsetof(VexGuestPPC32State,guest_CIA),
395db1941aff78d331d5eed56091a9dc861414654ebcerion          .sizeof_IP = 4,
396896a1373cfdbaa25f4ab73ed4f27554016defecccerion
397896a1373cfdbaa25f4ab73ed4f27554016defecccerion          /* Describe any sections to be regarded by Memcheck as
398896a1373cfdbaa25f4ab73ed4f27554016defecccerion             'always-defined'. */
3997787af415a9104b601c2f0ce5b56749e4fd86691sewardj          .n_alwaysDefd = 7,
400896a1373cfdbaa25f4ab73ed4f27554016defecccerion
401896a1373cfdbaa25f4ab73ed4f27554016defecccerion          .alwaysDefd
4029759a81d44beb5b565b2e038d63e2f0c7b51933csewardj	  = { /*  0 */ ALWAYSDEFD(guest_CIA),
4039759a81d44beb5b565b2e038d63e2f0c7b51933csewardj	      /*  1 */ ALWAYSDEFD(guest_EMWARN),
4049759a81d44beb5b565b2e038d63e2f0c7b51933csewardj	      /*  2 */ ALWAYSDEFD(guest_TISTART),
4059759a81d44beb5b565b2e038d63e2f0c7b51933csewardj	      /*  3 */ ALWAYSDEFD(guest_TILEN),
4069759a81d44beb5b565b2e038d63e2f0c7b51933csewardj	      /*  4 */ ALWAYSDEFD(guest_VSCR),
4077787af415a9104b601c2f0ce5b56749e4fd86691sewardj	      /*  5 */ ALWAYSDEFD(guest_FPROUND),
4087787af415a9104b601c2f0ce5b56749e4fd86691sewardj	      /*  6 */ ALWAYSDEFD(guest_RESVN)
4099759a81d44beb5b565b2e038d63e2f0c7b51933csewardj            }
410896a1373cfdbaa25f4ab73ed4f27554016defecccerion        };
411896a1373cfdbaa25f4ab73ed4f27554016defecccerion
412896a1373cfdbaa25f4ab73ed4f27554016defecccerion
413896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---------------------------------------------------------------*/
4141515db99ce1abcd2147ac54aea1a7090c7895a43cerion/*--- end                              guest-ppc32/ghelpers.c ---*/
415896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---------------------------------------------------------------*/
416