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