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/configure.ac b/configure.ac
index 80be383..8703f7c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -111,6 +111,11 @@
 	arch=microblaze
 	AC_DEFINE([MICROBLAZE], 1, [Define for the MicroBlaze architecture.])
 	;;
+or1k*)
+	arch=or1k
+	AC_DEFINE([OR1K], 1, [Define for the OpenRISC 1000 architecture.])
+	;;
+
 *)
 	AC_MSG_RESULT([NO!])
 	AC_MSG_ERROR([architecture $host_cpu is not supported by strace])
diff --git a/defs.h b/defs.h
index 8ea1aaa..82ffd84 100644
--- a/defs.h
+++ b/defs.h
@@ -138,6 +138,7 @@
     || defined(X86_64) \
     || defined(ARM) || defined(AARCH64) \
     || defined(AVR32) \
+    || defined(OR1K) \
     ) && defined(__GLIBC__)
 # include <sys/ptrace.h>
 #else
@@ -564,7 +565,8 @@
  || defined(AARCH64) \
  || defined(ARM) \
  || defined(SPARC) || defined(SPARC64) \
- || defined(TILE)
+ || defined(TILE) \
+ || defined(OR1K)
 extern long get_regs_error;
 # define clear_regs()  (get_regs_error = -1)
 extern void get_regs(pid_t pid);
