This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[PATCH 11/12] mips: add support in tapset
- From: Marcin Nowakowski <marcin dot nowakowski at imgtec dot com>
- To: <systemtap at sourceware dot org>
- Cc: Marcin Nowakowski <marcin dot nowakowski at imgtec dot com>
- Date: Tue, 11 Oct 2016 10:14:27 +0200
- Subject: [PATCH 11/12] mips: add support in tapset
- Authentication-results: sourceware.org; auth=none
- References: <1476173668-30787-1-git-send-email-marcin.nowakowski@imgtec.com>
This change adds
* return value extraction
* __is_user_regs() method
* basic support for ptrace
Signed-off-by: Marcin Nowakowski <marcin.nowakowski@imgtec.com>
---
tapset/errno.stp | 2 ++
tapset/linux/aux_syscalls.stp | 7 ++++++
tapset/linux/mips/aux_syscalls.stp | 44 ++++++++++++++++++++++++++++++++++++++
tapsets.cxx | 1 +
4 files changed, 54 insertions(+)
create mode 100644 tapset/linux/mips/aux_syscalls.stp
diff --git a/tapset/errno.stp b/tapset/errno.stp
index d49fd3a..95e23c7 100644
--- a/tapset/errno.stp
+++ b/tapset/errno.stp
@@ -390,6 +390,8 @@ static long _stp_returnval(struct pt_regs *regs) {
return regs->regs[0];
#elif defined (__arm__)
return regs->ARM_r0;
+#elif defined (__mips__)
+ return regs->regs[2];
#else
_stp_error("returnval() not defined for this architecture");
return 0;
diff --git a/tapset/linux/aux_syscalls.stp b/tapset/linux/aux_syscalls.stp
index 527b43b..e6ca71d 100644
--- a/tapset/linux/aux_syscalls.stp
+++ b/tapset/linux/aux_syscalls.stp
@@ -3964,6 +3964,13 @@ function _swapon_flags_str:string(flags:long)
#elif defined(__arm__)
long cpsr = kread(®s->ARM_cpsr);
STAP_RETVALUE = ((cpsr & 0xf) == 0);
+#elif defined(__mips__)
+ unsigned long cp0 = kread(®s->cp0_status);
+#if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX)
+ THIS->__retvalue = ((cp0 & 0x08) == 8);
+#else
+ THIS->__retvalue = ((cp0 & 0x18) == 0x10);
+#endif
#elif defined(__s390__) || defined(__s390x__)
unsigned long mask = kread(®s->psw.mask);
STAP_RETVALUE = ((mask & PSW_MASK_PSTATE) != 0);
diff --git a/tapset/linux/mips/aux_syscalls.stp b/tapset/linux/mips/aux_syscalls.stp
new file mode 100644
index 0000000..5de5485
--- /dev/null
+++ b/tapset/linux/mips/aux_syscalls.stp
@@ -0,0 +1,44 @@
+# arch-specific requests of ptrace ___________________________
+#
+function _arch_ptrace_argstr(request, pid, addr, data)
+{
+ if (request == %{ PTRACE_GETREGS %})
+ // TODO: Retrieve *data in .return
+ return sprintf ("PTRACE_GETREGS, %d, data=%p", pid, data)
+ if (request == %{ PTRACE_SETREGS %})
+ // TODO: Retrieve *data here
+ return sprintf ("PTRACE_SETREGS, %d, data=%p", pid, data)
+ if (request == %{ PTRACE_GETFPREGS %})
+ // TODO: Retrieve *data in .return
+ return sprintf ("PTRACE_GETFPREGS, %d, data=%p", pid, data)
+ if (request == %{ PTRACE_SETFPREGS %})
+ // TODO: Retrieve *data here
+ return sprintf ("PTRACE_SETFPREGS, %d, data=%p", pid, data)
+ if (request == %{ PTRACE_PEEKTEXT_3264 %})
+ // TODO: Retrieve *data in .return
+ return sprintf ("PTRACE_PEEKTEXT_3264, %d, *addr=%p, data=%p", pid, user_long(addr), data)
+ if (request == %{ PTRACE_PEEKDATA_3264 %})
+ // TODO: Retrieve *data in .return
+ return sprintf ("PTRACE_PEEKDATA_3264, %d, *addr=%p, data=%p", pid, user_long(addr), data)
+ if (request == %{ PTRACE_POKETEXT_3264 %})
+ return sprintf ("PTRACE_POKETEXT_3264, %d, *addr=%p, data=%p", pid, user_long(addr), data)
+ if (request == %{ PTRACE_POKEDATA_3264 %})
+ return sprintf ("PTRACE_POKEDATA_3264, %d, *addr=%p, data=%p", pid, user_long(addr), data)
+ if (request == %{ PTRACE_GET_THREAD_AREA %})
+ // TODO: Retrieve *data in .return
+ return sprintf ("PTRACE_GET_THREAD_AREA, %d, index=%d, data=%p", pid, addr, data)
+ if (request == %{ PTRACE_GET_THREAD_AREA_3264 %})
+ // TODO: Retrieve *data in .return
+ return sprintf ("PTRACE_GET_THREAD_AREA_3264, %d, index=%d, data=%p", pid, addr, data)
+ if (request == %{ PTRACE_GET_WATCH_REGS %})
+ // TODO: Retrieve *data in .return
+ return sprintf ("PTRACE_GET_WATCH_REGS, %d, data=%p", pid, data)
+ if (request == %{ PTRACE_SET_WATCH_REGS %})
+ // TODO: Retrieve *data here
+ return sprintf ("PTRACE_SET_WATCH_REGS, %d, data=%p", pid, data)
+}
+
+function _ptrace_return_arch_prctl_addr:long(request:long, addr:long, data:long)
+{
+ return 0
+}
diff --git a/tapsets.cxx b/tapsets.cxx
index 2193b7d..817b7d3 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -2500,6 +2500,7 @@ validate_module_elf (Dwfl_Module *mod, const char *name, base_query *q)
case EM_IA_64: expect_machine = "ia64"; break;
case EM_ARM: expect_machine = "arm*"; break;
case EM_AARCH64: expect_machine = "arm64"; break;
+ case EM_MIPS: expect_machine = "mips"; break;
// XXX: fill in some more of these
default: expect_machine = "?"; break;
}
--
2.7.4