From: Markos Chandras <[email protected]>

This patchset adds support for Imagination's Meta architecture.
The Meta Linux kernel port will be included in the Linux Kernel
v3.9. It also uses the generic system call numbers.

Signed-off-by: Markos Chandras <[email protected]>
---
 README                               |    1 +
 configure.ac                         |    1 +
 sysdeps/linux-gnu/metag/Makefile.am  |   16 ++
 sysdeps/linux-gnu/metag/arch.h       |   27 +++
 sysdeps/linux-gnu/metag/plt.c        |   35 ++++
 sysdeps/linux-gnu/metag/ptrace.h     |   21 +++
 sysdeps/linux-gnu/metag/regs.c       |   85 ++++++++++
 sysdeps/linux-gnu/metag/signalent.h  |   53 ++++++
 sysdeps/linux-gnu/metag/syscallent.h |  293 ++++++++++++++++++++++++++++++++++
 sysdeps/linux-gnu/metag/trace.c      |  108 +++++++++++++
 sysdeps/linux-gnu/trace.c            |    2 +-
 11 files changed, 641 insertions(+), 1 deletions(-)
 create mode 100644 sysdeps/linux-gnu/metag/Makefile.am
 create mode 100644 sysdeps/linux-gnu/metag/arch.h
 create mode 100644 sysdeps/linux-gnu/metag/plt.c
 create mode 100644 sysdeps/linux-gnu/metag/ptrace.h
 create mode 100644 sysdeps/linux-gnu/metag/regs.c
 create mode 100644 sysdeps/linux-gnu/metag/signalent.h
 create mode 100644 sysdeps/linux-gnu/metag/syscallent.h
 create mode 100644 sysdeps/linux-gnu/metag/trace.c

diff --git a/README b/README
index 3db5bc8..4a6bf5d 100644
--- a/README
+++ b/README
@@ -27,6 +27,7 @@ to test each release comprehensively on each target.
        i[4567]86-*-linux-gnu
        ia64-*-linux-gnu
        m68k-*-linux-gnu
+       metag-*-linux-gnu
        mips-*-linux-gnu
        powerpc-*-linux-gnu
        powerpc64-*-linux-gnu
