blob: 9928b731cdad4e09ce4bd2e5940334a974d43c7b [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
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}