blob: 78efec3a5c42308e7024d011ce6f2ae15cf95d11 [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 Wienand9a2ad352006-02-20 22:44:45 +01009void *
10get_instruction_pointer(struct process * proc) {
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 Wienand9a2ad352006-02-20 22:44:45 +010017void
18set_instruction_pointer(struct process * proc, void * addr) {
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 Wienand9a2ad352006-02-20 22:44:45 +010024void *
25get_stack_pointer(struct process * proc) {
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 Wienand9a2ad352006-02-20 22:44:45 +010032void *
33get_return_addr(struct process * proc, void * stack_pointer) {
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}