regs.c revision 3df476b28e4a9cdb43cf29fff8e89481310eb30d
1#if HAVE_CONFIG_H
2#include "config.h"
3#endif
4
5#include <sys/types.h>
6#include "ptrace.h"
7#include "main.h"
8
9void *
10get_instruction_pointer(Process *proc) {
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
18set_instruction_pointer(Process *proc, void *addr) {
19	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
20	if (a->valid)
21		a->regs.r_pc = (long)addr;
22}
23
24void *
25get_stack_pointer(Process *proc) {
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 *
33get_return_addr(Process *proc, void *stack_pointer) {
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}
44