regs.c revision 2d45b1a8e26a36a9f85dc49e721c4390ca93dc40
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 *get_instruction_pointer(struct process *proc) 10{ 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 set_instruction_pointer(struct process *proc, void *addr) 18{ 19 proc_archdep *a = (proc_archdep *) (proc->arch_ptr); 20 if (a->valid) 21 a->regs.r_pc = (long)addr; 22} 23 24void *get_stack_pointer(struct process *proc) 25{ 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 *get_return_addr(struct process *proc, void *stack_pointer) 33{ 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