1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * This file is part of ltrace. 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Copyright (C) 2010 Edgar E. Iglesias 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * This program is free software; you can redistribute it and/or 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * modify it under the terms of the GNU General Public License as 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * published by the Free Software Foundation; either version 2 of the 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * License, or (at your option) any later version. 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * This program is distributed in the hope that it will be useful, but 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * WITHOUT ANY WARRANTY; without even the implied warranty of 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * General Public License for more details. 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * You should have received a copy of the GNU General Public License 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * along with this program; if not, write to the Free Software 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * 02110-1301 USA 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if HAVE_CONFIG_H 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "config.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <sys/types.h> 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <sys/ptrace.h> 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <asm/ptrace.h> 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "proc.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "common.h" 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR)) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define PTRACE_PEEKUSER PTRACE_PEEKUSR 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR)) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define PTRACE_POKEUSER PTRACE_POKEUSR 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void *get_instruction_pointer(struct process *proc) 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles){ 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_PPC, 0); 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void set_instruction_pointer(struct process *proc, void *addr) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){ 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ptrace(PTRACE_POKEUSER, proc->pid, 4 * PT_PPC, addr); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void *get_stack_pointer(struct process *proc) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){ 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_USP, 0); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void *get_return_addr(struct process *proc, void *stack_pointer) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){ 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_SRP, 0); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)