regs.c revision f670eea50e959eeb9da53d70cad8d43c19494ef0
1#include "config.h" 2 3#include <sys/types.h> 4#include "ptrace.h" 5#include "common.h" 6 7void * 8get_instruction_pointer(Process *proc) { 9 proc_archdep *a = (proc_archdep *) (proc->arch_ptr); 10 if (a->valid) 11 return (void *)a->regs.r_pc; 12 return (void *)-1; 13} 14 15void 16set_instruction_pointer(Process *proc, void *addr) { 17 proc_archdep *a = (proc_archdep *) (proc->arch_ptr); 18 if (a->valid) 19 a->regs.r_pc = (long)addr; 20} 21 22void * 23get_stack_pointer(Process *proc) { 24 proc_archdep *a = (proc_archdep *) (proc->arch_ptr); 25 if (a->valid) 26 return (void *)a->regs.r_o6; 27 return (void *)-1; 28} 29 30void * 31get_return_addr(Process *proc, void *stack_pointer) { 32 proc_archdep *a = (proc_archdep *) (proc->arch_ptr); 33 unsigned int t; 34 if (!a->valid) 35 return (void *)-1; 36 /* Work around structure returns */ 37 t = ptrace(PTRACE_PEEKTEXT, proc->pid, a->regs.r_o7 + 8, 0); 38 if (t < 0x400000) 39 return (void *)a->regs.r_o7 + 12; 40 return (void *)a->regs.r_o7 + 8; 41} 42 43void 44set_return_addr(Process *proc, void *addr) { 45 proc_archdep *a = (proc_archdep *) (proc->arch_ptr); 46 unsigned int t; 47 if (!a->valid) 48 return; 49 ptrace(PTRACE_POKETEXT, proc->pid, a->regs.r_o7 + 8, addr); 50} 51