diff options
-rw-r--r-- | tapset/ChangeLog | 5 | ||||
-rw-r--r-- | tapset/s390x/syscalls.stp | 169 | ||||
-rw-r--r-- | tapset/syscalls.stp | 3 |
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) |