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