From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51894) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WwD99-0005BM-7x for qemu-devel@nongnu.org; Sun, 15 Jun 2014 12:19:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WwD93-00066Q-Dt for qemu-devel@nongnu.org; Sun, 15 Jun 2014 12:19:07 -0400 Received: from mail-we0-x22f.google.com ([2a00:1450:400c:c03::22f]:48655) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WwD93-00066M-7F for qemu-devel@nongnu.org; Sun, 15 Jun 2014 12:19:01 -0400 Received: by mail-we0-f175.google.com with SMTP id k48so4015616wev.34 for ; Sun, 15 Jun 2014 09:19:00 -0700 (PDT) Sender: Paul Burton From: Paul Burton Date: Sun, 15 Jun 2014 17:18:27 +0100 Message-Id: <1402849113-11402-11-git-send-email-paul@archlinuxmips.org> In-Reply-To: <1402849113-11402-1-git-send-email-paul@archlinuxmips.org> References: <1402849113-11402-1-git-send-email-paul@archlinuxmips.org> Subject: [Qemu-devel] [PATCH 10/16] linux-user: support timerfd_{create, gettime, settime} syscalls List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Riku Voipio , Paul Burton Adds support for the timerfd_create, timerfd_gettime & timerfd_settime syscalls, allowing use of timerfds by target programs. Signed-off-by: Paul Burton --- linux-user/strace.list | 9 +++++++++ linux-user/syscall.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/linux-user/strace.list b/linux-user/strace.list index fcb258d..8de972a 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1404,6 +1404,15 @@ #ifdef TARGET_NR_timer_settime { TARGET_NR_timer_settime, "timer_settime" , NULL, NULL, NULL }, #endif +#ifdef TARGET_NR_timerfd_create +{ TARGET_NR_timerfd_create, "timerfd_create" , NULL, NULL, NULL }, +#endif +#ifdef TARGET_NR_timerfd_gettime +{ TARGET_NR_timerfd_gettime, "timerfd_gettime" , NULL, NULL, NULL }, +#endif +#ifdef TARGET_NR_timerfd_settime +{ TARGET_NR_timerfd_settime, "timerfd_settime" , NULL, NULL, NULL }, +#endif #ifdef TARGET_NR_times { TARGET_NR_times, "times" , NULL, NULL, NULL }, #endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 8ebb9e7..0830205 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -58,6 +58,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base, #include #include #include +#include #include #include //#include @@ -9416,6 +9417,49 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, } #endif +#ifdef TARGET_NR_timerfd_create + case TARGET_NR_timerfd_create: + ret = get_errno(timerfd_create(arg1, + target_to_host_bitmask(arg2, fcntl_flags_tbl))); + break; +#endif + +#ifdef TARGET_NR_timerfd_gettime + case TARGET_NR_timerfd_gettime: + { + struct itimerspec its_curr; + + ret = get_errno(timerfd_gettime(arg1, &its_curr)); + + if (arg2 && host_to_target_itimerspec(arg2, &its_curr)) { + goto efault; + } + } + break; +#endif + +#ifdef TARGET_NR_timerfd_settime + case TARGET_NR_timerfd_settime: + { + struct itimerspec its_new, its_old, *p_new; + + if (arg3) { + if (target_to_host_itimerspec(&its_new, arg3)) + goto efault; + p_new = &its_new; + } else { + p_new = NULL; + } + + ret = get_errno(timerfd_settime(arg1, arg2, p_new, &its_old)); + + if (arg4 && host_to_target_itimerspec(arg4, &its_old)) { + goto efault; + } + } + break; +#endif + default: unimplemented: gemu_log("qemu: Unsupported syscall: %d\n", num); -- 2.0.0