blob: a1584accb90f5cd31ddce84cb45558658ffc07b6 [file] [log] [blame]
Juan Cespedesd44c6b81998-09-25 14:48:42 +02001#include "config.h"
Juan Cespedesd44c6b81998-09-25 14:48:42 +02002
Juan Cespedes5e01f651998-03-08 22:31:44 +01003#include <sys/types.h>
4#include <sys/ptrace.h>
Juan Cespedes64c6dfb1998-07-14 13:49:47 +02005#include <asm/ptrace.h>
Juan Cespedes5e01f651998-03-08 22:31:44 +01006
Petr Machata366c2f42012-02-09 19:34:36 +01007#include "proc.h"
Juan Cespedes5c3fe062004-06-14 18:08:37 +02008
Juan Cespedes5e0acdb1998-04-04 08:34:07 +02009#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR))
10# define PTRACE_PEEKUSER PTRACE_PEEKUSR
11#endif
12
13#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR))
14# define PTRACE_POKEUSER PTRACE_POKEUSR
15#endif
16
Juan Cespedesf1350522008-12-16 18:19:58 +010017void *
Juan Cespedesa8909f72009-04-28 20:02:41 +020018get_instruction_pointer(Process *proc) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010019 return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, 4 * EIP, 0);
Juan Cespedes5e01f651998-03-08 22:31:44 +010020}
21
Juan Cespedesf1350522008-12-16 18:19:58 +010022void
Juan Cespedesa8909f72009-04-28 20:02:41 +020023set_instruction_pointer(Process *proc, void *addr) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010024 ptrace(PTRACE_POKEUSER, proc->pid, 4 * EIP, (long)addr);
Juan Cespedes8f8282f2002-03-03 18:58:40 +010025}
26
Juan Cespedesf1350522008-12-16 18:19:58 +010027void *
Juan Cespedesa8909f72009-04-28 20:02:41 +020028get_stack_pointer(Process *proc) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010029 return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, 4 * UESP, 0);
Juan Cespedes5e01f651998-03-08 22:31:44 +010030}
31
Juan Cespedesf1350522008-12-16 18:19:58 +010032void *
Juan Cespedesa8909f72009-04-28 20:02:41 +020033get_return_addr(Process *proc, void *stack_pointer) {
Juan Cespedes5c3fe062004-06-14 18:08:37 +020034 return (void *)ptrace(PTRACE_PEEKTEXT, proc->pid, stack_pointer, 0);
Juan Cespedes5e01f651998-03-08 22:31:44 +010035}
Juan Cespedes2a61d192009-07-04 11:29:27 +020036
37void
38set_return_addr(Process *proc, void *addr) {
39 ptrace(PTRACE_POKETEXT, proc->pid, proc->stack_pointer, (long)addr);
40}