aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/linux-gnu/sparc/regs.c
blob: 17ffd9ee92c07315337beeb17fffc9e219d2aab1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#if HAVE_CONFIG_H
#include "config.h"
#endif

#include <sys/types.h>
#include "ptrace.h"
#include "ltrace.h"

void *
get_instruction_pointer(Process *proc) {
	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
	if (a->valid)
		return (void *)a->regs.r_pc;
	return (void *)-1;
}

void
set_instruction_pointer(Process *proc, void *addr) {
	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
	if (a->valid)
		a->regs.r_pc = (long)addr;
}

void *
get_stack_pointer(Process *proc) {
	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
	if (a->valid)
		return (void *)a->regs.r_o6;
	return (void *)-1;
}

void *
get_return_addr(Process *proc, void *stack_pointer) {
	proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
	unsigned int t;
	if (!a->valid)
		return (void *)-1;
	/* Work around structure returns */
	t = ptrace(PTRACE_PEEKTEXT, proc->pid, a->regs.r_o7 + 8, 0);
	if (t < 0x400000)
		return (void *)a->regs.r_o7 + 12;
	return (void *)a->regs.r_o7 + 8;
}