[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 038/108] linux-user: Split out mmap, mmap2, reboo
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v2 038/108] linux-user: Split out mmap, mmap2, reboot, swapon |
Date: |
Sat, 9 Jun 2018 17:01:10 -1000 |
All targets define swapon; remove the ifdef.
Add a comment noting the incorrect implementation of mmap2.
Signed-off-by: Richard Henderson <address@hidden>
---
linux-user/syscall.c | 142 ++++++++++++++++++++++++-------------------
1 file changed, 81 insertions(+), 61 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index f1123479df..a3374955da 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -8392,6 +8392,49 @@ IMPL(mknodat)
return ret;
}
+#ifdef TARGET_NR_mmap
+IMPL(mmap)
+{
+# if (defined(TARGET_I386) && defined(TARGET_ABI32)) \
+ || (defined(TARGET_ARM) && defined(TARGET_ABI32)) \
+ || defined(TARGET_M68K) || defined(TARGET_CRIS) \
+ || defined(TARGET_MICROBLAZE) || defined(TARGET_S390X)
+ abi_ulong orig_arg1 = arg1;
+ abi_ulong *v = lock_user(VERIFY_READ, arg1, 6 * sizeof(abi_ulong), 1);
+
+ if (!v) {
+ return -TARGET_EFAULT;
+ }
+ arg1 = tswapal(v[0]);
+ arg2 = tswapal(v[1]);
+ arg3 = tswapal(v[2]);
+ arg4 = tswapal(v[3]);
+ arg5 = tswapal(v[4]);
+ arg6 = tswapal(v[5]);
+ unlock_user(v, orig_arg1, 0);
+# endif
+ return get_errno(target_mmap(arg1, arg2, arg3,
+ target_to_host_bitmask(arg4, mmap_flags_tbl),
+ arg5, arg6));
+}
+#endif
+
+#ifdef TARGET_NR_mmap2
+IMPL(mmap2)
+{
+#ifndef MMAP_SHIFT
+#define MMAP_SHIFT 12
+#endif
+ /* ??? The argument to target_mmap is abi_ulong. Therefore this
+ * truncates the true offset for ABI32, which are the only users
+ * (and only point) of this syscall.
+ */
+ return get_errno(target_mmap(arg1, arg2, arg3,
+ target_to_host_bitmask(arg4, mmap_flags_tbl),
+ arg5, arg6 << MMAP_SHIFT));
+}
+#endif
+
IMPL(mount)
{
char *p1 = NULL, *p2, *p3 = NULL;
@@ -8751,6 +8794,23 @@ IMPL(readlinkat)
return do_readlinkat(arg1, arg2, arg3, arg4);
}
+IMPL(reboot)
+{
+ abi_long ret;
+ if (arg3 == LINUX_REBOOT_CMD_RESTART2) {
+ /* arg4 must be ignored in all other cases */
+ char *p = lock_user_string(arg4);
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(reboot(arg1, arg2, arg3, p));
+ unlock_user(p, arg4, 0);
+ } else {
+ ret = get_errno(reboot(arg1, arg2, arg3, NULL));
+ }
+ return ret;
+}
+
#ifdef TARGET_NR_rename
IMPL(rename)
{
@@ -9370,6 +9430,19 @@ IMPL(stime)
}
#endif
+IMPL(swapon)
+{
+ char *p = lock_user_string(arg1);
+ abi_long ret;
+
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(swapon(p, arg2));
+ unlock_user(p, arg1, 0);
+ return ret;
+}
+
#ifdef TARGET_NR_symlink
IMPL(symlink)
{
@@ -9630,67 +9703,6 @@ static abi_long do_syscall1(void *cpu_env, unsigned num,
abi_long arg1,
void *p;
switch(num) {
-#ifdef TARGET_NR_swapon
- case TARGET_NR_swapon:
- if (!(p = lock_user_string(arg1)))
- return -TARGET_EFAULT;
- ret = get_errno(swapon(p, arg2));
- unlock_user(p, arg1, 0);
- return ret;
-#endif
- case TARGET_NR_reboot:
- if (arg3 == LINUX_REBOOT_CMD_RESTART2) {
- /* arg4 must be ignored in all other cases */
- p = lock_user_string(arg4);
- if (!p) {
- return -TARGET_EFAULT;
- }
- ret = get_errno(reboot(arg1, arg2, arg3, p));
- unlock_user(p, arg4, 0);
- } else {
- ret = get_errno(reboot(arg1, arg2, arg3, NULL));
- }
- return ret;
-#ifdef TARGET_NR_mmap
- case TARGET_NR_mmap:
-#if (defined(TARGET_I386) && defined(TARGET_ABI32)) || \
- (defined(TARGET_ARM) && defined(TARGET_ABI32)) || \
- defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_MICROBLAZE)
\
- || defined(TARGET_S390X)
- {
- abi_ulong *v;
- abi_ulong v1, v2, v3, v4, v5, v6;
- if (!(v = lock_user(VERIFY_READ, arg1, 6 * sizeof(abi_ulong), 1)))
- return -TARGET_EFAULT;
- v1 = tswapal(v[0]);
- v2 = tswapal(v[1]);
- v3 = tswapal(v[2]);
- v4 = tswapal(v[3]);
- v5 = tswapal(v[4]);
- v6 = tswapal(v[5]);
- unlock_user(v, arg1, 0);
- ret = get_errno(target_mmap(v1, v2, v3,
- target_to_host_bitmask(v4,
mmap_flags_tbl),
- v5, v6));
- }
-#else
- ret = get_errno(target_mmap(arg1, arg2, arg3,
- target_to_host_bitmask(arg4,
mmap_flags_tbl),
- arg5,
- arg6));
-#endif
- return ret;
-#endif
-#ifdef TARGET_NR_mmap2
- case TARGET_NR_mmap2:
-#ifndef MMAP_SHIFT
-#define MMAP_SHIFT 12
-#endif
- ret = target_mmap(arg1, arg2, arg3,
- target_to_host_bitmask(arg4, mmap_flags_tbl),
- arg5, arg6 << MMAP_SHIFT);
- return get_errno(ret);
-#endif
case TARGET_NR_munmap:
return get_errno(target_munmap(arg1, arg2));
case TARGET_NR_mprotect:
@@ -12743,6 +12755,12 @@ static impl_fn *syscall_table(unsigned num)
SYSCALL(mknod);
#endif
SYSCALL(mknodat);
+#ifdef TARGET_NR_mmap
+ SYSCALL(mmap);
+#endif
+#ifdef TARGET_NR_mmap2
+ SYSCALL(mmap2);
+#endif
SYSCALL(mount);
#ifdef CONFIG_OPEN_BY_HANDLE
SYSCALL(name_to_handle_at);
@@ -12773,6 +12791,7 @@ static impl_fn *syscall_table(unsigned num)
SYSCALL(readlink);
#endif
SYSCALL(readlinkat);
+ SYSCALL(reboot);
#ifdef TARGET_NR_rename
SYSCALL(rename);
#endif
@@ -12827,6 +12846,7 @@ static impl_fn *syscall_table(unsigned num)
#ifdef TARGET_NR_stime
SYSCALL(stime);
#endif
+ SYSCALL(swapon);
#ifdef TARGET_NR_symlink
SYSCALL(symlink);
#endif
--
2.17.1
- [Qemu-devel] [PATCH v2 028/108] linux-user: Split out getpgrp, getppid, setsid, (continued)
- [Qemu-devel] [PATCH v2 028/108] linux-user: Split out getpgrp, getppid, setsid, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 029/108] linux-user: Split out rt_sigaction, sigaction, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 030/108] linux-user: Split out rt_sigprocmask, sgetmask, sigprocmask, ssetmask, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 031/108] linux-user: Split out rt_sigpending, rt_sigsuspend, sigpending, sigsuspend, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 032/108] linux-user: Split out rt_sigqueueinfo, rt_sigtimedwait, rt_tgsigqueueinfo, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 033/108] linux-user: Split out rt_sigreturn, sethostname, setrlimit, sigreturn, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 036/108] linux-user: Split out symlink, symlinkat, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 035/108] linux-user: Split out select, pselect6, newselect, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 034/108] linux-user: Split out getrlimit, getrusage, gettimeofday, settimeofday, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 037/108] linux-user: Split out readlink, readlinkat, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 038/108] linux-user: Split out mmap, mmap2, reboot, swapon,
Richard Henderson <=
- [Qemu-devel] [PATCH v2 039/108] linux-user: Split out mprotect, mremap, msync, munmap, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 040/108] linux-user: Split out mlock, mlockall, munlock, munlockall, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 041/108] linux-user: Split out fchmod, fchmodat, ftruncate, truncate, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 042/108] linux-user: Split out fstatfs, fstatfs64, statfs, statfs64, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 043/108] linux-user: Split out getpriority, setpriority, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 044/108] linux-user: Split out socketcall, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 045/108] linux-user: Split out accept, accept4, bind, connect, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 046/108] linux-user: Split out 7 syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 047/108] linux-user: Split out recvmmsg, send, sendmmsg, sendmsg, sendto, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 048/108] linux-user: Split out getrandom, shutdown, setsockopt, socket, socketpair, Richard Henderson, 2018/06/09