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)(&regs, 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, &regs);
72e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood
733b147b770269173d5d711d6c33f142dc5e723824zzy#elif defined(VGP_amd64_linux)
743b147b770269173d5d711d6c33f142dc5e723824zzy   struct vki_user_regs_struct regs;
753b147b770269173d5d711d6c33f142dc5e723824zzy   VG_(memset)(&regs, 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, &regs);
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) &regs.per_info - (unsigned long) &regs.psw.addr;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   pa.vki_process_addr = (unsigned long) &regs.psw.addr;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   pa.vki_kernel_addr = 8;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   VG_(memset)(&regs, 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)(&regs, 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, &regs);
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