regs.c revision 3458456ffbf0b6d85e1818dea7cbeacc8b1d2298
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.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.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.u_regs[UREG_I5];
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.u_regs[UREG_I6] + 8, 0);
38	if (t < 0x400000)
39		return (void *)a->regs.u_regs[UREG_I6] + 12;
40	return (void *)a->regs.u_regs[UREG_I6] + 8;
41}
42
43void
44set_return_addr(Process *proc, void *addr) {
45	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
46	if (!a->valid)
47		return;
48	ptrace(PTRACE_POKETEXT, proc->pid, a->regs.u_regs[UREG_I6] + 8, addr);
49}
50