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