diff options
author | Roland McGrath <roland@redhat.com> | 2008-08-25 03:09:16 +0000 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2008-08-25 03:09:16 +0000 |
commit | 4a6f652cb769024f71ab4023d5ee93e38d730355 (patch) | |
tree | f9dbf03080f3398fa9e5c052c5a8a0a1cc5a8ff5 /mem.c | |
parent | 6f677cff391efcd20a6acfb206ac5914afa97fa8 (diff) | |
download | strace-4a6f652cb769024f71ab4023d5ee93e38d730355.tar.gz strace-4a6f652cb769024f71ab4023d5ee93e38d730355.tar.bz2 strace-4a6f652cb769024f71ab4023d5ee93e38d730355.tar.xz |
2008-08-24 Roland McGrath <roland@redhat.com>
* linux/powerpc/syscallent.h: Handle subpage_prot.
* mem.c [LINUX && POWERPC] (sys_subpage_prot): New function.
* linux/syscall.h [POWERPC]: Declare it.
From Simon Murray <simon@transitive.com>.
Diffstat (limited to 'mem.c')
-rw-r--r-- | mem.c | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -886,3 +886,53 @@ struct tcb *tcp; return 0; } #endif + +#if defined(LINUX) && defined(POWERPC) +int +sys_subpage_prot(tcp) +struct tcb *tcp; +{ + if (entering(tcp)) { + unsigned long cur, end, abbrev_end, entries; + unsigned int entry; + + tprintf("%#lx, %#lx, ", tcp->u_arg[0], tcp->u_arg[1]); + entries = tcp->u_arg[1] >> 16; + if (!entries || !tcp->u_arg[2]) { + tprintf("{}"); + return 0; + } + cur = tcp->u_arg[2]; + end = cur + (sizeof(int) * entries); + if (!verbose(tcp) || end < tcp->u_arg[2]) { + tprintf("%#lx", tcp->u_arg[2]); + return 0; + } + if (abbrev(tcp)) { + abbrev_end = cur + (sizeof(int) * max_strlen); + if (abbrev_end > end) + abbrev_end = end; + } + else + abbrev_end = end; + tprintf("{"); + for (; cur < end; cur += sizeof(int)) { + if (cur > tcp->u_arg[2]) + tprintf(", "); + if (cur >= abbrev_end) { + tprintf("..."); + break; + } + if (umove(tcp, cur, &entry) < 0) { + tprintf("??? [%#lx]", cur); + break; + } + else + tprintf("%#08x", entry); + } + tprintf("}"); + } + + return 0; +} +#endif |