summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linux-user/syscall.c12
-rw-r--r--linux-user/syscall_defs.h6
2 files changed, 17 insertions, 1 deletions
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 */