regs.c revision a7af00db2231e99a4506e4f5587f9dd00b9d1175
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 "common.h" 11 12void * 13get_instruction_pointer(Process *proc) { 14 unsigned long ip = ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IIP, 0); 15 unsigned long slot = 16 (ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IPSR, 0) >> 41) & 3; 17 18 return (void *)(ip | slot); 19} 20 21void 22set_instruction_pointer(Process *proc, void *addr) { 23 24 unsigned long newip = (unsigned long)addr; 25 unsigned long slot = (unsigned long)addr & 0xf; 26 unsigned long psr = ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IPSR, 0); 27 28 psr &= ~(3UL << 41); 29 psr |= (slot & 0x3) << 41; 30 31 newip &= ~0xfUL; 32 33 ptrace(PTRACE_POKEUSER, proc->pid, PT_CR_IIP, (long)newip); 34 ptrace(PTRACE_POKEUSER, proc->pid, PT_CR_IPSR, psr); 35} 36 37void * 38get_stack_pointer(Process *proc) { 39 return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, PT_R12, 0); 40} 41 42void * 43get_return_addr(Process *proc, void *stack_pointer) { 44 return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, PT_B0, 0); 45} 46 47void 48set_return_addr(Process *proc, void *addr) { 49 ptrace(PTRACE_POKEUSER, proc->pid, PT_B0, addr); 50} 51