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

ARC Linux kernel port was merged in mainline 3.9, so hopefully strace
can now be merged too.

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.

Signed-off-by: Vineet Gupta <[email protected]>
---
 Makefile.am             |   1 +
 configure.ac            |   4 +
 defs.h                  |   4 +-
 linux/arc/ioctlent.h.in |   1 +
 linux/arc/syscallent.h  | 264 ++++++++++++++++++++++++++++++++++++++++++++++++
 process.c               |   2 +
 signal.c                |   2 +
 syscall.c               |  27 ++++-
 util.c                  |   3 +
 9 files changed, 305 insertions(+), 3 deletions(-)
 create mode 100644 linux/arc/ioctlent.h.in
 create mode 100644 linux/arc/syscallent.h

diff --git a/Makefile.am b/Makefile.am
index 9d611f3..f5710c2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -82,6 +82,7 @@ EXTRA_DIST =                          \
        linux/alpha/ioctlent.h.in       \
        linux/alpha/signalent.h         \
        linux/alpha/syscallent.h        \
+       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 c4896f3..40ea6af 100644
--- a/configure.ac
+++ b/configure.ac
@@ -70,6 +70,10 @@ avr32*)
        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 3f07c4f..f466bb2 100644
--- a/defs.h
+++ b/defs.h
@@ -155,6 +155,7 @@ extern char *stpcpy(char *dst, const char *src);
     || defined(METAG) \
     || defined(TILE) \
     || defined(XTENSA) \
+    || defined(ARC) \
     ) && defined(__GLIBC__)
 # include <sys/ptrace.h>
 #else
@@ -595,7 +596,8 @@ extern void call_summary(FILE *);
  || defined(SPARC) || defined(SPARC64) \
  || defined(TILE) \
  || defined(OR1K) \
- || defined(METAG)
+ || defined(METAG) \
+ || defined(ARC)
 extern long get_regs_error;
 # define clear_regs()  (get_regs_error = -1)
 extern void get_regs(pid_t pid);
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 799a314..6d488bd 100644
--- a/process.c
+++ b/process.c
@@ -2501,6 +2501,8 @@ const struct xlat struct_user_offsets[] = {
        /* nothing */
 #elif defined(XTENSA)
        /* nothing */
+#elif defined(ARC)
+       /* nothing */
 #endif
        { 0,                    NULL                                    },
 };
diff --git a/signal.c b/signal.c
index 55815aa..5c54535 100644
--- a/signal.c
+++ b/signal.c
@@ -996,6 +996,8 @@ sys_sigreturn(struct tcb *tcp)
        /* no need to remind */
 #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 7efee0e..acc0d83 100644
--- a/syscall.c
+++ b/syscall.c
@@ -805,6 +805,9 @@ static struct user_gp_regs metag_regs;
 # 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
@@ -949,6 +952,8 @@ printcall(struct tcb *tcp)
                return;
        }
        tprintf("[%08lx] ", pc);
+#elif defined(ARC)
+       tprintf("[%08lx] ", arc_regs.efa);
 #endif /* architecture */
 }
 
@@ -1007,7 +1012,8 @@ static void get_regset(pid_t pid)
 # 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)
@@ -1033,7 +1039,7 @@ void
 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 */
@@ -1532,6 +1538,8 @@ get_scno(struct tcb *tcp)
 #elif defined(XTENSA)
        if (upeek(tcp, SYSCALL_NR, &scno) < 0)
                return -1;
+# elif defined(ARC)
+       scno = arc_regs.scratch.r8;
 #endif
 
        tcp->scno = scno;
@@ -1938,6 +1946,11 @@ get_syscall_args(struct tcb *tcp)
        for (i = 0; i < nargs; ++i)
                if (upeek(tcp, 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, i*4, &tcp->u_arg[i]) < 0)
@@ -2145,6 +2158,8 @@ get_syscall_result(struct tcb *tcp)
 #elif defined(XTENSA)
        if (upeek(tcp, REG_A_BASE + 2, &xtensa_a2) < 0)
                return -1;
+#elif defined(ARC)
+       /* already done by get_regs */
 #endif
        return 1;
 }
@@ -2452,6 +2467,14 @@ get_error(struct tcb *tcp)
        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 6acdbc2..f7b745d 100644
--- a/util.c
+++ b/util.c
@@ -1404,6 +1404,9 @@ change_syscall(struct tcb *tcp, arg_setup_state *state, 
int new)
 #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 */
-- 
1.8.1.2


------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
Strace-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to