regs.c revision 3458456ffbf0b6d85e1818dea7cbeacc8b1d2298
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.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.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.u_regs[UREG_I5]; 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.u_regs[UREG_I6] + 8, 0); 38 if (t < 0x400000) 39 return (void *)a->regs.u_regs[UREG_I6] + 12; 40 return (void *)a->regs.u_regs[UREG_I6] + 8; 41} 42 43void 44set_return_addr(Process *proc, void *addr) { 45 proc_archdep *a = (proc_archdep *) (proc->arch_ptr); 46 if (!a->valid) 47 return; 48 ptrace(PTRACE_POKETEXT, proc->pid, a->regs.u_regs[UREG_I6] + 8, addr); 49} 50