13b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Low level interface to valgrind, for the remote server for GDB integrated 23b290486cd4cd601b20e04340e593c9ed9717e5fsewardj in valgrind. 33b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Copyright (C) 2011 43b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Free Software Foundation, Inc. 53b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 63b290486cd4cd601b20e04340e593c9ed9717e5fsewardj This file is part of VALGRIND. 73b290486cd4cd601b20e04340e593c9ed9717e5fsewardj It has been inspired from a file from gdbserver in gdb 6.6. 83b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 93b290486cd4cd601b20e04340e593c9ed9717e5fsewardj This program is free software; you can redistribute it and/or modify 103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj it under the terms of the GNU General Public License as published by 113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj the Free Software Foundation; either version 2 of the License, or 123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj (at your option) any later version. 133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj This program is distributed in the hope that it will be useful, 153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj but WITHOUT ANY WARRANTY; without even the implied warranty of 163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj GNU General Public License for more details. 183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj You should have received a copy of the GNU General Public License 203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj along with this program; if not, write to the Free Software 213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Foundation, Inc., 51 Franklin Street, Fifth Floor, 223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Boston, MA 02110-1301, USA. */ 233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "server.h" 253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "target.h" 263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "regdef.h" 273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "regcache.h" 283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 29c91f58449e6fc2a4ce0851639a342c4277612fbbflorian#include "pub_core_machine.h" 303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_threadstate.h" 313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_transtab.h" 323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_gdbserver.h" 333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "valgrind_low.h" 353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "libvex_guest_ppc32.h" 373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* this is only the basic set of registers. 393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Need to look at what is the exact ppc32 model to support. 403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj*/ 41d7209def7f1ffcc0b415710afb95c9eacca71155sewardjstatic struct reg regs[] = { 423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r0", 0, 32 }, 433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r1", 32, 32 }, 443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r2", 64, 32 }, 453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r3", 96, 32 }, 463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r4", 128, 32 }, 473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r5", 160, 32 }, 483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r6", 192, 32 }, 493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r7", 224, 32 }, 503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r8", 256, 32 }, 513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r9", 288, 32 }, 523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r10", 320, 32 }, 533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r11", 352, 32 }, 543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r12", 384, 32 }, 553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r13", 416, 32 }, 563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r14", 448, 32 }, 573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r15", 480, 32 }, 583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r16", 512, 32 }, 593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r17", 544, 32 }, 603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r18", 576, 32 }, 613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r19", 608, 32 }, 623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r20", 640, 32 }, 633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r21", 672, 32 }, 643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r22", 704, 32 }, 653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r23", 736, 32 }, 663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r24", 768, 32 }, 673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r25", 800, 32 }, 683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r26", 832, 32 }, 693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r27", 864, 32 }, 703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r28", 896, 32 }, 713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r29", 928, 32 }, 723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r30", 960, 32 }, 733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "r31", 992, 32 }, 743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f0", 1024, 64 }, 753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f1", 1088, 64 }, 763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f2", 1152, 64 }, 773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f3", 1216, 64 }, 783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f4", 1280, 64 }, 793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f5", 1344, 64 }, 803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f6", 1408, 64 }, 813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f7", 1472, 64 }, 823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f8", 1536, 64 }, 833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f9", 1600, 64 }, 843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f10", 1664, 64 }, 853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f11", 1728, 64 }, 863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f12", 1792, 64 }, 873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f13", 1856, 64 }, 883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f14", 1920, 64 }, 893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f15", 1984, 64 }, 903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f16", 2048, 64 }, 913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f17", 2112, 64 }, 923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f18", 2176, 64 }, 933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f19", 2240, 64 }, 943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f20", 2304, 64 }, 953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f21", 2368, 64 }, 963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f22", 2432, 64 }, 973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f23", 2496, 64 }, 983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f24", 2560, 64 }, 993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f25", 2624, 64 }, 1003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f26", 2688, 64 }, 1013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f27", 2752, 64 }, 1023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f28", 2816, 64 }, 1033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f29", 2880, 64 }, 1043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f30", 2944, 64 }, 1053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "f31", 3008, 64 }, 1063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "pc", 3072, 32 }, 1073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "msr", 3104, 32 }, 1083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "cr", 3136, 32 }, 1093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "lr", 3168, 32 }, 1103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "ctr", 3200, 32 }, 1113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "xer", 3232, 32 }, 1123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "fpscr", 3264, 32 }, 1133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "orig_r3", 3296, 32 }, 1143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "trap", 3328, 32 }, 1153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr0", 3360, 128 }, 1163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr1", 3488, 128 }, 1173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr2", 3616, 128 }, 1183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr3", 3744, 128 }, 1193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr4", 3872, 128 }, 1203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr5", 4000, 128 }, 1213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr6", 4128, 128 }, 1223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr7", 4256, 128 }, 1233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr8", 4384, 128 }, 1243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr9", 4512, 128 }, 1253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr10", 4640, 128 }, 1263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr11", 4768, 128 }, 1273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr12", 4896, 128 }, 1283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr13", 5024, 128 }, 1293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr14", 5152, 128 }, 1303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr15", 5280, 128 }, 1313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr16", 5408, 128 }, 1323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr17", 5536, 128 }, 1333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr18", 5664, 128 }, 1343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr19", 5792, 128 }, 1353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr20", 5920, 128 }, 1363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr21", 6048, 128 }, 1373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr22", 6176, 128 }, 1383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr23", 6304, 128 }, 1393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr24", 6432, 128 }, 1403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr25", 6560, 128 }, 1413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr26", 6688, 128 }, 1423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr27", 6816, 128 }, 1433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr28", 6944, 128 }, 1443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr29", 7072, 128 }, 1453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr30", 7200, 128 }, 1463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vr31", 7328, 128 }, 1473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vscr", 7456, 32 }, 1483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { "vrsave", 7488, 32 } 1493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}; 1503b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic const char *expedite_regs[] = { "r1", "pc", 0 }; 1513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#define num_regs (sizeof (regs) / sizeof (regs[0])) 1523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1533b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 1543b290486cd4cd601b20e04340e593c9ed9717e5fsewardjCORE_ADDR get_pc (void) 1553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 1563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj unsigned long pc; 1573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj collect_register_by_name ("pc", &pc); 1593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "stop pc is %p\n", (void *) pc); 1613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return pc; 1623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 1633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1643b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 1653b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid set_pc (CORE_ADDR newpc) 1663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 1673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Bool mod; 1683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj supply_register_by_name ("pc", &newpc, &mod); 1693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (mod) 1703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "set pc to %p\n", C2v (newpc)); 1713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else 1723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "set pc not changed %p\n", C2v (newpc)); 1733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 1743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* store registers in the guest state (gdbserver_to_valgrind) 1763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj or fetch register from the guest state (valgrind_to_gdbserver). */ 1773b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 1783b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid transfer_register (ThreadId tid, int abs_regno, void * buf, 1793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj transfer_direction dir, int size, Bool *mod) 1803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 1813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ThreadState* tst = VG_(get_ThreadState)(tid); 1823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int set = abs_regno / num_regs; 1833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int regno = abs_regno % num_regs; 1843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mod = False; 1853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VexGuestPPC32State* ppc32 = (VexGuestPPC32State*) get_arch (set, tst); 1873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj switch (regno) { 1893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj // numbers here have to match the order of regs above 1903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj // Attention: gdb order does not match valgrind order. 1913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 0: VG_(transfer) (&ppc32->guest_GPR0, buf, dir, size, mod); break; 1923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 1: VG_(transfer) (&ppc32->guest_GPR1, buf, dir, size, mod); break; 1933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 2: VG_(transfer) (&ppc32->guest_GPR2, buf, dir, size, mod); break; 1943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 3: VG_(transfer) (&ppc32->guest_GPR3, buf, dir, size, mod); break; 1953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 4: VG_(transfer) (&ppc32->guest_GPR4, buf, dir, size, mod); break; 1963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 5: VG_(transfer) (&ppc32->guest_GPR5, buf, dir, size, mod); break; 1973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 6: VG_(transfer) (&ppc32->guest_GPR6, buf, dir, size, mod); break; 1983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 7: VG_(transfer) (&ppc32->guest_GPR7, buf, dir, size, mod); break; 1993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 8: VG_(transfer) (&ppc32->guest_GPR8, buf, dir, size, mod); break; 2003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 9: VG_(transfer) (&ppc32->guest_GPR9, buf, dir, size, mod); break; 2013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 10: VG_(transfer) (&ppc32->guest_GPR10, buf, dir, size, mod); break; 2023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 11: VG_(transfer) (&ppc32->guest_GPR11, buf, dir, size, mod); break; 2033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 12: VG_(transfer) (&ppc32->guest_GPR12, buf, dir, size, mod); break; 2043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 13: VG_(transfer) (&ppc32->guest_GPR13, buf, dir, size, mod); break; 2053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 14: VG_(transfer) (&ppc32->guest_GPR14, buf, dir, size, mod); break; 2063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 15: VG_(transfer) (&ppc32->guest_GPR15, buf, dir, size, mod); break; 2073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 16: VG_(transfer) (&ppc32->guest_GPR16, buf, dir, size, mod); break; 2083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 17: VG_(transfer) (&ppc32->guest_GPR17, buf, dir, size, mod); break; 2093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 18: VG_(transfer) (&ppc32->guest_GPR18, buf, dir, size, mod); break; 2103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 19: VG_(transfer) (&ppc32->guest_GPR19, buf, dir, size, mod); break; 2113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 20: VG_(transfer) (&ppc32->guest_GPR20, buf, dir, size, mod); break; 2123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 21: VG_(transfer) (&ppc32->guest_GPR21, buf, dir, size, mod); break; 2133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 22: VG_(transfer) (&ppc32->guest_GPR22, buf, dir, size, mod); break; 2143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 23: VG_(transfer) (&ppc32->guest_GPR23, buf, dir, size, mod); break; 2153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 24: VG_(transfer) (&ppc32->guest_GPR24, buf, dir, size, mod); break; 2163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 25: VG_(transfer) (&ppc32->guest_GPR25, buf, dir, size, mod); break; 2173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 26: VG_(transfer) (&ppc32->guest_GPR26, buf, dir, size, mod); break; 2183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 27: VG_(transfer) (&ppc32->guest_GPR27, buf, dir, size, mod); break; 2193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 28: VG_(transfer) (&ppc32->guest_GPR28, buf, dir, size, mod); break; 2203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 29: VG_(transfer) (&ppc32->guest_GPR29, buf, dir, size, mod); break; 2213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 30: VG_(transfer) (&ppc32->guest_GPR30, buf, dir, size, mod); break; 2223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 31: VG_(transfer) (&ppc32->guest_GPR31, buf, dir, size, mod); break; 2233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 32: VG_(transfer) (&ppc32->guest_VSR0, buf, dir, size, mod); break; 2243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 33: VG_(transfer) (&ppc32->guest_VSR1, buf, dir, size, mod); break; 2253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 34: VG_(transfer) (&ppc32->guest_VSR2, buf, dir, size, mod); break; 2263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 35: VG_(transfer) (&ppc32->guest_VSR3, buf, dir, size, mod); break; 2273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 36: VG_(transfer) (&ppc32->guest_VSR4, buf, dir, size, mod); break; 2283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 37: VG_(transfer) (&ppc32->guest_VSR5, buf, dir, size, mod); break; 2293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 38: VG_(transfer) (&ppc32->guest_VSR6, buf, dir, size, mod); break; 2303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 39: VG_(transfer) (&ppc32->guest_VSR7, buf, dir, size, mod); break; 2313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 40: VG_(transfer) (&ppc32->guest_VSR8, buf, dir, size, mod); break; 2323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 41: VG_(transfer) (&ppc32->guest_VSR9, buf, dir, size, mod); break; 2333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 42: VG_(transfer) (&ppc32->guest_VSR10, buf, dir, size, mod); break; 2343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 43: VG_(transfer) (&ppc32->guest_VSR11, buf, dir, size, mod); break; 2353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 44: VG_(transfer) (&ppc32->guest_VSR12, buf, dir, size, mod); break; 2363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 45: VG_(transfer) (&ppc32->guest_VSR13, buf, dir, size, mod); break; 2373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 46: VG_(transfer) (&ppc32->guest_VSR14, buf, dir, size, mod); break; 2383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 47: VG_(transfer) (&ppc32->guest_VSR15, buf, dir, size, mod); break; 2393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 48: VG_(transfer) (&ppc32->guest_VSR16, buf, dir, size, mod); break; 2403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 49: VG_(transfer) (&ppc32->guest_VSR17, buf, dir, size, mod); break; 2413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 50: VG_(transfer) (&ppc32->guest_VSR18, buf, dir, size, mod); break; 2423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 51: VG_(transfer) (&ppc32->guest_VSR19, buf, dir, size, mod); break; 2433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 52: VG_(transfer) (&ppc32->guest_VSR20, buf, dir, size, mod); break; 2443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 53: VG_(transfer) (&ppc32->guest_VSR21, buf, dir, size, mod); break; 2453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 54: VG_(transfer) (&ppc32->guest_VSR22, buf, dir, size, mod); break; 2463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 55: VG_(transfer) (&ppc32->guest_VSR23, buf, dir, size, mod); break; 2473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 56: VG_(transfer) (&ppc32->guest_VSR24, buf, dir, size, mod); break; 2483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 57: VG_(transfer) (&ppc32->guest_VSR25, buf, dir, size, mod); break; 2493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 58: VG_(transfer) (&ppc32->guest_VSR26, buf, dir, size, mod); break; 2503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 59: VG_(transfer) (&ppc32->guest_VSR27, buf, dir, size, mod); break; 2513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 60: VG_(transfer) (&ppc32->guest_VSR28, buf, dir, size, mod); break; 2523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 61: VG_(transfer) (&ppc32->guest_VSR29, buf, dir, size, mod); break; 2533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 62: VG_(transfer) (&ppc32->guest_VSR30, buf, dir, size, mod); break; 2543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 63: VG_(transfer) (&ppc32->guest_VSR31, buf, dir, size, mod); break; 2553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 64: VG_(transfer) (&ppc32->guest_CIA, buf, dir, size, mod); break; 2563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 65: *mod = False; break; // VEX does not model Machine State Register 2573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 66: { 2583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj UInt cr = LibVEX_GuestPPC32_get_CR (ppc32); 2593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (dir == valgrind_to_gdbserver) { 2603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(transfer) (&cr, buf, dir, size, mod); 2613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 2623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj UInt newcr; 2633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(transfer) (&newcr, buf, dir, size, mod); 2643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mod = newcr != cr; 2653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj LibVEX_GuestPPC32_put_CR (newcr, ppc32); 2663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 2683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 67: VG_(transfer) (&ppc32->guest_LR, buf, dir, size, mod); break; 2703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 68: VG_(transfer) (&ppc32->guest_CTR, buf, dir, size, mod); break; 2713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 69: { 2723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj UInt xer = LibVEX_GuestPPC32_get_XER (ppc32); 2733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (dir == valgrind_to_gdbserver) { 2743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(transfer) (&xer, buf, dir, size, mod); 2753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 2763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj UInt newxer; 2773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(transfer) (&newxer, buf, dir, size, mod); 2783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mod = newxer != xer; 2793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj LibVEX_GuestPPC32_put_XER (newxer, ppc32); 2803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 2823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 70: VG_(transfer) (&ppc32->guest_FPROUND, buf, dir, size, mod); break; 2843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 71: *mod = False; break; // GDBTD???? VEX { "orig_r3", 3296, 32 }, 2853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 72: *mod = False; break; // GDBTD???? VEX { "trap", 3328, 32 }, 2863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 73: VG_(transfer) (&ppc32->guest_VSR32, buf, dir, size, mod); break; 2873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 74: VG_(transfer) (&ppc32->guest_VSR33, buf, dir, size, mod); break; 2883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 75: VG_(transfer) (&ppc32->guest_VSR34, buf, dir, size, mod); break; 2893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 76: VG_(transfer) (&ppc32->guest_VSR35, buf, dir, size, mod); break; 2903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 77: VG_(transfer) (&ppc32->guest_VSR36, buf, dir, size, mod); break; 2913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 78: VG_(transfer) (&ppc32->guest_VSR37, buf, dir, size, mod); break; 2923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 79: VG_(transfer) (&ppc32->guest_VSR38, buf, dir, size, mod); break; 2933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 80: VG_(transfer) (&ppc32->guest_VSR39, buf, dir, size, mod); break; 2943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 81: VG_(transfer) (&ppc32->guest_VSR40, buf, dir, size, mod); break; 2953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 82: VG_(transfer) (&ppc32->guest_VSR41, buf, dir, size, mod); break; 2963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 83: VG_(transfer) (&ppc32->guest_VSR42, buf, dir, size, mod); break; 2973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 84: VG_(transfer) (&ppc32->guest_VSR43, buf, dir, size, mod); break; 2983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 85: VG_(transfer) (&ppc32->guest_VSR44, buf, dir, size, mod); break; 2993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 86: VG_(transfer) (&ppc32->guest_VSR45, buf, dir, size, mod); break; 3003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 87: VG_(transfer) (&ppc32->guest_VSR46, buf, dir, size, mod); break; 3013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 88: VG_(transfer) (&ppc32->guest_VSR47, buf, dir, size, mod); break; 3023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 89: VG_(transfer) (&ppc32->guest_VSR48, buf, dir, size, mod); break; 3033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 90: VG_(transfer) (&ppc32->guest_VSR49, buf, dir, size, mod); break; 3043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 91: VG_(transfer) (&ppc32->guest_VSR50, buf, dir, size, mod); break; 3053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 92: VG_(transfer) (&ppc32->guest_VSR51, buf, dir, size, mod); break; 3063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 93: VG_(transfer) (&ppc32->guest_VSR52, buf, dir, size, mod); break; 3073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 94: VG_(transfer) (&ppc32->guest_VSR53, buf, dir, size, mod); break; 3083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 95: VG_(transfer) (&ppc32->guest_VSR54, buf, dir, size, mod); break; 3093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 96: VG_(transfer) (&ppc32->guest_VSR55, buf, dir, size, mod); break; 3103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 97: VG_(transfer) (&ppc32->guest_VSR56, buf, dir, size, mod); break; 3113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 98: VG_(transfer) (&ppc32->guest_VSR57, buf, dir, size, mod); break; 3123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 99: VG_(transfer) (&ppc32->guest_VSR58, buf, dir, size, mod); break; 3133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 100: VG_(transfer) (&ppc32->guest_VSR59, buf, dir, size, mod); break; 3143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 101: VG_(transfer) (&ppc32->guest_VSR60, buf, dir, size, mod); break; 3153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 102: VG_(transfer) (&ppc32->guest_VSR61, buf, dir, size, mod); break; 3163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 103: VG_(transfer) (&ppc32->guest_VSR62, buf, dir, size, mod); break; 3173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 104: VG_(transfer) (&ppc32->guest_VSR63, buf, dir, size, mod); break; 3183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 105: VG_(transfer) (&ppc32->guest_VSCR, buf, dir, size, mod); break; 3193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case 106: VG_(transfer) (&ppc32->guest_VRSAVE, buf, dir, size, mod); break; 3203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj default: vg_assert(0); 3213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 3223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 3233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 324419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippestatic 3256bd9dc18c043927c1196caba20a327238a179c42florianconst char* target_xml (Bool shadow_mode) 326419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippe{ 327419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippe if (shadow_mode) { 328419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippe return "powerpc-altivec32l-valgrind.xml"; 329419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippe } else { 330419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippe return "powerpc-altivec32l.xml"; 331419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippe } 332419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippe} 333419d5f2931a88d5e15e78fdaeac4d550aaf1e789philippe 3341670b05a4a415dbfd75b1a120713b4a206bb719ephilippestatic CORE_ADDR** target_get_dtv (ThreadState *tst) 3351670b05a4a415dbfd75b1a120713b4a206bb719ephilippe{ 33687fc2a9cdecaf88c3e847a168057b2122c9cab04philippe VexGuestPPC32State* ppc32 = (VexGuestPPC32State*)&tst->arch.vex; 3371670b05a4a415dbfd75b1a120713b4a206bb719ephilippe // ppc32 dtv is located just before the tcb, which is 0x7000 before 3381670b05a4a415dbfd75b1a120713b4a206bb719ephilippe // the thread id (r2) 33987fc2a9cdecaf88c3e847a168057b2122c9cab04philippe return (CORE_ADDR**)((CORE_ADDR)ppc32->guest_GPR2 34087fc2a9cdecaf88c3e847a168057b2122c9cab04philippe - 0x7000 - sizeof(CORE_ADDR)); 3411670b05a4a415dbfd75b1a120713b4a206bb719ephilippe} 3421670b05a4a415dbfd75b1a120713b4a206bb719ephilippe 3433b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic struct valgrind_target_ops low_target = { 3443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj num_regs, 3453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj regs, 3463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1, //r1 3473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj transfer_register, 3483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj get_pc, 3493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj set_pc, 3503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj "ppc32", 3511670b05a4a415dbfd75b1a120713b4a206bb719ephilippe target_xml, 3521670b05a4a415dbfd75b1a120713b4a206bb719ephilippe target_get_dtv 3533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}; 3543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 3553b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid ppc32_init_architecture (struct valgrind_target_ops *target) 3563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 3573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *target = low_target; 3583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj set_register_cache (regs, num_regs); 3593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj gdbserver_expedite_regs = expedite_regs; 3603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 3613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 362