From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35477) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XELQ1-0007Te-95 for qemu-devel@nongnu.org; Mon, 04 Aug 2014 12:47:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XELPr-0008BP-U0 for qemu-devel@nongnu.org; Mon, 04 Aug 2014 12:47:29 -0400 From: Tom Musta Date: Mon, 4 Aug 2014 11:45:38 -0500 Message-Id: <1407170739-12237-12-git-send-email-tommusta@gmail.com> In-Reply-To: <1407170739-12237-1-git-send-email-tommusta@gmail.com> References: <1407170739-12237-1-git-send-email-tommusta@gmail.com> Subject: [Qemu-devel] [PATCH 11/12] linux-user: Support target-to-host translation of mlockall argument List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org Cc: Tom Musta , riku.voipio@linaro.org, agraf@suse.de 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 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