diff --git a/configure.ac b/configure.ac
index 525efaa..c8633fa 100644
--- a/configure.ac
+++ b/configure.ac
@@ -339,6 +339,7 @@ AC_CONFIG_FILES([
        sysdeps/linux-gnu/cris/Makefile
        sysdeps/linux-gnu/ia64/Makefile
        sysdeps/linux-gnu/m68k/Makefile
+       sysdeps/linux-gnu/metag/Makefile
        sysdeps/linux-gnu/mips/Makefile
        sysdeps/linux-gnu/ppc/Makefile
        sysdeps/linux-gnu/s390/Makefile
diff --git a/sysdeps/linux-gnu/metag/Makefile.am 
b/sysdeps/linux-gnu/metag/Makefile.am
new file mode 100644
index 0000000..a79d2f7
--- /dev/null
+++ b/sysdeps/linux-gnu/metag/Makefile.am
@@ -0,0 +1,16 @@
+noinst_LTLIBRARIES = \
+       ../libcpu.la
+
+___libcpu_la_SOURCES = \
+       plt.c \
+       regs.c \
+       trace.c
+
+noinst_HEADERS = \
+       arch.h \
+       ptrace.h \
+       signalent.h \
+       syscallent.h
+
+MAINTAINERCLEANFILES = \
+       Makefile.in
diff --git a/sysdeps/linux-gnu/metag/arch.h b/sysdeps/linux-gnu/metag/arch.h
new file mode 100644
index 0000000..727e2cb
--- /dev/null
+++ b/sysdeps/linux-gnu/metag/arch.h
@@ -0,0 +1,27 @@
+/*
+ * This file is part of ltrace.
+ * Copyright (C) 1998,2004,2008 Juan Cespedes
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#define LT_ELFCLASS    ELFCLASS32
+#define LT_ELF_MACHINE EM_METAG
+
+#define BREAKPOINT_VALUE { 0x01, 0x00, 0x40, 0xAF }
+#define BREAKPOINT_LENGTH 4
+#define DECR_PC_AFTER_BREAK 0
+#define ARCH_ENDIAN_LITTLE
diff --git a/sysdeps/linux-gnu/metag/plt.c b/sysdeps/linux-gnu/metag/plt.c
new file mode 100644
index 0000000..125ecc5
--- /dev/null
+++ b/sysdeps/linux-gnu/metag/plt.c
@@ -0,0 +1,35 @@
+/*
+ * This file is part of ltrace.
+ *
+ * Copyright (C) 2013 Imagination Technologies Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <gelf.h>
+
+#include "proc.h"
+#include "library.h"
+#include "ltrace-elf.h"
+
+GElf_Addr arch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela * rela)
+{
+       return lte->plt_addr + ( ndx * 0x18 ) + 0x18;
+}
+
+void *sym2addr(struct process *proc, struct library_symbol *sym)
+{
+       return sym->enter_addr;
+}
diff --git a/sysdeps/linux-gnu/metag/ptrace.h b/sysdeps/linux-gnu/metag/ptrace.h
new file mode 100644
index 0000000..7a41e4a
--- /dev/null
+++ b/sysdeps/linux-gnu/metag/ptrace.h
@@ -0,0 +1,21 @@
+/*
+ * This file is part of ltrace.
+ *
+ * Copyright (C) 2013 Imagination Technologies Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <sys/ptrace.h>
diff --git a/sysdeps/linux-gnu/metag/regs.c b/sysdeps/linux-gnu/metag/regs.c
new file mode 100644
index 0000000..62431de
--- /dev/null
+++ b/sysdeps/linux-gnu/metag/regs.c
@@ -0,0 +1,85 @@
+/*
+ * This file is part of ltrace.
+ *
+ * Copyright (C) 2013 Imagination Technologies Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/ptrace.h>
+#include <linux/uio.h>
+#include <asm/ptrace.h>
+
+#include "proc.h"
+#include "common.h"
+
+void *get_instruction_pointer(struct process *proc)
+{
+       struct user_gp_regs regs;
+       struct iovec iov;
+
+       iov.iov_base = &regs;
+       iov.iov_len = sizeof(regs);
+       if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov))
+               return (void *)-1;
+
+       return (void *)regs.pc; /* PC */
+}
+
+void set_instruction_pointer(struct process *proc, void *addr)
+{
+       struct user_gp_regs regs;
+       struct iovec iov;
+
+       iov.iov_base = &regs;
+       iov.iov_len = sizeof(regs);
+       if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov))
+               return;
+
+       regs.pc = (unsigned long)addr;
+
+       iov.iov_base = &regs;
+       iov.iov_len = sizeof(regs);
+       ptrace(PTRACE_SETREGSET, proc->pid, NT_PRSTATUS, (long)&iov);
+}
+
+void *get_stack_pointer(struct process *proc)
+{
+       struct user_gp_regs regs;
+       struct iovec iov;
+
+       iov.iov_base = &regs;
+       iov.iov_len = sizeof(regs);
+       if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov))
+               return (void *)-1;
+
+       return (void *)regs.ax[0][0]; /* A0StP (A0.0) */
+}
+
+void *get_return_addr(struct process *proc, void *stack_pointer)
+{
+       struct user_gp_regs regs;
+       struct iovec iov;
+
+       iov.iov_base = &regs;
+       iov.iov_len = sizeof(regs);
+       if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov))
+               return (void *)-1;
+
+       return (void *)regs.dx[4][1]; /* D1RtP (D1.4) */
+}
diff --git a/sysdeps/linux-gnu/metag/signalent.h 
b/sysdeps/linux-gnu/metag/signalent.h
new file mode 100644
index 0000000..80228b7
--- /dev/null
+++ b/sysdeps/linux-gnu/metag/signalent.h
@@ -0,0 +1,53 @@
+/*
+ * This file is part of ltrace.
+ *
+ * Copyright (C) 2013 Imagination Technologies Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+       "SIG_0",        /* 0 */
+       "SIGHUP",       /* 1 */
+       "SIGINT",       /* 2 */
+       "SIGQUIT",      /* 3 */
+       "SIGILL",       /* 4 */
+       "SIGTRAP",      /* 5 */
+       "SIGABRT",      /* 6 */
+       "SIGBUS",       /* 7 */
+       "SIGFPE",       /* 8 */
+       "SIGKILL",      /* 9 */
+       "SIGUSR1",      /* 10 */
+       "SIGSEGV",      /* 11 */
+       "SIGUSR2",      /* 12 */
+       "SIGPIPE",      /* 13 */
+       "SIGALRM",      /* 14 */
+       "SIGTERM",      /* 15 */
+       "SIGSTKFLT",    /* 16 */
+       "SIGCHLD",      /* 17 */
+       "SIGCONT",      /* 18 */
+       "SIGSTOP",      /* 19 */
+       "SIGTSTP",      /* 20 */
+       "SIGTTIN",      /* 21 */
+       "SIGTTOU",      /* 22 */
+       "SIGURG",       /* 23 */
+       "SIGXCPU",      /* 24 */
+       "SIGXFSZ",      /* 25 */
+       "SIGVTALRM",    /* 26 */
+       "SIGPROF",      /* 27 */
+       "SIGWINCH",     /* 28 */
+       "SIGIO",        /* 29 */
+       "SIGPWR",       /* 30 */
+       "SIGSYS",       /* 31 */
+       "SIGRTMIN",     /* 32 */
diff --git a/sysdeps/linux-gnu/metag/syscallent.h 
b/sysdeps/linux-gnu/metag/syscallent.h
new file mode 100644
index 0000000..447c550
--- /dev/null
+++ b/sysdeps/linux-gnu/metag/syscallent.h
@@ -0,0 +1,293 @@
+/*
+ * This file is part of ltrace.
+ *
+ * Copyright (C) 2013 Imagination Technologies Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+       "io_setup",                    /* 0 */
+       "io_destroy",                  /* 1 */
+       "io_submit",                   /* 2 */
+       "io_cancel",                   /* 3 */
+       "io_getevents",                /* 4 */
+       "setxattr",                    /* 5 */
+       "lsetxattr",                   /* 6 */
+       "fsetxattr",                   /* 7 */
+       "getxattr",                    /* 8 */
+       "lgetxattr",                   /* 9 */
+       "fgetxattr",                   /* 10 */
+       "listxattr",                   /* 11 */
+       "llistxattr",                  /* 12 */
+       "flistxattr",                  /* 13 */
+       "removexattr",                 /* 14 */
+       "lremovexattr",                /* 15 */
+       "fremovexattr",                /* 16 */
+       "getcwd",                      /* 17 */
+       "lookup_dcookie",              /* 18 */
+       "eventfd2",                    /* 19 */
+       "epoll_create1",               /* 20 */
+       "epoll_ctl",                   /* 21 */
+       "epoll_pwait",                 /* 22 */
+       "dup",                         /* 23 */
+       "dup3",                        /* 24 */
+       "fcntl64",                     /* 25 */
+       "inotify_init1",               /* 26 */
+       "inotify_add_watch",           /* 27 */
+       "inotify_rm_watch",            /* 28 */
+       "ioctl",                       /* 29 */
+       "ioprio_set",                  /* 30 */
+       "ioprio_get",                  /* 31 */
+       "flock",                       /* 32 */
+       "mknodat",                     /* 33 */
+       "mkdirat",                     /* 34 */
+       "unlinkat",                    /* 35 */
+       "symlinkat",                   /* 36 */
+       "linkat",                      /* 37 */
+       "renameat",                    /* 38 */
+       "umount",                      /* 39 */
+       "mount",                       /* 40 */
+       "pivot_root",                  /* 41 */
+       "42",                          /* 42 */
+       "statfs64",                    /* 43 */
+       "fstatfs64",                   /* 44 */
+       "truncate64",                  /* 45 */
+       "ftruncate64",                 /* 46 */
+       "fallocate",                   /* 47 */
+       "faccessat",                   /* 48 */
+       "chdir",                       /* 49 */
+       "fchdir",                      /* 50 */
+       "chroot",                      /* 51 */
+       "fchmod",                      /* 52 */
+       "fchmodat",                    /* 53 */
+       "fchownat",                    /* 54 */
+       "fchown",                      /* 55 */
+       "openat",                      /* 56 */
+       "close",                       /* 57 */
+       "vhangup",                     /* 58 */
+       "pipe2",                       /* 59 */
+       "quotactl",                    /* 60 */
+       "getdents64",                  /* 61 */
+       "llseek",                      /* 62 */
+       "read",                        /* 63 */
+       "write",                       /* 64 */
+       "readv",                       /* 65 */
+       "writev",                      /* 66 */
+       "pread64",                     /* 67 */
+       "pwrite64",                    /* 68 */
+       "preadv",                      /* 69 */
+       "pwritev",                     /* 70 */
+       "sendfile64",                  /* 71 */
+       "pselect6",                    /* 72 */
+       "ppoll",                       /* 73 */
+       "signalfd4",                   /* 74 */
+       "vmsplice",                    /* 75 */
+       "splice",                      /* 76 */
+       "tee",                         /* 77 */
+       "readlinkat",                  /* 78 */
+       "fstatat64",                   /* 79 */
+       "fstat64",                     /* 80 */
+       "sync",                        /* 81 */
+       "fsync",                       /* 82 */
+       "fdatasync",                   /* 83 */
+       "sync_file_range",             /* 84 */
+       "timerfd_create",              /* 85 */
+       "timerfd_settime",             /* 86 */
+       "timerfd_gettime",             /* 87 */
+       "utimensat",                   /* 88 */
+       "acct",                        /* 89 */
+       "capget",                      /* 90 */
+       "capset",                      /* 91 */
+       "personality",                 /* 92 */
+       "exit",                        /* 93 */
+       "exit_group",                  /* 94 */
+       "waitid",                      /* 95 */
+       "set_tid_address",             /* 96 */
+       "unshare",                     /* 97 */
+       "futex",                       /* 98 */
+       "set_robust_list",             /* 99 */
+       "get_robust_list",             /* 100 */
+       "nanosleep",                   /* 101 */
+       "getitimer",                   /* 102 */
+       "setitimer",                   /* 103 */
+       "kexec_load",                  /* 104 */
+       "init_module",                 /* 105 */
+       "delete_module",               /* 106 */
+       "timer_create",                /* 107 */
+       "timer_gettime",               /* 108 */
+       "timer_getoverrun",            /* 109 */
+       "timer_settime",               /* 110 */
+       "timer_delete",                /* 111 */
+       "clock_settime",               /* 112 */
+       "clock_gettime",               /* 113 */
+       "clock_getres",                /* 114 */
+       "clock_nanosleep",             /* 115 */
+       "syslog",                      /* 116 */
+       "ptrace",                      /* 117 */
+       "sched_setparam",              /* 118 */
+       "sched_setscheduler",          /* 119 */
+       "sched_getscheduler",          /* 120 */
+       "sched_getparam",              /* 121 */
+       "sched_setaffinity",           /* 122 */
+       "sched_getaffinity",           /* 123 */
+       "sched_yield",                 /* 124 */
+       "sched_get_priority_max",      /* 125 */
+       "sched_get_priority_min",      /* 126 */
+       "sched_rr_get_interval",       /* 127 */
+       "restart_syscall",             /* 128 */
+       "kill",                        /* 129 */
+       "tkill",                       /* 130 */
+       "tgkill",                      /* 131 */
+       "sigaltstack",                 /* 132 */
+       "rt_sigsuspend",               /* 133 */
+       "rt_sigaction",                /* 134 */
+       "rt_sigprocmask",              /* 135 */
+       "rt_sigpending",               /* 136 */
+       "rt_sigtimedwait",             /* 137 */
+       "rt_sigqueueinfo",             /* 138 */
+       "rt_sigreturn",                /* 139 */
+       "setpriority",                 /* 140 */
+       "getpriority",                 /* 141 */
+       "reboot",                      /* 142 */
+       "setregid",                    /* 143 */
+       "setgid",                      /* 144 */
+       "setreuid",                    /* 145 */
+       "setuid",                      /* 146 */
+       "setresuid",                   /* 147 */
+       "getresuid",                   /* 148 */
+       "setresgid",                   /* 149 */
+       "getresgid",                   /* 150 */
+       "setfsuid",                    /* 151 */
+       "setfsgid",                    /* 152 */
+       "times",                       /* 153 */
+       "setpgid",                     /* 154 */
+       "getpgid",                     /* 155 */
+       "getsid",                      /* 156 */
+       "setsid",                      /* 157 */
+       "getgroups",                   /* 158 */
+       "setgroups",                   /* 159 */
+       "newuname",                    /* 160 */
+       "sethostname",                 /* 161 */
+       "setdomainname",               /* 162 */
+       "getrlimit",                   /* 163 */
+       "setrlimit",                   /* 164 */
+       "getrusage",                   /* 165 */
+       "umask",                       /* 166 */
+       "prctl",                       /* 167 */
+       "getcpu",                      /* 168 */
+       "gettimeofday",                /* 169 */
+       "settimeofday",                /* 170 */
+       "adjtimex",                    /* 171 */
+       "getpid",                      /* 172 */
+       "getppid",                     /* 173 */
+       "getuid",                      /* 174 */
+       "geteuid",                     /* 175 */
+       "getgid",                      /* 176 */
+       "getegid",                     /* 177 */
+       "gettid",                      /* 178 */
+       "sysinfo",                     /* 179 */
+       "mq_open",                     /* 180 */
+       "mq_unlink",                   /* 181 */
+       "mq_timedsend",                /* 182 */
+       "mq_timedreceive",             /* 183 */
+       "mq_notify",                   /* 184 */
+       "mq_getsetattr",               /* 185 */
+       "msgget",                      /* 186 */
+       "msgctl",                      /* 187 */
+       "msgrcv",                      /* 188 */
+       "msgsnd",                      /* 189 */
+       "semget",                      /* 190 */
+       "semctl",                      /* 191 */
+       "semtimedop",                  /* 192 */
+       "semop",                       /* 193 */
+       "shmget",                      /* 194 */
+       "shmctl",                      /* 195 */
+       "shmat",                       /* 196 */
+       "shmdt",                       /* 197 */
+       "socket",                      /* 198 */
+       "socketpair",                  /* 199 */
+       "bind",                        /* 200 */
+       "listen",                      /* 201 */
+       "accept",                      /* 202 */
+       "connect",                     /* 203 */
+       "getsockname",                 /* 204 */
+       "getpeername",                 /* 205 */
+       "sendto",                      /* 206 */
+       "recvfrom",                    /* 207 */
+       "setsockopt",                  /* 208 */
+       "getsockopt",                  /* 209 */
+       "shutdown",                    /* 210 */
+       "sendmsg",                     /* 211 */
+       "recvmsg",                     /* 212 */
+       "readahead",                   /* 213 */
+       "brk",                         /* 214 */
+       "munmap",                      /* 215 */
+       "mremap",                      /* 216 */
+       "add_key",                     /* 217 */
+       "request_key",                 /* 218 */
+       "keyctl",                      /* 219 */
+       "clone",                       /* 220 */
+       "execve",                      /* 221 */
+       "mmap2",                       /* 222 */
+       "fadvise64_64",                /* 223 */
+       "swapon",                      /* 224 */
+       "swapoff",                     /* 225 */
+       "mprotect",                    /* 226 */
+       "msync",                       /* 227 */
+       "mlock",                       /* 228 */
+       "munlock",                     /* 229 */
+       "mlockall",                    /* 230 */
+       "munlockall",                  /* 231 */
+       "mincore",                     /* 232 */
+       "madvise",                     /* 233 */
+       "remap_file_pages",            /* 234 */
+       "mbind",                       /* 235 */
+       "get_mempolicy",               /* 236 */
+       "set_mempolicy",               /* 237 */
+       "migrate_pages",               /* 238 */
+       "move_pages",                  /* 239 */
+       "rt_tgsigqueueinfo",           /* 240 */
+       "perf_event_open",             /* 241 */
+       "accept4",                     /* 242 */
+       "recvmmsg",                    /* 243 */
+       "244",                         /* 244 */
+       "metag_setglobalbit",          /* 245 */
+       "metag_set_fpu_flags",         /* 246 */
+       "metag_set_tls",               /* 247 */
+       "metag_get_tls",               /* 248 */
+       "249",                         /* 249 */
+       "250",                         /* 250 */
+       "251",                         /* 251 */
+       "252",                         /* 252 */
+       "253",                         /* 253 */
+       "254",                         /* 254 */
+       "255",                         /* 255 */
+       "256",                         /* 256 */
+       "257",                         /* 257 */
+       "258",                         /* 258 */
+       "259",                         /* 259 */
+       "wait4",                       /* 260 */
+       "prlimit64",                   /* 261 */
+       "fanotify_init",               /* 262 */
+       "fanotify_mark",               /* 263 */
+       "name_to_handle_at",           /* 264 */
+       "open_by_handle_at",           /* 265 */
+       "clock_adjtime",               /* 266 */
+       "syncfs",                      /* 267 */
+       "setns",                       /* 268 */
+       "sendmmsg",                    /* 269 */
+       "process_vm_readv",            /* 270 */
+       "process_vm_writev",           /* 271 */
+       "kcmp",                        /* 272 */
diff --git a/sysdeps/linux-gnu/metag/trace.c b/sysdeps/linux-gnu/metag/trace.c
new file mode 100644
index 0000000..8c4fd65
--- /dev/null
+++ b/sysdeps/linux-gnu/metag/trace.c
@@ -0,0 +1,108 @@
+/*
+ * This file is part of ltrace.
+ *
+ * Copyright (C) 2013 Imagination Technologies Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <sys/ptrace.h>
+#include <linux/uio.h>
+#include <asm/ptrace.h>
+
+#include "proc.h"
+#include "common.h"
+
+void get_arch_dep(struct process *proc)
+{
+
+}
+
+int syscall_p(struct process *proc, int status, int *sysnum)
+{
+       if (WIFSTOPPED(status)
+           && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
+               struct user_gp_regs regs;
+               struct iovec iov;
+
+               /* get GP registers */
+               iov.iov_base = &regs;
+               iov.iov_len = sizeof(regs);
+               if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS,
+                          (long)&iov))
+                       return -1;
+
+               /* fetch the SWI instruction */
+               unsigned int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, regs.pc,
+                                          0);
+               *sysnum = regs.dx[0][1];
+
+               if (insn != 0xAF440001) {
+                       /* check if we're returning from the system call */
+                       insn = ptrace(PTRACE_PEEKTEXT, proc->pid, regs.pc - 4,
+                                     0);
+                       if (insn == 0xAF440001) {
+                               return 2;
+                       }
+
+                       return 0;
+               }
+
+               if (*sysnum >= 0) {
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+long gimme_arg(enum tof type, struct process *proc, int arg_num, struct 
arg_type_info *info)
+{
+       long ret;
+       struct user_gp_regs regs;
+       struct iovec iov;
+
+       /* get GP registers */
+       iov.iov_base = &regs;
+       iov.iov_len = sizeof(regs);
+       if (ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, (long)&iov))
+               return 0;
+
+       debug(2, "type %d arg %d arg",type, arg_num);
+       if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL) {
+               if (arg_num < 6) {
+                       /* Args go backwards starting from D1Ar1 (D1.3) */
+                       ret = ((unsigned long *)&regs.dx[3][1])[-arg_num];
+                       debug(2,"ret = %#lx",ret);
+                       return ret;
+               } else {
+                       return 0;
+               }
+       }
+       if (arg_num >= 0) {
+               fprintf(stderr,"args on return?");
+       }
+       if (type == LT_TOF_FUNCTIONR || type == LT_TOF_SYSCALLR) {
+               return regs.dx[0][0]; /* D0Re0 (D0.0) */
+       }
+
+       fprintf(stderr, "gimme_arg called with wrong arguments\n");
+
+       return 0;
+}
diff --git a/sysdeps/linux-gnu/trace.c b/sysdeps/linux-gnu/trace.c
index e57a5ed..9a57a0a 100644
--- a/sysdeps/linux-gnu/trace.c
+++ b/sysdeps/linux-gnu/trace.c
@@ -908,7 +908,7 @@ continue_after_breakpoint(struct process *proc, struct 
breakpoint *sbp)
        if (sbp->enabled == 0) {
                continue_process(proc->pid);
        } else {
-#if defined __sparc__  || defined __ia64___
+#if defined __sparc__  || defined __ia64___ || defined __metag__
                /* we don't want to singlestep here */
                continue_process(proc->pid);
 #else
-- 
1.7.1



_______________________________________________
Ltrace-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/ltrace-devel

Reply via email to