diff --git a/linux/or1k/ioctlent.h.in b/linux/or1k/ioctlent.h.in
new file mode 100644
index 0000000..52ac99b
--- /dev/null
+++ b/linux/or1k/ioctlent.h.in
@@ -0,0 +1 @@
+#include "../i386/ioctlent.h.in"
diff --git a/linux/or1k/syscallent.h b/linux/or1k/syscallent.h
new file mode 100644
index 0000000..beb8b4b
--- /dev/null
+++ b/linux/or1k/syscallent.h
@@ -0,0 +1,260 @@
+	{  2,	0,	sys_io_setup,			"io_setup"		}, /* 0 */
+	{  1,	0,	sys_io_destroy,			"io_destroy"		}, /* 1 */
+	{  3,	0,	sys_io_submit,			"io_submit"		}, /* 2 */
+	{  3,	0,	sys_io_cancel,			"io_cancel"		}, /* 3 */
+	{  5,	0,	sys_io_getevents,		"io_getevents"		}, /* 4 */
+	{  5,	TF,	sys_setxattr,			"setxattr"		}, /* 5 */
+	{  5,	TF,	sys_setxattr,			"lsetxattr"		}, /* 6 */
+	{  5,	TD,	sys_fsetxattr,			"fsetxattr"		}, /* 7 */
+	{  4,	TF,	sys_getxattr,			"getxattr"		}, /* 8 */
+	{  4,	TF,	sys_getxattr,			"lgetxattr"		}, /* 9 */
+	{  4,	TD,	sys_fgetxattr,			"fgetxattr"		}, /* 10 */
+	{  3,	TF,	sys_listxattr,			"listxattr"		}, /* 11 */
+	{  3,	TF,	sys_listxattr,			"llistxattr"		}, /* 12 */
+	{  3,	TD,	sys_flistxattr,			"flistxattr"		}, /* 13 */
+	{  2,	TF,	sys_removexattr,		"removexattr"		}, /* 14 */
+	{  2,	TF,	sys_removexattr,		"lremovexattr"		}, /* 15 */
+	{  2,	TD,	sys_fremovexattr,		"fremovexattr"		}, /* 16 */
+	{  2,	TF,	sys_getcwd,			"getcwd"		}, /* 17 */
+	{  4,	0,	sys_lookup_dcookie,		"lookup_dcookie"	}, /* 18 */
+	{  2,	TD,	sys_eventfd2,			"eventfd2"		}, /* 19 */
+	{  1,	TD,	sys_epoll_create1,		"epoll_create1"		}, /* 20 */
+	{  4,	TD,	sys_epoll_ctl,			"epoll_ctl"		}, /* 21 */
+	{  6,	TD,	sys_epoll_pwait,		"epoll_pwait"		}, /* 22 */
+	{  1,	TD,	sys_dup,			"dup"			}, /* 23 */
+	{  3,	TD,	sys_dup3,			"dup3"			}, /* 24 */
+	{  3,	TD,	sys_fcntl,			"fcntl64"		}, /* 25 */
+	{  1,	TD,	sys_inotify_init1,		"inotify_init1"		}, /* 26 */
+	{  3,	TD,	sys_inotify_add_watch,		"inotify_add_watch"	}, /* 27 */
+	{  2,	TD,	sys_inotify_rm_watch,		"inotify_rm_watch"	}, /* 28 */
+	{  3,	TD,	sys_ioctl,			"ioctl"			}, /* 29 */
+	{  3,	0,	sys_ioprio_set,			"ioprio_set"		}, /* 30 */
+	{  2,	0,	sys_ioprio_get,			"ioprio_get"		}, /* 31 */
+	{  2,	TD,	sys_flock,			"flock"			}, /* 32 */
+	{  4,	TD|TF,	sys_mknodat,			"mknodat"		}, /* 33 */
+	{  3,	TD|TF,	sys_mkdirat,			"mkdirat"		}, /* 34 */
+	{  3,	TD|TF,	sys_unlinkat,			"unlinkat"		}, /* 35 */
+	{  3,	TD|TF,	sys_symlinkat,			"symlinkat"		}, /* 36 */
+	{  5,	TD|TF,	sys_linkat,			"linkat"		}, /* 37 */
+	{  4,	TD|TF,	sys_renameat,			"renameat"		}, /* 38 */
+	{  2,	TF,	sys_umount2,			"umount"		}, /* 39 */
+	{  5,	TF,	sys_mount,			"mount"			}, /* 40 */
+	{  2,	TF,	sys_pivotroot,			"pivot_root"		}, /* 41 */
+	{  3,	0,	sys_nfsservctl,			"nfsservctl"		}, /* 42 */
+	{  3,	TF,	sys_statfs64,			"statfs64"		}, /* 43 */
+	{  3,	TD,	sys_fstatfs64,			"fstatfs64"		}, /* 44 */
+	{  4,	TF,	sys_truncate64,			"truncate64"		}, /* 45 */
+	{  4,	TD,	sys_ftruncate64,		"ftruncate64"		}, /* 46 */
+	{  6,	TD,	sys_fallocate,			"fallocate"		}, /* 47 */
+	{  3,	TD|TF,	sys_faccessat,			"faccessat"		}, /* 48 */
+	{  1,	TF,	sys_chdir,			"chdir"			}, /* 49 */
+	{  1,	TF,	sys_fchdir,			"fchdir"		}, /* 50 */
+	{  1,	TF,	sys_chroot,			"chroot"		}, /* 51 */
+	{  2,	TD,	sys_fchmod,			"fchmod"		}, /* 52 */
+	{  3,	TD|TF,	sys_fchmodat,			"fchmodat"		}, /* 53 */
+	{  5,	TD|TF,	sys_fchownat,			"fchownat"		}, /* 54 */
+	{  3,	TD,	sys_fchown,			"fchown"		}, /* 55 */
+	{  4,	TD|TF,	sys_openat,			"openat"		}, /* 56 */
+	{  1,	TD,	sys_close,			"close"			}, /* 57 */
+	{  0,	0,	sys_vhangup,			"vhangup"		}, /* 58 */
+	{  2,	TD,	sys_pipe2,			"pipe2"			}, /* 59 */
+	{  4,	0,	sys_quotactl,			"quotactl"		}, /* 60 */
+	{  3,	TD,	sys_getdents64,			"getdents64"		}, /* 61 */
+	{  5,	TF,	sys_llseek,			"_llseek"		}, /* 62 */
+	{  3,	TD,	sys_read,			"read"			}, /* 63 */
+	{  3,	TD,	sys_write,			"write"			}, /* 64 */
+	{  3,	TD,	sys_readv,			"readv"			}, /* 65 */
+	{  3,	TD,	sys_writev,			"writev"		}, /* 66 */
+	{  6,	TD,	sys_pread,			"pread64"		}, /* 67 */
+	{  6,	TD,	sys_pwrite,			"pwrite64"		}, /* 68 */
+	{  5,	TD,	sys_preadv,			"preadv"		}, /* 69 */
+	{  5,	TD,	sys_pwritev,			"pwritev"		}, /* 70 */
+	{  4,	TD|TN,	sys_sendfile64,			"sendfile64"		}, /* 71 */
+	{  6,	TD,	sys_pselect6,			"pselect6"		}, /* 72 */
+	{  5,	TD,	sys_ppoll,			"ppoll"			}, /* 73 */
+	{  4,	TD|TS,	sys_signalfd4,			"signalfd4"		}, /* 74 */
+	{  4,	TD,	sys_vmsplice,			"vmsplice"		}, /* 75 */
+	{  6,	TD,	sys_splice,			"splice"		}, /* 76 */
+	{  4,	TD,	sys_tee,			"tee"			}, /* 77 */
+	{  4,	TD|TF,	sys_readlinkat,			"readlinkat"		}, /* 78 */
+	{  4,	TD|TF,	sys_newfstatat,			"fstatat64"		}, /* 79 */
+	{  2,	TD,	sys_fstat64,			"fstat64"		}, /* 80 */
+	{  0,	0,	sys_sync,			"sync"			}, /* 81 */
+	{  1,	TD,	sys_fsync,			"fsync"			}, /* 82 */
+	{  1,	TD,	sys_fdatasync,			"fdatasync"		}, /* 83 */
+	{  4,	TD,	sys_sync_file_range,		"sync_file_range"	}, /* 84 */
+	{  4,	TD,	sys_timerfd_create,		"timerfd_create"	}, /* 85 */
+	{  4,	TD,	sys_timerfd_settime,		"timerfd_settime"	}, /* 86 */
+	{  2,	TD,	sys_timerfd_gettime,		"timerfd_gettime"	}, /* 87 */
+	{  4,	TD|TF,	sys_utimensat,			"utimensat"		}, /* 88 */
+	{  1,	TF,	sys_acct,			"acct"			}, /* 89 */
+	{  2,	0,	sys_capget,			"capget"		}, /* 90 */
+	{  2,	0,	sys_capset,			"capset"		}, /* 91 */
+	{  1,	0,	sys_personality,		"personality"		}, /* 92 */
+	{  1,	TP,	sys_exit,			"exit"			}, /* 93 */
+	{  1,	TP,	sys_exit,			"exit_group"		}, /* 94 */
+	{  5,	TP,	sys_waitid,			"waitid"		}, /* 95 */
+	{  1,	0,	sys_set_tid_address,		"set_tid_address"	}, /* 96 */
+	{  1,	TP,	sys_unshare,			"unshare"		}, /* 97 */
+	{  6,	0,	sys_futex,			"futex"			}, /* 98 */
+	{  2,	0,	sys_set_robust_list,		"set_robust_list"	}, /* 99 */
+	{  3,	0,	sys_get_robust_list,		"get_robust_list"	}, /* 100 */
+	{  2,	0,	sys_nanosleep,			"nanosleep"		}, /* 101 */
+	{  2,	0,	sys_getitimer,			"getitimer"		}, /* 102 */
+	{  3,	0,	sys_setitimer,			"setitimer"		}, /* 103 */
+	{  4,	0,	sys_kexec_load,			"kexec_load"		}, /* 104 */
+	{  3,	0,	sys_init_module,		"init_module"		}, /* 105 */
+	{  2,	0,	sys_delete_module,		"delete_module"		}, /* 106 */
+	{  3,	0,	sys_timer_create,		"timer_create"		}, /* 107 */
+	{  2,	0,	sys_timer_gettime,		"timer_gettime"		}, /* 108 */
+	{  1,	0,	sys_timer_getoverrun,		"timer_getoverrun"	}, /* 109 */
+	{  4,	0,	sys_timer_settime,		"timer_settime"		}, /* 110 */
+	{  1,	0,	sys_timer_delete,		"timer_delete"		}, /* 111 */
+	{  2,	0,	sys_clock_settime,		"clock_settime"		}, /* 112 */
+	{  2,	0,	sys_clock_gettime,		"clock_gettime"		}, /* 113 */
+	{  2,	0,	sys_clock_getres,		"clock_getres"		}, /* 114 */
+	{  4,	0,	sys_clock_nanosleep,		"clock_nanosleep"	}, /* 115 */
+	{  3,	0,	sys_syslog,			"syslog"		}, /* 116 */
+	{  4,	0,	sys_ptrace,			"ptrace"		}, /* 117 */
+	{  2,	0,	sys_sched_setparam,		"sched_setparam"	}, /* 118 */
+	{  3,	0,	sys_sched_setscheduler,		"sched_setscheduler"	}, /* 119 */
+	{  1,	0,	sys_sched_getscheduler,		"sched_getscheduler"	}, /* 120 */
+	{  2,	0,	sys_sched_getparam,		"sched_getparam"	}, /* 121 */
+	{  3,	0,	sys_sched_setaffinity,		"sched_setaffinity"	}, /* 122 */
+	{  3,	0,	sys_sched_getaffinity,		"sched_getaffinity"	}, /* 123 */
+	{  0,	0,	sys_sched_yield,		"sched_yield"		}, /* 124 */
+	{  1,	0,	sys_sched_get_priority_max,	"sched_get_priority_max"}, /* 125 */
+	{  1,	0,	sys_sched_get_priority_min,	"sched_get_priority_min"}, /* 126 */
+	{  2,	0,	sys_sched_rr_get_interval,	"sched_rr_get_interval" }, /* 127 */
+	{  0,	0,	sys_restart_syscall,		"restart_syscall"	}, /* 128 */
+	{  2,	TS,	sys_kill,			"kill"			}, /* 129 */
+	{  2,	TS,	sys_kill,			"tkill"			}, /* 130 */
+	{  3,	TS,	sys_tgkill,			"tgkill"		}, /* 131 */
+	{  2,	TS,	sys_sigaltstack,		"sigaltstack"		}, /* 132 */
+	{  2,	TS,	sys_rt_sigsuspend,		"rt_sigsuspend"		}, /* 133 */
+	{  4,	TS,	sys_rt_sigaction,		"rt_sigaction"		}, /* 134 */
+	{  4,	TS,	sys_rt_sigprocmask,		"rt_sigprocmask"	}, /* 135 */
+	{  2,	TS,	sys_rt_sigpending,		"rt_sigpending"		}, /* 136 */
+	{  4,	TS,	sys_rt_sigtimedwait,		"rt_sigtimedwait"	}, /* 137 */
+	{  3,	TS,	sys_rt_sigqueueinfo,		"rt_sigqueueinfo"	}, /* 138 */
+	{  0,	TS,	sys_rt_sigreturn,		"rt_sigreturn"		}, /* 139 */
+	{  3,	0,	sys_setpriority,		"setpriority"		}, /* 140 */
+	{  2,	0,	sys_getpriority,		"getpriority"		}, /* 141 */
+	{  4,	0,	sys_reboot,			"reboot"		}, /* 142 */
+	{  2,	0,	sys_setregid,			"setregid"		}, /* 143 */
+	{  1,	0,	sys_setgid,			"setgid"		}, /* 144 */
+	{  2,	0,	sys_setreuid,			"setreuid"		}, /* 145 */
+	{  1,	0,	sys_setuid,			"setuid"		}, /* 146 */
+	{  3,	0,	sys_setresuid,			"setresuid"		}, /* 147 */
+	{  3,	0,	sys_getresuid,			"getresuid"		}, /* 148 */
+	{  3,	0,	sys_setresgid,			"setresgid"		}, /* 149 */
+	{  3,	0,	sys_getresgid,			"getresgid"		}, /* 150 */
+	{  1,	NF,	sys_setfsuid,			"setfsuid"		}, /* 151 */
+	{  1,	NF,	sys_setfsgid,			"setfsgid"		}, /* 152 */
+	{  1,	0,	sys_times,			"times"			}, /* 153 */
+	{  2,	0,	sys_setpgid,			"setpgid"		}, /* 154 */
+	{  1,	0,	sys_getpgid,			"getpgid"		}, /* 155 */
+	{  1,	0,	sys_getsid,			"getsid"		}, /* 156 */
+	{  0,	0,	sys_setsid,			"setsid"		}, /* 157 */
+	{  2,	0,	sys_getgroups,			"getgroups"		}, /* 158 */
+	{  2,	0,	sys_setgroups,			"setgroups"		}, /* 159 */
+	{  1,	0,	sys_uname,			"uname"			}, /* 160 */
+	{  2,	0,	sys_sethostname,		"sethostname"		}, /* 161 */
+	{  2,	0,	sys_setdomainname,		"setdomainname"		}, /* 162 */
+	{  2,	0,	sys_getrlimit,			"oldgetrlimit"		}, /* 163 */
+	{  2,	0,	sys_setrlimit,			"setrlimit"		}, /* 164 */
+	{  2,	0,	sys_getrusage,			"getrusage"		}, /* 165 */
+	{  1,	0,	sys_umask,			"umask"			}, /* 166 */
+	{  5,	0,	sys_prctl,			"prctl"			}, /* 167 */
+	{  3,	0,	sys_getcpu,			"getcpu"		}, /* 168 */
+	{  2,	0,	sys_gettimeofday,		"gettimeofday"		}, /* 169 */
+	{  2,	0,	sys_settimeofday,		"settimeofday"		}, /* 170 */
+	{  1,	0,	sys_adjtimex,			"adjtimex"		}, /* 171 */
+	{  0,	0,	sys_getpid,			"getpid"		}, /* 172 */
+	{  0,	0,	sys_getppid,			"getppid"		}, /* 173 */
+	{  0,	NF,	sys_getuid,			"getuid"		}, /* 174 */
+	{  0,	NF,	sys_geteuid,			"geteuid"		}, /* 175 */
+	{  0,	NF,	sys_getgid,			"getgid"		}, /* 176 */
+	{  0,	NF,	sys_getegid,			"getegid"		}, /* 177 */
+	{  0,	0,	sys_gettid,			"gettid"		}, /* 178 */
+	{  1,	0,	sys_sysinfo,			"sysinfo"		}, /* 179 */
+	{  4,	0,	sys_mq_open,			"mq_open"		}, /* 180 */
+	{  1,	0,	sys_mq_unlink,			"mq_unlink"		}, /* 181 */
+	{  5,	0,	sys_mq_timedsend,		"mq_timedsend"		}, /* 182 */
+	{  5,	0,	sys_mq_timedreceive,		"mq_timedreceive"	}, /* 183 */
+	{  2,	0,	sys_mq_notify,			"mq_notify"		}, /* 184 */
+	{  3,	0,	sys_mq_getsetattr,		"mq_getsetattr"		}, /* 185 */
+	{  4,	TI,	sys_msgget,			"msgget"		}, /* 186 */
+	{  4,	TI,	sys_msgctl,			"msgctl"		}, /* 187 */
+	{  4,	TI,	sys_msgrcv,			"msgrcv"		}, /* 188 */
+	{  4,	TI,	sys_msgsnd,			"msgsnd"		}, /* 189 */
+	{  4,	TI,	sys_semget,			"semget"		}, /* 190 */
+	{  4,	TI,	sys_semctl,			"semctl"		}, /* 191 */
+	{  5,	TI,	sys_semtimedop,			"semtimedop"		}, /* 192 */
+	{  4,	TI,	sys_semop,			"semop"			}, /* 193 */
+	{  4,	TI,	sys_shmget,			"shmget"		}, /* 194 */
+	{  4,	TI,	sys_shmctl,			"shmctl"		}, /* 195 */
+	{  4,	TI,	sys_shmat,			"shmat"			}, /* 196 */
+	{  4,	TI,	sys_shmdt,			"shmdt"			}, /* 197 */
+	{  3,	TN,	sys_socket,			"socket"		}, /* 198 */
+	{  4,	TN,	sys_socketpair,			"socketpair"		}, /* 199 */
+	{  3,	TN,	sys_bind,			"bind"			}, /* 200 */
+	{  2,	TN,	sys_listen,			"listen"		}, /* 201 */
+	{  3,	TN,	sys_accept,			"accept"		}, /* 202 */
+	{  3,	TN,	sys_connect,			"connect"		}, /* 203 */
+	{  3,	TN,	sys_getsockname,		"getsockname"		}, /* 204 */
+	{  3,	TN,	sys_getpeername,		"getpeername"		}, /* 205 */
+	{  6,	TN,	sys_sendto,			"sendto"		}, /* 206 */
+	{  6,	TN,	sys_recvfrom,			"recvfrom"		}, /* 207 */
+	{  5,	TN,	sys_setsockopt,			"setsockopt"		}, /* 208 */
+	{  5,	TN,	sys_getsockopt,			"getsockopt"		}, /* 209 */
+	{  2,	TN,	sys_shutdown,			"shutdown"		}, /* 210 */
+	{  3,	TN,	sys_sendmsg,			"sendmsg"		}, /* 211 */
+	{  5,	TN,	sys_recvmsg,			"recvmsg"		}, /* 212 */
+	{  5,	TD,	sys_readahead,			"readahead"		}, /* 213 */
+	{  1,	0,	sys_brk,			"brk"			}, /* 214 */
+	{  2,	0,	sys_munmap,			"munmap"		}, /* 215 */
+	{  5,	0,	sys_mremap,			"mremap"		}, /* 216 */
+	{  5,	0,	sys_add_key,			"add_key"		}, /* 217 */
+	{  4,	0,	sys_request_key,		"request_key"		}, /* 218 */
+	{  5,	0,	sys_keyctl,			"keyctl"		}, /* 219 */
+	{  5,	TP,	sys_clone,			"clone"			}, /* 220 */
+	{  3,	TF|TP,	sys_execve,			"execve"		}, /* 221 */
+	{  6,	TD,	sys_mmap,			"mmap2"			}, /* 222 */
+	{  6,	TD,	sys_fadvise64_64,		"fadvise64_64"		}, /* 223 */
+	{  2,	TF,	sys_swapon,			"swapon"		}, /* 224 */
+	{  1,	TF,	sys_swapoff,			"swapoff"		}, /* 225 */
+	{  3,	0,	sys_mprotect,			"mprotect"		}, /* 226 */
+	{  3,	0,	sys_msync,			"msync"			}, /* 227 */
+	{  2,	0,	sys_mlock,			"mlock"			}, /* 228 */
+	{  2,	0,	sys_munlock,			"munlock"		}, /* 229 */
+	{  1,	0,	sys_mlockall,			"mlockall"		}, /* 230 */
+	{  0,	0,	sys_munlockall,			"munlockall"		}, /* 231 */
+	{  3,	0,	sys_mincore,			"mincore"		}, /* 232 */
+	{  3,	0,	sys_madvise,			"madvise"		}, /* 233 */
+	{  5,	0,	sys_remap_file_pages,		"remap_file_pages"	}, /* 234 */
+	{  6,	0,	sys_mbind,			"mbind"			}, /* 235 */
+	{  5,	0,	sys_get_mempolicy,		"get_mempolicy"		}, /* 236 */
+	{  3,	0,	sys_set_mempolicy,		"set_mempolicy"		}, /* 237 */
+	{  5,	0,	sys_migrate_pages,		"migrate_pages"		}, /* 238 */
+	{  6,	0,	sys_move_pages,			"move_pages"		}, /* 239 */
+	{  4,	TP|TS,	sys_rt_tgsigqueueinfo,		"rt_tgsigqueueinfo"	}, /* 240 */
+	{  5,	TD,	sys_perf_event_open,		"perf_event_open"	}, /* 241 */
+	{  4,	TN,	sys_accept4,			"accept4"		}, /* 242 */
+	{  5,	TN,	sys_recvmmsg,			"recvmmsg"		}, /* 243 */
+	{  6,	NF,	sys_or1k_atomic,		"or1k_atomic" 		}, /* 244 */
+
+	[245 ... 259] = { },
+
+	{  4,	TP,	sys_wait4,			"wait4"			}, /* 260 */
+	{  4,	0,	sys_prlimit64,			"prlimit64"		}, /* 261 */
+	{  2,	TD,	sys_fanotify_init,		"fanotify_init"		}, /* 262 */
+	{  5,	TD|TF,	sys_fanotify_mark,		"fanotify_mark"		}, /* 263 */
+	{  5,	TD|TF,	sys_name_to_handle_at,		"name_to_handle_at"	}, /* 264 */
+	{  3,	TD,	sys_open_by_handle_at,		"open_by_handle_at"	}, /* 265 */
+	{  2,	0,	sys_clock_adjtime,		"clock_adjtime"		}, /* 266 */
+	{  1,	TD,	sys_syncfs,			"syncfs"		}, /* 267 */
+	{  2,	TD,	sys_setns,			"setns"			}, /* 268 */
+	{  4,	TN,	sys_sendmmsg,			"sendmmsg"		}, /* 269 */
+	{  6,	0,	sys_process_vm_readv,		"process_vm_readv"	}, /* 270 */
+	{  6,	0,	sys_process_vm_writev,		"process_vm_writev"	}, /* 271 */
diff --git a/linux/syscall.h b/linux/syscall.h
index 81b4c69..4189569 100644
--- a/linux/syscall.h
+++ b/linux/syscall.h
@@ -348,6 +348,10 @@
 int sys_cacheflush();
 #endif
 
