Add support for ARC Cores from Synopsys

Take #2 on mainlining strace support for ARC (last one was 4.6 based back
in March 2011), see
http://sourceforge.net/p/strace/mailman/message/27210168/

The syscall ABI is asm-generic/unistd.h based (so no legacy syscalls),
hence very similar to metag port.

test/* all seem to work well.

* linux/arc/ioctlent.h.in: New file.
* linux/arc/syscallent.h: Likewise.
* Makefile.am (EXTRA_DIST): Add linux/arc/ioctlent.h.in and
linux/arc/syscallent.h.
* configure.ac: Add ARC to the list of supported architectures.
* defs.h: Add ARC support.
* process.c (struct_user_offsets): Likewise.
* signal.c (sys_sigreturn): Likewise.
* syscall.c (print_pc, get_regset, get_regs, get_scno, get_syscall_args,
get_syscall_result, get_error): Likewise.
* util.c (change_syscall): Likewise.

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
diff --git a/Makefile.am b/Makefile.am
index 9d611f3..9187fa0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -82,6 +82,8 @@
 	linux/alpha/ioctlent.h.in	\
 	linux/alpha/signalent.h		\
 	linux/alpha/syscallent.h	\
+	linux/arc/ioctlent.h.in		\
+	linux/arc/syscallent.h		\
 	linux/arm/ioctlent.h.in		\
 	linux/arm/syscallent.h		\
 	linux/avr32/ioctlent.h.in	\
diff --git a/configure.ac b/configure.ac
index b3b62e8..f19e4f2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -74,6 +74,10 @@
 	arch=avr32
 	AC_DEFINE([AVR32], 1, [Define for the AVR32 architecture.])
 	;;
+arc*)
+	arch=arc
+	AC_DEFINE([ARC], 1, [Define for the ARC architecture.])
+	;;
 s390)
 	arch=s390
 	AC_DEFINE([S390], 1, [Define for the S390 architecture.])
diff --git a/defs.h b/defs.h
index 964636b..f5dd6d5 100644
--- a/defs.h
+++ b/defs.h
@@ -164,6 +164,7 @@
     || defined(METAG) \
     || defined(TILE) \
     || defined(XTENSA) \
+    || defined(ARC) \
     ) && defined(__GLIBC__)
 # include <sys/ptrace.h>
 #else
@@ -611,6 +612,7 @@
  || defined(TILE) \
  || defined(OR1K) \
  || defined(METAG) \
+ || defined(ARC) \
  || defined(POWERPC)
 extern long get_regs_error;
 # define clear_regs()  (get_regs_error = -1)
diff --git a/linux/arc/ioctlent.h.in b/linux/arc/ioctlent.h.in
new file mode 100644
index 0000000..52ac99b
--- /dev/null
+++ b/linux/arc/ioctlent.h.in
@@ -0,0 +1 @@
+#include "../i386/ioctlent.h.in"
diff --git a/linux/arc/syscallent.h b/linux/arc/syscallent.h
new file mode 100644
index 0000000..fd3171a
--- /dev/null
+++ b/linux/arc/syscallent.h
@@ -0,0 +1,264 @@
+	{ 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,			"umount2"		}, /* 39 */
+	{ 5,	TF,	sys_mount,			"mount"			}, /* 40 */
+	{ 2,	TF,	sys_pivotroot,			"pivot_root"		}, /* 41 */
+	{									}, /* 42 */
+	{ 3,	TF,	sys_statfs64,			"statfs64"		}, /* 43 */
+	{ 3,	TD,	sys_fstatfs64,			"fstatfs64"		}, /* 44 */
+	{ 3,	TF,	sys_truncate64,			"truncate64"		}, /* 45 */
+	{ 3,	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,	TD,	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,	TF,	sys_quotactl,			"quotactl"		}, /* 60 */
+	{ 3,	TD,	sys_getdents64,			"getdents64"		}, /* 61 */
+	{ 5,	TD,	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 */
+	{ 5,	TD,	sys_pread,			"pread64"		}, /* 67 */
+	{ 5,	TD,	sys_pwrite,			"pwrite64"		}, /* 68 */
+	{ 5,	TD,	sys_preadv,			"preadv"		}, /* 69 */
+	{ 5,	TD,	sys_pwritev,			"pwritev"		}, /* 70 */
+	{ 4,	TD|TN,	sys_sendfile64,			"sendfile"		}, /* 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 */
+	{ 6,	TD,	sys_sync_file_range,		"sync_file_range"	}, /* 84 */
+	{ 2,	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,			"getrlimit"		}, /* 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 */
+	{ 2,	TI,	sys_msgget,			"msgget"		}, /* 186 */
+	{ 3,	TI,	sys_msgctl,			"msgctl"		}, /* 187 */
+	{ 5,	TI,	sys_msgrcv,			"msgrcv"		}, /* 188 */
+	{ 4,	TI,	sys_msgsnd,			"msgsnd"		}, /* 189 */
+	{ 3,	TI,	sys_semget,			"semget"		}, /* 190 */
+	{ 4,	TI,	sys_semctl,			"semctl"		}, /* 191 */
+	{ 4,	TI,	sys_semtimedop,			"semtimedop"		}, /* 192 */
+	{ 3,	TI,	sys_semop,			"semop"			}, /* 193 */
+	{ 3,	TI,	sys_shmget,			"shmget"		}, /* 194 */
+	{ 3,	TI,	sys_shmctl,			"shmctl"		}, /* 195 */
+	{ 3,	TI,	sys_shmat,			"shmat"			}, /* 196 */
+	{ 1,	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 */
+	{ 3,	TN,	sys_recvmsg,			"recvmsg"		}, /* 212 */
+	{ 4,	TD,	sys_readahead,			"readahead"		}, /* 213 */
+	{ 1,	TM,	sys_brk,			"brk"			}, /* 214 */
+	{ 2,	TM,	sys_munmap,			"munmap"		}, /* 215 */
+	{ 5,	TM,	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|TM,	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,	TM,	sys_mprotect,			"mprotect"		}, /* 226 */
+	{ 3,	TM,	sys_msync,			"msync"			}, /* 227 */
+	{ 2,	TM,	sys_mlock,			"mlock"			}, /* 228 */
+	{ 2,	TM,	sys_munlock,			"munlock"		}, /* 229 */
+	{ 1,	TM,	sys_mlockall,			"mlockall"		}, /* 230 */
+	{ 0,	TM,	sys_munlockall,			"munlockall"		}, /* 231 */
+	{ 3,	TM,	sys_mincore,			"mincore"		}, /* 232 */
+	{ 3,	TM,	sys_madvise,			"madvise"		}, /* 233 */
+	{ 5,	TM,	sys_remap_file_pages,		"remap_file_pages"	}, /* 234 */
+	{ 6,	TM,	sys_mbind,			"mbind"			}, /* 235 */
+	{ 5,	TM,	sys_get_mempolicy,		"get_mempolicy"		}, /* 236 */
+	{ 3,	TM,	sys_set_mempolicy,		"set_mempolicy"		}, /* 237 */
+	{ 4,	TM,	sys_migrate_pages,		"migrate_pages"		}, /* 238 */
+	{ 6,	TM,	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 */
+	{ 3,	0,	printargs,			"arc_cacheflush"	}, /* 244 */
+	{ 1,	0,	printargs,			"arc_settls"		}, /* 245 */
+	{ 0,	0,	printargs,			"arc_gettls"		}, /* 246 */
+
+	[247 ... 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 */
+	{ 5,	0,	sys_kcmp,			"kcmp"			}, /* 272 */
+	{ 3,	TD,	sys_finit_module,		"finit_module"		}, /* 273 */
diff --git a/process.c b/process.c
index e2fa25b..1a2181b 100644
--- a/process.c
+++ b/process.c
@@ -2513,6 +2513,8 @@
 	/* nothing */
 #elif defined(XTENSA)
 	/* nothing */
+#elif defined(ARC)
+	/* nothing */
 #endif
 	{ 0,			NULL					},
 };
diff --git a/signal.c b/signal.c
index 6b3c8c0..7fb9abf 100644
--- a/signal.c
+++ b/signal.c
@@ -1033,6 +1033,8 @@
 	}
 #elif defined(XTENSA)
 	/* Xtensa only has rt_sys_sigreturn */
+#elif defined(ARC)
+	/* ARC syscall ABI only supports rt_sys_sigreturn */
 #else
 # warning No sys_sigreturn() for this architecture
 # warning         (no problem, just a reminder :-)
diff --git a/syscall.c b/syscall.c
index 1b49bb3..83a95bd 100644
--- a/syscall.c
+++ b/syscall.c
@@ -774,6 +774,9 @@
 # define ARCH_REGS_FOR_GETREGSET metag_regs
 #elif defined(XTENSA)
 static long xtensa_a2;
+# elif defined(ARC)
+static struct user_regs_struct arc_regs;
+# define ARCH_REGS_FOR_GETREGSET arc_regs
 #endif
 
 void
@@ -914,6 +917,8 @@
 		return;
 	}
 	tprintf("[%08lx] ", pc);
+#elif defined(ARC)
+	tprintf("[%08lx] ", arc_regs.efa);
 #endif /* architecture */
 }
 
