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
Juan Cespedes948a5d02004-07-07 10:47:50 +02009void *
10get_instruction_pointer(struct process * proc) {
Juan Cespedes5c3fe062004-06-14 18:08:37 +020011 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
Juan Cespedes948a5d02004-07-07 10:47:50 +020017void
18set_instruction_pointer(struct process * proc, void * addr) {
Juan Cespedes5c3fe062004-06-14 18:08:37 +020019 proc_archdep *a = (proc_archdep *)(proc->arch_ptr);
20 if (a->valid)
21 a->regs.r_pc = (long)addr;
22}
23
Juan Cespedes948a5d02004-07-07 10:47:50 +020024void *
25get_stack_pointer(struct process * proc) {
Juan Cespedes5c3fe062004-06-14 18:08:37 +020026 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
Juan Cespedes948a5d02004-07-07 10:47:50 +020032void *
33get_return_addr(struct process * proc, void * stack_pointer) {
Juan Cespedes5c3fe062004-06-14 18:08:37 +020034 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}