From: Dmitry V. Levin Date: Fri, 17 Apr 2015 09:14:19 +0000 (+0000) Subject: mips o32: decode indirect syscall X-Git-Tag: v4.11~519 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f34b97f89dd3893ef3652a6899487771402fc13c;p=strace mips o32: decode indirect syscall Implement decoding of MIPS O32 specific indirect syscall. * syscall.c [LINUX_MIPSO32] (decode_mips_subcall, sys_syscall): New functions. (trace_syscall_entering) [LINUX_MIPSO32]: Use decode_mips_subcall. * linux/mips/syscallent-o32.h (4000): Change sys_func to sys_syscall. Reported-and-tested-by: Arturo Borrero Gonzalez --- diff --git a/linux/mips/syscallent-o32.h b/linux/mips/syscallent-o32.h index cb4c2885..83d003f2 100644 --- a/linux/mips/syscallent-o32.h +++ b/linux/mips/syscallent-o32.h @@ -1,6 +1,6 @@ #if defined LINUX_MIPSO32 /* For an O32 strace, decode the o32 syscalls. */ -[4000] = { MA, 0, printargs, "syscall" }, /* start of Linux o32 */ +[4000] = { MA, 0, sys_syscall, "syscall" }, /* start of Linux o32 */ [4001] = { 1, TP|SE, sys_exit, "exit" }, [4002] = { 0, TP, sys_fork, "fork" }, [4003] = { 3, TD, sys_read, "read" }, diff --git a/syscall.c b/syscall.c index 1e19eb55..b63a5280 100644 --- a/syscall.c +++ b/syscall.c @@ -602,6 +602,30 @@ decode_ipc_subcall(struct tcb *tcp) } #endif +#ifdef LINUX_MIPSO32 +static void +decode_mips_subcall(struct tcb *tcp) +{ + if (!SCNO_IS_VALID(tcp->u_arg[0])) + return; + tcp->scno = tcp->u_arg[0]; + tcp->qual_flg = qual_flags[tcp->scno]; + tcp->s_ent = &sysent[tcp->scno]; + memmove(&tcp->u_arg[0], &tcp->u_arg[1], + sizeof(tcp->u_arg) - sizeof(tcp->u_arg[0])); + /* + * Fetching the last arg of 7-arg syscalls (fadvise64_64 + * and sync_file_range) would require additional code, + * see linux/mips/get_syscall_args.c + */ +} + +SYS_FUNC(syscall) +{ + return printargs(tcp); +} +#endif + int printargs(struct tcb *tcp) { @@ -770,6 +794,11 @@ trace_syscall_entering(struct tcb *tcp) goto ret; } +#ifdef LINUX_MIPSO32 + if (sys_syscall == tcp->s_ent->sys_func) + decode_mips_subcall(tcp); +#endif + if ( sys_execve == tcp->s_ent->sys_func # if defined(SPARC) || defined(SPARC64) || sys_execv == tcp->s_ent->sys_func