1896a1373cfdbaa25f4ab73ed4f27554016defecccerion 2896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---------------------------------------------------------------*/ 3752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--- begin guest_ppc_helpers.c ---*/ 4896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---------------------------------------------------------------*/ 5896a1373cfdbaa25f4ab73ed4f27554016defecccerion 6896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* 7752f90673ebbb6b2f55fc5e46606dea371313713sewardj This file is part of Valgrind, a dynamic binary instrumentation 8752f90673ebbb6b2f55fc5e46606dea371313713sewardj framework. 9896a1373cfdbaa25f4ab73ed4f27554016defecccerion 1089ae8477745fd2a15453557d729a50e627325ee2sewardj Copyright (C) 2004-2013 OpenWorks LLP 11752f90673ebbb6b2f55fc5e46606dea371313713sewardj info@open-works.net 127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 13752f90673ebbb6b2f55fc5e46606dea371313713sewardj This program is free software; you can redistribute it and/or 14752f90673ebbb6b2f55fc5e46606dea371313713sewardj modify it under the terms of the GNU General Public License as 15752f90673ebbb6b2f55fc5e46606dea371313713sewardj published by the Free Software Foundation; either version 2 of the 16752f90673ebbb6b2f55fc5e46606dea371313713sewardj License, or (at your option) any later version. 177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 18752f90673ebbb6b2f55fc5e46606dea371313713sewardj This program is distributed in the hope that it will be useful, but 19752f90673ebbb6b2f55fc5e46606dea371313713sewardj WITHOUT ANY WARRANTY; without even the implied warranty of 20752f90673ebbb6b2f55fc5e46606dea371313713sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21752f90673ebbb6b2f55fc5e46606dea371313713sewardj General Public License for more details. 22752f90673ebbb6b2f55fc5e46606dea371313713sewardj 23752f90673ebbb6b2f55fc5e46606dea371313713sewardj You should have received a copy of the GNU General Public License 24752f90673ebbb6b2f55fc5e46606dea371313713sewardj along with this program; if not, write to the Free Software 25752f90673ebbb6b2f55fc5e46606dea371313713sewardj Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 02110-1301, USA. 277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 28752f90673ebbb6b2f55fc5e46606dea371313713sewardj The GNU General Public License is contained in the file COPYING. 29896a1373cfdbaa25f4ab73ed4f27554016defecccerion 30896a1373cfdbaa25f4ab73ed4f27554016defecccerion Neither the names of the U.S. Department of Energy nor the 31896a1373cfdbaa25f4ab73ed4f27554016defecccerion University of California nor the names of its contributors may be 32896a1373cfdbaa25f4ab73ed4f27554016defecccerion used to endorse or promote products derived from this software 33896a1373cfdbaa25f4ab73ed4f27554016defecccerion without prior written permission. 34896a1373cfdbaa25f4ab73ed4f27554016defecccerion*/ 35896a1373cfdbaa25f4ab73ed4f27554016defecccerion 36896a1373cfdbaa25f4ab73ed4f27554016defecccerion#include "libvex_basictypes.h" 3733b024301d2311965cc68dc4cc900f3d0fdd8085florian#include "libvex_emnote.h" 381515db99ce1abcd2147ac54aea1a7090c7895a43cerion#include "libvex_guest_ppc32.h" 39d953ebb9b04cbad6891676df597bf0c542b1ec89cerion#include "libvex_guest_ppc64.h" 40896a1373cfdbaa25f4ab73ed4f27554016defecccerion#include "libvex_ir.h" 41896a1373cfdbaa25f4ab73ed4f27554016defecccerion#include "libvex.h" 42896a1373cfdbaa25f4ab73ed4f27554016defecccerion 43cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "main_util.h" 446c46befd9eb90c1b6e739926c1fa335cba75bf46philippe#include "main_globals.h" 45cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_generic_bb_to_IR.h" 46cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_ppc_defs.h" 47896a1373cfdbaa25f4ab73ed4f27554016defecccerion 48896a1373cfdbaa25f4ab73ed4f27554016defecccerion 49d953ebb9b04cbad6891676df597bf0c542b1ec89cerion/* This file contains helper functions for ppc32 and ppc64 guest code. 50d953ebb9b04cbad6891676df597bf0c542b1ec89cerion Calls to these functions are generated by the back end. These 51d953ebb9b04cbad6891676df597bf0c542b1ec89cerion calls are of course in the host machine code and this file will be 52d953ebb9b04cbad6891676df597bf0c542b1ec89cerion compiled to host machine code, so that all makes sense. 53896a1373cfdbaa25f4ab73ed4f27554016defecccerion 54896a1373cfdbaa25f4ab73ed4f27554016defecccerion Only change the signatures of these helper functions very 55896a1373cfdbaa25f4ab73ed4f27554016defecccerion carefully. If you change the signature here, you'll have to change 56896a1373cfdbaa25f4ab73ed4f27554016defecccerion the parameters passed to it in the IR calls constructed by 57d0eae2d5b6d8224bf1f075098e044b23ecffd9aecerion guest-ppc/toIR.c. 58896a1373cfdbaa25f4ab73ed4f27554016defecccerion*/ 59896a1373cfdbaa25f4ab73ed4f27554016defecccerion 60896a1373cfdbaa25f4ab73ed4f27554016defecccerion 6173a9197285975856fd3cc577216237afb3612b09sewardj/*---------------------------------------------------------------*/ 6273a9197285975856fd3cc577216237afb3612b09sewardj/*--- Misc integer helpers. ---*/ 6373a9197285975856fd3cc577216237afb3612b09sewardj/*---------------------------------------------------------------*/ 6473a9197285975856fd3cc577216237afb3612b09sewardj 6573a9197285975856fd3cc577216237afb3612b09sewardj/* CALLED FROM GENERATED CODE */ 6673a9197285975856fd3cc577216237afb3612b09sewardj/* DIRTY HELPER (non-referentially-transparent) */ 67d0eae2d5b6d8224bf1f075098e044b23ecffd9aecerion/* Horrible hack. On non-ppc platforms, return 1. */ 6873a9197285975856fd3cc577216237afb3612b09sewardj/* Reads a complete, consistent 64-bit TB value. */ 695b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionULong ppcg_dirtyhelper_MFTB ( void ) 7073a9197285975856fd3cc577216237afb3612b09sewardj{ 712322360949754bdcaa87e5ea704480e0b267b09aflorian# if defined(__powerpc__) 7273a9197285975856fd3cc577216237afb3612b09sewardj ULong res; 7373a9197285975856fd3cc577216237afb3612b09sewardj UInt lo, hi1, hi2; 7473a9197285975856fd3cc577216237afb3612b09sewardj while (1) { 7573a9197285975856fd3cc577216237afb3612b09sewardj __asm__ __volatile__ ("\n" 7673a9197285975856fd3cc577216237afb3612b09sewardj "\tmftbu %0\n" 7773a9197285975856fd3cc577216237afb3612b09sewardj "\tmftb %1\n" 7873a9197285975856fd3cc577216237afb3612b09sewardj "\tmftbu %2\n" 7973a9197285975856fd3cc577216237afb3612b09sewardj : "=r" (hi1), "=r" (lo), "=r" (hi2) 8073a9197285975856fd3cc577216237afb3612b09sewardj ); 8173a9197285975856fd3cc577216237afb3612b09sewardj if (hi1 == hi2) break; 8273a9197285975856fd3cc577216237afb3612b09sewardj } 8373a9197285975856fd3cc577216237afb3612b09sewardj res = ((ULong)hi1) << 32; 8473a9197285975856fd3cc577216237afb3612b09sewardj res |= (ULong)lo; 8573a9197285975856fd3cc577216237afb3612b09sewardj return res; 8673a9197285975856fd3cc577216237afb3612b09sewardj# else 8773a9197285975856fd3cc577216237afb3612b09sewardj return 1ULL; 8873a9197285975856fd3cc577216237afb3612b09sewardj# endif 8973a9197285975856fd3cc577216237afb3612b09sewardj} 9073a9197285975856fd3cc577216237afb3612b09sewardj 9173a9197285975856fd3cc577216237afb3612b09sewardj 926f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion/* CALLED FROM GENERATED CODE */ 93abb321cf9ad44ad0ac445250c31128452e316547sewardj/* DIRTY HELPER (non-referentially transparent) */ 94abb321cf9ad44ad0ac445250c31128452e316547sewardjUInt ppc32g_dirtyhelper_MFSPR_268_269 ( UInt r269 ) 95abb321cf9ad44ad0ac445250c31128452e316547sewardj{ 962322360949754bdcaa87e5ea704480e0b267b09aflorian# if defined(__powerpc__) 97abb321cf9ad44ad0ac445250c31128452e316547sewardj UInt spr; 98abb321cf9ad44ad0ac445250c31128452e316547sewardj if (r269) { 99abb321cf9ad44ad0ac445250c31128452e316547sewardj __asm__ __volatile__("mfspr %0,269" : "=b"(spr)); 100abb321cf9ad44ad0ac445250c31128452e316547sewardj } else { 101abb321cf9ad44ad0ac445250c31128452e316547sewardj __asm__ __volatile__("mfspr %0,268" : "=b"(spr)); 102abb321cf9ad44ad0ac445250c31128452e316547sewardj } 103abb321cf9ad44ad0ac445250c31128452e316547sewardj return spr; 104abb321cf9ad44ad0ac445250c31128452e316547sewardj# else 105abb321cf9ad44ad0ac445250c31128452e316547sewardj return 0; 106abb321cf9ad44ad0ac445250c31128452e316547sewardj# endif 107abb321cf9ad44ad0ac445250c31128452e316547sewardj} 108abb321cf9ad44ad0ac445250c31128452e316547sewardj 109abb321cf9ad44ad0ac445250c31128452e316547sewardj 110abb321cf9ad44ad0ac445250c31128452e316547sewardj/* CALLED FROM GENERATED CODE */ 11137b2ee8724691d97860726ea2c59005b6b654892sewardj/* DIRTY HELPER (I'm not really sure what the side effects are) */ 11237b2ee8724691d97860726ea2c59005b6b654892sewardjUInt ppc32g_dirtyhelper_MFSPR_287 ( void ) 11337b2ee8724691d97860726ea2c59005b6b654892sewardj{ 1142322360949754bdcaa87e5ea704480e0b267b09aflorian# if defined(__powerpc__) 11537b2ee8724691d97860726ea2c59005b6b654892sewardj UInt spr; 11637b2ee8724691d97860726ea2c59005b6b654892sewardj __asm__ __volatile__("mfspr %0,287" : "=b"(spr)); 11737b2ee8724691d97860726ea2c59005b6b654892sewardj return spr; 11837b2ee8724691d97860726ea2c59005b6b654892sewardj# else 11937b2ee8724691d97860726ea2c59005b6b654892sewardj return 0; 12037b2ee8724691d97860726ea2c59005b6b654892sewardj# endif 12137b2ee8724691d97860726ea2c59005b6b654892sewardj} 12237b2ee8724691d97860726ea2c59005b6b654892sewardj 12337b2ee8724691d97860726ea2c59005b6b654892sewardj 12437b2ee8724691d97860726ea2c59005b6b654892sewardj/* CALLED FROM GENERATED CODE */ 1256f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion/* DIRTY HELPER (reads guest state, writes guest mem) */ 1266f6c6a0d6a601af3137f861f5fc9d76365c48e96cerionvoid ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst, 127d14709407df9363767aa888b03f95f08df169dcesewardj UInt vD_off, UInt sh, UInt shift_right ) 1286f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion{ 129197bd17d3ba8ac5204cd5c9ba5fab571249eb791sewardj static 1306f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion UChar ref[32] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1316f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 1326f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 1336f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }; 134197bd17d3ba8ac5204cd5c9ba5fab571249eb791sewardj U128* pU128_src; 135197bd17d3ba8ac5204cd5c9ba5fab571249eb791sewardj U128* pU128_dst; 136197bd17d3ba8ac5204cd5c9ba5fab571249eb791sewardj 137d14709407df9363767aa888b03f95f08df169dcesewardj vassert( vD_off <= sizeof(VexGuestPPC32State)-8 ); 138d14709407df9363767aa888b03f95f08df169dcesewardj vassert( sh <= 15 ); 139d14709407df9363767aa888b03f95f08df169dcesewardj vassert( shift_right <= 1 ); 140d14709407df9363767aa888b03f95f08df169dcesewardj if (shift_right) 141197bd17d3ba8ac5204cd5c9ba5fab571249eb791sewardj sh = 16-sh; 1426f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion /* else shift left */ 1436f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion 144197bd17d3ba8ac5204cd5c9ba5fab571249eb791sewardj pU128_src = (U128*)&ref[sh]; 145d14709407df9363767aa888b03f95f08df169dcesewardj pU128_dst = (U128*)( ((UChar*)gst) + vD_off ); 1466f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion 1476f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion (*pU128_dst)[0] = (*pU128_src)[0]; 1486f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion (*pU128_dst)[1] = (*pU128_src)[1]; 1496f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion (*pU128_dst)[2] = (*pU128_src)[2]; 1506f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion (*pU128_dst)[3] = (*pU128_src)[3]; 1516f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion} 1526f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion 1535b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion/* CALLED FROM GENERATED CODE */ 1545b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion/* DIRTY HELPER (reads guest state, writes guest mem) */ 1555b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionvoid ppc64g_dirtyhelper_LVS ( VexGuestPPC64State* gst, 1561f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll UInt vD_off, UInt sh, UInt shift_right, 1571f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll UInt endness ) 1585b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion{ 15928d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj UChar ref[32]; 16028d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj ULong i; 1611f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll Int k; 16228d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj /* ref[] used to be a static const array, but this doesn't work on 16328d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj ppc64 because VEX doesn't load the TOC pointer for the call here, 16428d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj and so we wind up picking up some totally random other data. 16528d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj (It's a wonder we don't segfault.) So, just to be clear, this 16628d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj "fix" (vex r2073) is really a kludgearound for the fact that 16728d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj VEX's 64-bit ppc code generation doesn't provide a valid TOC 16828d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj pointer for helper function calls. Ick. (Bug 250038) */ 16928d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj for (i = 0; i < 32; i++) ref[i] = i; 17028d672a3a56bbb049e7fd7cb383ba52c4cfd954asewardj 1715b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion U128* pU128_src; 1725b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion U128* pU128_dst; 1735b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion 1745b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion vassert( vD_off <= sizeof(VexGuestPPC64State)-8 ); 1755b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion vassert( sh <= 15 ); 1765b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion vassert( shift_right <= 1 ); 1775b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion if (shift_right) 1785b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion sh = 16-sh; 1795b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion /* else shift left */ 1805b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion 1815b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion pU128_src = (U128*)&ref[sh]; 1825b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion pU128_dst = (U128*)( ((UChar*)gst) + vD_off ); 1835b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion 1841f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll if ((0x1 & endness) == 0x0) { 1851f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll /* Little endian */ 1861f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll unsigned char *srcp, *dstp; 1871f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll srcp = (unsigned char *)pU128_src; 1881f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll dstp = (unsigned char *)pU128_dst; 1891f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll for (k = 15; k >= 0; k--, srcp++) 1901f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll dstp[k] = *srcp; 1911f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll } else { 1921f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll (*pU128_dst)[0] = (*pU128_src)[0]; 1931f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll (*pU128_dst)[1] = (*pU128_src)[1]; 1941f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll (*pU128_dst)[2] = (*pU128_src)[2]; 1951f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll (*pU128_dst)[3] = (*pU128_src)[3]; 1961f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll } 1975b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion} 1985b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion 1996f6c6a0d6a601af3137f861f5fc9d76365c48e96cerion 20073a9197285975856fd3cc577216237afb3612b09sewardj/* Helper-function specialiser. */ 201896a1373cfdbaa25f4ab73ed4f27554016defecccerion 2021ff4756e1731485e6bf3cd96717cd8398daec1f2florianIRExpr* guest_ppc32_spechelper ( const HChar* function_name, 203be9179130bdfb61d0e03ecb32eced8dd5c7bfc74sewardj IRExpr** args, 204be9179130bdfb61d0e03ecb32eced8dd5c7bfc74sewardj IRStmt** precedingStmts, 205be9179130bdfb61d0e03ecb32eced8dd5c7bfc74sewardj Int n_precedingStmts ) 206896a1373cfdbaa25f4ab73ed4f27554016defecccerion{ 207896a1373cfdbaa25f4ab73ed4f27554016defecccerion return NULL; 208896a1373cfdbaa25f4ab73ed4f27554016defecccerion} 209896a1373cfdbaa25f4ab73ed4f27554016defecccerion 2101ff4756e1731485e6bf3cd96717cd8398daec1f2florianIRExpr* guest_ppc64_spechelper ( const HChar* function_name, 211be9179130bdfb61d0e03ecb32eced8dd5c7bfc74sewardj IRExpr** args, 212be9179130bdfb61d0e03ecb32eced8dd5c7bfc74sewardj IRStmt** precedingStmts, 213be9179130bdfb61d0e03ecb32eced8dd5c7bfc74sewardj Int n_precedingStmts ) 214f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion{ 215f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion return NULL; 216f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion} 217f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 218896a1373cfdbaa25f4ab73ed4f27554016defecccerion 219896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*----------------------------------------------*/ 220896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*--- The exported fns .. ---*/ 221896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*----------------------------------------------*/ 222896a1373cfdbaa25f4ab73ed4f27554016defecccerion 223896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* VISIBLE TO LIBVEX CLIENT */ 224efa834abaded25c8aff2f3923e476ef7cc1d0396florianUInt LibVEX_GuestPPC32_get_CR ( /*IN*/const VexGuestPPC32State* vex_state ) 225896a1373cfdbaa25f4ab73ed4f27554016defecccerion{ 226b51f0f4f33256638ed953156a2635aa739b232f1sewardj# define FIELD(_n) \ 227b51f0f4f33256638ed953156a2635aa739b232f1sewardj ( ( (UInt) \ 228b51f0f4f33256638ed953156a2635aa739b232f1sewardj ( (vex_state->guest_CR##_n##_321 & (7<<1)) \ 229b51f0f4f33256638ed953156a2635aa739b232f1sewardj | (vex_state->guest_CR##_n##_0 & 1) \ 230b51f0f4f33256638ed953156a2635aa739b232f1sewardj ) \ 231b51f0f4f33256638ed953156a2635aa739b232f1sewardj ) \ 232b51f0f4f33256638ed953156a2635aa739b232f1sewardj << (4 * (7-(_n))) \ 233b51f0f4f33256638ed953156a2635aa739b232f1sewardj ) 234b51f0f4f33256638ed953156a2635aa739b232f1sewardj 235b51f0f4f33256638ed953156a2635aa739b232f1sewardj return 236b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(0) | FIELD(1) | FIELD(2) | FIELD(3) 237b51f0f4f33256638ed953156a2635aa739b232f1sewardj | FIELD(4) | FIELD(5) | FIELD(6) | FIELD(7); 238b51f0f4f33256638ed953156a2635aa739b232f1sewardj 239b51f0f4f33256638ed953156a2635aa739b232f1sewardj# undef FIELD 240900f6b52087bf8a46de43a446eb24e4425c24130cerion} 241900f6b52087bf8a46de43a446eb24e4425c24130cerion 242b51f0f4f33256638ed953156a2635aa739b232f1sewardj 243900f6b52087bf8a46de43a446eb24e4425c24130cerion/* VISIBLE TO LIBVEX CLIENT */ 244d953ebb9b04cbad6891676df597bf0c542b1ec89cerion/* Note: %CR is 32 bits even for ppc64 */ 245efa834abaded25c8aff2f3923e476ef7cc1d0396florianUInt LibVEX_GuestPPC64_get_CR ( /*IN*/const VexGuestPPC64State* vex_state ) 246d953ebb9b04cbad6891676df597bf0c542b1ec89cerion{ 247d953ebb9b04cbad6891676df597bf0c542b1ec89cerion# define FIELD(_n) \ 248d953ebb9b04cbad6891676df597bf0c542b1ec89cerion ( ( (UInt) \ 249d953ebb9b04cbad6891676df597bf0c542b1ec89cerion ( (vex_state->guest_CR##_n##_321 & (7<<1)) \ 250d953ebb9b04cbad6891676df597bf0c542b1ec89cerion | (vex_state->guest_CR##_n##_0 & 1) \ 251d953ebb9b04cbad6891676df597bf0c542b1ec89cerion ) \ 252d953ebb9b04cbad6891676df597bf0c542b1ec89cerion ) \ 253d953ebb9b04cbad6891676df597bf0c542b1ec89cerion << (4 * (7-(_n))) \ 254d953ebb9b04cbad6891676df597bf0c542b1ec89cerion ) 255d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 256d953ebb9b04cbad6891676df597bf0c542b1ec89cerion return 257d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(0) | FIELD(1) | FIELD(2) | FIELD(3) 258d953ebb9b04cbad6891676df597bf0c542b1ec89cerion | FIELD(4) | FIELD(5) | FIELD(6) | FIELD(7); 259d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 260d953ebb9b04cbad6891676df597bf0c542b1ec89cerion# undef FIELD 261d953ebb9b04cbad6891676df597bf0c542b1ec89cerion} 262d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 263d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 264d953ebb9b04cbad6891676df597bf0c542b1ec89cerion/* VISIBLE TO LIBVEX CLIENT */ 265b51f0f4f33256638ed953156a2635aa739b232f1sewardjvoid LibVEX_GuestPPC32_put_CR ( UInt cr_native, 266900f6b52087bf8a46de43a446eb24e4425c24130cerion /*OUT*/VexGuestPPC32State* vex_state ) 267900f6b52087bf8a46de43a446eb24e4425c24130cerion{ 268b51f0f4f33256638ed953156a2635aa739b232f1sewardj UInt t; 269b51f0f4f33256638ed953156a2635aa739b232f1sewardj 270b51f0f4f33256638ed953156a2635aa739b232f1sewardj# define FIELD(_n) \ 271b51f0f4f33256638ed953156a2635aa739b232f1sewardj do { \ 272b51f0f4f33256638ed953156a2635aa739b232f1sewardj t = cr_native >> (4*(7-(_n))); \ 273c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj vex_state->guest_CR##_n##_0 = toUChar(t & 1); \ 274c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj vex_state->guest_CR##_n##_321 = toUChar(t & (7<<1)); \ 275b51f0f4f33256638ed953156a2635aa739b232f1sewardj } while (0) 276b51f0f4f33256638ed953156a2635aa739b232f1sewardj 277b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(0); 278b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(1); 279b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(2); 280b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(3); 281b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(4); 282b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(5); 283b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(6); 284b51f0f4f33256638ed953156a2635aa739b232f1sewardj FIELD(7); 285b51f0f4f33256638ed953156a2635aa739b232f1sewardj 286b51f0f4f33256638ed953156a2635aa739b232f1sewardj# undef FIELD 287896a1373cfdbaa25f4ab73ed4f27554016defecccerion} 288896a1373cfdbaa25f4ab73ed4f27554016defecccerion 289b51f0f4f33256638ed953156a2635aa739b232f1sewardj 290896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* VISIBLE TO LIBVEX CLIENT */ 291d953ebb9b04cbad6891676df597bf0c542b1ec89cerion/* Note: %CR is 32 bits even for ppc64 */ 292d953ebb9b04cbad6891676df597bf0c542b1ec89cerionvoid LibVEX_GuestPPC64_put_CR ( UInt cr_native, 293d953ebb9b04cbad6891676df597bf0c542b1ec89cerion /*OUT*/VexGuestPPC64State* vex_state ) 294d953ebb9b04cbad6891676df597bf0c542b1ec89cerion{ 295d953ebb9b04cbad6891676df597bf0c542b1ec89cerion UInt t; 296d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 297d953ebb9b04cbad6891676df597bf0c542b1ec89cerion# define FIELD(_n) \ 298d953ebb9b04cbad6891676df597bf0c542b1ec89cerion do { \ 299d953ebb9b04cbad6891676df597bf0c542b1ec89cerion t = cr_native >> (4*(7-(_n))); \ 300d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR##_n##_0 = toUChar(t & 1); \ 301d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR##_n##_321 = toUChar(t & (7<<1)); \ 302d953ebb9b04cbad6891676df597bf0c542b1ec89cerion } while (0) 303d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 304d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(0); 305d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(1); 306d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(2); 307d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(3); 308d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(4); 309d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(5); 310d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(6); 311d953ebb9b04cbad6891676df597bf0c542b1ec89cerion FIELD(7); 312d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 313d953ebb9b04cbad6891676df597bf0c542b1ec89cerion# undef FIELD 314d953ebb9b04cbad6891676df597bf0c542b1ec89cerion} 315d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 316d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 317d953ebb9b04cbad6891676df597bf0c542b1ec89cerion/* VISIBLE TO LIBVEX CLIENT */ 318efa834abaded25c8aff2f3923e476ef7cc1d0396florianUInt LibVEX_GuestPPC32_get_XER ( /*IN*/const VexGuestPPC32State* vex_state ) 319896a1373cfdbaa25f4ab73ed4f27554016defecccerion{ 320b51f0f4f33256638ed953156a2635aa739b232f1sewardj UInt w = 0; 321b51f0f4f33256638ed953156a2635aa739b232f1sewardj w |= ( ((UInt)vex_state->guest_XER_BC) & 0xFF ); 322b51f0f4f33256638ed953156a2635aa739b232f1sewardj w |= ( (((UInt)vex_state->guest_XER_SO) & 0x1) << 31 ); 323b51f0f4f33256638ed953156a2635aa739b232f1sewardj w |= ( (((UInt)vex_state->guest_XER_OV) & 0x1) << 30 ); 324b51f0f4f33256638ed953156a2635aa739b232f1sewardj w |= ( (((UInt)vex_state->guest_XER_CA) & 0x1) << 29 ); 325b51f0f4f33256638ed953156a2635aa739b232f1sewardj return w; 326896a1373cfdbaa25f4ab73ed4f27554016defecccerion} 327896a1373cfdbaa25f4ab73ed4f27554016defecccerion 328b51f0f4f33256638ed953156a2635aa739b232f1sewardj 329896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* VISIBLE TO LIBVEX CLIENT */ 330d953ebb9b04cbad6891676df597bf0c542b1ec89cerion/* Note: %XER is 32 bits even for ppc64 */ 331efa834abaded25c8aff2f3923e476ef7cc1d0396florianUInt LibVEX_GuestPPC64_get_XER ( /*IN*/const VexGuestPPC64State* vex_state ) 332d953ebb9b04cbad6891676df597bf0c542b1ec89cerion{ 333d953ebb9b04cbad6891676df597bf0c542b1ec89cerion UInt w = 0; 334d953ebb9b04cbad6891676df597bf0c542b1ec89cerion w |= ( ((UInt)vex_state->guest_XER_BC) & 0xFF ); 335d953ebb9b04cbad6891676df597bf0c542b1ec89cerion w |= ( (((UInt)vex_state->guest_XER_SO) & 0x1) << 31 ); 336d953ebb9b04cbad6891676df597bf0c542b1ec89cerion w |= ( (((UInt)vex_state->guest_XER_OV) & 0x1) << 30 ); 337d953ebb9b04cbad6891676df597bf0c542b1ec89cerion w |= ( (((UInt)vex_state->guest_XER_CA) & 0x1) << 29 ); 338d953ebb9b04cbad6891676df597bf0c542b1ec89cerion return w; 339d953ebb9b04cbad6891676df597bf0c542b1ec89cerion} 340d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 341d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 342d953ebb9b04cbad6891676df597bf0c542b1ec89cerion/* VISIBLE TO LIBVEX CLIENT */ 343b51f0f4f33256638ed953156a2635aa739b232f1sewardjvoid LibVEX_GuestPPC32_put_XER ( UInt xer_native, 344b51f0f4f33256638ed953156a2635aa739b232f1sewardj /*OUT*/VexGuestPPC32State* vex_state ) 34551900a2deba4c16728d2b5ab40477def5362a4f0cerion{ 346c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj vex_state->guest_XER_BC = toUChar(xer_native & 0xFF); 347c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj vex_state->guest_XER_SO = toUChar((xer_native >> 31) & 0x1); 348c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj vex_state->guest_XER_OV = toUChar((xer_native >> 30) & 0x1); 349c7cd2142ff0172bd3702d0607426a8014d8842e5sewardj vex_state->guest_XER_CA = toUChar((xer_native >> 29) & 0x1); 35051900a2deba4c16728d2b5ab40477def5362a4f0cerion} 35151900a2deba4c16728d2b5ab40477def5362a4f0cerion 35220f4061cdd9ad51f68134126d1e5e116f0430edfsewardj/* VISIBLE TO LIBVEX CLIENT */ 35320f4061cdd9ad51f68134126d1e5e116f0430edfsewardj/* Note: %XER is 32 bits even for ppc64 */ 35420f4061cdd9ad51f68134126d1e5e116f0430edfsewardjvoid LibVEX_GuestPPC64_put_XER ( UInt xer_native, 35520f4061cdd9ad51f68134126d1e5e116f0430edfsewardj /*OUT*/VexGuestPPC64State* vex_state ) 35620f4061cdd9ad51f68134126d1e5e116f0430edfsewardj{ 35720f4061cdd9ad51f68134126d1e5e116f0430edfsewardj vex_state->guest_XER_BC = toUChar(xer_native & 0xFF); 35820f4061cdd9ad51f68134126d1e5e116f0430edfsewardj vex_state->guest_XER_SO = toUChar((xer_native >> 31) & 0x1); 35920f4061cdd9ad51f68134126d1e5e116f0430edfsewardj vex_state->guest_XER_OV = toUChar((xer_native >> 30) & 0x1); 36020f4061cdd9ad51f68134126d1e5e116f0430edfsewardj vex_state->guest_XER_CA = toUChar((xer_native >> 29) & 0x1); 36120f4061cdd9ad51f68134126d1e5e116f0430edfsewardj} 362b51f0f4f33256638ed953156a2635aa739b232f1sewardj 36351900a2deba4c16728d2b5ab40477def5362a4f0cerion/* VISIBLE TO LIBVEX CLIENT */ 3641515db99ce1abcd2147ac54aea1a7090c7895a43cerionvoid LibVEX_GuestPPC32_initialise ( /*OUT*/VexGuestPPC32State* vex_state ) 365896a1373cfdbaa25f4ab73ed4f27554016defecccerion{ 366aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj Int i; 3673dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->host_EvC_FAILADDR = 0; 3683dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->host_EvC_COUNTER = 0; 3693dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->pad3 = 0; 3703dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->pad4 = 0; 3713dee849ec7c38746749065e67dc53b75daa7617dsewardj 372896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR0 = 0; 373896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR1 = 0; 374896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR2 = 0; 375896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR3 = 0; 376896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR4 = 0; 377896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR5 = 0; 378896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR6 = 0; 379896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR7 = 0; 380896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR8 = 0; 381896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR9 = 0; 382896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR10 = 0; 383896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR11 = 0; 384896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR12 = 0; 385896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR13 = 0; 386896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR14 = 0; 387896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR15 = 0; 388896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR16 = 0; 389896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR17 = 0; 390896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR18 = 0; 391896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR19 = 0; 392896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR20 = 0; 393896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR21 = 0; 394896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR22 = 0; 395896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR23 = 0; 396896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR24 = 0; 397896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR25 = 0; 398896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR26 = 0; 399896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR27 = 0; 400896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR28 = 0; 401d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR29 = 0; 402d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR30 = 0; 403d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR31 = 0; 404d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 405d953ebb9b04cbad6891676df597bf0c542b1ec89cerion /* Initialise the vector state. */ 406d953ebb9b04cbad6891676df597bf0c542b1ec89cerion# define VECZERO(_vr) _vr[0]=_vr[1]=_vr[2]=_vr[3] = 0; 407d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 40866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR0 ); 40966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR1 ); 41066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR2 ); 41166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR3 ); 41266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR4 ); 41366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR5 ); 41466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR6 ); 41566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR7 ); 41666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR8 ); 41766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR9 ); 41866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR10); 41966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR11); 42066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR12); 42166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR13); 42266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR14); 42366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR15); 42466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR16); 42566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR17); 42666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR18); 42766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR19); 42866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR20); 42966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR21); 43066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR22); 43166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR23); 43266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR24); 43366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR25); 43466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR26); 43566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR27); 43666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR28); 43766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR29); 43866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR30); 43966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR31); 44066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR32); 44166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR33); 44266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR34); 44366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR35); 44466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR36); 44566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR37); 44666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR38); 44766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR39); 44866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR40); 44966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR41); 45066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR42); 45166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR43); 45266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR44); 45366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR45); 45466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR46); 45566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR47); 45666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR48); 45766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR49); 45866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR50); 45966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR51); 46066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR52); 46166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR53); 46266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR54); 46366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR55); 46466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR56); 46566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR57); 46666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR58); 46766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR59); 46866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR60); 46966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR61); 47066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR62); 47166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR63); 472d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 473d953ebb9b04cbad6891676df597bf0c542b1ec89cerion# undef VECZERO 474d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 475d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CIA = 0; 476d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_LR = 0; 477d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CTR = 0; 478d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 479d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_XER_SO = 0; 480d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_XER_OV = 0; 481d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_XER_CA = 0; 482d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_XER_BC = 0; 483d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 484d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR0_321 = 0; 485d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR0_0 = 0; 486d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR1_321 = 0; 487d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR1_0 = 0; 488d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR2_321 = 0; 489d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR2_0 = 0; 490d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR3_321 = 0; 491d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR3_0 = 0; 492d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR4_321 = 0; 493d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR4_0 = 0; 494d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR5_321 = 0; 495d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR5_0 = 0; 496d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR6_321 = 0; 497d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR6_0 = 0; 498d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR7_321 = 0; 499d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_CR7_0 = 0; 500d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 501c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj vex_state->guest_FPROUND = PPCrm_NEAREST; 502c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj vex_state->guest_DFPROUND = PPCrm_NEAREST; 5033dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->pad1 = 0; 5043dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->pad2 = 0; 505d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 506d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_VRSAVE = 0; 507d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 508d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_VSCR = 0x0; // Non-Java mode = 0 509d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 5106ef84bed9bb3af22060eb1759788034602bbcc88florian vex_state->guest_EMNOTE = EmNote_NONE; 511d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 51205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vex_state->guest_CMSTART = 0; 51305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vex_state->guest_CMLEN = 0; 514d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 515ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vex_state->guest_NRADDR = 0; 516aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj vex_state->guest_NRADDR_GPR2 = 0; 517aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj 518aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj vex_state->guest_REDIR_SP = -1; 519aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj for (i = 0; i < VEX_GUEST_PPC32_REDIR_STACK_SIZE; i++) 520aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj vex_state->guest_REDIR_STACK[i] = 0; 521aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj 522e86310f555a233cc2ca02e1a5d0adb555f12bdcdsewardj vex_state->guest_IP_AT_SYSCALL = 0; 523aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj vex_state->guest_SPRG3_RO = 0; 5243dee849ec7c38746749065e67dc53b75daa7617dsewardj 5258943d02aa373f45c6e5fdcbe5947620285d442b1carll vex_state->padding1 = 0; 5268943d02aa373f45c6e5fdcbe5947620285d442b1carll vex_state->padding2 = 0; 527d953ebb9b04cbad6891676df597bf0c542b1ec89cerion} 528d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 529d953ebb9b04cbad6891676df597bf0c542b1ec89cerion 530d953ebb9b04cbad6891676df597bf0c542b1ec89cerion/* VISIBLE TO LIBVEX CLIENT */ 531d953ebb9b04cbad6891676df597bf0c542b1ec89cerionvoid LibVEX_GuestPPC64_initialise ( /*OUT*/VexGuestPPC64State* vex_state ) 532d953ebb9b04cbad6891676df597bf0c542b1ec89cerion{ 533be482aed27a2a57c2009eb0a68e42d1b19fdfdf6sewardj Int i; 5343dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->host_EvC_FAILADDR = 0; 5353dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->host_EvC_COUNTER = 0; 5363dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->pad0 = 0; 537d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR0 = 0; 538d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR1 = 0; 539d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR2 = 0; 540d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR3 = 0; 541d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR4 = 0; 542d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR5 = 0; 543d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR6 = 0; 544d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR7 = 0; 545d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR8 = 0; 546d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR9 = 0; 547d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR10 = 0; 548d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR11 = 0; 549d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR12 = 0; 550d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR13 = 0; 551d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR14 = 0; 552d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR15 = 0; 553d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR16 = 0; 554d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR17 = 0; 555d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR18 = 0; 556d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR19 = 0; 557d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR20 = 0; 558d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR21 = 0; 559d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR22 = 0; 560d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR23 = 0; 561d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR24 = 0; 562d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR25 = 0; 563d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR26 = 0; 564d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR27 = 0; 565d953ebb9b04cbad6891676df597bf0c542b1ec89cerion vex_state->guest_GPR28 = 0; 566896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR29 = 0; 567896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR30 = 0; 568896a1373cfdbaa25f4ab73ed4f27554016defecccerion vex_state->guest_GPR31 = 0; 569896a1373cfdbaa25f4ab73ed4f27554016defecccerion 57051900a2deba4c16728d2b5ab40477def5362a4f0cerion /* Initialise the vector state. */ 571b51f0f4f33256638ed953156a2635aa739b232f1sewardj# define VECZERO(_vr) _vr[0]=_vr[1]=_vr[2]=_vr[3] = 0; 572b51f0f4f33256638ed953156a2635aa739b232f1sewardj 57366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR0 ); 57466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR1 ); 57566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR2 ); 57666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR3 ); 57766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR4 ); 57866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR5 ); 57966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR6 ); 58066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR7 ); 58166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR8 ); 58266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR9 ); 58366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR10); 58466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR11); 58566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR12); 58666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR13); 58766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR14); 58866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR15); 58966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR16); 59066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR17); 59166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR18); 59266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR19); 59366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR20); 59466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR21); 59566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR22); 59666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR23); 59766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR24); 59866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR25); 59966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR26); 60066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR27); 60166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR28); 60266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR29); 60366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR30); 60466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR31); 60566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR32); 60666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR33); 60766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR34); 60866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR35); 60966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR36); 61066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR37); 61166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR38); 61266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR39); 61366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR40); 61466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR41); 61566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR42); 61666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR43); 61766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR44); 61866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR45); 61966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR46); 62066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR47); 62166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR48); 62266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR49); 62366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR50); 62466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR51); 62566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR52); 62666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR53); 62766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR54); 62866d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR55); 62966d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR56); 63066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR57); 63166d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR58); 63266d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR59); 63366d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR60); 63466d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR61); 63566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR62); 63666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj VECZERO(vex_state->guest_VSR63); 637b51f0f4f33256638ed953156a2635aa739b232f1sewardj 638b51f0f4f33256638ed953156a2635aa739b232f1sewardj# undef VECZERO 63951900a2deba4c16728d2b5ab40477def5362a4f0cerion 640db1941aff78d331d5eed56091a9dc861414654ebcerion vex_state->guest_CIA = 0; 64191ad5368eb6354ad4fabc86f2b2e641736997a38cerion vex_state->guest_LR = 0; 64291ad5368eb6354ad4fabc86f2b2e641736997a38cerion vex_state->guest_CTR = 0; 643896a1373cfdbaa25f4ab73ed4f27554016defecccerion 644b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_XER_SO = 0; 645b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_XER_OV = 0; 646b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_XER_CA = 0; 647b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_XER_BC = 0; 648b51f0f4f33256638ed953156a2635aa739b232f1sewardj 649b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR0_321 = 0; 650b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR0_0 = 0; 651b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR1_321 = 0; 652b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR1_0 = 0; 653b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR2_321 = 0; 654b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR2_0 = 0; 655b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR3_321 = 0; 656b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR3_0 = 0; 657b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR4_321 = 0; 658b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR4_0 = 0; 659b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR5_321 = 0; 660b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR5_0 = 0; 661b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR6_321 = 0; 662b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR6_0 = 0; 663b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR7_321 = 0; 664b51f0f4f33256638ed953156a2635aa739b232f1sewardj vex_state->guest_CR7_0 = 0; 665db1941aff78d331d5eed56091a9dc861414654ebcerion 666c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj vex_state->guest_FPROUND = PPCrm_NEAREST; 667c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj vex_state->guest_DFPROUND = PPCrm_NEAREST; 6683dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->pad1 = 0; 6693dee849ec7c38746749065e67dc53b75daa7617dsewardj vex_state->pad2 = 0; 670094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion 67151900a2deba4c16728d2b5ab40477def5362a4f0cerion vex_state->guest_VRSAVE = 0; 67251900a2deba4c16728d2b5ab40477def5362a4f0cerion 6738f3bc90e00591116b81ee5deb626266eeb3bc492cerion vex_state->guest_VSCR = 0x0; // Non-Java mode = 0 67451900a2deba4c16728d2b5ab40477def5362a4f0cerion 6756ef84bed9bb3af22060eb1759788034602bbcc88florian vex_state->guest_EMNOTE = EmNote_NONE; 676094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion 677e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj vex_state->padding = 0; 678ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj 67905f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vex_state->guest_CMSTART = 0; 68005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vex_state->guest_CMLEN = 0; 6817787af415a9104b601c2f0ce5b56749e4fd86691sewardj 682ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vex_state->guest_NRADDR = 0; 6835ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj vex_state->guest_NRADDR_GPR2 = 0; 684be482aed27a2a57c2009eb0a68e42d1b19fdfdf6sewardj 685be482aed27a2a57c2009eb0a68e42d1b19fdfdf6sewardj vex_state->guest_REDIR_SP = -1; 686be482aed27a2a57c2009eb0a68e42d1b19fdfdf6sewardj for (i = 0; i < VEX_GUEST_PPC64_REDIR_STACK_SIZE; i++) 687be482aed27a2a57c2009eb0a68e42d1b19fdfdf6sewardj vex_state->guest_REDIR_STACK[i] = 0; 688aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj 689e86310f555a233cc2ca02e1a5d0adb555f12bdcdsewardj vex_state->guest_IP_AT_SYSCALL = 0; 690aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj vex_state->guest_SPRG3_RO = 0; 6918943d02aa373f45c6e5fdcbe5947620285d442b1carll vex_state->guest_TFHAR = 0; 6928943d02aa373f45c6e5fdcbe5947620285d442b1carll vex_state->guest_TFIAR = 0; 6938943d02aa373f45c6e5fdcbe5947620285d442b1carll vex_state->guest_TEXASR = 0; 694896a1373cfdbaa25f4ab73ed4f27554016defecccerion} 695896a1373cfdbaa25f4ab73ed4f27554016defecccerion 696896a1373cfdbaa25f4ab73ed4f27554016defecccerion 697896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*-----------------------------------------------------------*/ 6987594920259781fa292dd6a3b27beb63f5875c308cerion/*--- Describing the ppc guest state, for the benefit ---*/ 699896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*--- of iropt and instrumenters. ---*/ 700896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*-----------------------------------------------------------*/ 701896a1373cfdbaa25f4ab73ed4f27554016defecccerion 702896a1373cfdbaa25f4ab73ed4f27554016defecccerion/* Figure out if any part of the guest state contained in minoff 703896a1373cfdbaa25f4ab73ed4f27554016defecccerion .. maxoff requires precise memory exceptions. If in doubt return 704896a1373cfdbaa25f4ab73ed4f27554016defecccerion True (but this is generates significantly slower code). 705e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj 706e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj By default we enforce precise exns for guest R1 (stack pointer), 707e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj CIA (current insn address) and LR (link register). These are the 7087594920259781fa292dd6a3b27beb63f5875c308cerion minimum needed to extract correct stack backtraces from ppc 709e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj code. [[NB: not sure if keeping LR up to date is actually 710e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj necessary.]] 7116c46befd9eb90c1b6e739926c1fa335cba75bf46philippe 7126c46befd9eb90c1b6e739926c1fa335cba75bf46philippe Only R1 is needed in mode VexRegUpdSpAtMemAccess. 713896a1373cfdbaa25f4ab73ed4f27554016defecccerion*/ 714ca2c3c75784d35d136fc7c952717cdee5063c193sewardjBool guest_ppc32_state_requires_precise_mem_exns ( 715ca2c3c75784d35d136fc7c952717cdee5063c193sewardj Int minoff, Int maxoff, VexRegisterUpdates pxControl 716ca2c3c75784d35d136fc7c952717cdee5063c193sewardj ) 717896a1373cfdbaa25f4ab73ed4f27554016defecccerion{ 718e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj Int lr_min = offsetof(VexGuestPPC32State, guest_LR); 719e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj Int lr_max = lr_min + 4 - 1; 720e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj Int r1_min = offsetof(VexGuestPPC32State, guest_GPR1); 721e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj Int r1_max = r1_min + 4 - 1; 722e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj Int cia_min = offsetof(VexGuestPPC32State, guest_CIA); 723e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj Int cia_max = cia_min + 4 - 1; 724e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj 7256c46befd9eb90c1b6e739926c1fa335cba75bf46philippe if (maxoff < r1_min || minoff > r1_max) { 7266c46befd9eb90c1b6e739926c1fa335cba75bf46philippe /* no overlap with R1 */ 727ca2c3c75784d35d136fc7c952717cdee5063c193sewardj if (pxControl == VexRegUpdSpAtMemAccess) 7286c46befd9eb90c1b6e739926c1fa335cba75bf46philippe return False; // We only need to check stack pointer. 729e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj } else { 730e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj return True; 731e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj } 732e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj 7336c46befd9eb90c1b6e739926c1fa335cba75bf46philippe if (maxoff < lr_min || minoff > lr_max) { 7346c46befd9eb90c1b6e739926c1fa335cba75bf46philippe /* no overlap with LR */ 735e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj } else { 736e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj return True; 737e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj } 738e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj 739e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj if (maxoff < cia_min || minoff > cia_max) { 740e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj /* no overlap with CIA */ 741e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj } else { 742e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj return True; 743e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj } 744896a1373cfdbaa25f4ab73ed4f27554016defecccerion 745e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj return False; 746e523a4bfe8e515b9223fc0a1a40d434963d60850sewardj} 747896a1373cfdbaa25f4ab73ed4f27554016defecccerion 748ca2c3c75784d35d136fc7c952717cdee5063c193sewardjBool guest_ppc64_state_requires_precise_mem_exns ( 749ca2c3c75784d35d136fc7c952717cdee5063c193sewardj Int minoff, Int maxoff, VexRegisterUpdates pxControl 750ca2c3c75784d35d136fc7c952717cdee5063c193sewardj ) 751f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion{ 7525ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj /* Given that R2 is a Big Deal in the ELF ppc64 ABI, it seems 7535ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj prudent to be conservative with it, even though thus far there 7545ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj is no evidence to suggest that it actually needs to be kept up 7555ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj to date wrt possible exceptions. */ 756f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion Int lr_min = offsetof(VexGuestPPC64State, guest_LR); 75709bbf50cddb05bc35d646bf8b422c807696b8fd1sewardj Int lr_max = lr_min + 8 - 1; 758f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion Int r1_min = offsetof(VexGuestPPC64State, guest_GPR1); 75909bbf50cddb05bc35d646bf8b422c807696b8fd1sewardj Int r1_max = r1_min + 8 - 1; 7605ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj Int r2_min = offsetof(VexGuestPPC64State, guest_GPR2); 7615ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj Int r2_max = r2_min + 8 - 1; 762f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion Int cia_min = offsetof(VexGuestPPC64State, guest_CIA); 76309bbf50cddb05bc35d646bf8b422c807696b8fd1sewardj Int cia_max = cia_min + 8 - 1; 764f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 7656c46befd9eb90c1b6e739926c1fa335cba75bf46philippe if (maxoff < r1_min || minoff > r1_max) { 7666c46befd9eb90c1b6e739926c1fa335cba75bf46philippe /* no overlap with R1 */ 767ca2c3c75784d35d136fc7c952717cdee5063c193sewardj if (pxControl == VexRegUpdSpAtMemAccess) 7686c46befd9eb90c1b6e739926c1fa335cba75bf46philippe return False; // We only need to check stack pointer. 769f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion } else { 770f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion return True; 771f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion } 772f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 7736c46befd9eb90c1b6e739926c1fa335cba75bf46philippe if (maxoff < lr_min || minoff > lr_max) { 7746c46befd9eb90c1b6e739926c1fa335cba75bf46philippe /* no overlap with LR */ 775f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion } else { 776f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion return True; 777f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion } 778f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 7795ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj if (maxoff < r2_min || minoff > r2_max) { 7805ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj /* no overlap with R2 */ 7815ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj } else { 7825ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj return True; 7835ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj } 7845ff11ddafe3e0080711657a1cf581e1a64dbf117sewardj 785f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion if (maxoff < cia_min || minoff > cia_max) { 786f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* no overlap with CIA */ 787f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion } else { 788f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion return True; 789f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion } 790f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 791f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion return False; 792f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion} 793f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 794896a1373cfdbaa25f4ab73ed4f27554016defecccerion 795f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion#define ALWAYSDEFD32(field) \ 7961515db99ce1abcd2147ac54aea1a7090c7895a43cerion { offsetof(VexGuestPPC32State, field), \ 7971515db99ce1abcd2147ac54aea1a7090c7895a43cerion (sizeof ((VexGuestPPC32State*)0)->field) } 798896a1373cfdbaa25f4ab73ed4f27554016defecccerion 799896a1373cfdbaa25f4ab73ed4f27554016defecccerionVexGuestLayout 8001515db99ce1abcd2147ac54aea1a7090c7895a43cerion ppc32Guest_layout 801896a1373cfdbaa25f4ab73ed4f27554016defecccerion = { 802896a1373cfdbaa25f4ab73ed4f27554016defecccerion /* Total size of the guest state, in bytes. */ 8031515db99ce1abcd2147ac54aea1a7090c7895a43cerion .total_sizeB = sizeof(VexGuestPPC32State), 804896a1373cfdbaa25f4ab73ed4f27554016defecccerion 805896a1373cfdbaa25f4ab73ed4f27554016defecccerion /* Describe the stack pointer. */ 8061515db99ce1abcd2147ac54aea1a7090c7895a43cerion .offset_SP = offsetof(VexGuestPPC32State,guest_GPR1), 807896a1373cfdbaa25f4ab73ed4f27554016defecccerion .sizeof_SP = 4, 808896a1373cfdbaa25f4ab73ed4f27554016defecccerion 809a203330aad67bc3e52ca1395a55e94ef9a091223sewardj /* Describe the frame pointer. */ 810a203330aad67bc3e52ca1395a55e94ef9a091223sewardj .offset_FP = offsetof(VexGuestPPC32State,guest_GPR1), 811a203330aad67bc3e52ca1395a55e94ef9a091223sewardj .sizeof_FP = 4, 812a203330aad67bc3e52ca1395a55e94ef9a091223sewardj 813896a1373cfdbaa25f4ab73ed4f27554016defecccerion /* Describe the instruction pointer. */ 8141515db99ce1abcd2147ac54aea1a7090c7895a43cerion .offset_IP = offsetof(VexGuestPPC32State,guest_CIA), 815db1941aff78d331d5eed56091a9dc861414654ebcerion .sizeof_IP = 4, 816896a1373cfdbaa25f4ab73ed4f27554016defecccerion 817896a1373cfdbaa25f4ab73ed4f27554016defecccerion /* Describe any sections to be regarded by Memcheck as 818896a1373cfdbaa25f4ab73ed4f27554016defecccerion 'always-defined'. */ 819e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj .n_alwaysDefd = 11, 820896a1373cfdbaa25f4ab73ed4f27554016defecccerion 821896a1373cfdbaa25f4ab73ed4f27554016defecccerion .alwaysDefd 822f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion = { /* 0 */ ALWAYSDEFD32(guest_CIA), 8236ef84bed9bb3af22060eb1759788034602bbcc88florian /* 1 */ ALWAYSDEFD32(guest_EMNOTE), 82405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj /* 2 */ ALWAYSDEFD32(guest_CMSTART), 82505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj /* 3 */ ALWAYSDEFD32(guest_CMLEN), 826f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* 4 */ ALWAYSDEFD32(guest_VSCR), 827f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* 5 */ ALWAYSDEFD32(guest_FPROUND), 828e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 6 */ ALWAYSDEFD32(guest_NRADDR), 829e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 7 */ ALWAYSDEFD32(guest_NRADDR_GPR2), 830e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 8 */ ALWAYSDEFD32(guest_REDIR_SP), 831e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 9 */ ALWAYSDEFD32(guest_REDIR_STACK), 832e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 10 */ ALWAYSDEFD32(guest_IP_AT_SYSCALL) 8339759a81d44beb5b565b2e038d63e2f0c7b51933csewardj } 834896a1373cfdbaa25f4ab73ed4f27554016defecccerion }; 835896a1373cfdbaa25f4ab73ed4f27554016defecccerion 836f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion#define ALWAYSDEFD64(field) \ 837f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion { offsetof(VexGuestPPC64State, field), \ 838f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion (sizeof ((VexGuestPPC64State*)0)->field) } 839f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 840f0de28cf1a762b0d6f74c93d3532c89a230673bbcerionVexGuestLayout 841f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion ppc64Guest_layout 842f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion = { 843f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* Total size of the guest state, in bytes. */ 844f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion .total_sizeB = sizeof(VexGuestPPC64State), 845f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 846f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* Describe the stack pointer. */ 847f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion .offset_SP = offsetof(VexGuestPPC64State,guest_GPR1), 84809bbf50cddb05bc35d646bf8b422c807696b8fd1sewardj .sizeof_SP = 8, 849f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 850a203330aad67bc3e52ca1395a55e94ef9a091223sewardj /* Describe the frame pointer. */ 851a203330aad67bc3e52ca1395a55e94ef9a091223sewardj .offset_FP = offsetof(VexGuestPPC64State,guest_GPR1), 852a203330aad67bc3e52ca1395a55e94ef9a091223sewardj .sizeof_FP = 8, 853a203330aad67bc3e52ca1395a55e94ef9a091223sewardj 854f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* Describe the instruction pointer. */ 855f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion .offset_IP = offsetof(VexGuestPPC64State,guest_CIA), 85609bbf50cddb05bc35d646bf8b422c807696b8fd1sewardj .sizeof_IP = 8, 857f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 858f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* Describe any sections to be regarded by Memcheck as 859f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 'always-defined'. */ 8609c2f13d0d9730eb8134c09e6684fdc9796c137b7sewardj .n_alwaysDefd = 11, 861f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 862f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion .alwaysDefd 863f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion = { /* 0 */ ALWAYSDEFD64(guest_CIA), 8646ef84bed9bb3af22060eb1759788034602bbcc88florian /* 1 */ ALWAYSDEFD64(guest_EMNOTE), 86505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj /* 2 */ ALWAYSDEFD64(guest_CMSTART), 86605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj /* 3 */ ALWAYSDEFD64(guest_CMLEN), 867f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* 4 */ ALWAYSDEFD64(guest_VSCR), 868f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion /* 5 */ ALWAYSDEFD64(guest_FPROUND), 869e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 6 */ ALWAYSDEFD64(guest_NRADDR), 870e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 7 */ ALWAYSDEFD64(guest_NRADDR_GPR2), 871e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 8 */ ALWAYSDEFD64(guest_REDIR_SP), 872e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 9 */ ALWAYSDEFD64(guest_REDIR_STACK), 873e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj /* 10 */ ALWAYSDEFD64(guest_IP_AT_SYSCALL) 874f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion } 875f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion }; 876896a1373cfdbaa25f4ab73ed4f27554016defecccerion 877896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---------------------------------------------------------------*/ 878cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj/*--- end guest_ppc_helpers.c ---*/ 879896a1373cfdbaa25f4ab73ed4f27554016defecccerion/*---------------------------------------------------------------*/ 880