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