linux-user: support timerfd_{create, gettime, settime} syscalls
Adds support for the timerfd_create, timerfd_gettime & timerfd_settime syscalls, allowing use of timerfds by target programs. v2: By Riku - added configure check for timerfd and ifdefs for benefit of old distributions like RHEL5. Signed-off-by: Paul Burton <paul@archlinuxmips.org> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
f17f4989fa
commit
518343413f
17
configure
vendored
17
configure
vendored
@ -3456,6 +3456,20 @@ if compile_prog "" "" ; then
|
|||||||
sendfile=yes
|
sendfile=yes
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# check for timerfd support (glibc 2.8 and newer)
|
||||||
|
timerfd=no
|
||||||
|
cat > $TMPC << EOF
|
||||||
|
#include <sys/timerfd.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
return(timerfd_create(CLOCK_REALTIME, 0));
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
if compile_prog "" "" ; then
|
||||||
|
timerfd=yes
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if tools are available to build documentation.
|
# Check if tools are available to build documentation.
|
||||||
if test "$docs" != "no" ; then
|
if test "$docs" != "no" ; then
|
||||||
if has makeinfo && has pod2man; then
|
if has makeinfo && has pod2man; then
|
||||||
@ -4524,6 +4538,9 @@ fi
|
|||||||
if test "$sendfile" = "yes" ; then
|
if test "$sendfile" = "yes" ; then
|
||||||
echo "CONFIG_SENDFILE=y" >> $config_host_mak
|
echo "CONFIG_SENDFILE=y" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
|
if test "$timerfd" = "yes" ; then
|
||||||
|
echo "CONFIG_TIMERFD=y" >> $config_host_mak
|
||||||
|
fi
|
||||||
if test "$inotify" = "yes" ; then
|
if test "$inotify" = "yes" ; then
|
||||||
echo "CONFIG_INOTIFY=y" >> $config_host_mak
|
echo "CONFIG_INOTIFY=y" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
|
@ -1404,6 +1404,15 @@
|
|||||||
#ifdef TARGET_NR_timer_settime
|
#ifdef TARGET_NR_timer_settime
|
||||||
{ TARGET_NR_timer_settime, "timer_settime" , NULL, NULL, NULL },
|
{ TARGET_NR_timer_settime, "timer_settime" , NULL, NULL, NULL },
|
||||||
#endif
|
#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
|
#ifdef TARGET_NR_times
|
||||||
{ TARGET_NR_times, "times" , NULL, NULL, NULL },
|
{ TARGET_NR_times, "times" , NULL, NULL, NULL },
|
||||||
#endif
|
#endif
|
||||||
|
@ -58,6 +58,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base,
|
|||||||
#include <sys/shm.h>
|
#include <sys/shm.h>
|
||||||
#include <sys/sem.h>
|
#include <sys/sem.h>
|
||||||
#include <sys/statfs.h>
|
#include <sys/statfs.h>
|
||||||
|
#include <sys/timerfd.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
#include <sys/sysinfo.h>
|
#include <sys/sysinfo.h>
|
||||||
//#include <sys/user.h>
|
//#include <sys/user.h>
|
||||||
@ -9547,6 +9548,50 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
|
||||||
|
case TARGET_NR_timerfd_create:
|
||||||
|
ret = get_errno(timerfd_create(arg1,
|
||||||
|
target_to_host_bitmask(arg2, fcntl_flags_tbl)));
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)
|
||||||
|
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
|
||||||
|
|
||||||
|
#if defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD)
|
||||||
|
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:
|
default:
|
||||||
unimplemented:
|
unimplemented:
|
||||||
gemu_log("qemu: Unsupported syscall: %d\n", num);
|
gemu_log("qemu: Unsupported syscall: %d\n", num);
|
||||||
|
Loading…
Reference in New Issue
Block a user