From patchwork Mon Jul 23 12:56:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 142606 Delivered-To: patch@linaro.org Received: by 2002:a2e:9754:0:0:0:0:0 with SMTP id f20-v6csp6022944ljj; Mon, 23 Jul 2018 06:01:04 -0700 (PDT) X-Google-Smtp-Source: AAOMgpe+DxSEvNCLAxTWlMEtEGV0DM5A2Oc9STUsrB8xa6KJYNCYeAVDOulc1pddcLMDXA/spbxG X-Received: by 2002:a37:284a:: with SMTP id o71-v6mr10783515qkh.176.1532350864124; Mon, 23 Jul 2018 06:01:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532350864; cv=none; d=google.com; s=arc-20160816; b=GnrrlsdO2JG4MzWvP3m2+NxIR6tQmjC9A7EFXzx2ktj1yviFSwBibJZLBBvmwwJi61 +AiKpmHRbb7r9tqM9h9JzamaBuijDWEY2Mk669XiSbIKaNtyWi9s28JL/2CIeFZ/dfe3 Qv4kkGjQfzJFAjyU62/L/htHHDK9OcJ1gI/V2OqM+LhPRZgAvwKQTY79YFVEHP7Dn13S FYgy21LxNDb4vJaNaYSp632zHIxXkV2p5yTZcmlG3BrGwpl/beCm5HNzVk0dCMNpR4Uh kcuTaoiog3GS6WkZzL04BbA92PGM+piTHLqN8VxlFZ+vquMRoGIMMQfSF4jzGrueY9lK j93Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:to:from:arc-authentication-results; bh=pxugKgAD2KpFVBELVfl1/0nGFnoMHImtqWoXWfrTy58=; b=YfXv+RL96Pok6T0q93Hm6nQodDfQ3m8Yph6B0VQNgC/8KJeIU6cl37adA1/H3FfKe8 m3kCC0reoKhgggA1q1za9yoZu9/62aMcDjA/Y1jh15RUoC2SNeK/FjcWNOeyKUJZG8lm ybS4OnKF6VILHmR8TWbzQ53krAovbEOLHVzfhP3IU2uj+BIa2qwSxM+KSHPKGq6+wD1l gAIllq6gO0+Qu8isVeGsBuxfoSy/xYPtQ4XuVXibxWS3r2VN6HD2XAh9h0kD/bNm3Zkx rQmaRztVsHcn3NqcAiIhzz9YsFrsHMau3tsQrBKotsBxJGVBlYefHbLWKl/Djh0qTgRJ rKzQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org" Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id o7-v6si2272395qvk.183.2018.07.23.06.01.03 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 23 Jul 2018 06:01:04 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org" Received: from localhost ([::1]:34509 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fhaSV-000753-Kl for patch@linaro.org; Mon, 23 Jul 2018 09:01:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44030) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fhaOX-000529-Rw for qemu-devel@nongnu.org; Mon, 23 Jul 2018 08:57:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fhaOU-0007fR-RL for qemu-devel@nongnu.org; Mon, 23 Jul 2018 08:56:57 -0400 Received: from mout.kundenserver.de ([212.227.126.134]:40859) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fhaOU-0007ey-EV for qemu-devel@nongnu.org; Mon, 23 Jul 2018 08:56:54 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue007 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MWcQg-1fX6231quY-00XeUN; Mon, 23 Jul 2018 14:56:37 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Mon, 23 Jul 2018 14:56:24 +0200 Message-Id: <20180723125624.18863-3-laurent@vivier.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180723125624.18863-1-laurent@vivier.eu> References: <20180723125624.18863-1-laurent@vivier.eu> MIME-Version: 1.0 X-Provags-ID: V03:K1:ratF6hiCl01Jo2gmZbpwoleYJI7dyrvbjGIuDzZC8r7WV9MMm6u sH9Fjbyaq99xhATLqx67/PbEVYULhHokBuFqdF7tTA3gTkFlT2vnkff7hYgG9z7Xxxqai7v EHMxE4HBPOf4auObLIDc8l2KIDqmPz7k8jAguhiuCvihpK9kr2DSX7SWrE6EviKoVogRXm1 a1W1ZEMIjsVt6m7ozBjuQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:rQHoxcpY/34=:KiyxR0PRAadwPb0HvAl0rD pXOsmqMU0kOgNlmuc1xR+EFbURMPT9RhtgvAbuZqPCjxtoZNsKYjUUwDBLEANNd1n5LSb4pg1 zSQQ15XVqAD3KverXhv/GTageFmQHiCHpHu2wR2WK0XvNcKPA/bwD0iomdYWoJWxgF5GJy5Pd oapC8Gq1tMgbk8pZ3ghJIqfo1T35dov+TGSVW9jHvEgMomyALamLPvvjlXGdRhXGZRFq5SPMp vlaVD9efs3WaDxoTIYAoCAts1wd3WxOnba9uQOFLQ0UJ+Oxha62N/2nAz9cR7PoQZgIgLiI3P sTW9m7Fbk9XttJjB+19NMHaEVw1T3eLuJHbw+zGWZauE8MK6/ssRtY8Ssz7jrxeSPy0ughj7i wqfgrzLRWS8nVrzHcS9mYxOSmC+UG1dkdy0iQjyhiXKo5op56zrPrAVf72jF55KiPUqZxoEDG KrCnjTDZSPxm0eiwVam+t61xkdePSqMsICLICL2haSeLjYrx4Gr1JAdQAvxfjj52VbQ5bYXW7 wXU6o/JeqN2Qle/rmReHjwZQUGUs7/Zf2uCqNp9xHiaxL4RNEOXIqz++tXf+f7Kbk5xZZGCng DRi4itS0iscUTZXH2zjFBvOL8d8twALN8OHGATQZ2zCFSqxx974kxgE6yjzyTSmo1WwreAwg/ NiZqIBpFEKQYKezm2kVmfW5LRlQ+jtlCupP06HAE5zZyxd4F9gQLcE3sE96cGcJCfzq0U+Z3X D5gT1GdVCoSy+jJg X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.134 Subject: [Qemu-devel] [PULL 2/2] linux-user/ppc: Implement swapcontext syscall X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Riku Voipio , Richard Henderson , Laurent Vivier Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Richard Henderson This allows the tests generated by debian-powerpc-user-cross to function properly, especially tests/test-coroutine. Technically this syscall is available to both ppc32 and ppc64, but only ppc32 glibc actually uses it. Thus the ppc64 path is untested. Signed-off-by: Richard Henderson Tested-by: Alex Bennée Reviewed-by: Alex Bennée Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Laurent Vivier Message-Id: <20180718200648.22529-1-richard.henderson@linaro.org> --- linux-user/ppc/signal.c | 56 +++++++++++++++++++++++++++++++++++++++++ linux-user/qemu.h | 2 ++ linux-user/syscall.c | 6 +++++ 3 files changed, 64 insertions(+) -- 2.17.1 diff --git a/linux-user/ppc/signal.c b/linux-user/ppc/signal.c index ef4c518f11..2ae120a2bc 100644 --- a/linux-user/ppc/signal.c +++ b/linux-user/ppc/signal.c @@ -675,3 +675,59 @@ sigsegv: force_sig(TARGET_SIGSEGV); return -TARGET_QEMU_ESIGRETURN; } + +/* This syscall implements {get,set,swap}context for userland. */ +abi_long do_swapcontext(CPUArchState *env, abi_ulong uold_ctx, + abi_ulong unew_ctx, abi_long ctx_size) +{ + struct target_ucontext *uctx; + struct target_mcontext *mctx; + + /* For ppc32, ctx_size is "reserved for future use". + * For ppc64, we do not yet support the VSX extension. + */ + if (ctx_size < sizeof(struct target_ucontext)) { + return -TARGET_EINVAL; + } + + if (uold_ctx) { + TaskState *ts = (TaskState *)thread_cpu->opaque; + + if (!lock_user_struct(VERIFY_WRITE, uctx, uold_ctx, 1)) { + return -TARGET_EFAULT; + } + +#ifdef TARGET_PPC64 + mctx = &uctx->tuc_sigcontext.mcontext; +#else + /* ??? The kernel aligns the pointer down here into padding, but + * in setup_rt_frame we don't. Be self-compatible for now. + */ + mctx = &uctx->tuc_mcontext; + __put_user(h2g(mctx), &uctx->tuc_regs); +#endif + + save_user_regs(env, mctx); + host_to_target_sigset(&uctx->tuc_sigmask, &ts->signal_mask); + + unlock_user_struct(uctx, uold_ctx, 1); + } + + if (unew_ctx) { + int err; + + if (!lock_user_struct(VERIFY_READ, uctx, unew_ctx, 1)) { + return -TARGET_EFAULT; + } + err = do_setcontext(uctx, env, 0); + unlock_user_struct(uctx, unew_ctx, 1); + + if (err) { + /* We cannot return to a partially updated context. */ + force_sig(TARGET_SIGSEGV); + } + return -TARGET_QEMU_ESIGRETURN; + } + + return 0; +} diff --git a/linux-user/qemu.h b/linux-user/qemu.h index 7b16a1cdea..b4959e41c6 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -396,6 +396,8 @@ long do_sigreturn(CPUArchState *env); long do_rt_sigreturn(CPUArchState *env); abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp); int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset); +abi_long do_swapcontext(CPUArchState *env, abi_ulong uold_ctx, + abi_ulong unew_ctx, abi_long ctx_size); /** * block_signals: block all signals while handling this guest syscall * diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3df3bdffb2..dfc851cc35 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -12790,6 +12790,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, ret = get_errno(kcmp(arg1, arg2, arg3, arg4, arg5)); break; #endif +#ifdef TARGET_NR_swapcontext + case TARGET_NR_swapcontext: + /* PowerPC specific. */ + ret = do_swapcontext(cpu_env, arg1, arg2, arg3); + break; +#endif default: unimplemented: