19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*--------------------------------------------------------------------*/ 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*--- Attaching a debugger. m_debugger.c ---*/ 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*--------------------------------------------------------------------*/ 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project This file is part of Valgrind, a dynamic binary instrumentation 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project framework. 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Copyright (C) 2000-2013 Julian Seward 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jseward@acm.org 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project This program is free software; you can redistribute it and/or 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modify it under the terms of the GNU General Public License as 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project published by the Free Software Foundation; either version 2 of the 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project License, or (at your option) any later version. 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project This program is distributed in the hope that it will be useful, but 19065b299df4159602327977dd007cb2cd6b64ab20Jeff Sharkey WITHOUT ANY WARRANTY; without even the implied warranty of 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project General Public License for more details. 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project You should have received a copy of the GNU General Public License 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project along with this program; if not, write to the Free Software 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 02111-1307, USA. 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project The GNU General Public License is contained in the file COPYING. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 30065b299df4159602327977dd007cb2cd6b64ab20Jeff Sharkey 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "pub_core_basics.h" 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "pub_core_vki.h" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "pub_core_libcsetjmp.h" 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "pub_core_threadstate.h" 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "pub_core_xarray.h" 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "pub_core_clientstate.h" 37e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#include "pub_core_debugger.h" 38e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#include "pub_core_gdbserver.h" 39e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#include "pub_core_libcbase.h" 40e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#include "pub_core_libcprint.h" 41e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#include "pub_core_libcproc.h" 42e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#include "pub_core_libcsignal.h" 43e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#include "pub_core_libcassert.h" 44e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#include "pub_core_options.h" 45e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood 46e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define WSTOPSIG(status) (((status) & 0xff00) >> 8) 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Int ptrace_setregs(Int pid, VexGuestArchState* vex) 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 52e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood#if defined(VGP_x86_linux) 53e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood struct vki_user_regs_struct regs; 54e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood VG_(memset)(®s, 0, sizeof(regs)); 55e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.cs = vex->guest_CS; 56e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.ss = vex->guest_SS; 57e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.ds = vex->guest_DS; 58e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.es = vex->guest_ES; 59e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.fs = vex->guest_FS; 60e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.gs = vex->guest_GS; 61e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.eax = vex->guest_EAX; 62e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.ebx = vex->guest_EBX; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.ecx = vex->guest_ECX; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.edx = vex->guest_EDX; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.esi = vex->guest_ESI; 66e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.edi = vex->guest_EDI; 673b147b770269173d5d711d6c33f142dc5e723824zzy regs.ebp = vex->guest_EBP; 683b147b770269173d5d711d6c33f142dc5e723824zzy regs.esp = vex->guest_ESP; 693b147b770269173d5d711d6c33f142dc5e723824zzy regs.eflags = LibVEX_GuestX86_get_eflags(vex); 703b147b770269173d5d711d6c33f142dc5e723824zzy regs.eip = vex->guest_EIP; 713b147b770269173d5d711d6c33f142dc5e723824zzy return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, ®s); 72e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood 733b147b770269173d5d711d6c33f142dc5e723824zzy#elif defined(VGP_amd64_linux) 743b147b770269173d5d711d6c33f142dc5e723824zzy struct vki_user_regs_struct regs; 753b147b770269173d5d711d6c33f142dc5e723824zzy VG_(memset)(®s, 0, sizeof(regs)); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.rax = vex->guest_RAX; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.rbx = vex->guest_RBX; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.rcx = vex->guest_RCX; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.rdx = vex->guest_RDX; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.rsi = vex->guest_RSI; 81e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.rdi = vex->guest_RDI; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.rbp = vex->guest_RBP; 83e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.rsp = vex->guest_RSP; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.r8 = vex->guest_R8; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.r9 = vex->guest_R9; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.r10 = vex->guest_R10; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.r11 = vex->guest_R11; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.r12 = vex->guest_R12; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.r13 = vex->guest_R13; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.r14 = vex->guest_R14; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.r15 = vex->guest_R15; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.eflags = LibVEX_GuestAMD64_get_rflags(vex); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.rip = vex->guest_RIP; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Set %{c,d,e,f,s,g}s and %{fs,gs}_base (whatever those are) to 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values which don't fail the kernel's sanity checks. I have no 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project idea what these should really be set to. Anyway, mostly it 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project seems that zero is an allowable value, except for %cs and %ss 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project which have to have their lowest 2 bits be 11. See putreg() in 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linux-2.6.23/arch/x86_64/kernel/ptrace.c for the apparently 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project relevant sanity checks. This fixes #145622. */ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.cs = 3; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.ds = 0; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.es = 0; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.fs = 0; 105c59a66238261778b3fbc496e9b21dfa043ee9160Jesse Wilson regs.ss = 3; 106e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood regs.gs = 0; 107c59a66238261778b3fbc496e9b21dfa043ee9160Jesse Wilson regs.fs_base = 0; 108c59a66238261778b3fbc496e9b21dfa043ee9160Jesse Wilson regs.gs_base = 0; 109c59a66238261778b3fbc496e9b21dfa043ee9160Jesse Wilson return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, ®s); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif defined(VGP_ppc32_linux) 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Int rc = 0; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* apparently the casting to void* is the Right Thing To Do */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R0 * 4), (void*)vex->guest_GPR0); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R1 * 4), (void*)vex->guest_GPR1); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R2 * 4), (void*)vex->guest_GPR2); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R3 * 4), (void*)vex->guest_GPR3); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R4 * 4), (void*)vex->guest_GPR4); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R5 * 4), (void*)vex->guest_GPR5); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R6 * 4), (void*)vex->guest_GPR6); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R7 * 4), (void*)vex->guest_GPR7); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R8 * 4), (void*)vex->guest_GPR8); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R9 * 4), (void*)vex->guest_GPR9); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R10 * 4), (void*)vex->guest_GPR10); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R11 * 4), (void*)vex->guest_GPR11); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R12 * 4), (void*)vex->guest_GPR12); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R13 * 4), (void*)vex->guest_GPR13); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R14 * 4), (void*)vex->guest_GPR14); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R15 * 4), (void*)vex->guest_GPR15); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R16 * 4), (void*)vex->guest_GPR16); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R17 * 4), (void*)vex->guest_GPR17); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R18 * 4), (void*)vex->guest_GPR18); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R19 * 4), (void*)vex->guest_GPR19); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R20 * 4), (void*)vex->guest_GPR20); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R21 * 4), (void*)vex->guest_GPR21); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R22 * 4), (void*)vex->guest_GPR22); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R23 * 4), (void*)vex->guest_GPR23); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R24 * 4), (void*)vex->guest_GPR24); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R25 * 4), (void*)vex->guest_GPR25); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R26 * 4), (void*)vex->guest_GPR26); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R27 * 4), (void*)vex->guest_GPR27); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R28 * 4), (void*)vex->guest_GPR28); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R29 * 4), (void*)vex->guest_GPR29); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R30 * 4), (void*)vex->guest_GPR30); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R31 * 4), (void*)vex->guest_GPR31); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_NIP * 4), (void*)vex->guest_CIA); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_CCR * 4), 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)LibVEX_GuestPPC32_get_CR(vex)); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_LNK * 4), (void*)vex->guest_LR); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_CTR * 4), (void*)vex->guest_CTR); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_XER * 4), 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)LibVEX_GuestPPC32_get_XER(vex)); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rc; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif defined(VGP_ppc64_linux) 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Int rc = 0; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* FRJ: copied nearly verbatim from the ppc32 case. I compared the 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vki-ppc64-linux.h with its ppc32 counterpart and saw no 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appreciable differences, other than the registers being 8 bytes 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project instead of 4. No idea why we don't set all of the entries 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project declared in vki_pt_regs, but ppc32 doesn't so there must be a 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reason. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Finally, note that CR and XER are 32 bits even for ppc64 (see 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project libvex_guest_ppc64.h), but the vki_pt_regs struct still gives 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project them 64 bits. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* apparently the casting to void* is the Right Thing To Do */ 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R0 * 8), (void*)vex->guest_GPR0); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R1 * 8), (void*)vex->guest_GPR1); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R2 * 8), (void*)vex->guest_GPR2); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R3 * 8), (void*)vex->guest_GPR3); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R4 * 8), (void*)vex->guest_GPR4); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R5 * 8), (void*)vex->guest_GPR5); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R6 * 8), (void*)vex->guest_GPR6); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R7 * 8), (void*)vex->guest_GPR7); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R8 * 8), (void*)vex->guest_GPR8); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R9 * 8), (void*)vex->guest_GPR9); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R10 * 8), (void*)vex->guest_GPR10); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R11 * 8), (void*)vex->guest_GPR11); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R12 * 8), (void*)vex->guest_GPR12); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R13 * 8), (void*)vex->guest_GPR13); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R14 * 8), (void*)vex->guest_GPR14); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R15 * 8), (void*)vex->guest_GPR15); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R16 * 8), (void*)vex->guest_GPR16); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R17 * 8), (void*)vex->guest_GPR17); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R18 * 8), (void*)vex->guest_GPR18); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R19 * 8), (void*)vex->guest_GPR19); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R20 * 8), (void*)vex->guest_GPR20); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R21 * 8), (void*)vex->guest_GPR21); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R22 * 8), (void*)vex->guest_GPR22); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R23 * 8), (void*)vex->guest_GPR23); 193065b299df4159602327977dd007cb2cd6b64ab20Jeff Sharkey rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R24 * 8), (void*)vex->guest_GPR24); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R25 * 8), (void*)vex->guest_GPR25); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R26 * 8), (void*)vex->guest_GPR26); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R27 * 8), (void*)vex->guest_GPR27); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R28 * 8), (void*)vex->guest_GPR28); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R29 * 8), (void*)vex->guest_GPR29); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R30 * 8), (void*)vex->guest_GPR30); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R31 * 8), (void*)vex->guest_GPR31); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_NIP * 8), (void*)vex->guest_CIA); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_CCR * 8), 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)(long)LibVEX_GuestPPC64_get_CR(vex)); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_LNK * 8), (void*)vex->guest_LR); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_CTR * 8), (void*)vex->guest_CTR); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_XER * 8), 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)(long)LibVEX_GuestPPC64_get_XER(vex)); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rc; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif defined(VGP_arm_linux) 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct vki_user_regs_struct uregs; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VG_(memset)(&uregs, 0, sizeof(uregs)); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r0 = vex->guest_R0; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r1 = vex->guest_R1; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r2 = vex->guest_R2; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r3 = vex->guest_R3; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r4 = vex->guest_R4; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r5 = vex->guest_R5; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r6 = vex->guest_R6; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r7 = vex->guest_R7; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r8 = vex->guest_R8; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r9 = vex->guest_R9; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_r10 = vex->guest_R10; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_fp = vex->guest_R11; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_ip = vex->guest_R12; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_sp = vex->guest_R13; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_lr = vex->guest_R14; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove the T bit from the bottom of R15T. It will get shipped 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // over in CPSR.T instead, since LibVEX_GuestARM_get_cpsr copies 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it from R15T[0]. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_pc = vex->guest_R15T & 0xFFFFFFFE; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.ARM_cpsr = LibVEX_GuestARM_get_cpsr(vex); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, &uregs); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif defined(VGP_arm64_linux) 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project I_die_here; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //ATC 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct vki_user_pt_regs uregs; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VG_(memset)(&uregs, 0, sizeof(uregs)); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[0] = vex->guest_X0; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[1] = vex->guest_X1; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[2] = vex->guest_X2; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[3] = vex->guest_X3; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[4] = vex->guest_X4; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[5] = vex->guest_X5; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[6] = vex->guest_X6; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[7] = vex->guest_X7; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[8] = vex->guest_X8; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[9] = vex->guest_X9; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[10] = vex->guest_X10; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[11] = vex->guest_X11; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[12] = vex->guest_X12; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[13] = vex->guest_X13; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[14] = vex->guest_X14; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[15] = vex->guest_X15; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[16] = vex->guest_X16; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[17] = vex->guest_X17; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[18] = vex->guest_X18; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[19] = vex->guest_X19; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[20] = vex->guest_X20; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[21] = vex->guest_X21; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[22] = vex->guest_X22; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[23] = vex->guest_X23; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[24] = vex->guest_X24; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[25] = vex->guest_X25; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[26] = vex->guest_X26; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[27] = vex->guest_X27; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[28] = vex->guest_X28; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[29] = vex->guest_X29; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.regs[30] = vex->guest_X30; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.sp = vex->guest_XSP; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.pc = vex->guest_PC; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uregs.pstate = LibVEX_GuestARM64_get_nzcv(vex); /* is this correct? */ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, &uregs); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif defined(VGP_x86_darwin) 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project I_die_here; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif defined(VGP_amd64_darwin) 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project I_die_here; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif defined(VGP_s390x_linux) 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct vki_user_regs_struct regs; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vki_ptrace_area pa; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* We don't set the psw mask and start at offset 8 */ 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa.vki_len = (unsigned long) ®s.per_info - (unsigned long) ®s.psw.addr; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa.vki_process_addr = (unsigned long) ®s.psw.addr; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa.vki_kernel_addr = 8; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VG_(memset)(®s, 0, sizeof(regs)); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.psw.addr = vex->guest_IA; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* We don't set the mask */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[0] = vex->guest_r0; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[1] = vex->guest_r1; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[2] = vex->guest_r2; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[3] = vex->guest_r3; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[4] = vex->guest_r4; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[5] = vex->guest_r5; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[6] = vex->guest_r6; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[7] = vex->guest_r7; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[8] = vex->guest_r8; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[9] = vex->guest_r9; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[10] = vex->guest_r10; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[11] = vex->guest_r11; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[12] = vex->guest_r12; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[13] = vex->guest_r13; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[14] = vex->guest_r14; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.gprs[15] = vex->guest_r15; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[0] = vex->guest_a0; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[1] = vex->guest_a1; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[2] = vex->guest_a2; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[3] = vex->guest_a3; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[4] = vex->guest_a4; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[5] = vex->guest_a5; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[6] = vex->guest_a6; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[7] = vex->guest_a7; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[8] = vex->guest_a8; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[9] = vex->guest_a9; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[10] = vex->guest_a10; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[11] = vex->guest_a11; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project regs.acrs[12] = vex->guest_a12; 325 regs.acrs[13] = vex->guest_a13; 326 regs.acrs[14] = vex->guest_a14; 327 regs.acrs[15] = vex->guest_a15; 328 329 /* only used for system call restart and friends, just use r2 */ 330 regs.orig_gpr2 = vex->guest_r2; 331 332 regs.fp_regs.fprs[0].ui = vex->guest_f0; 333 regs.fp_regs.fprs[1].ui = vex->guest_f1; 334 regs.fp_regs.fprs[2].ui = vex->guest_f2; 335 regs.fp_regs.fprs[3].ui = vex->guest_f3; 336 regs.fp_regs.fprs[4].ui = vex->guest_f4; 337 regs.fp_regs.fprs[5].ui = vex->guest_f5; 338 regs.fp_regs.fprs[6].ui = vex->guest_f6; 339 regs.fp_regs.fprs[7].ui = vex->guest_f7; 340 regs.fp_regs.fprs[8].ui = vex->guest_f8; 341 regs.fp_regs.fprs[9].ui = vex->guest_f9; 342 regs.fp_regs.fprs[10].ui = vex->guest_f10; 343 regs.fp_regs.fprs[11].ui = vex->guest_f11; 344 regs.fp_regs.fprs[12].ui = vex->guest_f12; 345 regs.fp_regs.fprs[13].ui = vex->guest_f13; 346 regs.fp_regs.fprs[14].ui = vex->guest_f14; 347 regs.fp_regs.fprs[15].ui = vex->guest_f15; 348 regs.fp_regs.fpc = vex->guest_fpc; 349 350 return VG_(ptrace)(VKI_PTRACE_POKEUSR_AREA, pid, &pa, NULL); 351 352#elif defined(VGP_mips32_linux) || defined(VGP_mips64_linux) 353 struct vki_user_regs_struct regs; 354 VG_(memset)(®s, 0, sizeof(regs)); 355 regs.MIPS_r0 = vex->guest_r0; 356 regs.MIPS_r1 = vex->guest_r1; 357 regs.MIPS_r2 = vex->guest_r2; 358 regs.MIPS_r3 = vex->guest_r3; 359 regs.MIPS_r4 = vex->guest_r4; 360 regs.MIPS_r5 = vex->guest_r5; 361 regs.MIPS_r6 = vex->guest_r6; 362 regs.MIPS_r7 = vex->guest_r7; 363 regs.MIPS_r8 = vex->guest_r8; 364 regs.MIPS_r9 = vex->guest_r9; 365 regs.MIPS_r10 = vex->guest_r10; 366 regs.MIPS_r11 = vex->guest_r11; 367 regs.MIPS_r12 = vex->guest_r12; 368 regs.MIPS_r13 = vex->guest_r13; 369 regs.MIPS_r14 = vex->guest_r14; 370 regs.MIPS_r15 = vex->guest_r15; 371 regs.MIPS_r16 = vex->guest_r16; 372 regs.MIPS_r17 = vex->guest_r17; 373 regs.MIPS_r18 = vex->guest_r18; 374 regs.MIPS_r19 = vex->guest_r19; 375 regs.MIPS_r20 = vex->guest_r20; 376 regs.MIPS_r21 = vex->guest_r21; 377 regs.MIPS_r22 = vex->guest_r22; 378 regs.MIPS_r23 = vex->guest_r23; 379 regs.MIPS_r24 = vex->guest_r24; 380 regs.MIPS_r25 = vex->guest_r25; 381 regs.MIPS_r26 = vex->guest_r26; 382 regs.MIPS_r27 = vex->guest_r27; 383 regs.MIPS_r28 = vex->guest_r28; 384 regs.MIPS_r29 = vex->guest_r29; 385 regs.MIPS_r30 = vex->guest_r30; 386 regs.MIPS_r31 = vex->guest_r31; 387 return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, ®s); 388 389#else 390# error Unknown arch 391#endif 392} 393 394/* Start debugger and get it to attach to this process. Called if the 395 user requests this service after an error has been shown, so she can 396 poke around and look at parameters, memory, etc. You can't 397 meaningfully get the debugger to continue the program, though; to 398 continue, quit the debugger. */ 399void VG_(start_debugger) ( ThreadId tid ) 400{ 401# define N_BUF 4096 402 Int pid, rc; 403 404 pid = VG_(fork)(); 405 406 if (pid == 0) { 407 /* child */ 408 VG_(set_ptracer)(); 409 rc = VG_(ptrace)(VKI_PTRACE_TRACEME, 0, NULL, NULL); 410 vg_assert(rc == 0); 411 rc = VG_(kill)(VG_(getpid)(), VKI_SIGSTOP); 412 vg_assert(rc == 0); 413 414 } else if (pid > 0) { 415 /* parent */ 416 Int status; 417 Int res; 418 419 if ((res = VG_(waitpid)(pid, &status, 0)) == pid && 420 WIFSTOPPED(status) && WSTOPSIG(status) == VKI_SIGSTOP && 421 ptrace_setregs(pid, &(VG_(threads)[tid].arch.vex)) == 0 && 422 VG_(kill)(pid, VKI_SIGSTOP) == 0 && 423 VG_(ptrace)(VKI_PTRACE_DETACH, pid, NULL, 0) == 0) 424 { 425 HChar pidbuf[15]; 426 HChar file[50]; 427 HChar buf[N_BUF]; 428 HChar *bufptr; 429 const HChar *cmdptr; 430 431 VG_(sprintf)(pidbuf, "%d", pid); 432 VG_(sprintf)(file, "/proc/%d/fd/%d", pid, VG_(cl_exec_fd)); 433 434 bufptr = buf; 435 cmdptr = VG_(clo_db_command); 436 437 while (*cmdptr) { 438 /* each iteration can advance bufptr by at most the length 439 of file[], so the following assertion is generously 440 over-paranoid. */ 441 vg_assert(bufptr - buf < N_BUF-15-50-10/*paranoia*/); 442 switch (*cmdptr) { 443 case '%': 444 switch (*++cmdptr) { 445 case 'f': 446 VG_(memcpy)(bufptr, file, VG_(strlen)(file)); 447 bufptr += VG_(strlen)(file); 448 cmdptr++; 449 break; 450 case 'p': 451 VG_(memcpy)(bufptr, pidbuf, VG_(strlen)(pidbuf)); 452 bufptr += VG_(strlen)(pidbuf); 453 cmdptr++; 454 break; 455 default: 456 *bufptr++ = *cmdptr++; 457 break; 458 } 459 break; 460 default: 461 *bufptr++ = *cmdptr++; 462 break; 463 } 464 vg_assert(bufptr - buf < N_BUF-15-50-10/*paranoia*/); 465 } 466 467 *bufptr++ = '\0'; 468 469 VG_(message)(Vg_UserMsg, "starting debugger with cmd: %s\n", buf); 470 res = VG_(system)(buf); 471 if (res == 0) { 472 VG_(message)(Vg_UserMsg, "\n"); 473 VG_(message)(Vg_UserMsg, 474 "Debugger has detached. Valgrind regains control." 475 " We continue.\n"); 476 } else { 477 VG_(message)(Vg_UserMsg, 478 "Warning: Debugger attach failed! (sys_system)\n"); 479 VG_(message)(Vg_UserMsg, "\n"); 480 } 481 } else { 482 VG_(message)(Vg_UserMsg, 483 "Warning: Debugger attach failed! (ptrace problem?)\n"); 484 VG_(message)(Vg_UserMsg, "\n"); 485 } 486 487 VG_(kill)(pid, VKI_SIGKILL); 488 VG_(waitpid)(pid, &status, 0); 489 } 490# undef N_BUF 491} 492 493 494 495/*--------------------------------------------------------------------*/ 496/*--- end ---*/ 497/*--------------------------------------------------------------------*/ 498