1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Low level interface to valgrind, for the remote server for GDB integrated 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov in valgrind. 3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Copyright (C) 2011 4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Free Software Foundation, Inc. 5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This file is part of VALGRIND. 7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov It has been inspired from a file from gdbserver in gdb 6.6. 8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This program is free software; you can redistribute it and/or modify 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov it under the terms of the GNU General Public License as published by 11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov the Free Software Foundation; either version 2 of the License, or 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (at your option) any later version. 13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This program is distributed in the hope that it will be useful, 15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov but WITHOUT ANY WARRANTY; without even the implied warranty of 16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GNU General Public License for more details. 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov You should have received a copy of the GNU General Public License 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov along with this program; if not, write to the Free Software 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Foundation, Inc., 51 Franklin Street, Fifth Floor, 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Boston, MA 02110-1301, USA. */ 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "server.h" 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "target.h" 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "regdef.h" 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "regcache.h" 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_aspacemgr.h" 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_machine.h" 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_threadstate.h" 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_transtab.h" 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_gdbserver.h" 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "valgrind_low.h" 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "libvex_guest_amd64.h" 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* GDBTD: ??? have a cleaner way to get the f80 <> f64 conversion functions */ 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* below include needed for conversion f80 <> f64 */ 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "../../VEX/priv/guest_generic_x87.h" 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* below loosely inspired from file generated with gdb regdat.sh */ 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct reg regs[] = { 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rax", 0, 64 }, 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rbx", 64, 64 }, 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rcx", 128, 64 }, 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rdx", 192, 64 }, 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rsi", 256, 64 }, 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rdi", 320, 64 }, 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rbp", 384, 64 }, 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rsp", 448, 64 }, 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "r8", 512, 64 }, 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "r9", 576, 64 }, 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "r10", 640, 64 }, 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "r11", 704, 64 }, 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "r12", 768, 64 }, 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "r13", 832, 64 }, 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "r14", 896, 64 }, 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "r15", 960, 64 }, 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "rip", 1024, 64 }, 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "eflags", 1088, 32 }, 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "cs", 1120, 32 }, 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "ss", 1152, 32 }, 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "ds", 1184, 32 }, 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "es", 1216, 32 }, 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "fs", 1248, 32 }, 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "gs", 1280, 32 }, 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "st0", 1312, 80 }, 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "st1", 1392, 80 }, 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "st2", 1472, 80 }, 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "st3", 1552, 80 }, 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "st4", 1632, 80 }, 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "st5", 1712, 80 }, 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "st6", 1792, 80 }, 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "st7", 1872, 80 }, 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "fctrl", 1952, 32 }, 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "fstat", 1984, 32 }, 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "ftag", 2016, 32 }, 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "fiseg", 2048, 32 }, 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "fioff", 2080, 32 }, 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "foseg", 2112, 32 }, 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "fooff", 2144, 32 }, 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "fop", 2176, 32 }, 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm0", 2208, 128 }, 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm1", 2336, 128 }, 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm2", 2464, 128 }, 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm3", 2592, 128 }, 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm4", 2720, 128 }, 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm5", 2848, 128 }, 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm6", 2976, 128 }, 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm7", 3104, 128 }, 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm8", 3232, 128 }, 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm9", 3360, 128 }, 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm10", 3488, 128 }, 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm11", 3616, 128 }, 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm12", 3744, 128 }, 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm13", 3872, 128 }, 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm14", 4000, 128 }, 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "xmm15", 4128, 128 }, 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "mxcsr", 4256, 32 }, 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(VGO_linux) 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { "orig_rax", 4288, 64 } 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}; 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic const char *expedite_regs[] = { "rbp", "rsp", "rip", 0 }; 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define num_regs (sizeof (regs) / sizeof (regs[0])) 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovCORE_ADDR get_pc (void) 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long pc; 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov collect_register_by_name ("rip", &pc); 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov dlog(1, "stop pc is %p\n", (void *) pc); 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return pc; 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid set_pc (CORE_ADDR newpc) 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool mod; 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov supply_register_by_name ("rip", &newpc, &mod); 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (mod) 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov dlog(1, "set pc to %p\n", C2v (newpc)); 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov dlog(1, "set pc not changed %p\n", C2v (newpc)); 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* store registers in the guest state (gdbserver_to_valgrind) 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov or fetch register from the guest state (valgrind_to_gdbserver). */ 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid transfer_register (ThreadId tid, int abs_regno, void * buf, 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov transfer_direction dir, int size, Bool *mod) 136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ThreadState* tst = VG_(get_ThreadState)(tid); 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int set = abs_regno / num_regs; 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int regno = abs_regno % num_regs; 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *mod = False; 141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VexGuestAMD64State* amd64 = (VexGuestAMD64State*) get_arch (set, tst); 143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (regno) { 145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // numbers here have to match the order of regs above. 146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // Attention: gdb order does not match valgrind order. 147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 0: VG_(transfer) (&amd64->guest_RAX, buf, dir, size, mod); break; 148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 1: VG_(transfer) (&amd64->guest_RBX, buf, dir, size, mod); break; 149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 2: VG_(transfer) (&amd64->guest_RCX, buf, dir, size, mod); break; 150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 3: VG_(transfer) (&amd64->guest_RDX, buf, dir, size, mod); break; 151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 4: VG_(transfer) (&amd64->guest_RSI, buf, dir, size, mod); break; 152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 5: VG_(transfer) (&amd64->guest_RDI, buf, dir, size, mod); break; 153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 6: VG_(transfer) (&amd64->guest_RBP, buf, dir, size, mod); break; 154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 7: VG_(transfer) (&amd64->guest_RSP, buf, dir, size, mod); break; 155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 8: VG_(transfer) (&amd64->guest_R8, buf, dir, size, mod); break; 156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 9: VG_(transfer) (&amd64->guest_R9, buf, dir, size, mod); break; 157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 10: VG_(transfer) (&amd64->guest_R10, buf, dir, size, mod); break; 158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 11: VG_(transfer) (&amd64->guest_R11, buf, dir, size, mod); break; 159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 12: VG_(transfer) (&amd64->guest_R12, buf, dir, size, mod); break; 160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 13: VG_(transfer) (&amd64->guest_R13, buf, dir, size, mod); break; 161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 14: VG_(transfer) (&amd64->guest_R14, buf, dir, size, mod); break; 162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 15: VG_(transfer) (&amd64->guest_R15, buf, dir, size, mod); break; 163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 16: 164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(transfer) (&amd64->guest_RIP, buf, dir, size, mod); 165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (*mod && VG_(debugLog_getLevel)() > 2) { 166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov char bufimage [2*sizeof(amd64->guest_IP_AT_SYSCALL) + 1]; 167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov heximage (bufimage, 168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (char *) &amd64->guest_IP_AT_SYSCALL, 169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof(amd64->guest_IP_AT_SYSCALL)); 170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov dlog(3, "guest_IP_AT_SYSCALL %s\n", bufimage); 171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 17: 174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (dir == valgrind_to_gdbserver) { 175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ULong rflags; 176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* we can only retrieve the real flags (set 0) 177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov retrieving shadow flags is not ok */ 178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (set == 0) 179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov rflags = LibVEX_GuestAMD64_get_rflags (amd64); 180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov rflags = 0; 182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(transfer) (&rflags, buf, dir, size, mod); 183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *mod = False; //GDBTD? how do we store rflags in libvex_guest_amd64.h ??? 185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 18: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_CS, buf, dir, size, mod); 188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 19: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_SS, buf, dir, size, mod); 189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 20: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_DS, buf, dir, size, mod); 190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 21: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_ES, buf, dir, size, mod); 191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 22: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_FS, buf, dir, size, mod); 192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 23: VG_(transfer) (&amd64->guest_GS_0x60, buf, dir, size, mod); break; 193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 24: 194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 25: 195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 26: 196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 27: /* register 24 to 31 are float registers 80 bits but 64 bits in valgrind */ 197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 28: 198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 29: 199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 30: 200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 31: 201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (dir == valgrind_to_gdbserver) { 202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UChar fpreg80[10]; 203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov convert_f64le_to_f80le ((UChar *)&amd64->guest_FPREG[regno-16], 204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fpreg80); 205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(transfer) (&fpreg80, buf, dir, sizeof(fpreg80), mod); 206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ULong fpreg64; 208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov convert_f80le_to_f64le (buf, (UChar *)&fpreg64); 209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(transfer) (&amd64->guest_FPREG[regno-16], &fpreg64, 210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov dir, sizeof(fpreg64), mod); 211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 32: 214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (dir == valgrind_to_gdbserver) { 215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // vex only models the rounding bits (see libvex_guest_amd64.h) 216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord value = 0x037f; 217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov value |= amd64->guest_FPROUND << 10; 218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(transfer)(&value, buf, dir, size, mod); 219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *mod = False; // GDBTD???? VEX equivalent fcrtl 221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 33: 224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (dir == valgrind_to_gdbserver) { 225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord value = amd64->guest_FC3210; 226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov value |= (amd64->guest_FTOP & 7) << 11; 227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(transfer)(&value, buf, dir, size, mod); 228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *mod = False; // GDBTD???? VEX equivalent fstat 230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 34: 233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (dir == valgrind_to_gdbserver) { 234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // vex doesn't model these precisely 235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord value = 236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ((amd64->guest_FPTAG[0] ? 0 : 3) << 0) | 237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ((amd64->guest_FPTAG[1] ? 0 : 3) << 2) | 238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ((amd64->guest_FPTAG[2] ? 0 : 3) << 4) | 239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ((amd64->guest_FPTAG[3] ? 0 : 3) << 6) | 240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ((amd64->guest_FPTAG[4] ? 0 : 3) << 8) | 241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ((amd64->guest_FPTAG[5] ? 0 : 3) << 10) | 242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ((amd64->guest_FPTAG[6] ? 0 : 3) << 12) | 243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ((amd64->guest_FPTAG[7] ? 0 : 3) << 14); 244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(transfer)(&value, buf, dir, size, mod); 245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *mod = False; // GDBTD???? VEX equivalent ftag 247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 35: *mod = False; break; // GDBTD ??? equivalent of fiseg 250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 36: *mod = False; break; // GDBTD ??? equivalent of fioff 251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 37: *mod = False; break; // GDBTD ??? equivalent of foseg 252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 38: *mod = False; break; // GDBTD ??? equivalent of fooff 253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 39: *mod = False; break; // GDBTD ??? equivalent of fop 254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 40: VG_(transfer) (&amd64->guest_XMM0, buf, dir, size, mod); break; 255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 41: VG_(transfer) (&amd64->guest_XMM1, buf, dir, size, mod); break; 256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 42: VG_(transfer) (&amd64->guest_XMM2, buf, dir, size, mod); break; 257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 43: VG_(transfer) (&amd64->guest_XMM3, buf, dir, size, mod); break; 258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 44: VG_(transfer) (&amd64->guest_XMM4, buf, dir, size, mod); break; 259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 45: VG_(transfer) (&amd64->guest_XMM5, buf, dir, size, mod); break; 260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 46: VG_(transfer) (&amd64->guest_XMM6, buf, dir, size, mod); break; 261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 47: VG_(transfer) (&amd64->guest_XMM7, buf, dir, size, mod); break; 262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 48: VG_(transfer) (&amd64->guest_XMM8, buf, dir, size, mod); break; 263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 49: VG_(transfer) (&amd64->guest_XMM9, buf, dir, size, mod); break; 264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 50: VG_(transfer) (&amd64->guest_XMM10, buf, dir, size, mod); break; 265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 51: VG_(transfer) (&amd64->guest_XMM11, buf, dir, size, mod); break; 266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 52: VG_(transfer) (&amd64->guest_XMM12, buf, dir, size, mod); break; 267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 53: VG_(transfer) (&amd64->guest_XMM13, buf, dir, size, mod); break; 268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 54: VG_(transfer) (&amd64->guest_XMM14, buf, dir, size, mod); break; 269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 55: VG_(transfer) (&amd64->guest_XMM15, buf, dir, size, mod); break; 270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 56: 271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (dir == valgrind_to_gdbserver) { 272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // vex only models the rounding bits (see libvex_guest_x86.h) 273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord value = 0x1f80; 274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov value |= amd64->guest_SSEROUND << 13; 275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(transfer)(&value, buf, dir, size, mod); 276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *mod = False; // GDBTD???? VEX equivalent mxcsr 278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 57: *mod = False; break; // GDBTD???? VEX equivalent { "orig_rax"}, 281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: vg_assert(0); 282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic struct valgrind_target_ops low_target = { 286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov num_regs, 287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov regs, 288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 7, //RSP 289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov transfer_register, 290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov get_pc, 291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov set_pc, 292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "amd64", 293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov NULL, // target_xml not needed. 294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(VGO_linux) 295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "amd64-linux-valgrind.xml" 296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else 297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "amd64-coresse-valgrind.xml" 298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}; 300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid amd64_init_architecture (struct valgrind_target_ops *target) 302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *target = low_target; 304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov set_register_cache (regs, num_regs); 305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov gdbserver_expedite_regs = expedite_regs; 306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 307