regs.c revision 366c2f46d844f040458df9b7e35fc3b8527ed2d3
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 "proc.h"
13#include "common.h"
14
15#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR))
16# define PTRACE_PEEKUSER PTRACE_PEEKUSR
17#endif
18
19#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR))
20# define PTRACE_POKEUSER PTRACE_POKEUSR
21#endif
22
23#ifdef __s390x__
24#define PSW_MASK	0xffffffffffffffff
25#define PSW_MASK31	0x7fffffff
26#else
27#define PSW_MASK	0x7fffffff
28#endif
29
30void *
31get_instruction_pointer(Process *proc) {
32	long ret = ptrace(PTRACE_PEEKUSER, proc->pid, PT_PSWADDR, 0) & PSW_MASK;
33#ifdef __s390x__
34	if (proc->mask_32bit)
35		ret &= PSW_MASK31;
36#endif
37	return (void *)ret;
38}
39
40void
41set_instruction_pointer(Process *proc, void *addr) {
42#ifdef __s390x__
43	if (proc->mask_32bit)
44		addr = (void *)((long)addr & PSW_MASK31);
45#endif
46	ptrace(PTRACE_POKEUSER, proc->pid, PT_PSWADDR, addr);
47}
48
49void *
50get_stack_pointer(Process *proc) {
51	long ret = ptrace(PTRACE_PEEKUSER, proc->pid, PT_GPR15, 0) & PSW_MASK;
52#ifdef __s390x__
53	if (proc->mask_32bit)
54		ret &= PSW_MASK31;
55#endif
56	return (void *)ret;
57}
58
59void *
60get_return_addr(Process *proc, void *stack_pointer) {
61	long ret = ptrace(PTRACE_PEEKUSER, proc->pid, PT_GPR14, 0) & PSW_MASK;
62#ifdef __s390x__
63	if (proc->mask_32bit)
64		ret &= PSW_MASK31;
65#endif
66	return (void *)ret;
67}
68
69void
70set_return_addr(Process *proc, void *addr) {
71#ifdef __s390x__
72	if (proc->mask_32bit)
73		addr = (void *)((long)addr & PSW_MASK31);
74#endif
75	ptrace(PTRACE_POKEUSER, proc->pid, PT_GPR14, addr);
76}
77