#define DEFAULT_PERSONALITY 0
#ifdef LINUXSPARC
+/* Indexes into the pt_regs.u_reg[] array -- UREG_XX from kernel are all off
+ * by 1 and use Ix instead of Ox. These work for both 32 and 64 bit Linux. */
+#define U_REG_G1 0
+#define U_REG_O0 7
+#define U_REG_O1 8
#define PERSONALITY0_WORDSIZE 4
#define PERSONALITY1_WORDSIZE 4
#undef SUPPORTED_PERSONALITIES
#include <sys/ptrace.h>
#endif
-#if HAVE_ASM_REG_H
-#if defined (SPARC) || defined (SPARC64)
-# define fpq kernel_fpq
-# define fq kernel_fq
-# define fpu kernel_fpu
-#endif /* SPARC || SPARC64 */
-#include <asm/reg.h>
-#if defined (SPARC) || defined (SPARC64)
-# undef fpq
-# undef fq
-# undef fpu
-#endif /* SPARC || SPARC64 */
-#endif /* HAVE_ASM_REG_H */
-
#ifdef HAVE_SYS_REG_H
# include <sys/reg.h>
#ifndef PTRACE_PEEKUSR
return -1;
return 0;
#elif defined(SPARC) || defined(SPARC64)
- struct regs regs;
+ struct pt_regs regs;
if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)®s, 0)<0)
return -1;
- regs.r_g1=new;
+ regs.u_regs[U_REG_G1] = new;
if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)®s, 0)<0)
return -1;
return 0;
# include <asm/ptrace_offsets.h>
#endif /* !IA64 */
-#if HAVE_ASM_REG_H
-# if defined (SPARC) || defined (SPARC64)
-# define fpq kernel_fpq
-# define fq kernel_fq
-# define fpu kernel_fpu
-# endif
-# include <asm/reg.h>
-# if defined (SPARC) || defined (SPARC64)
-# undef fpq
-# undef fq
-# undef fpu
-# endif
#if defined (LINUX) && defined (SPARC64)
-# define r_pc r_tpc
# undef PTRACE_GETREGS
# define PTRACE_GETREGS PTRACE_GETREGS64
# undef PTRACE_SETREGS
# define PTRACE_SETREGS PTRACE_SETREGS64
#endif /* LINUX && SPARC64 */
-#endif /* HAVE_ASM_REG_H */
-#if defined (SPARC) || defined (SPARC64)
-typedef struct {
- struct regs si_regs;
- int si_mask;
-} m_siginfo_t;
-#elif defined (MIPS)
+#if defined (SPARC) || defined (SPARC64) || defined (MIPS)
typedef struct {
struct pt_regs si_regs;
int si_mask;
return 0;
#elif defined (SPARC) || defined (SPARC64)
long i1;
- struct regs regs;
+ struct pt_regs regs;
m_siginfo_t si;
if(ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
}
if(entering(tcp)) {
tcp->u_arg[0] = 0;
- i1 = regs.r_o1;
+ i1 = regs.u_regs[U_REG_O1];
if(umove(tcp, i1, &si) < 0) {
perror("sigreturn: umove ");
return 0;
#include <sys/syscall.h>
#include <sys/param.h>
-#if HAVE_ASM_REG_H
-#if defined (SPARC) || defined (SPARC64)
-# define fpq kernel_fpq
-# define fq kernel_fq
-# define fpu kernel_fpu
-#endif
-#include <asm/reg.h>
-#if defined (SPARC) || defined (SPARC64)
-# undef fpq
-# undef fq
-# undef fpu
-#endif
-#endif
-
#ifdef HAVE_SYS_REG_H
#include <sys/reg.h>
#ifndef PTRACE_PEEKUSR
#endif
#if defined (LINUX) && defined (SPARC64)
-# define r_pc r_tpc
# undef PTRACE_GETREGS
# define PTRACE_GETREGS PTRACE_GETREGS64
# undef PTRACE_SETREGS
#elif defined(AVR32)
static struct pt_regs regs;
#elif defined (SPARC) || defined (SPARC64)
- static struct regs regs;
+ static struct pt_regs regs;
static unsigned long trap;
#elif defined(LINUX_MIPSN32)
static long long a3;
if (!(tcp->flags & TCB_INSYSCALL)) {
/* Retrieve the syscall trap instruction. */
errno = 0;
- trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.r_pc, 0);
# if defined(SPARC64)
+ trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.tpc, 0);
trap >>= 32;
+# else
+ trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.pc, 0);
# endif
if (errno)
return -1;
return 0;
}
# if defined (SPARC64)
- fprintf(stderr,"syscall: unknown syscall trap %08lx %016lx\n", trap, regs.r_tpc);
+ fprintf(stderr,"syscall: unknown syscall trap %08lx %016lx\n", trap, regs.tpc);
# else
- fprintf(stderr,"syscall: unknown syscall trap %08x %08x\n", trap, regs.r_pc);
+ fprintf(stderr,"syscall: unknown syscall trap %08lx %08lx\n", trap, regs.pc);
# endif
return -1;
}
if (trap == 0x91d02027)
scno = 156;
else
- scno = regs.r_g1;
+ scno = regs.u_regs[U_REG_G1];
if (scno == 0) {
- scno = regs.r_o0;
- memmove (®s.r_o0, ®s.r_o1, 7*sizeof(regs.r_o0));
+ scno = regs.u_regs[U_REG_O0];
+ memmove (®s.u_regs[U_REG_O0], ®s.u_regs[U_REG_O1], 7*sizeof(regs.u_regs[0]));
}
}
# elif defined(HPPA)
u_error = 0;
}
# elif defined(SPARC)
- if (regs.r_psr & PSR_C) {
+ if (regs.psr & PSR_C) {
tcp->u_rval = -1;
- u_error = regs.r_o0;
+ u_error = regs.u_regs[U_REG_O0];
}
else {
- tcp->u_rval = regs.r_o0;
+ tcp->u_rval = regs.u_regs[U_REG_O0];
u_error = 0;
}
# elif defined(SPARC64)
- if (regs.r_tstate & 0x1100000000UL) {
+ if (regs.tstate & 0x1100000000UL) {
tcp->u_rval = -1;
- u_error = regs.r_o0;
+ u_error = regs.u_regs[U_REG_O0];
}
else {
- tcp->u_rval = regs.r_o0;
+ tcp->u_rval = regs.u_regs[U_REG_O0];
u_error = 0;
}
# elif defined(HPPA)
if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0)
return -1;
if (error) {
- regs.r_psr |= PSR_C;
- regs.r_o0 = error;
+ regs.psr |= PSR_C;
+ regs.u_regs[U_REG_O0] = error;
}
else {
- regs.r_psr &= ~PSR_C;
- regs.r_o0 = rval;
+ regs.psr &= ~PSR_C;
+ regs.u_regs[U_REG_O0] = rval;
}
if (ptrace(PTRACE_SETREGS, tcp->pid, (char *)®s, 0) < 0)
return -1;
if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0)
return -1;
if (error) {
- regs.r_tstate |= 0x1100000000UL;
- regs.r_o0 = error;
+ regs.tstate |= 0x1100000000UL;
+ regs.u_regs[U_REG_O0] = error;
}
else {
- regs.r_tstate &= ~0x1100000000UL;
- regs.r_o0 = rval;
+ regs.tstate &= ~0x1100000000UL;
+ regs.u_regs[U_REG_O0] = rval;
}
if (ptrace(PTRACE_SETREGS, tcp->pid, (char *)®s, 0) < 0)
return -1;
else
tcp->u_nargs = MAX_ARGS;
for (i = 0; i < tcp->u_nargs; i++)
- tcp->u_arg[i] = *((®s.r_o0) + i);
+ tcp->u_arg[i] = regs.u_regs[U_REG_O0 + i];
}
#elif defined (HPPA)
{
#ifdef LINUX
#if defined (SPARC) || defined (SPARC64)
- struct regs regs;
+ struct pt_regs regs;
if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0)
return -1;
- val = regs.r_o1;
+ val = regs.u_regs[U_REG_O1];
#elif defined(SH)
if (upeek(tcp, 4*(REG_REG0+1), &val) < 0)
return -1;
#include <sys/utsname.h>
#endif /* SUNOS4_KERNEL_ARCH_KLUDGE */
-#if defined(LINUXSPARC)
-
-# define fpq kernel_fpq
-# define fq kernel_fq
-# define fpu kernel_fpu
-# include <asm/reg.h>
-# undef fpq
-# undef fq
-# undef fpu
-
-#if defined (SPARC64)
-# define r_pc r_tpc
+#if defined(LINUXSPARC) && defined (SPARC64)
# undef PTRACE_GETREGS
# define PTRACE_GETREGS PTRACE_GETREGS64
# undef PTRACE_SETREGS
# define PTRACE_SETREGS PTRACE_SETREGS64
-#endif /* SPARC64 */
-
-#if !defined(__GLIBC__)
-
-#include <linux/unistd.h>
-
-#define _hack_syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,\
- type5,arg5,syscall) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
-{ \
- long __res; \
-\
-__asm__ volatile ("or %%g0, %1, %%o0\n\t" \
- "or %%g0, %2, %%o1\n\t" \
- "or %%g0, %3, %%o2\n\t" \
- "or %%g0, %4, %%o3\n\t" \
- "or %%g0, %5, %%o4\n\t" \
- "or %%g0, %6, %%g1\n\t" \
-#if defined (SPARC64)
- "t 0x6d\n\t" \
-#else
- "t 0x10\n\t" \
-#endif
- "bcc 1f\n\t" \
- "or %%g0, %%o0, %0\n\t" \
- "sub %%g0, %%o0, %0\n\t" \
- "1:\n\t" \
- : "=r" (__res) \
- : "0" ((long)(arg1)),"1" ((long)(arg2)), \
- "2" ((long)(arg3)),"3" ((long)(arg4)),"4" ((long)(arg5)), \
- "i" (__NR_##syscall) \
- : "g1", "o0", "o1", "o2", "o3", "o4"); \
-if (__res>=0) \
- return (type) __res; \
-errno = -__res; \
-return -1; \
-}
-
-static _hack_syscall5(int,_ptrace,int,__request,int,__pid,int,__addr,int,__data,int,__addr2,ptrace)
-
-#define _ptrace
-
-#endif
-
#endif
/* macros */
if (upeek(tcp, REG_EPC, &pc) < 0)
return -1;
# elif defined(SPARC) || defined(SPARC64)
- struct regs regs;
+ struct pt_regs regs;
if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0)
return -1;
- pc = regs.r_pc;
+# if defined(SPARC64)
+ pc = regs.tpc;
+# else
+ pc = regs.pc;
+# endif
# elif defined(S390) || defined(S390X)
if(upeek(tcp,PT_PSWADDR,&pc) < 0)
return -1;
}
tprintf("[%08lx] ", pc);
# elif defined(SPARC) || defined(SPARC64)
- struct regs regs;
+ struct pt_regs regs;
if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0) {
PRINTBADPC;
return;
}
- tprintf("[%08lx] ", regs.r_pc);
+# if defined(SPARC64)
+ tprintf("[%08lx] ", regs.tpc);
+# else
+ tprintf("[%08lx] ", regs.pc);
+# endif
# elif defined(HPPA)
long pc;
# elif defined (SPARC) || defined (SPARC64)
-typedef struct regs arg_setup_state;
+typedef struct pt_regs arg_setup_state;
# define arg_setup(tcp, state) \
(ptrace (PTRACE_GETREGS, tcp->pid, (char *) (state), 0))
# define arg_finish_change(tcp, state) \
(ptrace (PTRACE_SETREGS, tcp->pid, (char *) (state), 0))
-# define get_arg0(tcp, state, valp) (*(valp) = (state)->r_o0, 0)
-# define get_arg1(tcp, state, valp) (*(valp) = (state)->r_o1, 0)
-# define set_arg0(tcp, state, val) ((state)->r_o0 = (val), 0)
-# define set_arg1(tcp, state, val) ((state)->r_o1 = (val), 0)
+# define get_arg0(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O0], 0)
+# define get_arg1(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O1], 0)
+# define set_arg0(tcp, state, val) ((state)->u_regs[U_REG_O0] = (val), 0)
+# define set_arg1(tcp, state, val) ((state)->u_regs[U_REG_O1] = (val), 0)
# define restore_arg0(tcp, state, val) 0
# else /* other architectures */