regs.c revision f13505251e6402460f6cc7ec84e0d8ca91607b4f
1#if HAVE_CONFIG_H
2#include "config.h"
3#endif
4
5#include <sys/types.h>
6#include <sys/ptrace.h>
7#include <asm/ptrace.h>
8
9#include "ltrace.h"
10
11#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR))
12# define PTRACE_PEEKUSER PTRACE_PEEKUSR
13#endif
14
15#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR))
16# define PTRACE_POKEUSER PTRACE_POKEUSR
17#endif
18
19void *
20get_instruction_pointer(struct process *proc) {
21	return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, sizeof(long) * PT_NIP,
22			      0);
23}
24
25void
26set_instruction_pointer(struct process *proc, void *addr) {
27	ptrace(PTRACE_POKEUSER, proc->pid, sizeof(long) * PT_NIP, addr);
28}
29
30void *
31get_stack_pointer(struct process *proc) {
32	return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, sizeof(long) * PT_R1,
33			      0);
34}
35
36void *
37get_return_addr(struct process *proc, void *stack_pointer) {
38	return (void *)ptrace(PTRACE_PEEKUSER, proc->pid, sizeof(long) * PT_LNK,
39			      0);
40}
41
42/* Grab the value of CTR registers.  */
43void *
44get_count_register (struct process *proc) {
45	return (void *) ptrace (PTRACE_PEEKUSER, proc->pid,
46				sizeof (long) * PT_CTR, 0);
47}
48