blob: 1f2861abde96d13a54b8643afb8a56f182bd5e7d [file] [log] [blame]
Juan Cespedes5c3fe062004-06-14 18:08:37 +02001#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 Wienand2d45b1a2006-02-20 22:48:07 +01009void *get_instruction_pointer(struct process *proc)
10{
11 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020012 if (a->valid)
13 return (void *)a->regs.r_pc;
14 return (void *)-1;
15}
16
Ian Wienand2d45b1a2006-02-20 22:48:07 +010017void set_instruction_pointer(struct process *proc, void *addr)
18{
19 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020020 if (a->valid)
21 a->regs.r_pc = (long)addr;
22}
23
Ian Wienand2d45b1a2006-02-20 22:48:07 +010024void *get_stack_pointer(struct process *proc)
25{
26 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020027 if (a->valid)
28 return (void *)a->regs.r_o6;
29 return (void *)-1;
30}
31
Ian Wienand2d45b1a2006-02-20 22:48:07 +010032void *get_return_addr(struct process *proc, void *stack_pointer)
33{
34 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020035 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}