+#if defined OR1K
+int sys_or1k_atomic();
+#endif
+
 #ifdef POWERPC
 int sys_subpage_prot();
 #endif
diff --git a/process.c b/process.c
index 95eb05d..0b702e7 100644
--- a/process.c
+++ b/process.c
@@ -465,7 +465,8 @@
 # define ARG_PTID	2
 # define ARG_CTID	3
 # define ARG_TLS	4
-#elif defined X86_64 || defined X32 || defined ALPHA || defined TILE
+#elif defined X86_64 || defined X32 || defined ALPHA || defined TILE \
+   || defined OR1K
 # define ARG_FLAGS	0
 # define ARG_STACK	1
 # define ARG_PTID	2
@@ -2107,6 +2108,42 @@
 	{ PT_FSR,		"rfsr",					},
 	{ PT_KERNEL_MODE,	"kernel_mode",				},
 #endif
+#ifdef OR1K
+	{ 4*0,  "r0" },
+	{ 4*1,  "r1" },
+	{ 4*2,  "r2" },
+	{ 4*3,  "r3" },
+	{ 4*4,  "r4" },
+	{ 4*5,  "r5" },
+	{ 4*6,  "r6" },
+	{ 4*7,  "r7" },
+	{ 4*8,  "r8" },
+	{ 4*9,  "r9" },
+	{ 4*10, "r10" },
+	{ 4*11, "r11" },
+	{ 4*12, "r12" },
+	{ 4*13, "r13" },
+	{ 4*14, "r14" },
+	{ 4*15, "r15" },
+	{ 4*16, "r16" },
+	{ 4*17, "r17" },
+	{ 4*18, "r18" },
+	{ 4*19, "r19" },
+	{ 4*20, "r20" },
+	{ 4*21, "r21" },
+	{ 4*22, "r22" },
+	{ 4*23, "r23" },
+	{ 4*24, "r24" },
+	{ 4*25, "r25" },
+	{ 4*26, "r26" },
+	{ 4*27, "r27" },
+	{ 4*28, "r28" },
+	{ 4*29, "r29" },
+	{ 4*30, "r30" },
+	{ 4*31, "r31" },
+	{ 4*32, "pc" },
+	{ 4*33, "sr" },
+#endif
 	/* Other fields in "struct user" */
 #if defined(S390) || defined(S390X)
 	{ uoff(u_tsize),	"offsetof(struct user, u_tsize)"	},
