1a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras/* 2a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * This file is part of ltrace. 3a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * 4a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * Copyright (C) 2013 Imagination Technologies Ltd. 5a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * 6a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * This program is free software; you can redistribute it and/or 7a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * modify it under the terms of the GNU General Public License 8a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * version 2 as published by the Free Software Foundation. 9a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * 10a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * This program is distributed in the hope that it will be useful, but 11a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * WITHOUT ANY WARRANTY; without even the implied warranty of 12a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * General Public License for more details. 14a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * 15a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * You should have received a copy of the GNU General Public License 16a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * along with this program; if not, write to the Free Software 17a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 18a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras * 02110-1301 USA 19a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras */ 20a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 21a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras#include "config.h" 22a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 23a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras#include <sys/types.h> 24a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras#include <sys/ptrace.h> 25a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras#include <linux/uio.h> 26a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras#include <asm/ptrace.h> 27a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 28a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras#include "proc.h" 29a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras#include "common.h" 30a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 31a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandrasarch_addr_t 32a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandrasget_instruction_pointer(struct process *proc) 33a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras{ 34a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras struct user_gp_regs regs; 35a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras struct iovec iov; 36a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 37a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_base = ®s; 38a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_len = sizeof(regs); 39a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov)) 40a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras return (void *)-1; 41a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 42a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras return (void *)regs.pc; /* PC */ 43a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras} 44a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 45a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandrasvoid 46a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandrasset_instruction_pointer(struct process *proc, arch_addr_t addr) 47a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras{ 48a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras struct user_gp_regs regs; 49a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras struct iovec iov; 50a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 51a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_base = ®s; 52a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_len = sizeof(regs); 53a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov)) 54a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras return; 55a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 56a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras regs.pc = (unsigned long)addr; 57a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 58a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_base = ®s; 59a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_len = sizeof(regs); 60a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras ptrace(PTRACE_SETREGSET, proc->pid, NT_PRSTATUS, (long)&iov); 61a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras} 62a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 63a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandrasarch_addr_t 64a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandrasget_stack_pointer(struct process *proc) 65a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras{ 66a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras struct user_gp_regs regs; 67a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras struct iovec iov; 68a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 69a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_base = ®s; 70a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_len = sizeof(regs); 71a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov)) 72a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras return (void *)-1; 73a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 74a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras return (void *)regs.ax[0][0]; /* A0StP (A0.0) */ 75a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras} 76a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 77a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandrasarch_addr_t 78a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandrasget_return_addr(struct process *proc, void *stack_pointer) 79a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras{ 80a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras struct user_gp_regs regs; 81a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras struct iovec iov; 82a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 83a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_base = ®s; 84a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras iov.iov_len = sizeof(regs); 85a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov)) 86a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras return (void *)-1; 87a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras 88a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras return (void *)regs.dx[4][1]; /* D1RtP (D1.4) */ 89a193452188e51f233677e3f2607d9a61a789a1dfMarkos Chandras} 90