diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b226429103..cd3fdf5535 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1763,7 +1763,17 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, } break; case TARGET_NR_select: - goto unimplemented; + { + struct target_sel_arg_struct *sel = (void *)arg1; + sel->n = tswapl(sel->n); + sel->inp = tswapl(sel->inp); + sel->outp = tswapl(sel->outp); + sel->exp = tswapl(sel->exp); + sel->tvp = tswapl(sel->tvp); + ret = do_select(sel->n, (void *)sel->inp, (void *)sel->outp, + (void *)sel->exp, (void *)sel->tvp); + } + break; case TARGET_NR_symlink: ret = get_errno(symlink((const char *)arg1, (const char *)arg2)); break; diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 3826c12909..5caf2d855e 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -390,6 +390,12 @@ struct target_tms { target_clock_t tms_cstime; }; +struct target_sel_arg_struct { + target_long n; + target_long inp, outp, exp; + target_long tvp; +}; + struct target_iovec { target_long iov_base; /* Starting address */ target_long iov_len; /* Number of bytes */