regs.c revision f670eea50e959eeb9da53d70cad8d43c19494ef0
1/*
2** S/390 version
3** Copyright (C) 2001 IBM Poughkeepsie, IBM Corporation
4*/
5
6#include "config.h"
7
8#include <sys/types.h>
9#include <sys/ptrace.h>
10#include <asm/ptrace.h>
11
12#include "common.h"
13
14#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR))
15# define PTRACE_PEEKUSER PTRACE_PEEKUSR
16#endif
17
18#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR))
19# define PTRACE_POKEUSER PTRACE_POKEUSR
20#endif
21
22#ifdef __s390x__
23#define PSW_MASK	0xffffffffffffffff
24#define PSW_MASK31	0x7fffffff
25#else
26#define PSW_MASK	0x7fffffff
27#endif
28
29void *
30get_instruction_pointer(Process *proc) {
31	long ret = ptrace(PTRACE_PEEKUSER, proc->pid, PT_PSWADDR, 0) & PSW_MASK;
32#ifdef __s390x__
33	if (proc->mask_32bit)
34		ret &= PSW_MASK31;
35#endif
36	return (void *)ret;
37}
38
39void
40set_instruction_pointer(Process *proc, void *addr) {
41#ifdef __s390x__
42	if (proc->mask_32bit)
43		addr = (void *)((long)addr & PSW_MASK31);
44#endif
45	ptrace(PTRACE_POKEUSER, proc->pid, PT_PSWADDR, addr);
46}
47
48void *
49get_stack_pointer(Process *proc) {
50	long ret = ptrace(PTRACE_PEEKUSER, proc->pid, PT_GPR15, 0) & PSW_MASK;
51#ifdef __s390x__
52	if (proc->mask_32bit)
53		ret &= PSW_MASK31;
54#endif
55	return (void *)ret;
56}
57
58void *
59get_return_addr(Process *proc, void *stack_pointer) {
60	long ret = ptrace(PTRACE_PEEKUSER, proc->pid, PT_GPR14, 0) & PSW_MASK;
61#ifdef __s390x__
62	if (proc->mask_32bit)
63		ret &= PSW_MASK31;
64#endif
65	return (void *)ret;
66}
67
68void
69set_return_addr(Process *proc, void *addr) {
70#ifdef __s390x__
71	if (proc->mask_32bit)
72		addr = (void *)((long)addr & PSW_MASK31);
73#endif
74	ptrace(PTRACE_POKEUSER, proc->pid, PT_GPR14, addr);
75}
76