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