1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin                               guest_ppc_helpers.c ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2004-2013 OpenWorks LLP
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.net
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02110-1301, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Neither the names of the U.S. Department of Energy nor the
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   University of California nor the names of its contributors may be
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   used to endorse or promote products derived from this software
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   without prior written permission.
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_basictypes.h"
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_emnote.h"
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_guest_ppc32.h"
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_guest_ppc64.h"
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_ir.h"
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex.h"
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "main_util.h"
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "main_globals.h"
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "guest_generic_bb_to_IR.h"
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "guest_ppc_defs.h"
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This file contains helper functions for ppc32 and ppc64 guest code.
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Calls to these functions are generated by the back end.  These
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   calls are of course in the host machine code and this file will be
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   compiled to host machine code, so that all makes sense.
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Only change the signatures of these helper functions very
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   carefully.  If you change the signature here, you'll have to change
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the parameters passed to it in the IR calls constructed by
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest-ppc/toIR.c.
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Misc integer helpers.                                   ---*/
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* CALLED FROM GENERATED CODE */
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* DIRTY HELPER (non-referentially-transparent) */
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Horrible hack.  On non-ppc platforms, return 1. */
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Reads a complete, consistent 64-bit TB value. */
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong ppcg_dirtyhelper_MFTB ( void )
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  if defined(__powerpc__) || defined(_AIX)
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt  lo, hi1, hi2;
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (1) {
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("\n"
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "\tmftbu %0\n"
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "\tmftb %1\n"
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "\tmftbu %2\n"
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : "=r" (hi1), "=r" (lo), "=r" (hi2)
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (hi1 == hi2) break;
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = ((ULong)hi1) << 32;
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res |= (ULong)lo;
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  else
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 1ULL;
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* CALLED FROM GENERATED CODE */
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* DIRTY HELPER (non-referentially transparent) */
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt ppc32g_dirtyhelper_MFSPR_268_269 ( UInt r269 )
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  if defined(__powerpc__) || defined(_AIX)
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt spr;
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (r269) {
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__("mfspr %0,269" : "=b"(spr));
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__("mfspr %0,268" : "=b"(spr));
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return spr;
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  else
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* CALLED FROM GENERATED CODE */
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* DIRTY HELPER (I'm not really sure what the side effects are) */
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt ppc32g_dirtyhelper_MFSPR_287 ( void )
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  if defined(__powerpc__) || defined(_AIX)
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt spr;
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__ __volatile__("mfspr %0,287" : "=b"(spr));
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return spr;
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  else
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* CALLED FROM GENERATED CODE */
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* DIRTY HELPER (reads guest state, writes guest mem) */
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst,
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              UInt vD_off, UInt sh, UInt shift_right )
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  static
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  UChar ref[32] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U128* pU128_src;
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U128* pU128_dst;
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  vassert( vD_off       <= sizeof(VexGuestPPC32State)-8 );
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  vassert( sh           <= 15 );
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  vassert( shift_right  <=  1 );
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (shift_right)
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     sh = 16-sh;
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* else shift left  */
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pU128_src = (U128*)&ref[sh];
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pU128_dst = (U128*)( ((UChar*)gst) + vD_off );
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (*pU128_dst)[0] = (*pU128_src)[0];
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (*pU128_dst)[1] = (*pU128_src)[1];
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (*pU128_dst)[2] = (*pU128_src)[2];
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (*pU128_dst)[3] = (*pU128_src)[3];
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* CALLED FROM GENERATED CODE */
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* DIRTY HELPER (reads guest state, writes guest mem) */
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppc64g_dirtyhelper_LVS ( VexGuestPPC64State* gst,
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              UInt vD_off, UInt sh, UInt shift_right )
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
158f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root  UChar ref[32];
159f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root  ULong i;
160f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root  /* ref[] used to be a static const array, but this doesn't work on
161f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root     ppc64 because VEX doesn't load the TOC pointer for the call here,
162f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root     and so we wind up picking up some totally random other data.
163f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root     (It's a wonder we don't segfault.)  So, just to be clear, this
164f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root     "fix" (vex r2073) is really a kludgearound for the fact that
165f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root     VEX's 64-bit ppc code generation doesn't provide a valid TOC
166f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root     pointer for helper function calls.  Ick.  (Bug 250038) */
167f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root  for (i = 0; i < 32; i++) ref[i] = i;
168f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny Root
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U128* pU128_src;
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U128* pU128_dst;
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  vassert( vD_off       <= sizeof(VexGuestPPC64State)-8 );
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  vassert( sh           <= 15 );
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  vassert( shift_right  <=  1 );
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (shift_right)
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     sh = 16-sh;
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* else shift left  */
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pU128_src = (U128*)&ref[sh];
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pU128_dst = (U128*)( ((UChar*)gst) + vD_off );
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (*pU128_dst)[0] = (*pU128_src)[0];
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (*pU128_dst)[1] = (*pU128_src)[1];
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (*pU128_dst)[2] = (*pU128_src)[2];
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (*pU128_dst)[3] = (*pU128_src)[3];
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Helper-function specialiser. */
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovIRExpr* guest_ppc32_spechelper ( const HChar* function_name,
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 IRExpr** args,
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 IRStmt** precedingStmts,
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 Int      n_precedingStmts )
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovIRExpr* guest_ppc64_spechelper ( const HChar* function_name,
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 IRExpr** args,
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 IRStmt** precedingStmts,
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 Int      n_precedingStmts )
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------*/
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- The exported fns ..                    ---*/
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------*/
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovUInt LibVEX_GuestPPC32_get_CR ( /*IN*/const VexGuestPPC32State* vex_state )
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define FIELD(_n)                                    \
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ( ( (UInt)                                       \
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           ( (vex_state->guest_CR##_n##_321 & (7<<1))  \
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             | (vex_state->guest_CR##_n##_0 & 1)       \
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           )                                           \
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        )                                              \
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        << (4 * (7-(_n)))                              \
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      )
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      FIELD(0) | FIELD(1) | FIELD(2) | FIELD(3)
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      | FIELD(4) | FIELD(5) | FIELD(6) | FIELD(7);
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef FIELD
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Note: %CR is 32 bits even for ppc64 */
234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovUInt LibVEX_GuestPPC64_get_CR ( /*IN*/const VexGuestPPC64State* vex_state )
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define FIELD(_n)                                    \
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ( ( (UInt)                                       \
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           ( (vex_state->guest_CR##_n##_321 & (7<<1))  \
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             | (vex_state->guest_CR##_n##_0 & 1)       \
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           )                                           \
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        )                                              \
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        << (4 * (7-(_n)))                              \
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      )
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      FIELD(0) | FIELD(1) | FIELD(2) | FIELD(3)
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      | FIELD(4) | FIELD(5) | FIELD(6) | FIELD(7);
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef FIELD
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_GuestPPC32_put_CR ( UInt cr_native,
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                /*OUT*/VexGuestPPC32State* vex_state )
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt t;
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define FIELD(_n)                                           \
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      do {                                                    \
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         t = cr_native >> (4*(7-(_n)));                       \
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_state->guest_CR##_n##_0 = toUChar(t & 1);        \
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_state->guest_CR##_n##_321 = toUChar(t & (7<<1)); \
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } while (0)
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(0);
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(1);
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(2);
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(3);
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(4);
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(5);
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(6);
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(7);
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef FIELD
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Note: %CR is 32 bits even for ppc64 */
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_GuestPPC64_put_CR ( UInt cr_native,
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                /*OUT*/VexGuestPPC64State* vex_state )
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt t;
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define FIELD(_n)                                           \
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      do {                                                    \
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         t = cr_native >> (4*(7-(_n)));                       \
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_state->guest_CR##_n##_0 = toUChar(t & 1);        \
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_state->guest_CR##_n##_321 = toUChar(t & (7<<1)); \
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } while (0)
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(0);
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(1);
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(2);
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(3);
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(4);
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(5);
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(6);
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   FIELD(7);
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef FIELD
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovUInt LibVEX_GuestPPC32_get_XER ( /*IN*/const VexGuestPPC32State* vex_state )
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt w = 0;
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   w |= ( ((UInt)vex_state->guest_XER_BC) & 0xFF );
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   w |= ( (((UInt)vex_state->guest_XER_SO) & 0x1) << 31 );
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   w |= ( (((UInt)vex_state->guest_XER_OV) & 0x1) << 30 );
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   w |= ( (((UInt)vex_state->guest_XER_CA) & 0x1) << 29 );
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return w;
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Note: %XER is 32 bits even for ppc64 */
320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovUInt LibVEX_GuestPPC64_get_XER ( /*IN*/const VexGuestPPC64State* vex_state )
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt w = 0;
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   w |= ( ((UInt)vex_state->guest_XER_BC) & 0xFF );
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   w |= ( (((UInt)vex_state->guest_XER_SO) & 0x1) << 31 );
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   w |= ( (((UInt)vex_state->guest_XER_OV) & 0x1) << 30 );
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   w |= ( (((UInt)vex_state->guest_XER_CA) & 0x1) << 29 );
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return w;
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_GuestPPC32_put_XER ( UInt xer_native,
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 /*OUT*/VexGuestPPC32State* vex_state )
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_BC = toUChar(xer_native & 0xFF);
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_SO = toUChar((xer_native >> 31) & 0x1);
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_OV = toUChar((xer_native >> 30) & 0x1);
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_CA = toUChar((xer_native >> 29) & 0x1);
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Note: %XER is 32 bits even for ppc64 */
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_GuestPPC64_put_XER ( UInt xer_native,
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 /*OUT*/VexGuestPPC64State* vex_state )
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_BC = toUChar(xer_native & 0xFF);
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_SO = toUChar((xer_native >> 31) & 0x1);
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_OV = toUChar((xer_native >> 30) & 0x1);
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_CA = toUChar((xer_native >> 29) & 0x1);
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_GuestPPC32_initialise ( /*OUT*/VexGuestPPC32State* vex_state )
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int i;
356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->host_EvC_FAILADDR = 0;
357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->host_EvC_COUNTER  = 0;
358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->pad3 = 0;
359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->pad4 = 0;
360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR0  = 0;
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR1  = 0;
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR2  = 0;
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR3  = 0;
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR4  = 0;
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR5  = 0;
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR6  = 0;
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR7  = 0;
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR8  = 0;
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR9  = 0;
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR10 = 0;
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR11 = 0;
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR12 = 0;
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR13 = 0;
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR14 = 0;
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR15 = 0;
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR16 = 0;
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR17 = 0;
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR18 = 0;
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR19 = 0;
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR20 = 0;
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR21 = 0;
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR22 = 0;
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR23 = 0;
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR24 = 0;
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR25 = 0;
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR26 = 0;
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR27 = 0;
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR28 = 0;
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR29 = 0;
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR30 = 0;
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR31 = 0;
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Initialise the vector state. */
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define VECZERO(_vr) _vr[0]=_vr[1]=_vr[2]=_vr[3] = 0;
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR0 );
398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR1 );
399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR2 );
400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR3 );
401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR4 );
402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR5 );
403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR6 );
404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR7 );
405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR8 );
406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR9 );
407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR10);
408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR11);
409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR12);
410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR13);
411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR14);
412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR15);
413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR16);
414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR17);
415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR18);
416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR19);
417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR20);
418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR21);
419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR22);
420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR23);
421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR24);
422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR25);
423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR26);
424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR27);
425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR28);
426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR29);
427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR30);
428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR31);
429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR32);
430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR33);
431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR34);
432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR35);
433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR36);
434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR37);
435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR38);
436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR39);
437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR40);
438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR41);
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR42);
440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR43);
441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR44);
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR45);
443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR46);
444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR47);
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR48);
446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR49);
447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR50);
448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR51);
449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR52);
450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR53);
451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR54);
452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR55);
453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR56);
454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR57);
455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR58);
456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR59);
457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR60);
458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR61);
459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR62);
460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR63);
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef VECZERO
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CIA  = 0;
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_LR   = 0;
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CTR  = 0;
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_SO = 0;
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_OV = 0;
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_CA = 0;
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_BC = 0;
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR0_321 = 0;
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR0_0   = 0;
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR1_321 = 0;
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR1_0   = 0;
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR2_321 = 0;
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR2_0   = 0;
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR3_321 = 0;
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR3_0   = 0;
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR4_321 = 0;
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR4_0   = 0;
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR5_321 = 0;
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR5_0   = 0;
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR6_321 = 0;
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR6_0   = 0;
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR7_321 = 0;
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR7_0   = 0;
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->guest_FPROUND  = PPCrm_NEAREST;
491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->guest_DFPROUND = PPCrm_NEAREST;
492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->pad1 = 0;
493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->pad2 = 0;
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_VRSAVE = 0;
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_VSCR = 0x0;  // Non-Java mode = 0
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vex_state->guest_EMNOTE = EmNote_NONE;
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
501eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vex_state->guest_CMSTART = 0;
502eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vex_state->guest_CMLEN   = 0;
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_NRADDR = 0;
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_NRADDR_GPR2 = 0;
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_REDIR_SP = -1;
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < VEX_GUEST_PPC32_REDIR_STACK_SIZE; i++)
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_state->guest_REDIR_STACK[i] = 0;
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_IP_AT_SYSCALL = 0;
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_SPRG3_RO = 0;
513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vex_state->padding1 = 0;
515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vex_state->padding2 = 0;
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VISIBLE TO LIBVEX CLIENT */
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_GuestPPC64_initialise ( /*OUT*/VexGuestPPC64State* vex_state )
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int i;
523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->host_EvC_FAILADDR = 0;
524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->host_EvC_COUNTER = 0;
525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->pad0 = 0;
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR0  = 0;
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR1  = 0;
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR2  = 0;
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR3  = 0;
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR4  = 0;
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR5  = 0;
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR6  = 0;
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR7  = 0;
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR8  = 0;
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR9  = 0;
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR10 = 0;
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR11 = 0;
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR12 = 0;
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR13 = 0;
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR14 = 0;
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR15 = 0;
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR16 = 0;
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR17 = 0;
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR18 = 0;
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR19 = 0;
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR20 = 0;
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR21 = 0;
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR22 = 0;
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR23 = 0;
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR24 = 0;
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR25 = 0;
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR26 = 0;
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR27 = 0;
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR28 = 0;
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR29 = 0;
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR30 = 0;
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_GPR31 = 0;
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Initialise the vector state. */
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define VECZERO(_vr) _vr[0]=_vr[1]=_vr[2]=_vr[3] = 0;
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR0 );
563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR1 );
564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR2 );
565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR3 );
566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR4 );
567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR5 );
568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR6 );
569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR7 );
570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR8 );
571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR9 );
572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR10);
573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR11);
574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR12);
575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR13);
576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR14);
577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR15);
578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR16);
579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR17);
580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR18);
581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR19);
582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR20);
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR21);
584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR22);
585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR23);
586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR24);
587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR25);
588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR26);
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR27);
590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR28);
591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR29);
592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR30);
593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR31);
594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR32);
595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR33);
596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR34);
597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR35);
598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR36);
599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR37);
600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR38);
601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR39);
602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR40);
603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR41);
604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR42);
605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR43);
606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR44);
607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR45);
608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR46);
609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR47);
610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR48);
611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR49);
612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR50);
613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR51);
614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR52);
615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR53);
616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR54);
617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR55);
618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR56);
619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR57);
620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR58);
621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR59);
622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR60);
623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR61);
624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR62);
625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VECZERO(vex_state->guest_VSR63);
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef VECZERO
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CIA  = 0;
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_LR   = 0;
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CTR  = 0;
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_SO = 0;
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_OV = 0;
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_CA = 0;
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_XER_BC = 0;
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR0_321 = 0;
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR0_0   = 0;
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR1_321 = 0;
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR1_0   = 0;
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR2_321 = 0;
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR2_0   = 0;
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR3_321 = 0;
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR3_0   = 0;
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR4_321 = 0;
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR4_0   = 0;
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR5_321 = 0;
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR5_0   = 0;
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR6_321 = 0;
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR6_0   = 0;
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR7_321 = 0;
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_CR7_0   = 0;
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->guest_FPROUND  = PPCrm_NEAREST;
656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->guest_DFPROUND = PPCrm_NEAREST;
657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->pad1 = 0;
658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_state->pad2 = 0;
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_VRSAVE = 0;
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_VSCR = 0x0;  // Non-Java mode = 0
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vex_state->guest_EMNOTE = EmNote_NONE;
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->padding = 0;
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
668eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vex_state->guest_CMSTART = 0;
669eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vex_state->guest_CMLEN   = 0;
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_NRADDR = 0;
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_NRADDR_GPR2 = 0;
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_REDIR_SP = -1;
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < VEX_GUEST_PPC64_REDIR_STACK_SIZE; i++)
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_state->guest_REDIR_STACK[i] = 0;
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_IP_AT_SYSCALL = 0;
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_state->guest_SPRG3_RO = 0;
680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vex_state->guest_TFHAR  = 0;
681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vex_state->guest_TFIAR  = 0;
682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vex_state->guest_TEXASR = 0;
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-----------------------------------------------------------*/
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Describing the ppc guest state, for the benefit     ---*/
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- of iropt and instrumenters.                         ---*/
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-----------------------------------------------------------*/
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Figure out if any part of the guest state contained in minoff
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   .. maxoff requires precise memory exceptions.  If in doubt return
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   True (but this is generates significantly slower code).
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   By default we enforce precise exns for guest R1 (stack pointer),
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CIA (current insn address) and LR (link register).  These are the
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   minimum needed to extract correct stack backtraces from ppc
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   code. [[NB: not sure if keeping LR up to date is actually
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   necessary.]]
700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Only R1 is needed in mode VexRegUpdSpAtMemAccess.
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool guest_ppc32_state_requires_precise_mem_exns ( Int minoff,
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                                   Int maxoff )
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int lr_min  = offsetof(VexGuestPPC32State, guest_LR);
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int lr_max  = lr_min + 4 - 1;
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int r1_min  = offsetof(VexGuestPPC32State, guest_GPR1);
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int r1_max  = r1_min + 4 - 1;
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int cia_min = offsetof(VexGuestPPC32State, guest_CIA);
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int cia_max = cia_min + 4 - 1;
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (maxoff < r1_min || minoff > r1_max) {
714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* no overlap with R1 */
715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (vex_control.iropt_register_updates == VexRegUpdSpAtMemAccess)
716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return False; // We only need to check stack pointer.
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (maxoff < lr_min || minoff > lr_max) {
722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* no overlap with LR */
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (maxoff < cia_min || minoff > cia_max) {
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* no overlap with CIA */
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return False;
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool guest_ppc64_state_requires_precise_mem_exns ( Int minoff,
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                                   Int maxoff )
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Given that R2 is a Big Deal in the ELF ppc64 ABI, it seems
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      prudent to be conservative with it, even though thus far there
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is no evidence to suggest that it actually needs to be kept up
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      to date wrt possible exceptions. */
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int lr_min  = offsetof(VexGuestPPC64State, guest_LR);
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int lr_max  = lr_min + 8 - 1;
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int r1_min  = offsetof(VexGuestPPC64State, guest_GPR1);
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int r1_max  = r1_min + 8 - 1;
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int r2_min  = offsetof(VexGuestPPC64State, guest_GPR2);
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int r2_max  = r2_min + 8 - 1;
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int cia_min = offsetof(VexGuestPPC64State, guest_CIA);
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int cia_max = cia_min + 8 - 1;
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (maxoff < r1_min || minoff > r1_max) {
753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* no overlap with R1 */
754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (vex_control.iropt_register_updates == VexRegUpdSpAtMemAccess)
755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return False; // We only need to check stack pointer.
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (maxoff < lr_min || minoff > lr_max) {
761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* no overlap with LR */
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (maxoff < r2_min || minoff > r2_max) {
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* no overlap with R2 */
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (maxoff < cia_min || minoff > cia_max) {
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* no overlap with CIA */
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return False;
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ALWAYSDEFD32(field)                           \
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { offsetof(VexGuestPPC32State, field),            \
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (sizeof ((VexGuestPPC32State*)0)->field) }
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVexGuestLayout
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ppc32Guest_layout
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = {
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Total size of the guest state, in bytes. */
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .total_sizeB = sizeof(VexGuestPPC32State),
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Describe the stack pointer. */
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .offset_SP = offsetof(VexGuestPPC32State,guest_GPR1),
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .sizeof_SP = 4,
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Describe the frame pointer. */
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .offset_FP = offsetof(VexGuestPPC32State,guest_GPR1),
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .sizeof_FP = 4,
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Describe the instruction pointer. */
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .offset_IP = offsetof(VexGuestPPC32State,guest_CIA),
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .sizeof_IP = 4,
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Describe any sections to be regarded by Memcheck as
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             'always-defined'. */
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .n_alwaysDefd = 11,
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .alwaysDefd
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  = { /*  0 */ ALWAYSDEFD32(guest_CIA),
810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	      /*  1 */ ALWAYSDEFD32(guest_EMNOTE),
811eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov	      /*  2 */ ALWAYSDEFD32(guest_CMSTART),
812eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov	      /*  3 */ ALWAYSDEFD32(guest_CMLEN),
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  4 */ ALWAYSDEFD32(guest_VSCR),
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  5 */ ALWAYSDEFD32(guest_FPROUND),
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              /*  6 */ ALWAYSDEFD32(guest_NRADDR),
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  7 */ ALWAYSDEFD32(guest_NRADDR_GPR2),
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  8 */ ALWAYSDEFD32(guest_REDIR_SP),
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  9 */ ALWAYSDEFD32(guest_REDIR_STACK),
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /* 10 */ ALWAYSDEFD32(guest_IP_AT_SYSCALL)
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        };
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ALWAYSDEFD64(field)                           \
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { offsetof(VexGuestPPC64State, field),            \
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (sizeof ((VexGuestPPC64State*)0)->field) }
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVexGuestLayout
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ppc64Guest_layout
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = {
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Total size of the guest state, in bytes. */
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .total_sizeB = sizeof(VexGuestPPC64State),
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Describe the stack pointer. */
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .offset_SP = offsetof(VexGuestPPC64State,guest_GPR1),
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .sizeof_SP = 8,
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Describe the frame pointer. */
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .offset_FP = offsetof(VexGuestPPC64State,guest_GPR1),
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .sizeof_FP = 8,
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Describe the instruction pointer. */
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .offset_IP = offsetof(VexGuestPPC64State,guest_CIA),
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .sizeof_IP = 8,
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /* Describe any sections to be regarded by Memcheck as
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             'always-defined'. */
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .n_alwaysDefd = 11,
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          .alwaysDefd
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  = { /*  0 */ ALWAYSDEFD64(guest_CIA),
851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	      /*  1 */ ALWAYSDEFD64(guest_EMNOTE),
852eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov	      /*  2 */ ALWAYSDEFD64(guest_CMSTART),
853eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov	      /*  3 */ ALWAYSDEFD64(guest_CMLEN),
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  4 */ ALWAYSDEFD64(guest_VSCR),
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  5 */ ALWAYSDEFD64(guest_FPROUND),
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  6 */ ALWAYSDEFD64(guest_NRADDR),
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  7 */ ALWAYSDEFD64(guest_NRADDR_GPR2),
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  8 */ ALWAYSDEFD64(guest_REDIR_SP),
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /*  9 */ ALWAYSDEFD64(guest_REDIR_STACK),
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      /* 10 */ ALWAYSDEFD64(guest_IP_AT_SYSCALL)
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        };
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                 guest_ppc_helpers.c ---*/
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
867