@@ -78,6 +78,7 @@ SYSCALL_DEF_FULL(mmap2, .impl = impl_mmap,
.arg_type = { ARG_PTR, ARG_DEC, ARG_MMAPPROT,
ARG_MMAPFLAG, ARG_DEC, ARG_DEC64 });
#endif
+SYSCALL_DEF(mount, ARG_STR, ARG_STR, ARG_STR, ARG_MOUNTFLAG, ARG_PTR);
SYSCALL_DEF(mprotect, ARG_PTR, ARG_DEC, ARG_MMAPPROT);
SYSCALL_DEF_FULL(mremap, .impl = impl_mremap,
.print_ret = print_syscall_ptr_ret,
@@ -62,6 +62,7 @@ typedef enum {
ARG_MMAPFLAG,
ARG_MMAPPROT,
ARG_MODEFLAG,
+ ARG_MOUNTFLAG,
ARG_OPENFLAG,
ARG_UNLINKATFLAG,
ARG_LSEEKWHENCE,
@@ -708,7 +708,7 @@ static struct flags const open_flags[] = {
FLAG_END,
};
-UNUSED static struct flags mount_flags[] = {
+static struct flags const mount_flags[] = {
#ifdef MS_BIND
FLAG_GENERIC(MS_BIND),
#endif
@@ -2015,22 +2015,6 @@ print_symlinkat(const struct syscallname *name,
}
#endif
-#ifdef TARGET_NR_mount
-static void
-print_mount(const struct syscallname *name,
- abi_long arg0, abi_long arg1, abi_long arg2,
- abi_long arg3, abi_long arg4, abi_long arg5)
-{
- print_syscall_prologue(name);
- print_string(arg0, 0);
- print_string(arg1, 0);
- print_string(arg2, 0);
- print_flags(mount_flags, arg3, 0);
- print_pointer(arg4, 1);
- print_syscall_epilogue(name);
-}
-#endif
-
#ifdef TARGET_NR_umount
static void
print_umount(const struct syscallname *name,
@@ -2315,6 +2299,9 @@ static void print_syscall_def1(const SyscallDef *def, int64_t args[6])
case ARG_MODEFLAG:
len = add_flags(b, rest, mode_flags, arg, true);
break;
+ case ARG_MOUNTFLAG:
+ len = add_flags(b, rest, mount_flags, arg, true);
+ break;
case ARG_OPENFLAG:
len = add_open_flags(b, rest, arg);
break;
@@ -174,6 +174,54 @@ SYSCALL_IMPL(mknodat)
return do_mknodat(arg1, arg2, arg3, arg4);
}
+SYSCALL_IMPL(mount)
+{
+ abi_ulong target_src = arg1;
+ abi_ulong target_tgt = arg2;
+ abi_ulong target_fst = arg3;
+ abi_ulong mountflags = arg4;
+ abi_ulong target_data = arg5;
+ char *p_src = NULL, *p_tgt = NULL, *p_fst = NULL, *p_data = NULL;
+ abi_long ret = -TARGET_EFAULT;
+
+ if (target_src) {
+ p_src = lock_user_string(target_src);
+ if (!p_src) {
+ goto exit0;
+ }
+ }
+
+ p_tgt = lock_user_string(target_tgt);
+ if (!p_tgt) {
+ goto exit1;
+ }
+
+ if (target_fst) {
+ p_fst = lock_user_string(target_fst);
+ if (!p_fst) {
+ goto exit2;
+ }
+ }
+
+ /*
+ * FIXME - arg5 should be locked, but it isn't clear how to
+ * do that since it's not guaranteed to be a NULL-terminated
+ * string.
+ */
+ if (target_data) {
+ p_data = g2h(target_data);
+ }
+ ret = get_errno(mount(p_src, p_tgt, p_fst, mountflags, p_data));
+
+ unlock_user(p_fst, target_fst, 0);
+ exit2:
+ unlock_user(p_tgt, target_tgt, 0);
+ exit1:
+ unlock_user(p_src, target_src, 0);
+ exit0:
+ return ret;
+}
+
/*
* Helpers for do_openat, manipulating /proc/self/foo.
*/
@@ -5380,61 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
void *p;
switch(num) {
- case TARGET_NR_mount:
- {
- /* need to look at the data field */
- void *p2, *p3;
-
- if (arg1) {
- p = lock_user_string(arg1);
- if (!p) {
- return -TARGET_EFAULT;
- }
- } else {
- p = NULL;
- }
-
- p2 = lock_user_string(arg2);
- if (!p2) {
- if (arg1) {
- unlock_user(p, arg1, 0);
- }
- return -TARGET_EFAULT;
- }
-
- if (arg3) {
- p3 = lock_user_string(arg3);
- if (!p3) {
- if (arg1) {
- unlock_user(p, arg1, 0);
- }
- unlock_user(p2, arg2, 0);
- return -TARGET_EFAULT;
- }
- } else {
- p3 = NULL;
- }
-
- /* FIXME - arg5 should be locked, but it isn't clear how to
- * do that since it's not guaranteed to be a NULL-terminated
- * string.
- */
- if (!arg5) {
- ret = mount(p, p2, p3, (unsigned long)arg4, NULL);
- } else {
- ret = mount(p, p2, p3, (unsigned long)arg4, g2h(arg5));
- }
- ret = get_errno(ret);
-
- if (arg1) {
- unlock_user(p, arg1, 0);
- }
- unlock_user(p2, arg2, 0);
- if (arg3) {
- unlock_user(p3, arg3, 0);
- }
- }
- return ret;
#ifdef TARGET_NR_umount
case TARGET_NR_umount:
if (!(p = lock_user_string(arg1)))
@@ -497,9 +497,6 @@
#ifdef TARGET_NR_modify_ldt
{ TARGET_NR_modify_ldt, "modify_ldt" , NULL, NULL, NULL },
#endif
-#ifdef TARGET_NR_mount
-{ TARGET_NR_mount, "mount" , NULL, print_mount, NULL },
-#endif
#ifdef TARGET_NR_move_pages
{ TARGET_NR_move_pages, "move_pages" , NULL, NULL, NULL },
#endif
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/syscall-defs.h | 1 + linux-user/syscall.h | 1 + linux-user/strace.c | 21 +++---------- linux-user/syscall-file.inc.c | 48 ++++++++++++++++++++++++++++++ linux-user/syscall.c | 55 ----------------------------------- linux-user/strace.list | 3 -- 6 files changed, 54 insertions(+), 75 deletions(-)