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