summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tapset/ChangeLog5
-rw-r--r--tapset/s390x/syscalls.stp169
-rw-r--r--tapset/syscalls.stp3
3 files changed, 177 insertions, 0 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index 280398d8..cacc135c 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,8 @@
+2007-02-22 David Wilder <dwilder@us.ibm.com>
+
+ * syscalls.stp, s390x/syscall.stp: Created an s390x version of
+ syscall.mmap, syscall.mmap2, syscall.mmap.return, syscall.mmap2.return.
+
2007-02-09 Frank Ch. Eigler <fche@elastic.org>
* conversions.stp (*): Make errmsg usage uniform.
diff --git a/tapset/s390x/syscalls.stp b/tapset/s390x/syscalls.stp
new file mode 100644
index 00000000..275507b0
--- /dev/null
+++ b/tapset/s390x/syscalls.stp
@@ -0,0 +1,169 @@
+%(arch == "s390x" %?
+
+# mmap - s390x version of the syscall.mmap probes
+#
+# long old_mmap(struct mmap_arg_struct __user *arg)
+# long old32_mmap(struct mmap_arg_struct_emu31 __user *arg)
+#
+
+probe syscall.mmap = kernel.function("old_mmap"),
+ kernel.function("old32_mmap")
+{
+ name = "mmap"
+
+ if ( probefunc() == "old_mmap" ){
+ argstr = get_mmap_args($arg);
+ }else{
+ argstr = get_32mmap_args($arg);
+ }
+
+ argstr = get_mmap_args($arg);
+}
+
+probe syscall.mmap.return = kernel.function("old_mmap").return,
+ kernel.function("old32_mmap").return
+{
+ name = "mmap"
+ retstr = returnstr(2)
+}
+
+
+# mmap2 - s390x version of the syscall.mmap2 probes
+#
+# long sys_mmap2(struct mmap_arg_struct __user *arg)
+# long sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg)
+#
+probe syscall.mmap2 = kernel.function("sys_mmap2"),
+ kernel.function("sys32_mmap2")
+{
+ name = "mmap2"
+
+ if ( probefunc() == "sys_mmap2" ){
+ argstr = get_mmap_args($arg);
+ }else{
+ argstr = get_32mmap_args($arg);
+ }
+
+ argstr = get_mmap_args($arg);
+}
+
+probe syscall.mmap2.return = kernel.function("sys_mmap2").return,
+ kernel.function("sys32_mmap2").return
+{
+ name = "mmap2"
+ retstr = returnstr(2)
+}
+
+function get_mmap_args:string (args:long)
+%{
+ struct mmap_arg_struct {
+ unsigned long addr;
+ unsigned long len;
+ unsigned long prot;
+ unsigned long flags;
+ unsigned long fd;
+ unsigned long offset;
+ }a;
+
+ char proto[60];
+ char flags[256];
+
+ if(_stp_copy_from_user((char *)&a,
+ (char *)THIS->args, sizeof(a))== 0){
+
+ /* _mprotect_prot_str */
+ proto[0] = '\0';
+ if(a.prot){
+ if(a.prot & 1) strcat (proto, "PROT_READ|");
+ if(a.prot & 2) strcat (proto, "PROT_WRITE|");
+ if(a.prot & 4) strcat (proto, "PROT_EXEC|");
+ } else {
+ strcat (proto, "PROT_NONE");
+ }
+ if (proto[0] != '\0') proto[strlen(proto)-1] = '\0';
+
+ /* _mmap_flags */
+ flags[0]='\0';
+ if (a.flags & 1) strcat (flags, "MAP_SHARED|");
+ if (a.flags & 2) strcat (flags, "MAP_PRIVATE|");
+ if (a.flags & 0x10) strcat (flags, "MAP_FIXED|");
+ if (a.flags & 0x20) strcat (flags, "MAP_ANONYMOUS|");
+ if (a.flags & 0x100) strcat (flags, "MAP_GROWSDOWN|");
+ if (a.flags & 0x800) strcat (flags, "MAP_DENYWRITE|");
+ if (a.flags & 0x1000) strcat (flags, "MAP_EXECUTABLE|");
+ if (a.flags & 0x2000) strcat (flags, "MAP_LOCKED|");
+ if (a.flags & 0x4000) strcat (flags, "MAP_NORESERVE|");
+ if (a.flags & 0x8000) strcat (flags, "MAP_POPULATE|");
+ if (a.flags & 0x10000) strcat (flags, "MAP_NONBLOCK|");
+ if (flags[0] != '\0') flags[strlen(flags)-1] = '\0';
+
+ sprintf(THIS->__retvalue,"0x%lx, %ld, %s, %s, %ld, %ld",
+ a.addr,
+ a.len,
+ proto,
+ flags,
+ a.fd,
+ a.offset);
+ }else{
+ strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN);
+ }
+%}
+
+/* compat */
+function get_32mmap_args:string (args:long)
+%{
+ struct mmap_arg_struct_emu31 {
+ u32 addr;
+ u32 len;
+ u32 prot;
+ u32 flags;
+ u32 fd;
+ u32 offset;
+ }a;
+
+
+ char proto[60];
+ char flags[256];
+
+ if(_stp_copy_from_user((char *)&a,
+ (char *)THIS->args, sizeof(a))== 0){
+
+ /* _mprotect_prot_str */
+ proto[0] = '\0';
+ if(a.prot){
+ if(a.prot & 1) strcat (proto, "PROT_READ|");
+ if(a.prot & 2) strcat (proto, "PROT_WRITE|");
+ if(a.prot & 4) strcat (proto, "PROT_EXEC|");
+ } else {
+ strcat (proto, "PROT_NONE");
+ }
+ if (proto[0] != '\0') proto[strlen(proto)-1] = '\0';
+
+ /* _mmap_flags */
+ flags[0]='\0';
+ if (a.flags & 1) strcat (flags, "MAP_SHARED|");
+ if (a.flags & 2) strcat (flags, "MAP_PRIVATE|");
+ if (a.flags & 0x10) strcat (flags, "MAP_FIXED|");
+ if (a.flags & 0x20) strcat (flags, "MAP_ANONYMOUS|");
+ if (a.flags & 0x100) strcat (flags, "MAP_GROWSDOWN|");
+ if (a.flags & 0x800) strcat (flags, "MAP_DENYWRITE|");
+ if (a.flags & 0x1000) strcat (flags, "MAP_EXECUTABLE|");
+ if (a.flags & 0x2000) strcat (flags, "MAP_LOCKED|");
+ if (a.flags & 0x4000) strcat (flags, "MAP_NORESERVE|");
+ if (a.flags & 0x8000) strcat (flags, "MAP_POPULATE|");
+ if (a.flags & 0x10000) strcat (flags, "MAP_NONBLOCK|");
+ if (flags[0] != '\0') flags[strlen(flags)-1] = '\0';
+
+ sprintf(THIS->__retvalue,"0x%x, %d, %s, %s, %d, %d",
+ a.addr,
+ a.len,
+ proto,
+ flags,
+ a.fd,
+ a.offset);
+ }else{
+ strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN);
+ }
+%}
+
+%)
diff --git a/tapset/syscalls.stp b/tapset/syscalls.stp
index f3d9a581..bffa16bf 100644
--- a/tapset/syscalls.stp
+++ b/tapset/syscalls.stp
@@ -1942,6 +1942,8 @@ probe syscall.mlockall.return = kernel.function("sys_mlockall").return {
name = "mlockall"
retstr = returnstr(1)
}
+
+%(arch != "s390x" %?
# mmap
# long sys_mmap(unsigned long addr, unsigned long len,
# unsigned long prot, unsigned long flags,
@@ -1997,6 +1999,7 @@ probe syscall.mmap2.return =
name = "mmap2"
retstr = returnstr(2)
}
+%)
# modify_ldt _________________________________________________
# int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount)