qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 11/12] linux-user: Support target-to-host translatio


From: Tom Musta
Subject: [Qemu-devel] [PATCH 11/12] linux-user: Support target-to-host translation of mlockall argument
Date: Mon, 4 Aug 2014 11:45:38 -0500

The argument to the mlockall system call is not necessarily the same on
all platforms and thus may require translation prior to passing to the
host.

For example, PowerPC 64 bit platforms define values for MCL_CURRENT
(0x2000) and MCL_FUTURE (0x4000) which are different from Intel platforms
(0x1 and 0x2, respectively)

Signed-off-by: Tom Musta <address@hidden>

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 5660520..fea54be 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -4934,6 +4934,34 @@ static inline abi_long 
host_to_target_itimerspec(abi_ulong target_addr,
     return 0;
 }
 
+#if defined(TARGET_NR_mlockall)
+
+#if defined(TARGET_PPC64)
+#define TARGET_MLOCKALL_MCL_CURRENT 0x2000
+#define TARGET_MLOCKALL_MCL_FUTURE  0x4000
+#endif
+
+static inline int target_to_host_mlockall_arg(int arg)
+{
+    int result = 0;
+
+#ifdef TARGET_MLOCKALL_MCL_CURRENT
+    if (arg & TARGET_MLOCKALL_MCL_CURRENT) {
+        result |= MCL_CURRENT;
+        arg ^= TARGET_MLOCKALL_MCL_CURRENT;
+    }
+#endif
+#ifdef TARGET_MLOCKALL_MCL_FUTURE
+    if (arg & TARGET_MLOCKALL_MCL_FUTURE) {
+        result |= MCL_FUTURE;
+        arg ^= TARGET_MLOCKALL_MCL_FUTURE;
+    }
+#endif
+    result |= arg;
+    return result;
+}
+#endif
+
 #if defined(TARGET_NR_stat64) || defined(TARGET_NR_newfstatat)
 static inline abi_long host_to_target_stat64(void *cpu_env,
                                              abi_ulong target_addr,
@@ -6783,7 +6811,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 #endif
 #ifdef TARGET_NR_mlockall
     case TARGET_NR_mlockall:
-        ret = get_errno(mlockall(arg1));
+        ret = get_errno(mlockall(target_to_host_mlockall_arg(arg1)));
         break;
 #endif
 #ifdef TARGET_NR_munlockall
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]