@@ -1009,7 +1014,8 @@
 # if defined(ARM) \
   || defined(I386) \
   || defined(METAG) \
-  || defined(OR1K)
+  || defined(OR1K) \
+  || defined(ARC)
 	static struct iovec io = {
 		.iov_base = &ARCH_REGS_FOR_GETREGSET,
 		.iov_len = sizeof(ARCH_REGS_FOR_GETREGSET)
@@ -1035,7 +1041,7 @@
 get_regs(pid_t pid)
 {
 /* PTRACE_GETREGSET only */
-# if defined(METAG) || defined(OR1K) || defined(X32) || defined(AARCH64)
+# if defined(METAG) || defined(OR1K) || defined(X32) || defined(AARCH64) || defined(ARC)
 	get_regset(pid);
 
 /* PTRACE_GETREGS only */
@@ -1542,6 +1548,8 @@
 #elif defined(XTENSA)
 	if (upeek(tcp->pid, SYSCALL_NR, &scno) < 0)
 		return -1;
+# elif defined(ARC)
+	scno = arc_regs.scratch.r8;
 #endif
 
 	tcp->scno = scno;
@@ -1932,6 +1940,11 @@
 	for (i = 0; i < nargs; ++i)
 		if (upeek(tcp->pid, REG_A_BASE + xtensaregs[i], &tcp->u_arg[i]) < 0)
 			return -1;
+# elif defined(ARC)
+	long *arc_args = &arc_regs.scratch.r0;
+	for (i = 0; i < nargs; ++i)
+		tcp->u_arg[i] = *arc_args--;
+
 #else /* Other architecture (32bits specific) */
 	for (i = 0; i < nargs; ++i)
 		if (upeek(tcp->pid, i*4, &tcp->u_arg[i]) < 0)
@@ -2130,6 +2143,8 @@
 #elif defined(XTENSA)
 	if (upeek(tcp->pid, REG_A_BASE + 2, &xtensa_a2) < 0)
 		return -1;
+#elif defined(ARC)
+	/* already done by get_regs */
 #endif
 	return 1;
 }
@@ -2435,6 +2450,14 @@
 	else {
 		tcp->u_rval = xtensa_a2;
 	}
+#elif defined(ARC)
+	if (check_errno && is_negated_errno(arc_regs.scratch.r0)) {
+		tcp->u_rval = -1;
+		u_error = -arc_regs.scratch.r0;
+	}
+	else {
+		tcp->u_rval = arc_regs.scratch.r0;
+	}
 #endif
 	tcp->u_error = u_error;
 }
diff --git a/util.c b/util.c
index db376b3..0dab902 100644
--- a/util.c
+++ b/util.c
@@ -1404,6 +1404,9 @@
 #elif defined(XTENSA)
 	/* setbpt/clearbpt never used: */
 	/* Xtensa is only supported since linux 2.6.13 */
+#elif defined(ARC)
+	/* setbpt/clearbpt never used: */
+	/* ARC only supported since 3.9 */
 #else
 #warning Do not know how to handle change_syscall for this architecture
 #endif /* architecture */