--- defs.h.orig 2010-05-31 22:01:53.000000000 +0000 +++ defs.h 2010-05-31 23:29:27.000000000 +0000 @@ -211,6 +211,11 @@ #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 --- syscall.c.orig 2010-05-31 21:28:11.000000000 +0000 +++ syscall.c 2010-06-01 00:17:38.000000000 +0000 @@ -42,20 +42,6 @@ #include #include -#if HAVE_ASM_REG_H -#if defined (SPARC) || defined (SPARC64) -# define fpq kernel_fpq -# define fq kernel_fq -# define fpu kernel_fpu -#endif -#include -#if defined (SPARC) || defined (SPARC64) -# undef fpq -# undef fq -# undef fpu -#endif -#endif - #ifdef HAVE_SYS_REG_H #include #ifndef PTRACE_PEEKUSR @@ -75,7 +61,7 @@ #endif #if defined (LINUX) && defined (SPARC64) -# define r_pc r_tpc +# define FIXMEr_pc r_tpc # undef PTRACE_GETREGS # define PTRACE_GETREGS PTRACE_GETREGS64 # undef PTRACE_SETREGS @@ -752,7 +738,7 @@ static long r0; static long a3; #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; @@ -1165,9 +1151,11 @@ if (!(tcp->flags & TCB_INSYSCALL)) { /* Retrieve the syscall trap instruction. */ errno = 0; - trap = ptrace(PTRACE_PEEKTEXT,pid,(char *)regs.r_pc,0); #if defined(SPARC64) + trap = ptrace(PTRACE_PEEKTEXT,pid,(char *)regs.tpc,0); trap >>= 32; +#else + trap = ptrace(PTRACE_PEEKTEXT,pid,(char *)regs.pc,0); #endif if (errno) return -1; @@ -1205,9 +1193,9 @@ 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 %08x %08x\n", trap, regs.pc); #endif return -1; } @@ -1216,10 +1204,10 @@ 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) @@ -1599,22 +1587,22 @@ } #else /* !ALPHA */ #ifdef 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; } #else /* !SPARC */ #ifdef 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; } #else /* !SPARC64 */ @@ -1837,12 +1825,12 @@ 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; @@ -1851,12 +1839,12 @@ 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; @@ -2090,7 +2078,7 @@ 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) { @@ -2577,10 +2565,10 @@ #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->pid, 4*(REG_REG0+1), &val) < 0) return -1; --- util.c.orig 2010-06-01 00:18:31.000000000 +0000 +++ util.c 2010-06-01 00:44:32.000000000 +0000 @@ -80,63 +80,10 @@ #if defined(LINUXSPARC) -# define fpq kernel_fpq -# define fq kernel_fq -# define fpu kernel_fpu -# include -# undef fpq -# undef fq -# undef fpu - -#if defined (SPARC64) -# define r_pc r_tpc # undef PTRACE_GETREGS # define PTRACE_GETREGS PTRACE_GETREGS64 # undef PTRACE_SETREGS # define PTRACE_SETREGS PTRACE_SETREGS64 -#endif /* SPARC64 */ - -#if !defined(__GLIBC__) - -#include - -#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 @@ -1199,12 +1146,16 @@ } 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; @@ -1397,17 +1348,17 @@ #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 --- process.c.orig 2010-06-01 01:05:30.000000000 +0000 +++ process.c 2010-06-01 01:08:35.000000000 +0000 @@ -56,20 +56,6 @@ #include #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 -#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 #ifndef PTRACE_PEEKUSR @@ -695,10 +681,10 @@ 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; --- signal.c.orig 2010-06-01 01:09:58.000000000 +0000 +++ signal.c 2010-06-01 01:14:01.000000000 +0000 @@ -71,33 +71,14 @@ # include #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 -# 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; @@ -1405,7 +1386,7 @@ #else #if 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) { @@ -1414,7 +1395,7 @@ } 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;