| Juan Cespedes | 5c3fe06 | 2004-06-14 18:08:37 +0200 | [diff] [blame] | 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 | |
| Ian Wienand | 2d45b1a | 2006-02-20 22:48:07 +0100 | [diff] [blame] | 9 | void *get_instruction_pointer(struct process *proc) |
| 10 | { |
| 11 | proc_archdep *a = (proc_archdep *) (proc->arch_ptr); |
| Juan Cespedes | 5c3fe06 | 2004-06-14 18:08:37 +0200 | [diff] [blame] | 12 | if (a->valid) |
| 13 | return (void *)a->regs.r_pc; |
| 14 | return (void *)-1; |
| 15 | } |
| 16 | |
| Ian Wienand | 2d45b1a | 2006-02-20 22:48:07 +0100 | [diff] [blame] | 17 | void set_instruction_pointer(struct process *proc, void *addr) |
| 18 | { |
| 19 | proc_archdep *a = (proc_archdep *) (proc->arch_ptr); |
| Juan Cespedes | 5c3fe06 | 2004-06-14 18:08:37 +0200 | [diff] [blame] | 20 | if (a->valid) |
| 21 | a->regs.r_pc = (long)addr; |
| 22 | } |
| 23 | |
| Ian Wienand | 2d45b1a | 2006-02-20 22:48:07 +0100 | [diff] [blame] | 24 | void *get_stack_pointer(struct process *proc) |
| 25 | { |
| 26 | proc_archdep *a = (proc_archdep *) (proc->arch_ptr); |
| Juan Cespedes | 5c3fe06 | 2004-06-14 18:08:37 +0200 | [diff] [blame] | 27 | if (a->valid) |
| 28 | return (void *)a->regs.r_o6; |
| 29 | return (void *)-1; |
| 30 | } |
| 31 | |
| Ian Wienand | 2d45b1a | 2006-02-20 22:48:07 +0100 | [diff] [blame] | 32 | void *get_return_addr(struct process *proc, void *stack_pointer) |
| 33 | { |
| 34 | proc_archdep *a = (proc_archdep *) (proc->arch_ptr); |
| Juan Cespedes | 5c3fe06 | 2004-06-14 18:08:37 +0200 | [diff] [blame] | 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 | } |