From: Christian S. <bl...@cm...> - 2013-02-11 21:04:15
|
The following patch adds support for the or1k architecture. This architecture has been in mainline Linux since 3.1. Feel free to give harsh feedback and other comments :-). Support for the OpenRISC 1000 platform. * configure.ac: Added or1k. * defs.h: Added or1k to use _regs system. * linux/or1k/ioctlent.h.in: Use i386 ioctls. * linux/or1k/syscallent.h: New. * process.c: Added or1k. * syscall.c: Added or1k handlers. (or1k_io) iovec for or1k GETREGSET. (or1k_regs) regset structure for or1k. * util.c: Added or1k handler for change_syscall. --- configure.ac | 5 + defs.h | 8 +- linux/or1k/ioctlent.h.in | 1 + linux/or1k/syscallent.h | 1080 ++++++++++++++++++++++++++++++++++++++++++++++ process.c | 41 +- syscall.c | 34 +- util.c | 6 + 7 files changed, 1170 insertions(+), 5 deletions(-) create mode 100644 linux/or1k/ioctlent.h.in create mode 100644 linux/or1k/syscallent.h diff --git a/configure.ac b/configure.ac index 80be383..8703f7c 100644 --- a/configure.ac +++ b/configure.ac @@ -111,6 +111,11 @@ microblaze*) 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 9756179..bfa765e 100644 --- a/defs.h +++ b/defs.h @@ -375,6 +375,12 @@ extern struct pt_regs arm_regs; #if defined(TILE) extern struct pt_regs tile_regs; #endif +#if defined(OR1K) +extern struct user_regs_struct or1k_regs; +extern struct iovec or1k_io; +#endif + + /* Trace Control Block */ struct tcb { @@ -561,7 +567,7 @@ extern void call_summary(FILE *); || 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..a2305b3 --- /dev/null +++ b/linux/or1k/syscallent.h @@ -0,0 +1,1080 @@ + { 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 */ + { MA, 0, NULL, NULL }, /* 244 (unused) */ + { MA, 0, NULL, NULL }, /* 245 (unused) */ + { MA, 0, NULL, NULL }, /* 246 (unused) */ + { MA, 0, NULL, NULL }, /* 247 (unused) */ + { MA, 0, NULL, NULL }, /* 248 (unused) */ + { MA, 0, NULL, NULL }, /* 249 (unused) */ + { MA, 0, NULL, NULL }, /* 250 (unused) */ + { MA, 0, NULL, NULL }, /* 251 (unused) */ + { MA, 0, NULL, NULL }, /* 252 (unused) */ + { MA, 0, NULL, NULL }, /* 253 (unused) */ + { MA, 0, NULL, NULL }, /* 254 (unused) */ + { MA, 0, NULL, NULL }, /* 255 (unused) */ + { MA, 0, NULL, NULL }, /* 256 (unused) */ + { MA, 0, NULL, NULL }, /* 257 (unused) */ + { MA, 0, NULL, NULL }, /* 258 (unused) */ + { MA, 0, NULL, NULL }, /* 259 (unused) */ + { 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 */ + { MA, 0, NULL, NULL }, /* 272 (unused) */ + { MA, 0, NULL, NULL }, /* 273 (unused) */ + { MA, 0, NULL, NULL }, /* 274 (unused) */ + { MA, 0, NULL, NULL }, /* 275 (unused) */ + { MA, 0, NULL, NULL }, /* 276 (unused) */ + { MA, 0, NULL, NULL }, /* 277 (unused) */ + { MA, 0, NULL, NULL }, /* 278 (unused) */ + { MA, 0, NULL, NULL }, /* 279 (unused) */ + { MA, 0, NULL, NULL }, /* 280 (unused) */ + { MA, 0, NULL, NULL }, /* 281 (unused) */ + { MA, 0, NULL, NULL }, /* 282 (unused) */ + { MA, 0, NULL, NULL }, /* 283 (unused) */ + { MA, 0, NULL, NULL }, /* 284 (unused) */ + { MA, 0, NULL, NULL }, /* 285 (unused) */ + { MA, 0, NULL, NULL }, /* 286 (unused) */ + { MA, 0, NULL, NULL }, /* 287 (unused) */ + { MA, 0, NULL, NULL }, /* 288 (unused) */ + { MA, 0, NULL, NULL }, /* 289 (unused) */ + { MA, 0, NULL, NULL }, /* 290 (unused) */ + { MA, 0, NULL, NULL }, /* 291 (unused) */ + { MA, 0, NULL, NULL }, /* 292 (unused) */ + { MA, 0, NULL, NULL }, /* 293 (unused) */ + { MA, 0, NULL, NULL }, /* 294 (unused) */ + { MA, 0, NULL, NULL }, /* 295 (unused) */ + { MA, 0, NULL, NULL }, /* 296 (unused) */ + { MA, 0, NULL, NULL }, /* 297 (unused) */ + { MA, 0, NULL, NULL }, /* 298 (unused) */ + { MA, 0, NULL, NULL }, /* 299 (unused) */ + { MA, 0, NULL, NULL }, /* 300 (unused) */ + { MA, 0, NULL, NULL }, /* 301 (unused) */ + { MA, 0, NULL, NULL }, /* 302 (unused) */ + { MA, 0, NULL, NULL }, /* 303 (unused) */ + { MA, 0, NULL, NULL }, /* 304 (unused) */ + { MA, 0, NULL, NULL }, /* 305 (unused) */ + { MA, 0, NULL, NULL }, /* 306 (unused) */ + { MA, 0, NULL, NULL }, /* 307 (unused) */ + { MA, 0, NULL, NULL }, /* 308 (unused) */ + { MA, 0, NULL, NULL }, /* 309 (unused) */ + { MA, 0, NULL, NULL }, /* 310 (unused) */ + { MA, 0, NULL, NULL }, /* 311 (unused) */ + { MA, 0, NULL, NULL }, /* 312 (unused) */ + { MA, 0, NULL, NULL }, /* 313 (unused) */ + { MA, 0, NULL, NULL }, /* 314 (unused) */ + { MA, 0, NULL, NULL }, /* 315 (unused) */ + { MA, 0, NULL, NULL }, /* 316 (unused) */ + { MA, 0, NULL, NULL }, /* 317 (unused) */ + { MA, 0, NULL, NULL }, /* 318 (unused) */ + { MA, 0, NULL, NULL }, /* 319 (unused) */ + { MA, 0, NULL, NULL }, /* 320 (unused) */ + { MA, 0, NULL, NULL }, /* 321 (unused) */ + { MA, 0, NULL, NULL }, /* 322 (unused) */ + { MA, 0, NULL, NULL }, /* 323 (unused) */ + { MA, 0, NULL, NULL }, /* 324 (unused) */ + { MA, 0, NULL, NULL }, /* 325 (unused) */ + { MA, 0, NULL, NULL }, /* 326 (unused) */ + { MA, 0, NULL, NULL }, /* 327 (unused) */ + { MA, 0, NULL, NULL }, /* 328 (unused) */ + { MA, 0, NULL, NULL }, /* 329 (unused) */ + { MA, 0, NULL, NULL }, /* 330 (unused) */ + { MA, 0, NULL, NULL }, /* 331 (unused) */ + { MA, 0, NULL, NULL }, /* 332 (unused) */ + { MA, 0, NULL, NULL }, /* 333 (unused) */ + { MA, 0, NULL, NULL }, /* 334 (unused) */ + { MA, 0, NULL, NULL }, /* 335 (unused) */ + { MA, 0, NULL, NULL }, /* 336 (unused) */ + { MA, 0, NULL, NULL }, /* 337 (unused) */ + { MA, 0, NULL, NULL }, /* 338 (unused) */ + { MA, 0, NULL, NULL }, /* 339 (unused) */ + { MA, 0, NULL, NULL }, /* 340 (unused) */ + { MA, 0, NULL, NULL }, /* 341 (unused) */ + { MA, 0, NULL, NULL }, /* 342 (unused) */ + { MA, 0, NULL, NULL }, /* 343 (unused) */ + { MA, 0, NULL, NULL }, /* 344 (unused) */ + { MA, 0, NULL, NULL }, /* 345 (unused) */ + { MA, 0, NULL, NULL }, /* 346 (unused) */ + { MA, 0, NULL, NULL }, /* 347 (unused) */ + { MA, 0, NULL, NULL }, /* 348 (unused) */ + { MA, 0, NULL, NULL }, /* 349 (unused) */ + { MA, 0, NULL, NULL }, /* 350 (unused) */ + { MA, 0, NULL, NULL }, /* 351 (unused) */ + { MA, 0, NULL, NULL }, /* 352 (unused) */ + { MA, 0, NULL, NULL }, /* 353 (unused) */ + { MA, 0, NULL, NULL }, /* 354 (unused) */ + { MA, 0, NULL, NULL }, /* 355 (unused) */ + { MA, 0, NULL, NULL }, /* 356 (unused) */ + { MA, 0, NULL, NULL }, /* 357 (unused) */ + { MA, 0, NULL, NULL }, /* 358 (unused) */ + { MA, 0, NULL, NULL }, /* 359 (unused) */ + { MA, 0, NULL, NULL }, /* 360 (unused) */ + { MA, 0, NULL, NULL }, /* 361 (unused) */ + { MA, 0, NULL, NULL }, /* 362 (unused) */ + { MA, 0, NULL, NULL }, /* 363 (unused) */ + { MA, 0, NULL, NULL }, /* 364 (unused) */ + { MA, 0, NULL, NULL }, /* 365 (unused) */ + { MA, 0, NULL, NULL }, /* 366 (unused) */ + { MA, 0, NULL, NULL }, /* 367 (unused) */ + { MA, 0, NULL, NULL }, /* 368 (unused) */ + { MA, 0, NULL, NULL }, /* 369 (unused) */ + { MA, 0, NULL, NULL }, /* 370 (unused) */ + { MA, 0, NULL, NULL }, /* 371 (unused) */ + { MA, 0, NULL, NULL }, /* 372 (unused) */ + { MA, 0, NULL, NULL }, /* 373 (unused) */ + { MA, 0, NULL, NULL }, /* 374 (unused) */ + { MA, 0, NULL, NULL }, /* 375 (unused) */ + { MA, 0, NULL, NULL }, /* 376 (unused) */ + { MA, 0, NULL, NULL }, /* 377 (unused) */ + { MA, 0, NULL, NULL }, /* 378 (unused) */ + { MA, 0, NULL, NULL }, /* 379 (unused) */ + { MA, 0, NULL, NULL }, /* 380 (unused) */ + { MA, 0, NULL, NULL }, /* 381 (unused) */ + { MA, 0, NULL, NULL }, /* 382 (unused) */ + { MA, 0, NULL, NULL }, /* 383 (unused) */ + { MA, 0, NULL, NULL }, /* 384 (unused) */ + { MA, 0, NULL, NULL }, /* 385 (unused) */ + { MA, 0, NULL, NULL }, /* 386 (unused) */ + { MA, 0, NULL, NULL }, /* 387 (unused) */ + { MA, 0, NULL, NULL }, /* 388 (unused) */ + { MA, 0, NULL, NULL }, /* 389 (unused) */ + { MA, 0, NULL, NULL }, /* 390 (unused) */ + { MA, 0, NULL, NULL }, /* 391 (unused) */ + { MA, 0, NULL, NULL }, /* 392 (unused) */ + { MA, 0, NULL, NULL }, /* 393 (unused) */ + { MA, 0, NULL, NULL }, /* 394 (unused) */ + { MA, 0, NULL, NULL }, /* 395 (unused) */ + { MA, 0, NULL, NULL }, /* 396 (unused) */ + { MA, 0, NULL, NULL }, /* 397 (unused) */ + { MA, 0, NULL, NULL }, /* 398 (unused) */ + { MA, 0, NULL, NULL }, /* 399 (unused) */ + { MA, 0, NULL, NULL }, /* 400 (unused) */ + { MA, 0, NULL, NULL }, /* 401 (unused) */ + { MA, 0, NULL, NULL }, /* 402 (unused) */ + { MA, 0, NULL, NULL }, /* 403 (unused) */ + { MA, 0, NULL, NULL }, /* 404 (unused) */ + { MA, 0, NULL, NULL }, /* 405 (unused) */ + { MA, 0, NULL, NULL }, /* 406 (unused) */ + { MA, 0, NULL, NULL }, /* 407 (unused) */ + { MA, 0, NULL, NULL }, /* 408 (unused) */ + { MA, 0, NULL, NULL }, /* 409 (unused) */ + { MA, 0, NULL, NULL }, /* 410 (unused) */ + { MA, 0, NULL, NULL }, /* 411 (unused) */ + { MA, 0, NULL, NULL }, /* 412 (unused) */ + { MA, 0, NULL, NULL }, /* 413 (unused) */ + { MA, 0, NULL, NULL }, /* 414 (unused) */ + { MA, 0, NULL, NULL }, /* 415 (unused) */ + { MA, 0, NULL, NULL }, /* 416 (unused) */ + { MA, 0, NULL, NULL }, /* 417 (unused) */ + { MA, 0, NULL, NULL }, /* 418 (unused) */ + { MA, 0, NULL, NULL }, /* 419 (unused) */ + { MA, 0, NULL, NULL }, /* 420 (unused) */ + { MA, 0, NULL, NULL }, /* 421 (unused) */ + { MA, 0, NULL, NULL }, /* 422 (unused) */ + { MA, 0, NULL, NULL }, /* 423 (unused) */ + { MA, 0, NULL, NULL }, /* 424 (unused) */ + { MA, 0, NULL, NULL }, /* 425 (unused) */ + { MA, 0, NULL, NULL }, /* 426 (unused) */ + { MA, 0, NULL, NULL }, /* 427 (unused) */ + { MA, 0, NULL, NULL }, /* 428 (unused) */ + { MA, 0, NULL, NULL }, /* 429 (unused) */ + { MA, 0, NULL, NULL }, /* 430 (unused) */ + { MA, 0, NULL, NULL }, /* 431 (unused) */ + { MA, 0, NULL, NULL }, /* 432 (unused) */ + { MA, 0, NULL, NULL }, /* 433 (unused) */ + { MA, 0, NULL, NULL }, /* 434 (unused) */ + { MA, 0, NULL, NULL }, /* 435 (unused) */ + { MA, 0, NULL, NULL }, /* 436 (unused) */ + { MA, 0, NULL, NULL }, /* 437 (unused) */ + { MA, 0, NULL, NULL }, /* 438 (unused) */ + { MA, 0, NULL, NULL }, /* 439 (unused) */ + { MA, 0, NULL, NULL }, /* 440 (unused) */ + { MA, 0, NULL, NULL }, /* 441 (unused) */ + { MA, 0, NULL, NULL }, /* 442 (unused) */ + { MA, 0, NULL, NULL }, /* 443 (unused) */ + { MA, 0, NULL, NULL }, /* 444 (unused) */ + { MA, 0, NULL, NULL }, /* 445 (unused) */ + { MA, 0, NULL, NULL }, /* 446 (unused) */ + { MA, 0, NULL, NULL }, /* 447 (unused) */ + { MA, 0, NULL, NULL }, /* 448 (unused) */ + { MA, 0, NULL, NULL }, /* 449 (unused) */ + { MA, 0, NULL, NULL }, /* 450 (unused) */ + { MA, 0, NULL, NULL }, /* 451 (unused) */ + { MA, 0, NULL, NULL }, /* 452 (unused) */ + { MA, 0, NULL, NULL }, /* 453 (unused) */ + { MA, 0, NULL, NULL }, /* 454 (unused) */ + { MA, 0, NULL, NULL }, /* 455 (unused) */ + { MA, 0, NULL, NULL }, /* 456 (unused) */ + { MA, 0, NULL, NULL }, /* 457 (unused) */ + { MA, 0, NULL, NULL }, /* 458 (unused) */ + { MA, 0, NULL, NULL }, /* 459 (unused) */ + { MA, 0, NULL, NULL }, /* 460 (unused) */ + { MA, 0, NULL, NULL }, /* 461 (unused) */ + { MA, 0, NULL, NULL }, /* 462 (unused) */ + { MA, 0, NULL, NULL }, /* 463 (unused) */ + { MA, 0, NULL, NULL }, /* 464 (unused) */ + { MA, 0, NULL, NULL }, /* 465 (unused) */ + { MA, 0, NULL, NULL }, /* 466 (unused) */ + { MA, 0, NULL, NULL }, /* 467 (unused) */ + { MA, 0, NULL, NULL }, /* 468 (unused) */ + { MA, 0, NULL, NULL }, /* 469 (unused) */ + { MA, 0, NULL, NULL }, /* 470 (unused) */ + { MA, 0, NULL, NULL }, /* 471 (unused) */ + { MA, 0, NULL, NULL }, /* 472 (unused) */ + { MA, 0, NULL, NULL }, /* 473 (unused) */ + { MA, 0, NULL, NULL }, /* 474 (unused) */ + { MA, 0, NULL, NULL }, /* 475 (unused) */ + { MA, 0, NULL, NULL }, /* 476 (unused) */ + { MA, 0, NULL, NULL }, /* 477 (unused) */ + { MA, 0, NULL, NULL }, /* 478 (unused) */ + { MA, 0, NULL, NULL }, /* 479 (unused) */ + { MA, 0, NULL, NULL }, /* 480 (unused) */ + { MA, 0, NULL, NULL }, /* 481 (unused) */ + { MA, 0, NULL, NULL }, /* 482 (unused) */ + { MA, 0, NULL, NULL }, /* 483 (unused) */ + { MA, 0, NULL, NULL }, /* 484 (unused) */ + { MA, 0, NULL, NULL }, /* 485 (unused) */ + { MA, 0, NULL, NULL }, /* 486 (unused) */ + { MA, 0, NULL, NULL }, /* 487 (unused) */ + { MA, 0, NULL, NULL }, /* 488 (unused) */ + { MA, 0, NULL, NULL }, /* 489 (unused) */ + { MA, 0, NULL, NULL }, /* 490 (unused) */ + { MA, 0, NULL, NULL }, /* 491 (unused) */ + { MA, 0, NULL, NULL }, /* 492 (unused) */ + { MA, 0, NULL, NULL }, /* 493 (unused) */ + { MA, 0, NULL, NULL }, /* 494 (unused) */ + { MA, 0, NULL, NULL }, /* 495 (unused) */ + { MA, 0, NULL, NULL }, /* 496 (unused) */ + { MA, 0, NULL, NULL }, /* 497 (unused) */ + { MA, 0, NULL, NULL }, /* 498 (unused) */ + { MA, 0, NULL, NULL }, /* 499 (unused) */ + { MA, 0, NULL, NULL }, /* 500 (unused) */ + { MA, 0, NULL, NULL }, /* 501 (unused) */ + { MA, 0, NULL, NULL }, /* 502 (unused) */ + { MA, 0, NULL, NULL }, /* 503 (unused) */ + { MA, 0, NULL, NULL }, /* 504 (unused) */ + { MA, 0, NULL, NULL }, /* 505 (unused) */ + { MA, 0, NULL, NULL }, /* 506 (unused) */ + { MA, 0, NULL, NULL }, /* 507 (unused) */ + { MA, 0, NULL, NULL }, /* 508 (unused) */ + { MA, 0, NULL, NULL }, /* 509 (unused) */ + { MA, 0, NULL, NULL }, /* 510 (unused) */ + { MA, 0, NULL, NULL }, /* 511 (unused) */ + { MA, 0, NULL, NULL }, /* 512 (unused) */ + { MA, 0, NULL, NULL }, /* 513 (unused) */ + { MA, 0, NULL, NULL }, /* 514 (unused) */ + { MA, 0, NULL, NULL }, /* 515 (unused) */ + { MA, 0, NULL, NULL }, /* 516 (unused) */ + { MA, 0, NULL, NULL }, /* 517 (unused) */ + { MA, 0, NULL, NULL }, /* 518 (unused) */ + { MA, 0, NULL, NULL }, /* 519 (unused) */ + { MA, 0, NULL, NULL }, /* 520 (unused) */ + { MA, 0, NULL, NULL }, /* 521 (unused) */ + { MA, 0, NULL, NULL }, /* 522 (unused) */ + { MA, 0, NULL, NULL }, /* 523 (unused) */ + { MA, 0, NULL, NULL }, /* 524 (unused) */ + { MA, 0, NULL, NULL }, /* 525 (unused) */ + { MA, 0, NULL, NULL }, /* 526 (unused) */ + { MA, 0, NULL, NULL }, /* 527 (unused) */ + { MA, 0, NULL, NULL }, /* 528 (unused) */ + { MA, 0, NULL, NULL }, /* 529 (unused) */ + { MA, 0, NULL, NULL }, /* 530 (unused) */ + { MA, 0, NULL, NULL }, /* 531 (unused) */ + { MA, 0, NULL, NULL }, /* 532 (unused) */ + { MA, 0, NULL, NULL }, /* 533 (unused) */ + { MA, 0, NULL, NULL }, /* 534 (unused) */ + { MA, 0, NULL, NULL }, /* 535 (unused) */ + { MA, 0, NULL, NULL }, /* 536 (unused) */ + { MA, 0, NULL, NULL }, /* 537 (unused) */ + { MA, 0, NULL, NULL }, /* 538 (unused) */ + { MA, 0, NULL, NULL }, /* 539 (unused) */ + { MA, 0, NULL, NULL }, /* 540 (unused) */ + { MA, 0, NULL, NULL }, /* 541 (unused) */ + { MA, 0, NULL, NULL }, /* 542 (unused) */ + { MA, 0, NULL, NULL }, /* 543 (unused) */ + { MA, 0, NULL, NULL }, /* 544 (unused) */ + { MA, 0, NULL, NULL }, /* 545 (unused) */ + { MA, 0, NULL, NULL }, /* 546 (unused) */ + { MA, 0, NULL, NULL }, /* 547 (unused) */ + { MA, 0, NULL, NULL }, /* 548 (unused) */ + { MA, 0, NULL, NULL }, /* 549 (unused) */ + { MA, 0, NULL, NULL }, /* 550 (unused) */ + { MA, 0, NULL, NULL }, /* 551 (unused) */ + { MA, 0, NULL, NULL }, /* 552 (unused) */ + { MA, 0, NULL, NULL }, /* 553 (unused) */ + { MA, 0, NULL, NULL }, /* 554 (unused) */ + { MA, 0, NULL, NULL }, /* 555 (unused) */ + { MA, 0, NULL, NULL }, /* 556 (unused) */ + { MA, 0, NULL, NULL }, /* 557 (unused) */ + { MA, 0, NULL, NULL }, /* 558 (unused) */ + { MA, 0, NULL, NULL }, /* 559 (unused) */ + { MA, 0, NULL, NULL }, /* 560 (unused) */ + { MA, 0, NULL, NULL }, /* 561 (unused) */ + { MA, 0, NULL, NULL }, /* 562 (unused) */ + { MA, 0, NULL, NULL }, /* 563 (unused) */ + { MA, 0, NULL, NULL }, /* 564 (unused) */ + { MA, 0, NULL, NULL }, /* 565 (unused) */ + { MA, 0, NULL, NULL }, /* 566 (unused) */ + { MA, 0, NULL, NULL }, /* 567 (unused) */ + { MA, 0, NULL, NULL }, /* 568 (unused) */ + { MA, 0, NULL, NULL }, /* 569 (unused) */ + { MA, 0, NULL, NULL }, /* 570 (unused) */ + { MA, 0, NULL, NULL }, /* 571 (unused) */ + { MA, 0, NULL, NULL }, /* 572 (unused) */ + { MA, 0, NULL, NULL }, /* 573 (unused) */ + { MA, 0, NULL, NULL }, /* 574 (unused) */ + { MA, 0, NULL, NULL }, /* 575 (unused) */ + { MA, 0, NULL, NULL }, /* 576 (unused) */ + { MA, 0, NULL, NULL }, /* 577 (unused) */ + { MA, 0, NULL, NULL }, /* 578 (unused) */ + { MA, 0, NULL, NULL }, /* 579 (unused) */ + { MA, 0, NULL, NULL }, /* 580 (unused) */ + { MA, 0, NULL, NULL }, /* 581 (unused) */ + { MA, 0, NULL, NULL }, /* 582 (unused) */ + { MA, 0, NULL, NULL }, /* 583 (unused) */ + { MA, 0, NULL, NULL }, /* 584 (unused) */ + { MA, 0, NULL, NULL }, /* 585 (unused) */ + { MA, 0, NULL, NULL }, /* 586 (unused) */ + { MA, 0, NULL, NULL }, /* 587 (unused) */ + { MA, 0, NULL, NULL }, /* 588 (unused) */ + { MA, 0, NULL, NULL }, /* 589 (unused) */ + { MA, 0, NULL, NULL }, /* 590 (unused) */ + { MA, 0, NULL, NULL }, /* 591 (unused) */ + { MA, 0, NULL, NULL }, /* 592 (unused) */ + { MA, 0, NULL, NULL }, /* 593 (unused) */ + { MA, 0, NULL, NULL }, /* 594 (unused) */ + { MA, 0, NULL, NULL }, /* 595 (unused) */ + { MA, 0, NULL, NULL }, /* 596 (unused) */ + { MA, 0, NULL, NULL }, /* 597 (unused) */ + { MA, 0, NULL, NULL }, /* 598 (unused) */ + { MA, 0, NULL, NULL }, /* 599 (unused) */ + { MA, 0, NULL, NULL }, /* 600 (unused) */ + { MA, 0, NULL, NULL }, /* 601 (unused) */ + { MA, 0, NULL, NULL }, /* 602 (unused) */ + { MA, 0, NULL, NULL }, /* 603 (unused) */ + { MA, 0, NULL, NULL }, /* 604 (unused) */ + { MA, 0, NULL, NULL }, /* 605 (unused) */ + { MA, 0, NULL, NULL }, /* 606 (unused) */ + { MA, 0, NULL, NULL }, /* 607 (unused) */ + { MA, 0, NULL, NULL }, /* 608 (unused) */ + { MA, 0, NULL, NULL }, /* 609 (unused) */ + { MA, 0, NULL, NULL }, /* 610 (unused) */ + { MA, 0, NULL, NULL }, /* 611 (unused) */ + { MA, 0, NULL, NULL }, /* 612 (unused) */ + { MA, 0, NULL, NULL }, /* 613 (unused) */ + { MA, 0, NULL, NULL }, /* 614 (unused) */ + { MA, 0, NULL, NULL }, /* 615 (unused) */ + { MA, 0, NULL, NULL }, /* 616 (unused) */ + { MA, 0, NULL, NULL }, /* 617 (unused) */ + { MA, 0, NULL, NULL }, /* 618 (unused) */ + { MA, 0, NULL, NULL }, /* 619 (unused) */ + { MA, 0, NULL, NULL }, /* 620 (unused) */ + { MA, 0, NULL, NULL }, /* 621 (unused) */ + { MA, 0, NULL, NULL }, /* 622 (unused) */ + { MA, 0, NULL, NULL }, /* 623 (unused) */ + { MA, 0, NULL, NULL }, /* 624 (unused) */ + { MA, 0, NULL, NULL }, /* 625 (unused) */ + { MA, 0, NULL, NULL }, /* 626 (unused) */ + { MA, 0, NULL, NULL }, /* 627 (unused) */ + { MA, 0, NULL, NULL }, /* 628 (unused) */ + { MA, 0, NULL, NULL }, /* 629 (unused) */ + { MA, 0, NULL, NULL }, /* 630 (unused) */ + { MA, 0, NULL, NULL }, /* 631 (unused) */ + { MA, 0, NULL, NULL }, /* 632 (unused) */ + { MA, 0, NULL, NULL }, /* 633 (unused) */ + { MA, 0, NULL, NULL }, /* 634 (unused) */ + { MA, 0, NULL, NULL }, /* 635 (unused) */ + { MA, 0, NULL, NULL }, /* 636 (unused) */ + { MA, 0, NULL, NULL }, /* 637 (unused) */ + { MA, 0, NULL, NULL }, /* 638 (unused) */ + { MA, 0, NULL, NULL }, /* 639 (unused) */ + { MA, 0, NULL, NULL }, /* 640 (unused) */ + { MA, 0, NULL, NULL }, /* 641 (unused) */ + { MA, 0, NULL, NULL }, /* 642 (unused) */ + { MA, 0, NULL, NULL }, /* 643 (unused) */ + { MA, 0, NULL, NULL }, /* 644 (unused) */ + { MA, 0, NULL, NULL }, /* 645 (unused) */ + { MA, 0, NULL, NULL }, /* 646 (unused) */ + { MA, 0, NULL, NULL }, /* 647 (unused) */ + { MA, 0, NULL, NULL }, /* 648 (unused) */ + { MA, 0, NULL, NULL }, /* 649 (unused) */ + { MA, 0, NULL, NULL }, /* 650 (unused) */ + { MA, 0, NULL, NULL }, /* 651 (unused) */ + { MA, 0, NULL, NULL }, /* 652 (unused) */ + { MA, 0, NULL, NULL }, /* 653 (unused) */ + { MA, 0, NULL, NULL }, /* 654 (unused) */ + { MA, 0, NULL, NULL }, /* 655 (unused) */ + { MA, 0, NULL, NULL }, /* 656 (unused) */ + { MA, 0, NULL, NULL }, /* 657 (unused) */ + { MA, 0, NULL, NULL }, /* 658 (unused) */ + { MA, 0, NULL, NULL }, /* 659 (unused) */ + { MA, 0, NULL, NULL }, /* 660 (unused) */ + { MA, 0, NULL, NULL }, /* 661 (unused) */ + { MA, 0, NULL, NULL }, /* 662 (unused) */ + { MA, 0, NULL, NULL }, /* 663 (unused) */ + { MA, 0, NULL, NULL }, /* 664 (unused) */ + { MA, 0, NULL, NULL }, /* 665 (unused) */ + { MA, 0, NULL, NULL }, /* 666 (unused) */ + { MA, 0, NULL, NULL }, /* 667 (unused) */ + { MA, 0, NULL, NULL }, /* 668 (unused) */ + { MA, 0, NULL, NULL }, /* 669 (unused) */ + { MA, 0, NULL, NULL }, /* 670 (unused) */ + { MA, 0, NULL, NULL }, /* 671 (unused) */ + { MA, 0, NULL, NULL }, /* 672 (unused) */ + { MA, 0, NULL, NULL }, /* 673 (unused) */ + { MA, 0, NULL, NULL }, /* 674 (unused) */ + { MA, 0, NULL, NULL }, /* 675 (unused) */ + { MA, 0, NULL, NULL }, /* 676 (unused) */ + { MA, 0, NULL, NULL }, /* 677 (unused) */ + { MA, 0, NULL, NULL }, /* 678 (unused) */ + { MA, 0, NULL, NULL }, /* 679 (unused) */ + { MA, 0, NULL, NULL }, /* 680 (unused) */ + { MA, 0, NULL, NULL }, /* 681 (unused) */ + { MA, 0, NULL, NULL }, /* 682 (unused) */ + { MA, 0, NULL, NULL }, /* 683 (unused) */ + { MA, 0, NULL, NULL }, /* 684 (unused) */ + { MA, 0, NULL, NULL }, /* 685 (unused) */ + { MA, 0, NULL, NULL }, /* 686 (unused) */ + { MA, 0, NULL, NULL }, /* 687 (unused) */ + { MA, 0, NULL, NULL }, /* 688 (unused) */ + { MA, 0, NULL, NULL }, /* 689 (unused) */ + { MA, 0, NULL, NULL }, /* 690 (unused) */ + { MA, 0, NULL, NULL }, /* 691 (unused) */ + { MA, 0, NULL, NULL }, /* 692 (unused) */ + { MA, 0, NULL, NULL }, /* 693 (unused) */ + { MA, 0, NULL, NULL }, /* 694 (unused) */ + { MA, 0, NULL, NULL }, /* 695 (unused) */ + { MA, 0, NULL, NULL }, /* 696 (unused) */ + { MA, 0, NULL, NULL }, /* 697 (unused) */ + { MA, 0, NULL, NULL }, /* 698 (unused) */ + { MA, 0, NULL, NULL }, /* 699 (unused) */ + { MA, 0, NULL, NULL }, /* 700 (unused) */ + { MA, 0, NULL, NULL }, /* 701 (unused) */ + { MA, 0, NULL, NULL }, /* 702 (unused) */ + { MA, 0, NULL, NULL }, /* 703 (unused) */ + { MA, 0, NULL, NULL }, /* 704 (unused) */ + { MA, 0, NULL, NULL }, /* 705 (unused) */ + { MA, 0, NULL, NULL }, /* 706 (unused) */ + { MA, 0, NULL, NULL }, /* 707 (unused) */ + { MA, 0, NULL, NULL }, /* 708 (unused) */ + { MA, 0, NULL, NULL }, /* 709 (unused) */ + { MA, 0, NULL, NULL }, /* 710 (unused) */ + { MA, 0, NULL, NULL }, /* 711 (unused) */ + { MA, 0, NULL, NULL }, /* 712 (unused) */ + { MA, 0, NULL, NULL }, /* 713 (unused) */ + { MA, 0, NULL, NULL }, /* 714 (unused) */ + { MA, 0, NULL, NULL }, /* 715 (unused) */ + { MA, 0, NULL, NULL }, /* 716 (unused) */ + { MA, 0, NULL, NULL }, /* 717 (unused) */ + { MA, 0, NULL, NULL }, /* 718 (unused) */ + { MA, 0, NULL, NULL }, /* 719 (unused) */ + { MA, 0, NULL, NULL }, /* 720 (unused) */ + { MA, 0, NULL, NULL }, /* 721 (unused) */ + { MA, 0, NULL, NULL }, /* 722 (unused) */ + { MA, 0, NULL, NULL }, /* 723 (unused) */ + { MA, 0, NULL, NULL }, /* 724 (unused) */ + { MA, 0, NULL, NULL }, /* 725 (unused) */ + { MA, 0, NULL, NULL }, /* 726 (unused) */ + { MA, 0, NULL, NULL }, /* 727 (unused) */ + { MA, 0, NULL, NULL }, /* 728 (unused) */ + { MA, 0, NULL, NULL }, /* 729 (unused) */ + { MA, 0, NULL, NULL }, /* 730 (unused) */ + { MA, 0, NULL, NULL }, /* 731 (unused) */ + { MA, 0, NULL, NULL }, /* 732 (unused) */ + { MA, 0, NULL, NULL }, /* 733 (unused) */ + { MA, 0, NULL, NULL }, /* 734 (unused) */ + { MA, 0, NULL, NULL }, /* 735 (unused) */ + { MA, 0, NULL, NULL }, /* 736 (unused) */ + { MA, 0, NULL, NULL }, /* 737 (unused) */ + { MA, 0, NULL, NULL }, /* 738 (unused) */ + { MA, 0, NULL, NULL }, /* 739 (unused) */ + { MA, 0, NULL, NULL }, /* 740 (unused) */ + { MA, 0, NULL, NULL }, /* 741 (unused) */ + { MA, 0, NULL, NULL }, /* 742 (unused) */ + { MA, 0, NULL, NULL }, /* 743 (unused) */ + { MA, 0, NULL, NULL }, /* 744 (unused) */ + { MA, 0, NULL, NULL }, /* 745 (unused) */ + { MA, 0, NULL, NULL }, /* 746 (unused) */ + { MA, 0, NULL, NULL }, /* 747 (unused) */ + { MA, 0, NULL, NULL }, /* 748 (unused) */ + { MA, 0, NULL, NULL }, /* 749 (unused) */ + { MA, 0, NULL, NULL }, /* 750 (unused) */ + { MA, 0, NULL, NULL }, /* 751 (unused) */ + { MA, 0, NULL, NULL }, /* 752 (unused) */ + { MA, 0, NULL, NULL }, /* 753 (unused) */ + { MA, 0, NULL, NULL }, /* 754 (unused) */ + { MA, 0, NULL, NULL }, /* 755 (unused) */ + { MA, 0, NULL, NULL }, /* 756 (unused) */ + { MA, 0, NULL, NULL }, /* 757 (unused) */ + { MA, 0, NULL, NULL }, /* 758 (unused) */ + { MA, 0, NULL, NULL }, /* 759 (unused) */ + { MA, 0, NULL, NULL }, /* 760 (unused) */ + { MA, 0, NULL, NULL }, /* 761 (unused) */ + { MA, 0, NULL, NULL }, /* 762 (unused) */ + { MA, 0, NULL, NULL }, /* 763 (unused) */ + { MA, 0, NULL, NULL }, /* 764 (unused) */ + { MA, 0, NULL, NULL }, /* 765 (unused) */ + { MA, 0, NULL, NULL }, /* 766 (unused) */ + { MA, 0, NULL, NULL }, /* 767 (unused) */ + { MA, 0, NULL, NULL }, /* 768 (unused) */ + { MA, 0, NULL, NULL }, /* 769 (unused) */ + { MA, 0, NULL, NULL }, /* 770 (unused) */ + { MA, 0, NULL, NULL }, /* 771 (unused) */ + { MA, 0, NULL, NULL }, /* 772 (unused) */ + { MA, 0, NULL, NULL }, /* 773 (unused) */ + { MA, 0, NULL, NULL }, /* 774 (unused) */ + { MA, 0, NULL, NULL }, /* 775 (unused) */ + { MA, 0, NULL, NULL }, /* 776 (unused) */ + { MA, 0, NULL, NULL }, /* 777 (unused) */ + { MA, 0, NULL, NULL }, /* 778 (unused) */ + { MA, 0, NULL, NULL }, /* 779 (unused) */ + { MA, 0, NULL, NULL }, /* 780 (unused) */ + { MA, 0, NULL, NULL }, /* 781 (unused) */ + { MA, 0, NULL, NULL }, /* 782 (unused) */ + { MA, 0, NULL, NULL }, /* 783 (unused) */ + { MA, 0, NULL, NULL }, /* 784 (unused) */ + { MA, 0, NULL, NULL }, /* 785 (unused) */ + { MA, 0, NULL, NULL }, /* 786 (unused) */ + { MA, 0, NULL, NULL }, /* 787 (unused) */ + { MA, 0, NULL, NULL }, /* 788 (unused) */ + { MA, 0, NULL, NULL }, /* 789 (unused) */ + { MA, 0, NULL, NULL }, /* 790 (unused) */ + { MA, 0, NULL, NULL }, /* 791 (unused) */ + { MA, 0, NULL, NULL }, /* 792 (unused) */ + { MA, 0, NULL, NULL }, /* 793 (unused) */ + { MA, 0, NULL, NULL }, /* 794 (unused) */ + { MA, 0, NULL, NULL }, /* 795 (unused) */ + { MA, 0, NULL, NULL }, /* 796 (unused) */ + { MA, 0, NULL, NULL }, /* 797 (unused) */ + { MA, 0, NULL, NULL }, /* 798 (unused) */ + { MA, 0, NULL, NULL }, /* 799 (unused) */ + { MA, 0, NULL, NULL }, /* 800 (unused) */ + { MA, 0, NULL, NULL }, /* 801 (unused) */ + { MA, 0, NULL, NULL }, /* 802 (unused) */ + { MA, 0, NULL, NULL }, /* 803 (unused) */ + { MA, 0, NULL, NULL }, /* 804 (unused) */ + { MA, 0, NULL, NULL }, /* 805 (unused) */ + { MA, 0, NULL, NULL }, /* 806 (unused) */ + { MA, 0, NULL, NULL }, /* 807 (unused) */ + { MA, 0, NULL, NULL }, /* 808 (unused) */ + { MA, 0, NULL, NULL }, /* 809 (unused) */ + { MA, 0, NULL, NULL }, /* 810 (unused) */ + { MA, 0, NULL, NULL }, /* 811 (unused) */ + { MA, 0, NULL, NULL }, /* 812 (unused) */ + { MA, 0, NULL, NULL }, /* 813 (unused) */ + { MA, 0, NULL, NULL }, /* 814 (unused) */ + { MA, 0, NULL, NULL }, /* 815 (unused) */ + { MA, 0, NULL, NULL }, /* 816 (unused) */ + { MA, 0, NULL, NULL }, /* 817 (unused) */ + { MA, 0, NULL, NULL }, /* 818 (unused) */ + { MA, 0, NULL, NULL }, /* 819 (unused) */ + { MA, 0, NULL, NULL }, /* 820 (unused) */ + { MA, 0, NULL, NULL }, /* 821 (unused) */ + { MA, 0, NULL, NULL }, /* 822 (unused) */ + { MA, 0, NULL, NULL }, /* 823 (unused) */ + { MA, 0, NULL, NULL }, /* 824 (unused) */ + { MA, 0, NULL, NULL }, /* 825 (unused) */ + { MA, 0, NULL, NULL }, /* 826 (unused) */ + { MA, 0, NULL, NULL }, /* 827 (unused) */ + { MA, 0, NULL, NULL }, /* 828 (unused) */ + { MA, 0, NULL, NULL }, /* 829 (unused) */ + { MA, 0, NULL, NULL }, /* 830 (unused) */ + { MA, 0, NULL, NULL }, /* 831 (unused) */ + { MA, 0, NULL, NULL }, /* 832 (unused) */ + { MA, 0, NULL, NULL }, /* 833 (unused) */ + { MA, 0, NULL, NULL }, /* 834 (unused) */ + { MA, 0, NULL, NULL }, /* 835 (unused) */ + { MA, 0, NULL, NULL }, /* 836 (unused) */ + { MA, 0, NULL, NULL }, /* 837 (unused) */ + { MA, 0, NULL, NULL }, /* 838 (unused) */ + { MA, 0, NULL, NULL }, /* 839 (unused) */ + { MA, 0, NULL, NULL }, /* 840 (unused) */ + { MA, 0, NULL, NULL }, /* 841 (unused) */ + { MA, 0, NULL, NULL }, /* 842 (unused) */ + { MA, 0, NULL, NULL }, /* 843 (unused) */ + { MA, 0, NULL, NULL }, /* 844 (unused) */ + { MA, 0, NULL, NULL }, /* 845 (unused) */ + { MA, 0, NULL, NULL }, /* 846 (unused) */ + { MA, 0, NULL, NULL }, /* 847 (unused) */ + { MA, 0, NULL, NULL }, /* 848 (unused) */ + { MA, 0, NULL, NULL }, /* 849 (unused) */ + { MA, 0, NULL, NULL }, /* 850 (unused) */ + { MA, 0, NULL, NULL }, /* 851 (unused) */ + { MA, 0, NULL, NULL }, /* 852 (unused) */ + { MA, 0, NULL, NULL }, /* 853 (unused) */ + { MA, 0, NULL, NULL }, /* 854 (unused) */ + { MA, 0, NULL, NULL }, /* 855 (unused) */ + { MA, 0, NULL, NULL }, /* 856 (unused) */ + { MA, 0, NULL, NULL }, /* 857 (unused) */ + { MA, 0, NULL, NULL }, /* 858 (unused) */ + { MA, 0, NULL, NULL }, /* 859 (unused) */ + { MA, 0, NULL, NULL }, /* 860 (unused) */ + { MA, 0, NULL, NULL }, /* 861 (unused) */ + { MA, 0, NULL, NULL }, /* 862 (unused) */ + { MA, 0, NULL, NULL }, /* 863 (unused) */ + { MA, 0, NULL, NULL }, /* 864 (unused) */ + { MA, 0, NULL, NULL }, /* 865 (unused) */ + { MA, 0, NULL, NULL }, /* 866 (unused) */ + { MA, 0, NULL, NULL }, /* 867 (unused) */ + { MA, 0, NULL, NULL }, /* 868 (unused) */ + { MA, 0, NULL, NULL }, /* 869 (unused) */ + { MA, 0, NULL, NULL }, /* 870 (unused) */ + { MA, 0, NULL, NULL }, /* 871 (unused) */ + { MA, 0, NULL, NULL }, /* 872 (unused) */ + { MA, 0, NULL, NULL }, /* 873 (unused) */ + { MA, 0, NULL, NULL }, /* 874 (unused) */ + { MA, 0, NULL, NULL }, /* 875 (unused) */ + { MA, 0, NULL, NULL }, /* 876 (unused) */ + { MA, 0, NULL, NULL }, /* 877 (unused) */ + { MA, 0, NULL, NULL }, /* 878 (unused) */ + { MA, 0, NULL, NULL }, /* 879 (unused) */ + { MA, 0, NULL, NULL }, /* 880 (unused) */ + { MA, 0, NULL, NULL }, /* 881 (unused) */ + { MA, 0, NULL, NULL }, /* 882 (unused) */ + { MA, 0, NULL, NULL }, /* 883 (unused) */ + { MA, 0, NULL, NULL }, /* 884 (unused) */ + { MA, 0, NULL, NULL }, /* 885 (unused) */ + { MA, 0, NULL, NULL }, /* 886 (unused) */ + { MA, 0, NULL, NULL }, /* 887 (unused) */ + { MA, 0, NULL, NULL }, /* 888 (unused) */ + { MA, 0, NULL, NULL }, /* 889 (unused) */ + { MA, 0, NULL, NULL }, /* 890 (unused) */ + { MA, 0, NULL, NULL }, /* 891 (unused) */ + { MA, 0, NULL, NULL }, /* 892 (unused) */ + { MA, 0, NULL, NULL }, /* 893 (unused) */ + { MA, 0, NULL, NULL }, /* 894 (unused) */ + { MA, 0, NULL, NULL }, /* 895 (unused) */ + { MA, 0, NULL, NULL }, /* 896 (unused) */ + { MA, 0, NULL, NULL }, /* 897 (unused) */ + { MA, 0, NULL, NULL }, /* 898 (unused) */ + { MA, 0, NULL, NULL }, /* 899 (unused) */ + { MA, 0, NULL, NULL }, /* 900 (unused) */ + { MA, 0, NULL, NULL }, /* 901 (unused) */ + { MA, 0, NULL, NULL }, /* 902 (unused) */ + { MA, 0, NULL, NULL }, /* 903 (unused) */ + { MA, 0, NULL, NULL }, /* 904 (unused) */ + { MA, 0, NULL, NULL }, /* 905 (unused) */ + { MA, 0, NULL, NULL }, /* 906 (unused) */ + { MA, 0, NULL, NULL }, /* 907 (unused) */ + { MA, 0, NULL, NULL }, /* 908 (unused) */ + { MA, 0, NULL, NULL }, /* 909 (unused) */ + { MA, 0, NULL, NULL }, /* 910 (unused) */ + { MA, 0, NULL, NULL }, /* 911 (unused) */ + { MA, 0, NULL, NULL }, /* 912 (unused) */ + { MA, 0, NULL, NULL }, /* 913 (unused) */ + { MA, 0, NULL, NULL }, /* 914 (unused) */ + { MA, 0, NULL, NULL }, /* 915 (unused) */ + { MA, 0, NULL, NULL }, /* 916 (unused) */ + { MA, 0, NULL, NULL }, /* 917 (unused) */ + { MA, 0, NULL, NULL }, /* 918 (unused) */ + { MA, 0, NULL, NULL }, /* 919 (unused) */ + { MA, 0, NULL, NULL }, /* 920 (unused) */ + { MA, 0, NULL, NULL }, /* 921 (unused) */ + { MA, 0, NULL, NULL }, /* 922 (unused) */ + { MA, 0, NULL, NULL }, /* 923 (unused) */ + { MA, 0, NULL, NULL }, /* 924 (unused) */ + { MA, 0, NULL, NULL }, /* 925 (unused) */ + { MA, 0, NULL, NULL }, /* 926 (unused) */ + { MA, 0, NULL, NULL }, /* 927 (unused) */ + { MA, 0, NULL, NULL }, /* 928 (unused) */ + { MA, 0, NULL, NULL }, /* 929 (unused) */ + { MA, 0, NULL, NULL }, /* 930 (unused) */ + { MA, 0, NULL, NULL }, /* 931 (unused) */ + { MA, 0, NULL, NULL }, /* 932 (unused) */ + { MA, 0, NULL, NULL }, /* 933 (unused) */ + { MA, 0, NULL, NULL }, /* 934 (unused) */ + { MA, 0, NULL, NULL }, /* 935 (unused) */ + { MA, 0, NULL, NULL }, /* 936 (unused) */ + { MA, 0, NULL, NULL }, /* 937 (unused) */ + { MA, 0, NULL, NULL }, /* 938 (unused) */ + { MA, 0, NULL, NULL }, /* 939 (unused) */ + { MA, 0, NULL, NULL }, /* 940 (unused) */ + { MA, 0, NULL, NULL }, /* 941 (unused) */ + { MA, 0, NULL, NULL }, /* 942 (unused) */ + { MA, 0, NULL, NULL }, /* 943 (unused) */ + { MA, 0, NULL, NULL }, /* 944 (unused) */ + { MA, 0, NULL, NULL }, /* 945 (unused) */ + { MA, 0, NULL, NULL }, /* 946 (unused) */ + { MA, 0, NULL, NULL }, /* 947 (unused) */ + { MA, 0, NULL, NULL }, /* 948 (unused) */ + { MA, 0, NULL, NULL }, /* 949 (unused) */ + { MA, 0, NULL, NULL }, /* 950 (unused) */ + { MA, 0, NULL, NULL }, /* 951 (unused) */ + { MA, 0, NULL, NULL }, /* 952 (unused) */ + { MA, 0, NULL, NULL }, /* 953 (unused) */ + { MA, 0, NULL, NULL }, /* 954 (unused) */ + { MA, 0, NULL, NULL }, /* 955 (unused) */ + { MA, 0, NULL, NULL }, /* 956 (unused) */ + { MA, 0, NULL, NULL }, /* 957 (unused) */ + { MA, 0, NULL, NULL }, /* 958 (unused) */ + { MA, 0, NULL, NULL }, /* 959 (unused) */ + { MA, 0, NULL, NULL }, /* 960 (unused) */ + { MA, 0, NULL, NULL }, /* 961 (unused) */ + { MA, 0, NULL, NULL }, /* 962 (unused) */ + { MA, 0, NULL, NULL }, /* 963 (unused) */ + { MA, 0, NULL, NULL }, /* 964 (unused) */ + { MA, 0, NULL, NULL }, /* 965 (unused) */ + { MA, 0, NULL, NULL }, /* 966 (unused) */ + { MA, 0, NULL, NULL }, /* 967 (unused) */ + { MA, 0, NULL, NULL }, /* 968 (unused) */ + { MA, 0, NULL, NULL }, /* 969 (unused) */ + { MA, 0, NULL, NULL }, /* 970 (unused) */ + { MA, 0, NULL, NULL }, /* 971 (unused) */ + { MA, 0, NULL, NULL }, /* 972 (unused) */ + { MA, 0, NULL, NULL }, /* 973 (unused) */ + { MA, 0, NULL, NULL }, /* 974 (unused) */ + { MA, 0, NULL, NULL }, /* 975 (unused) */ + { MA, 0, NULL, NULL }, /* 976 (unused) */ + { MA, 0, NULL, NULL }, /* 977 (unused) */ + { MA, 0, NULL, NULL }, /* 978 (unused) */ + { MA, 0, NULL, NULL }, /* 979 (unused) */ + { MA, 0, NULL, NULL }, /* 980 (unused) */ + { MA, 0, NULL, NULL }, /* 981 (unused) */ + { MA, 0, NULL, NULL }, /* 982 (unused) */ + { MA, 0, NULL, NULL }, /* 983 (unused) */ + { MA, 0, NULL, NULL }, /* 984 (unused) */ + { MA, 0, NULL, NULL }, /* 985 (unused) */ + { MA, 0, NULL, NULL }, /* 986 (unused) */ + { MA, 0, NULL, NULL }, /* 987 (unused) */ + { MA, 0, NULL, NULL }, /* 988 (unused) */ + { MA, 0, NULL, NULL }, /* 989 (unused) */ + { MA, 0, NULL, NULL }, /* 990 (unused) */ + { MA, 0, NULL, NULL }, /* 991 (unused) */ + { MA, 0, NULL, NULL }, /* 992 (unused) */ + { MA, 0, NULL, NULL }, /* 993 (unused) */ + { MA, 0, NULL, NULL }, /* 994 (unused) */ + { MA, 0, NULL, NULL }, /* 995 (unused) */ + { MA, 0, NULL, NULL }, /* 996 (unused) */ + { MA, 0, NULL, NULL }, /* 997 (unused) */ + { MA, 0, NULL, NULL }, /* 998 (unused) */ + { MA, 0, NULL, NULL }, /* 999 (unused) */ + { MA, 0, NULL, NULL }, /* 1000 (unused) */ + { MA, 0, NULL, NULL }, /* 1001 (unused) */ + { MA, 0, NULL, NULL }, /* 1002 (unused) */ + { MA, 0, NULL, NULL }, /* 1003 (unused) */ + { MA, 0, NULL, NULL }, /* 1004 (unused) */ + { MA, 0, NULL, NULL }, /* 1005 (unused) */ + { MA, 0, NULL, NULL }, /* 1006 (unused) */ + { MA, 0, NULL, NULL }, /* 1007 (unused) */ + { MA, 0, NULL, NULL }, /* 1008 (unused) */ + { MA, 0, NULL, NULL }, /* 1009 (unused) */ + { MA, 0, NULL, NULL }, /* 1010 (unused) */ + { MA, 0, NULL, NULL }, /* 1011 (unused) */ + { MA, 0, NULL, NULL }, /* 1012 (unused) */ + { MA, 0, NULL, NULL }, /* 1013 (unused) */ + { MA, 0, NULL, NULL }, /* 1014 (unused) */ + { MA, 0, NULL, NULL }, /* 1015 (unused) */ + { MA, 0, NULL, NULL }, /* 1016 (unused) */ + { MA, 0, NULL, NULL }, /* 1017 (unused) */ + { MA, 0, NULL, NULL }, /* 1018 (unused) */ + { MA, 0, NULL, NULL }, /* 1019 (unused) */ + { MA, 0, NULL, NULL }, /* 1020 (unused) */ + { MA, 0, NULL, NULL }, /* 1021 (unused) */ + { MA, 0, NULL, NULL }, /* 1022 (unused) */ + { MA, 0, NULL, NULL }, /* 1023 (unused) */ + { 3, TD|TF, sys_open, "open" }, /* 1024 */ + { 2, TF, sys_link, "link" }, /* 1025 */ + { 1, TF, sys_unlink, "unlink" }, /* 1026 */ + { 3, TF, sys_mknod, "mknod" }, /* 1027 */ + { 2, TF, sys_chmod, "chmod" }, /* 1028 */ + { 3, TF, sys_chown, "lchown" }, /* 1029 */ + { 2, TF, sys_mkdir, "mkdir" }, /* 1030 */ + { 1, TF, sys_rmdir, "rmdir" }, /* 1031 */ + { 3, TF, sys_chown, "lchown" }, /* 1032 */ + { 2, TF, sys_access, "access" }, /* 1033 */ + { 2, TF, sys_rename, "rename" }, /* 1034 */ + { 3, TF, sys_readlink, "readlink" }, /* 1035 */ + { 2, TF, sys_symlink, "symlink" }, /* 1036 */ + { 2, TF, sys_utimes, "utimes" }, /* 1037 */ + { 2, TF, sys_stat64, "stat64" }, /* 1038 */ + { 2, TF, sys_lstat64, "lstat64" }, /* 1039 */ + { 1, TD, sys_pipe, "pipe" }, /* 1040 */ + { 2, TD, sys_dup2, "dup2" }, /* 1041 */ + { 1, TD, sys_epoll_create, "epoll_create" }, /* 1042 */ + { 0, TD, sys_inotify_init, "inotify_init" }, /* 1043 */ + { 1, TD, sys_eventfd, "eventfd" }, /* 1044 */ + { 3, TD|TS, sys_signalfd, "signalfd" }, /* 1045 */ + { 4, TD|TN, sys_sendfile, "sendfile" }, /* 1046 */ + { 2, TD, sys_ftruncate, "ftruncate" }, /* 1047 */ + { 2, TF, sys_truncate, "truncate" }, /* 1048 */ + { 2, TF, sys_stat, "stat" }, /* 1049 */ + { 2, TF, sys_lstat, "lstat" }, /* 1050 */ + { 2, TD, sys_fstat, "fstat" }, /* 1051 */ + { 3, TD, sys_fcntl, "fcntl" }, /* 1052 */ + { 6, TD, sys_fadvise64, "fadvise64" }, /* 1053 */ + { 4, TD|TF, sys_newfstatat, "newfstatat" }, /* 1054 */ + { 2, TD, sys_fstatfs, "fstatfs" }, /* 1055 */ + { 2, TF, sys_statfs, "statfs" }, /* 1056 */ + { 3, TF, sys_lseek, "lseek" }, /* 1057 */ + { 6, TD, sys_mmap, "mmap" }, /* 1058 */ + { 1, 0, sys_alarm, "alarm" }, /* 1059 */ + { 0, 0, sys_getpgrp, "getpgrp" }, /* 1060 */ + { 0, TS, sys_pause, "pause" }, /* 1061 */ + { 1, 0, sys_time, "time" }, /* 1062 */ + { 2, TF, sys_utime, "utime" }, /* 1063 */ + { 2, TD|TF, sys_creat, "creat" }, /* 1064 */ + { 3, TD, sys_getdents, "getdents" }, /* 1065 */ + { 3, TD|TF, sys_futimesat, "futimesat" }, /* 1066 */ + { 5, TD, sys_select, "select" }, /* 1067 */ + { 3, TD, sys_poll, "poll" }, /* 1068 */ + { 4, TD, sys_epoll_wait, "epoll_wait" }, /* 1069 */ + { 2, 0, sys_ustat, "ustat" }, /* 1070 */ + { 0, TP, sys_vfork, "vfork" }, /* 1071 */ + { MA, 0, NULL, NULL }, /* 1072 (unused) */ + { 4, TN, sys_recv, "recv" }, /* 1073 */ + { 4, TN, sys_send, "send" }, /* 1074 */ + { 0, 0, sys_bdflush, "bdflush" }, /* 1075 */ + { 1, TF, sys_umount, "oldumount" }, /* 1076 */ + { 1, TF, sys_uselib, "uselib" }, ... [truncated message content] |
From: Christian S. <bl...@cm...> - 2013-02-11 21:42:07
|
On Mon, Feb 11, 2013 at 9:37 PM, Christian Svensson <bl...@cm...> wrote: > The following patch adds support for the or1k architecture. > This architecture has been in mainline Linux since 3.1. > > Feel free to give harsh feedback and other comments :-). > > Support for the OpenRISC 1000 platform. > While fixing a bug in glibc I discovered that the default ptrace prototype hack stopped working. This is patch improves the last patch (apply after the first one). Sorry for the noise. Do not use hacked prototype for or1k. * defs.h: Use sys/ptrace.h for or1k. * syscall.c: Fix arguments for sys/ptrace.h. * util.c: Likewise. --- defs.h | 3 ++- syscall.c | 3 +-- util.c | 8 ++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/defs.h b/defs.h index bfa765e..c7903a1 100644 --- a/defs.h +++ b/defs.h @@ -134,7 +134,8 @@ extern char *stpcpy(char *dst, const char *src); # define LINUX_MIPS64 #endif -#if (defined(LINUXSPARC) || defined(X86_64) || defined(ARM) || defined(AARCH64) || defined(AVR32)) && defined(__GLIBC__) +#if (defined(LINUXSPARC) || defined(X86_64) || defined(ARM) || defined(AARCH64) \ + || defined(OR1K) || defined(AVR32)) && defined(__GLIBC__) # include <sys/ptrace.h> #else /* Work around awkward prototype in ptrace.h. */ diff --git a/syscall.c b/syscall.c index 053a8e5..473e4ce 100644 --- a/syscall.c +++ b/syscall.c @@ -898,8 +898,7 @@ void get_regs(pid_t pid) # elif defined(TILE) get_regs_error = ptrace(PTRACE_GETREGS, pid, NULL, (long) &tile_regs); # elif defined(OR1K) - get_regs_error = ptrace(PTRACE_GETREGSET, pid, (void *)NT_PRSTATUS, - (long)&or1k_io); + get_regs_error = ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &or1k_io); # endif } #endif diff --git a/util.c b/util.c index 2798350..56e0390 100644 --- a/util.c +++ b/util.c @@ -44,6 +44,10 @@ # include <asm/rse.h> #endif +#if defined(OR1K) +# include <elf.h> +#endif + #ifdef HAVE_SYS_REG_H # include <sys/reg.h> # define PTRACE_PEEKUSR PTRACE_PEEKUSER @@ -1292,10 +1296,10 @@ change_syscall(struct tcb *tcp, arg_setup_state *state, int new) return -1; return 0; #elif defined(OR1K) - if (ptrace(PTRACE_GETREGSET, tcp->pid, (void*)1, (long)&or1k_regs) < 0) + if (ptrace(PTRACE_GETREGSET, tcp->pid, NT_PRSTATUS, &or1k_regs) < 0) return -1; or1k_regs.gpr[11] = new; - if (ptrace(PTRACE_SETREGSET, tcp->pid, (void*)1, (long)&or1k_regs) < 0) + if (ptrace(PTRACE_SETREGSET, tcp->pid, NT_PRSTATUS, &or1k_regs) < 0) return -1; #else #warning Do not know how to handle change_syscall for this architecture -- 1.8.1.2 |
From: Denys V. <dvl...@re...> - 2013-02-12 11:14:07
|
On 02/11/2013 09:37 PM, Christian Svensson wrote: > The following patch adds support for the or1k architecture. > This architecture has been in mainline Linux since 3.1. > > Feel free to give harsh feedback and other comments :-). > > Support for the OpenRISC 1000 platform. > > * configure.ac: Added or1k. > * defs.h: Added or1k to use _regs system. > * linux/or1k/ioctlent.h.in: Use i386 ioctls. > * linux/or1k/syscallent.h: New. > * process.c: Added or1k. > * syscall.c: Added or1k handlers. > (or1k_io) iovec for or1k GETREGSET. > (or1k_regs) regset structure for or1k. > * util.c: Added or1k handler for change_syscall. > --- > configure.ac | 5 + > defs.h | 8 +- > linux/or1k/ioctlent.h.in | 1 + > linux/or1k/syscallent.h | 1080 ++++++++++++++++++++++++++++++++++++++++++++++ > process.c | 41 +- > syscall.c | 34 +- > util.c | 6 + > 7 files changed, 1170 insertions(+), 5 deletions(-) > create mode 100644 linux/or1k/ioctlent.h.in > create mode 100644 linux/or1k/syscallent.h > > diff --git a/configure.ac b/configure.ac > index 80be383..8703f7c 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -111,6 +111,11 @@ microblaze*) > 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 9756179..bfa765e 100644 > --- a/defs.h > +++ b/defs.h > @@ -375,6 +375,12 @@ extern struct pt_regs arm_regs; > #if defined(TILE) > extern struct pt_regs tile_regs; > #endif > +#if defined(OR1K) > +extern struct user_regs_struct or1k_regs; > +extern struct iovec or1k_io; > +#endif Do you need to expose or1k_io as extern? > + { 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 */ > + { MA, 0, NULL, NULL }, /* 272 (unused) */ > + { MA, 0, NULL, NULL }, /* 273 (unused) */ ... > + { MA, 0, NULL, NULL }, /* 1023 (unused) */ Collapse this hige block with "[a ... b] = { foo }" notation. > -#if defined(AARCH64) > +#if defined(AARCH64) || defined(OR1K) > # include <asm/ptrace.h> > -# include <sys/uio.h> > # include <elf.h> > #endif Do not share #define blocks with other arch. Create your own. > +#elif defined(OR1K) > +struct user_regs_struct or1k_regs; > +struct iovec or1k_io = { > + .iov_base = &or1k_regs, > + .iov_len = sizeof(or1k_regs) > +}; iov_len is kernel-writable field for GETREGSET. Please reinitialize it before every new call. > @@ -1291,6 +1291,12 @@ change_syscall(struct tcb *tcp, arg_setup_state > *state, int new) > if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new) < 0) > return -1; > return 0; > +#elif defined(OR1K) > + if (ptrace(PTRACE_GETREGSET, tcp->pid, (void*)1, (long)&or1k_regs) < 0) > + return -1; > + or1k_regs.gpr[11] = new; > + if (ptrace(PTRACE_SETREGSET, tcp->pid, (void*)1, (long)&or1k_regs) < 0) > + return -1; > #else > #warning Do not know how to handle change_syscall for this architecture > #endif /* architecture */ We will never reach this code: kernels new enough to support OR1K won't require fork/clone hacks (change_syscall is part of those). Replace this code by a comment /* never reached; OR1K is only supported by kernels since M.N.K. */ -- vda |
From: Christian S. <bl...@cm...> - 2013-02-12 11:32:50
|
>> @@ -375,6 +375,12 @@ extern struct pt_regs arm_regs; >> #if defined(TILE) >> extern struct pt_regs tile_regs; >> #endif >> +#if defined(OR1K) >> +extern struct user_regs_struct or1k_regs; >> +extern struct iovec or1k_io; >> +#endif > > Do you need to expose or1k_io as extern? I had some vague reason for this since it was used in util.c in change_syscall, but since that is deprecated code it's no longer necessary. > > >> + { 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 */ >> + { MA, 0, NULL, NULL }, /* 272 (unused) */ >> + { MA, 0, NULL, NULL }, /* 273 (unused) */ > ... >> + { MA, 0, NULL, NULL }, /* 1023 (unused) */ > > Collapse this hige block with "[a ... b] = { foo }" notation. Will do, see comments at end of email as well. > > >> -#if defined(AARCH64) >> +#if defined(AARCH64) || defined(OR1K) >> # include <asm/ptrace.h> >> -# include <sys/uio.h> >> # include <elf.h> >> #endif > > Do not share #define blocks with other arch. Create your own. Ok. > >> +#elif defined(OR1K) >> +struct user_regs_struct or1k_regs; >> +struct iovec or1k_io = { >> + .iov_base = &or1k_regs, >> + .iov_len = sizeof(or1k_regs) >> +}; > > iov_len is kernel-writable field for GETREGSET. > Please reinitialize it before every new call. Ok. > > >> @@ -1291,6 +1291,12 @@ change_syscall(struct tcb *tcp, arg_setup_state >> *state, int new) >> if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new) < 0) >> return -1; >> return 0; >> +#elif defined(OR1K) >> + if (ptrace(PTRACE_GETREGSET, tcp->pid, (void*)1, (long)&or1k_regs) < 0) >> + return -1; >> + or1k_regs.gpr[11] = new; >> + if (ptrace(PTRACE_SETREGSET, tcp->pid, (void*)1, (long)&or1k_regs) < 0) >> + return -1; >> #else >> #warning Do not know how to handle change_syscall for this architecture >> #endif /* architecture */ > > We will never reach this code: kernels new enough to support OR1K > won't require fork/clone hacks (change_syscall is part of those). > Replace this code by a comment > > /* never reached; OR1K is only supported by kernels since M.N.K. */ Ok. Thanks a lot for the feedback! I will submit a new patch with these things fixed. I talked with Jonas Bronn about this the syscall system a bit. The arches tile, aarch64 and or1k uses the newer kernel interface where the numbers are the same. The number of arches which uses this scheme will probably not go down :-). So, what about introducing a linux/syscallent.h that holds all syscalls that are shared? I did a mock-up: /* Generic syscall for newer architectures */ #if !defined(__GENERIC_SYSCALL_1) #define __GENERIC_SYSCALL_1 { 2, 0, sys_io_setup, "io_setup" }, /* 0 */ { 1, 0, sys_io_destroy, "io_destroy" }, /* 1 */ .. { 4, TN, sys_accept4, "accept4" }, /* 242 */ { 5, TN, sys_recvmmsg, "recvmmsg" }, /* 243 */ #elif !defined(__GENERIC_SYSCALL_2) #define __GENERIC_SYSCALL_2 { 4, TP, sys_wait4, "wait4" }, /* 260 */ { 4, 0, sys_prlimit64, "prlimit64" }, /* 261 */ .. { 4, TN, sys_sendmmsg, "sendmmsg" }, /* 269 */ #ifdef USE_PROCESS_VM { 6, 0, sys_process_vm_readv, "process_vm_readv" }, /* 270 */ { 6, 0, sys_process_vm_writev, "process_vm_writev" }, /* 271 */ #else { }, { }, #endif #elif !defined(__GENERIC_SYSCALL_DEPRECATED) #define __GENERIC_SYSCALL_DEPRECATED /* Quote from asm-generic/unistd.h: * * All syscalls below here should go away really, * these are provided for both review and as a porting * help for the C library version. * */ { 3, TD|TF, sys_open, "open" }, /* 1024 */ { 2, TF, sys_link, "link" }, /* 1025 */ ... { 1, 0, sys_sysctl, "sysctl" }, /* 1078 */ { 0, TP, sys_fork, "fork" }, /* 1079 */ #endif which will then reduce syscallent.h for openrisc to: #include "../syscallent.h" /* Arch-specific block */ { 4, 0, sys_or1k_atomic, "or1k_atomic" }, /* 244 */ [245 ... 259] = { }, #include "../syscallent.h" (Maybe it's too magical to include the same file twice?) What do you think? Regards, Christian |
From: Christian S. <bl...@cm...> - 2013-02-12 11:53:02
Attachments:
0001-Support-for-the-OpenRISC-1000-platform.patch
|
Updated patch. I also merged the secondary patch into this one. I have come to realize that my email client wraps lines - until I am able to fix that, I also attached the patch as an attachment. * configure.ac: Added or1k. * defs.h: Added or1k to use _regs system. * linux/or1k/ioctlent.h.in: Use i386 ioctls. * linux/or1k/syscallent.h: New. * process.c: Added or1k. * syscall.c: Added or1k handlers. (or1k_io) iovec for or1k GETREGSET. (or1k_regs) regset structure for or1k. * util.c: OR1K define to remove warning for change_syscall. --- configure.ac | 5 + defs.h | 5 +- linux/or1k/ioctlent.h.in | 1 + linux/or1k/syscallent.h | 260 +++++++++++++++++++++++++++++++++++++++++++++++ process.c | 41 +++++++- syscall.c | 31 ++++++ util.c | 2 + 7 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 linux/or1k/ioctlent.h.in create mode 100644 linux/or1k/syscallent.h diff --git a/configure.ac b/configure.ac index 80be383..8703f7c 100644 --- a/configure.ac +++ b/configure.ac @@ -111,6 +111,11 @@ microblaze*) 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 9756179..a99010f 100644 --- a/defs.h +++ b/defs.h @@ -134,7 +134,8 @@ extern char *stpcpy(char *dst, const char *src); # define LINUX_MIPS64 #endif -#if (defined(LINUXSPARC) || defined(X86_64) || defined(ARM) || defined(AARCH64) || defined(AVR32)) && defined(__GLIBC__) +#if (defined(LINUXSPARC) || defined(X86_64) || defined(ARM) || defined(AARCH64) \ + || defined(OR1K) || defined(AVR32)) && defined(__GLIBC__) # include <sys/ptrace.h> #else /* Work around awkward prototype in ptrace.h. */ @@ -561,7 +562,7 @@ extern void call_summary(FILE *); || 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..e2fe233 --- /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 */ + + { 3, 0, printargs, "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/process.c b/process.c index 6cf296c..3e92d84 100644 --- a/process.c +++ b/process.c @@ -2116,11 +2116,48 @@ const struct xlat struct_user_offsets[] = { { 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 #if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \ && !defined(ALPHA) && !defined(IA64) \ && !defined(CRISV10) && !defined(CRISV32) \ - && !defined(MICROBLAZE) && !defined(AARCH64) && !defined(TILE) + && !defined(MICROBLAZE) && !defined(AARCH64) \ + && !defined(TILE) && !defined(OR1K) # if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" }, # endif @@ -2159,7 +2196,7 @@ const struct xlat struct_user_offsets[] = { # endif #endif /* !defined(many arches) */ -#if !defined(HPPA) && !defined(AARCH64) && !defined(TILE) +#if !defined(HPPA) && !defined(AARCH64) && !defined(TILE) && !defined(OR1K) { sizeof(struct user), "sizeof(struct user)" }, #endif { 0, NULL }, diff --git a/syscall.c b/syscall.c index f403c44..29b89e0 100644 --- a/syscall.c +++ b/syscall.c @@ -71,6 +71,11 @@ # include <elf.h> #endif +#if defined(OR1K) +# include <sys/uio.h> +# include <elf.h> +#endif + #ifndef ERESTARTSYS # define ERESTARTSYS 512 #endif @@ -712,6 +717,11 @@ static long cris_r10; 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 @@ -847,6 +857,8 @@ printcall(struct tcb *tcp) # else tprintf("[%08lx] ", (unsigned long) tile_regs.pc); # endif +#elif defined(OR1K) + tprintf("[%08lx] ", or1k_regs.pc); #endif /* architecture */ } @@ -886,6 +898,9 @@ void get_regs(pid_t pid) get_regs_error = ptrace(PTRACE_GETREGS, pid, (char *)®s, 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 @@ -1328,6 +1343,8 @@ get_scno(struct tcb *tcp) #elif defined(MICROBLAZE) if (upeek(tcp, 0, &scno) < 0) return -1; +#elif defined(OR1K) + scno = or1k_regs.gpr[11]; #endif #if defined(SH) @@ -1712,6 +1729,10 @@ get_syscall_args(struct tcb *tcp) 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) @@ -1906,6 +1927,8 @@ get_syscall_result(struct tcb *tcp) #elif defined(MICROBLAZE) if (upeek(tcp, 3 * 4, µblaze_r3) < 0) return -1; +#elif defined(OR1K) + /* already done by get_regs */ #endif return 1; } @@ -2147,6 +2170,14 @@ get_error(struct tcb *tcp) 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/util.c b/util.c index 93a98f6..4dd977b 100644 --- a/util.c +++ b/util.c @@ -1291,6 +1291,8 @@ change_syscall(struct tcb *tcp, arg_setup_state *state, int new) if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new) < 0) return -1; 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 */ -- 1.8.1.2 |
From: Denys V. <dvl...@re...> - 2013-02-13 15:47:14
|
On 02/12/2013 12:52 PM, Christian Svensson wrote: > Updated patch. I also merged the secondary patch into this one. > I have come to realize that my email client wraps lines - until I am > able to fix that, I also attached the patch as an attachment. I just touched a few places in strace git which made merging of your patch not fully trivial... can I be so bold to ask you to rediff against current git? Sorry... -- vda |
From: Christian S. <bl...@cm...> - 2013-02-13 17:34:45
|
New patch. |
From: Christian S. <bl...@cm...> - 2013-02-13 17:43:55
|
* configure.ac: Added or1k. * defs.h: Added or1k to use _regs system. * linux/or1k/ioctlent.h.in: Use i386 ioctls. * linux/or1k/syscallent.h: New. * process.c: Added or1k. * syscall.c: Added or1k handlers. (or1k_io) iovec for or1k GETREGSET. (or1k_regs) regset structure for or1k. * util.c: OR1K define to remove warning for change_syscall. * system.c (sys_or1k_atomic): New. --- configure.ac | 5 + defs.h | 4 +- linux/or1k/ioctlent.h.in | 1 + linux/or1k/syscallent.h | 260 +++++++++++++++++++++++++++++++++++++++++++++++ linux/syscall.h | 4 + process.c | 39 ++++++- syscall.c | 31 ++++++ system.c | 60 +++++++++++ util.c | 2 + 9 files changed, 404 insertions(+), 2 deletions(-) create mode 100644 linux/or1k/ioctlent.h.in create mode 100644 linux/or1k/syscallent.h diff --git a/configure.ac b/configure.ac index 80be383..8703f7c 100644 --- a/configure.ac +++ b/configure.ac @@ -111,6 +111,11 @@ microblaze*) 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 ab474cb..e26ecec 100644 --- a/defs.h +++ b/defs.h @@ -138,6 +138,7 @@ extern char *stpcpy(char *dst, const char *src); || defined(X86_64) \ || defined(ARM) || defined(AARCH64) \ || defined(AVR32) \ + || defined(OR1K) \ ) && defined(__GLIBC__) # include <sys/ptrace.h> #else @@ -561,7 +562,8 @@ extern void call_summary(FILE *); || 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..6281d10 --- /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_sysmips(); 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..ea747e3 100644 --- a/process.c +++ b/process.c @@ -465,7 +465,8 @@ extern void print_ldt_entry(); # 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 @@ const struct xlat struct_user_offsets[] = { { 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)" }, diff --git a/syscall.c b/syscall.c index 68fab52..6e2f71d 100644 --- a/syscall.c +++ b/syscall.c @@ -71,6 +71,11 @@ # include <elf.h> #endif +#if defined(OR1K) +# include <sys/uio.h> +# include <elf.h> +#endif + #ifndef ERESTARTSYS # define ERESTARTSYS 512 #endif @@ -712,6 +717,11 @@ static long cris_r10; 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 @@ -847,6 +857,8 @@ printcall(struct tcb *tcp) # else tprintf("[%08lx] ", (unsigned long) tile_regs.pc); # endif +#elif defined(OR1K) + tprintf("[%08lx] ", or1k_regs.pc); #endif /* architecture */ } @@ -886,6 +898,9 @@ void get_regs(pid_t pid) get_regs_error = ptrace(PTRACE_GETREGS, pid, (char *)®s, 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 @@ -1328,6 +1343,8 @@ get_scno(struct tcb *tcp) #elif defined(MICROBLAZE) if (upeek(tcp, 0, &scno) < 0) return -1; +#elif defined(OR1K) + scno = or1k_regs.gpr[11]; #endif tcp->scno = scno; @@ -1702,6 +1719,10 @@ get_syscall_args(struct tcb *tcp) 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) @@ -1896,6 +1917,8 @@ get_syscall_result(struct tcb *tcp) #elif defined(MICROBLAZE) if (upeek(tcp, 3 * 4, µblaze_r3) < 0) return -1; +#elif defined(OR1K) + /* already done by get_regs */ #endif return 1; } @@ -2162,6 +2185,14 @@ get_error(struct tcb *tcp) 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..f256100 100644 --- a/system.c +++ b/system.c @@ -1026,3 +1026,63 @@ int sys_sysmips(struct tcb *tcp) } #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 @@ change_syscall(struct tcb *tcp, arg_setup_state *state, int new) /* 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 */ -- 1.8.1.2 |
From: Denys V. <dvl...@re...> - 2013-02-14 12:33:50
|
On 02/13/2013 06:12 PM, Christian Svensson wrote: > New patch. Applied, thanks! -- vda |