regs.c revision a7af00db2231e99a4506e4f5587f9dd00b9d1175
1#include "config.h"
2
3#include <sys/types.h>
4#include <sys/ptrace.h>
5
6#include <asm/ptrace_offsets.h>
7#include <asm/rse.h>
8
9#include <stddef.h>
10#include "common.h"
11
12void *
13get_instruction_pointer(Process *proc) {
14	unsigned long ip = ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IIP, 0);
15	unsigned long slot =
16	    (ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IPSR, 0) >> 41) & 3;
17
18	return (void *)(ip | slot);
19}
20
21void
22set_instruction_pointer(Process *proc, void *addr) {
23
24	unsigned long newip = (unsigned long)addr;
25	unsigned long slot = (unsigned long)addr & 0xf;
26	unsigned long psr = ptrace(PTRACE_PEEKUSER, proc->pid, PT_CR_IPSR, 0);
27
28	psr &= ~(3UL << 41);
29	psr |= (slot & 0x3) << 41;
30
31	newip &= ~0xfUL;
32
33	ptrace(PTRACE_POKEUSER, proc->pid, PT_CR_IIP, (long)newip);
34	ptrace(PTRACE_POKEUSER, proc->pid, PT_CR_IPSR, psr);
35}
36
37void *
38get_stack_pointer(Process *proc) {
39	return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, PT_R12, 0);
40}
41
42void *
43get_return_addr(Process *proc, void *stack_pointer) {
44	return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, PT_B0, 0);
45}
46
47void
48set_return_addr(Process *proc, void *addr) {
49	ptrace(PTRACE_POKEUSER, proc->pid, PT_B0, addr);
50}
51