regs.c revision f670eea50e959eeb9da53d70cad8d43c19494ef0
1#include "config.h"
2
3#include <sys/types.h>
4#include "ptrace.h"
5#include "common.h"
6
7void *
8get_instruction_pointer(Process *proc) {
9	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
10	if (a->valid)
11		return (void *)a->regs.r_pc;
12	return (void *)-1;
13}
14
15void
16set_instruction_pointer(Process *proc, void *addr) {
17	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
18	if (a->valid)
19		a->regs.r_pc = (long)addr;
20}
21
22void *
23get_stack_pointer(Process *proc) {
24	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
25	if (a->valid)
26		return (void *)a->regs.r_o6;
27	return (void *)-1;
28}
29
30void *
31get_return_addr(Process *proc, void *stack_pointer) {
32	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
33	unsigned int t;
34	if (!a->valid)
35		return (void *)-1;
36	/* Work around structure returns */
37	t = ptrace(PTRACE_PEEKTEXT, proc->pid, a->regs.r_o7 + 8, 0);
38	if (t < 0x400000)
39		return (void *)a->regs.r_o7 + 12;
40	return (void *)a->regs.r_o7 + 8;
41}
42
43void
44set_return_addr(Process *proc, void *addr) {
45	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
46	unsigned int t;
47	if (!a->valid)
48		return;
49	ptrace(PTRACE_POKETEXT, proc->pid, a->regs.r_o7 + 8, addr);
50}
51