regs.c revision f670eea50e959eeb9da53d70cad8d43c19494ef0
1#include "config.h" 2 3#include <sys/types.h> 4#include <sys/ptrace.h> 5 6#include <asm/ptrace_offsets.h> 7#include <asm/rse.h> 8 9#include <stddef.h> 10#include "debug.h" 11#include "common.h" 12 13void * 14get_instruction_pointer(Process *proc) { 15 unsigned long ip = ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IIP, 0); 16 unsigned long slot = 17 (ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IPSR, 0) >> 41) & 3; 18 19 return (void *)(ip | slot); 20} 21 22void 23set_instruction_pointer(Process *proc, void *addr) { 24 25 unsigned long newip = (unsigned long)addr; 26 unsigned long slot = (unsigned long)addr & 0xf; 27 unsigned long psr = ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IPSR, 0); 28 29 psr &= ~(3UL << 41); 30 psr |= (slot & 0x3) << 41; 31 32 newip &= ~0xfUL; 33 34 ptrace(PTRACE_POKEUSER, proc->pid, PT_CR_IIP, (long)newip); 35 ptrace(PTRACE_POKEUSER, proc->pid, PT_CR_IPSR, psr); 36} 37 38void * 39get_stack_pointer(Process *proc) { 40 return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, PT_R12, 0); 41} 42 43void * 44get_return_addr(Process *proc, void *stack_pointer) { 45 return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, PT_B0, 0); 46} 47 48void 49set_return_addr(Process *proc, void *addr) { 50 ptrace(PTRACE_POKEUSER, proc->pid, PT_B0, addr); 51} 52