Jakub Jelinek <jj@ultra.linux.cz>
John Hughes <john@Calva.COM>
Richard Braakman <dark@xs4all.nl>
+ Florian Lohoff <flo@rfc822.org>
+Sun Oct 31 22:03:00 CET 1999 Wichert Akkerman <wakkerma@debian.org>
+
+ * Merge Linux mips patch from Florian Lohoff <flo@rfc822.org>
+
Mon Oct 11 00:36:25 CEST 1999 Wichert Akkerman <wakkerma@debian.org>
* Merge patch from Keith Owens <kaos@ocs.com.au> to sys_query_module
sparc)
arch=sparc
;;
-mips)
+mips*)
arch=mips
;;
alpha*)
#define PTRACE_POKEUSER PTRACE_POKEUSR
#endif
#ifdef ALPHA
-#define REG_R0 0
-#define REG_A0 16
-#define REG_A3 19
-#define REG_FP 30
-#define REG_PC 64
+# define REG_R0 0
+# define REG_A0 16
+# define REG_A3 19
+# define REG_FP 30
+# define REG_PC 64
#endif /* ALPHA */
+#ifdef MIPS
+# define REG_V0 2
+# define REG_A0 4
+# define REG_A3 7
+# define REG_SP 29
+# define REG_EPC 64
+#endif /* MIPS */
#endif /* LINUX */
#define SUPPORTED_PERSONALITIES 1
#
srcdir = @srcdir@
-VPATH = $(srcdir)
+VPATH = @srcdir@
CC = @CC@
CPP = @CPP@
#
srcdir = @srcdir@
-VPATH = $(srcdir)
+VPATH = @srcdir@
CC = @CC@
CPP = @CPP@
#
srcdir = @srcdir@
-VPATH = $(srcdir)
+VPATH = @srcdir@
CC = @CC@
CPP = @CPP@
#
srcdir = @srcdir@
-VPATH = $(srcdir)
+VPATH = @srcdir@
CC = @CC@
CPP = @CPP@
int sys_query_module();
int sys_poll();
-#ifndef ALPHA
+#if !defined(ALPHA) && !defined(MIPS)
#ifdef POWERPC
# define SYS_socket_subcall 256
#else
int sys_msgsnd(), sys_msgrcv(), sys_msgget(), sys_msgctl();
int sys_shmat(), sys_shmdt(), sys_shmget(), sys_shmctl();
-#ifndef ALPHA
+#if !defined(ALPHA) && !defined(MIPS)
#ifdef POWERPC
# define SYS_ipc_subcall ((SYS_socket_subcall)+(SYS_socket_nsubcalls))
#else
struct tcb *tcp;
{
#ifdef LINUX
-# if defined(ALPHA) || defined(sparc) || defined(POWERPC)
+# if defined(ALPHA) || defined(sparc) || defined(POWERPC) || defined(MIPS)
long *u_arg = tcp->u_arg;
# else /* !ALPHA */
long u_arg[6];
#endif /* !LINUX */
if (entering(tcp)) {
-#if defined(LINUX) && !defined(ALPHA) && !defined(sparc) && !defined(POWERPC)
+#if defined(LINUX) && !defined(ALPHA) && !defined(sparc) && !defined(POWERPC) && !defined(MIPS)
if (umoven(tcp, tcp->u_arg[0], sizeof u_arg,
(char *) u_arg) == -1)
return 0;
{ 4*PT_PC, "4*PT_PC" },
#endif /* M68K */
#endif /* !I386 */
+#ifndef MIPS
{ uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
+#endif
#ifdef I386
{ uoff(i387), "offsetof(struct user, i387)" },
#else /* !I386 */
{ uoff(start_code), "offsetof(struct user, start_code)" },
{ uoff(start_stack), "offsetof(struct user, start_stack)" },
{ uoff(signal), "offsetof(struct user, signal)" },
+#ifndef MIPS
{ uoff(reserved), "offsetof(struct user, reserved)" },
+#endif
{ uoff(u_ar0), "offsetof(struct user, u_ar0)" },
-#ifndef ARM
+#if !defined(ARM) && !defined(MIPS)
{ uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
#endif
{ uoff(magic), "offsetof(struct user, magic)" },
return RVAL_NONE | RVAL_STR;
}
return 0;
+#else
+#ifdef MIPS
+ long sp;
+ struct sigcontext sc;
+
+ if(entering(tcp)) {
+ tcp->u_arg[0] = 0;
+ if (upeek(tcp->pid, REG_SP, &sp) < 0)
+ return 0;
+ if (umove(tcp, sp, &sc) < 0)
+ return 0;
+ tcp->u_arg[0] = 1;
+ tcp->u_arg[1] = sc.sc_sigset;
+ } else {
+ tcp->u_rval = tcp->u_error = 0;
+ if(tcp->u_arg[0] == 0)
+ return 0;
+ tcp->auxstr = sprintsigmask("mask now ", tcp->u_arg[1]);
+ return RVAL_NONE | RVAL_STR;
+ }
+ return 0;
+#endif /* MIPS */
#endif /* SPARC */
#endif /* ALPHA */
#endif /* !M68K */
#
srcdir = @srcdir@
-VPATH = $(srcdir)
+VPATH = @srcdir@
CC = @CC@
CPP = @CPP@
#
srcdir = @srcdir@
-VPATH = $(srcdir)
+VPATH = @srcdir@
CC = @CC@
CPP = @CPP@
enum subcall_style { shift_style, deref_style, mask_style, door_style };
-#if !(defined(LINUX) && defined(ALPHA))
+#if !(defined(LINUX) && ( defined(ALPHA) || defined(MIPS) ))
const int socket_map [] = {
/* SYS_SOCKET */ 97,
#elif defined (ALPHA)
long r0;
long a3;
+#elif defined(MIPS)
+ long r2,a3;
#elif defined (SPARC)
struct regs regs;
unsigned long trap;
#elif defined (M68K)
if (upeek(pid, 4*PT_ORIG_D0, &scno) < 0)
return -1;
+#elif defined (MIPS)
+ if (upeek(pid, REG_A3, &a3) < 0)
+ return -1;
+
+ if(!(tcp->flags & TCB_INSYSCALL)) {
+ if (upeek(pid, REG_V0, &scno) < 0)
+ return -1;
+
+ if (scno < 0 || scno > nsyscalls) {
+ if(a3 == 0 || a3 == -1) {
+ if(debug)
+ fprintf (stderr, "stray syscall exit: v0 = %ld\n", scno);
+ return 0;
+ }
+ }
+ } else {
+ if (upeek(pid, REG_V0, &r2) < 0)
+ return -1;
+ }
#elif defined (ALPHA)
if (upeek(pid, REG_A3, &a3) < 0)
return -1;
u_error = 0;
}
#else /* !I386 */
+#ifdef MIPS
+ if (a3) {
+ tcp->u_rval = -1;
+ u_error = r2;
+ } else {
+ tcp->u_rval = r2;
+ u_error = 0;
+ }
+#else
#ifdef POWERPC
if (result && (unsigned) -result < nerrnos) {
tcp->u_rval = -1;
#endif /* ARM */
#endif /* M68K */
#endif /* POWERPC */
+#endif /* MIPS */
#endif /* I386 */
#endif /* LINUX */
#ifdef SUNOS4
return -1;
}
}
+#elif defined (MIPS)
+ {
+ long sp;
+ int i, nargs;
+
+ nargs = tcp->u_nargs = sysent[tcp->scno].nargs;
+ if(nargs > 4) {
+ if(upeek(pid, REG_SP, &sp) < 0)
+ return -1;
+ for(i = 0; i < 4; i++) {
+ if (upeek(pid, REG_A0 + i, &tcp->u_arg[i])<0)
+ return -1;
+ }
+ umoven(tcp, sp+16, (nargs-4) * sizeof(tcp->u_arg[0]),
+ (char *)(tcp->u_arg + 4));
+ } else {
+ for(i = 0; i < nargs; i++) {
+ if (upeek(pid, REG_A0 + i, &tcp->u_arg[i]) < 0)
+ return -1;
+ }
+ }
+ }
#elif defined (POWERPC)
{
int i;
switch (tcp->scno) {
#endif
#ifdef LINUX
-#if !defined (ALPHA) && !defined(SPARC)
+#if !defined (ALPHA) && !defined(SPARC) && !defined(MIPS)
case SYS_socketcall:
decode_subcall(tcp, SYS_socket_subcall,
SYS_socket_nsubcalls, deref_style);
#ifdef LINUX
long pc;
-#ifdef I386
+#if defined(I386)
if (upeek(tcp->pid, 4*EIP, &pc) < 0)
return -1;
-#else /* !I386 */
-#ifdef ARM
+#elif defined(ARM)
if (upeek(tcp->pid, 4*15, &pc) < 0)
return -1;
-#else /* !ARM */
-#ifdef POWERPC
+#elif defined(POWERPC)
if (upeek(tcp->pid, 4*PT_NIP, &pc) < 0)
return -1;
-#else
-#ifdef M68K
+#elif defined(M68k)
if (upeek(tcp->pid, 4*PT_PC, &pc) < 0)
return -1;
-#else /* !M68K */
-#ifdef ALPHA
+#elif defined(ALPHA)
if (upeek(tcp->pid, REG_PC, &pc) < 0)
return -1;
-#else /* !ALPHA */
-#ifdef SPARC
+#elif defined(MIPS)
+ if (upeek(tcp->pid, REG_EPC, &pc) < 0)
+ return -1;
+#elif defined(SPARC)
struct regs regs;
if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0)
return -1;
pc = regs.r_pc;
-#endif /* SPARC */
-#endif /* ALPHA */
-#endif /* !M68K */
-#endif /* !POWERPC */
-#endif /* !ARM */
-#endif /* !I386 */
+#endif
return pc;
#endif /* LINUX */
#define LOOP 0x0000feeb
#elif defined(ARM)
#define LOOP -1 /* almost certainly wrong, jws */
+#elif defined(MIPS)
+#define LOOP 0x1000ffff
#else
#error unknown architecture
#endif
return -1;
#elif defined (ARM)
return -1;
+#elif defined (MIPS)
+ return -1; /* FIXME: I do not know what i do - Flo */
#elif defined (POWERPC)
if (upeek(tcp->pid, 4*PT_NIP, &tcp->baddr) < 0)
return -1;