@@ -2238,6 +2275,8 @@
 	{ uoff(magic),		"offsetof(struct user, magic)"		},
 	{ uoff(u_comm),		"offsetof(struct user, u_comm)"		},
 	{ sizeof(struct user),	"sizeof(struct user)"			},
+#elif defined(OR1K)
+	/* nothing */
 #endif
 	{ 0,			NULL					},
 };
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;
diff --git a/system.c b/system.c
index 3d41006..d5900c4 100644
--- a/system.c
+++ b/system.c
@@ -1026,3 +1026,63 @@
 }
 
 #endif /* MIPS */
+
+#ifdef OR1K
+#define OR1K_ATOMIC_SWAP        1
+#define OR1K_ATOMIC_CMPXCHG     2
+#define OR1K_ATOMIC_XCHG        3
+#define OR1K_ATOMIC_ADD         4
+#define OR1K_ATOMIC_DECPOS      5
+#define OR1K_ATOMIC_AND         6
+#define OR1K_ATOMIC_OR          7
+#define OR1K_ATOMIC_UMAX        8
+#define OR1K_ATOMIC_UMIN        9
+
+static const struct xlat atomic_ops[] = {
+	{ OR1K_ATOMIC_SWAP,		"SWAP"		},
+	{ OR1K_ATOMIC_CMPXCHG,		"CMPXCHG"	},
+	{ OR1K_ATOMIC_XCHG,		"XCHG"		},
+	{ OR1K_ATOMIC_ADD,		"ADD"		},
+	{ OR1K_ATOMIC_DECPOS,		"DECPOS"	},
+	{ OR1K_ATOMIC_AND,		"AND"		},
+	{ OR1K_ATOMIC_OR,		"OR"		},
+	{ OR1K_ATOMIC_UMAX,		"UMAX"		},
+	{ OR1K_ATOMIC_UMIN,		"UMIN"		},
+	{ 0, NULL }
+};
+
+int sys_or1k_atomic(struct tcb *tcp)
+{
+	if (entering(tcp)) {
+		printxval(atomic_ops, tcp->u_arg[0], "???");
+		switch(tcp->u_arg[0]) {
+		case OR1K_ATOMIC_SWAP:
+			tprintf(", 0x%lx, 0x%lx", tcp->u_arg[1], tcp->u_arg[2]);
+			break;
+		case OR1K_ATOMIC_CMPXCHG:
+			tprintf(", 0x%lx, %#lx, %#lx", tcp->u_arg[1], tcp->u_arg[2],
+				tcp->u_arg[3]);
+			break;
+
+		case OR1K_ATOMIC_XCHG:
+		case OR1K_ATOMIC_ADD:
+		case OR1K_ATOMIC_AND:
+		case OR1K_ATOMIC_OR:
+		case OR1K_ATOMIC_UMAX:
+		case OR1K_ATOMIC_UMIN:
+			tprintf(", 0x%lx, %#lx", tcp->u_arg[1], tcp->u_arg[2]);
+			break;
+
+		case OR1K_ATOMIC_DECPOS:
+			tprintf(", 0x%lx", tcp->u_arg[1]);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	return RVAL_HEX;
+}
+
+#endif /* OR1K */
diff --git a/util.c b/util.c
index f699cb2..55ff90d 100644
--- a/util.c
+++ b/util.c
@@ -1296,6 +1296,8 @@
 	/* setbpt/clearbpt never used: */
 	/* microblaze is only supported since about linux-2.6.30 */
 	return 0;
+#elif defined(OR1K)
+	/* never reached; OR1K is only supported by kernels since 3.1.0. */
 #else
 #warning Do not know how to handle change_syscall for this architecture
 #endif /* architecture */