Add support for the OpenRISC 1000 platform

* configure.ac: Added or1k architecture..
* defs.h: Added or1k to use register reading system.
* linux/or1k/ioctlent.h.in: Use i386 ioctls.
* linux/or1k/syscallent.h: New file.
* process.c: Added or1k register defs to struct_user_offsets[].
* syscall.c: Added or1k_io iovec for or1k GETREGSET,
  regset structure for or1k.
  (printcall): Added handling for or1k.
  (get_regs): Likewise.
  (get_scno): Likewise.
  (get_syscall_args): Likewise.
  (get_syscall_result): Likewise.
  (get_error): Likewise.
* util.c (change_syscall): Added dummy handling for or1k.
* system.c (sys_or1k_atomic): New function (or1k specific syscall).

Signed-off-by: Christian Svensson <blue@cmd.nu>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/syscall.c b/syscall.c
index b0104d0..7e5cff0 100644
--- a/syscall.c
+++ b/syscall.c
@@ -78,6 +78,11 @@
 # include <elf.h>
 #endif
 
+#if defined(OR1K)
+# include <sys/uio.h>
+# include <elf.h>
+#endif
+
 #ifndef ERESTARTSYS
 # define ERESTARTSYS	512
 #endif
@@ -746,6 +751,11 @@
 struct pt_regs tile_regs;
 #elif defined(MICROBLAZE)
 static long microblaze_r3;
+#elif defined(OR1K)
+static struct user_regs_struct or1k_regs;
+static struct iovec or1k_io = {
+	.iov_base = &or1k_regs
+};
 #endif
 
 void
@@ -890,6 +900,8 @@
 # else
 	tprintf("[%08lx] ", (unsigned long) tile_regs.pc);
 # endif
+#elif defined(OR1K)
+	tprintf("[%08lx] ", or1k_regs.pc);
 #endif /* architecture */
 }
 
@@ -962,6 +974,9 @@
 	get_regs_error = ptrace(PTRACE_GETREGS, pid, (char *)&regs, 0);
 # elif defined(TILE)
 	get_regs_error = ptrace(PTRACE_GETREGS, pid, NULL, (long) &tile_regs);
+# elif defined(OR1K)
+	or1k_io.iov_len = sizeof(or1k_regs);
+	get_regs_error = ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &or1k_io);
 # endif
 }
 #endif
@@ -1419,6 +1434,8 @@
 #elif defined(MICROBLAZE)
 	if (upeek(tcp, 0, &scno) < 0)
 		return -1;
+#elif defined(OR1K)
+	scno = or1k_regs.gpr[11];
 #endif
 
 	tcp->scno = scno;
@@ -1800,6 +1817,10 @@
 	tcp->u_arg[3] = i386_regs.esi;
 	tcp->u_arg[4] = i386_regs.edi;
 	tcp->u_arg[5] = i386_regs.ebp;
+#elif defined(OR1K)
+	(void)nargs;
+	for (i = 0; i < 6; ++i)
+		tcp->u_arg[i] = or1k_regs.gpr[3 + i];
 #else /* Other architecture (32bits specific) */
 	for (i = 0; i < nargs; ++i)
 		if (upeek(tcp, i*4, &tcp->u_arg[i]) < 0)
@@ -1994,6 +2015,8 @@
 #elif defined(MICROBLAZE)
 	if (upeek(tcp, 3 * 4, &microblaze_r3) < 0)
 		return -1;
+#elif defined(OR1K)
+	/* already done by get_regs */
 #endif
 	return 1;
 }
@@ -2277,6 +2300,14 @@
 	else {
 		tcp->u_rval = microblaze_r3;
 	}
+#elif defined(OR1K)
+	if (check_errno && is_negated_errno(or1k_regs.gpr[11])) {
+		tcp->u_rval = -1;
+		u_error = -or1k_regs.gpr[11];
+	}
+	else {
+		tcp->u_rval = or1k_regs.gpr[11];
+	}
 #endif
 	tcp->u_error = u_error;
 	return 1;