From patchwork Tue Jun 20 20:51:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 778476 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wsg8g6cjwz9s5L for ; Wed, 21 Jun 2017 06:55:15 +1000 (AEST) Received: from localhost ([::1]:50616 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dNQB7-0002Lb-H9 for incoming@patchwork.ozlabs.org; Tue, 20 Jun 2017 16:55:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55431) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dNQ87-0008EZ-7Y for qemu-devel@nongnu.org; Tue, 20 Jun 2017 16:52:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dNQ84-0004H6-JB for qemu-devel@nongnu.org; Tue, 20 Jun 2017 16:52:07 -0400 Received: from mout.kundenserver.de ([212.227.17.24]:57635) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dNQ84-0004GF-8C for qemu-devel@nongnu.org; Tue, 20 Jun 2017 16:52:04 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue104 [212.227.15.183]) with ESMTPSA (Nemesis) id 0LxOmo-1dqXWr0A7W-01707r; Tue, 20 Jun 2017 22:51:31 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Tue, 20 Jun 2017 22:51:21 +0200 Message-Id: <20170620205121.26515-7-laurent@vivier.eu> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170620205121.26515-1-laurent@vivier.eu> References: <20170620205121.26515-1-laurent@vivier.eu> X-Provags-ID: V03:K0:yn85rJvzsLAFn+Zg2LWs41Fh2MNP/BatUbjHr9UXXSmZUMpD7Sr NFgGenvK5WjvtH1A8uAx+ZhNPwmfNvE3j5201cuzQN//29ek7zR04UlWib6cibmTCpPheHf NRt6UZ4+mbS33MO3q8fwkIQ5EGWprYpev8SpoAOF6QTq8VCCWAhbRrdZryh55W4aWUV4wqA tJ7nHMpS4OxGiEpccF1VA== X-UI-Out-Filterresults: notjunk:1; V01:K0:/3MWe/EXLWc=:qEgsPtzQesrzSSXluNxXi2 zZVGxHuKc9KmNEj33a670R8JHTlk9PhUst1erWWykVNlo2o3Hcj7xFErKTUwyQLZLo/agfRD8 +pwbbMSkGm0zrH/BT+14GjaYJrLNFbrIXCwG2BacZDrMyQIfz3UY3s4A/mVaiPOrA6/QxpfTl InOWLY7kTEH0Ok863yR/CUhULaPdi1/7jw1x5DlOyuVZtj58/MxUOLEE7+56yw3eUlg6vpyaO HqZsMe9OOxNirvxIUoty6Uv6EmginxFJAFh6k+B/jxl9rSyONJhIVDpkxpecUyLvM7vOaj85D Qju7K3aP1/9zl4NovdRsG2hQrTkpGuqbGtn4fUi6xBKbf3Sy9DGe1tZ+LpITg+17zrQi0iLbJ gNz4JFWY1x6B05hiqEQ71e3FPg82BDjn3bYkAnlJ0xWQCHAUN2IVWjolaSXecuKq6O2GS+aom bK0moznDQElzDbyGu0WreYLHC2lQnXc8wP+uvpCBRL6MDBdJCzjdBaeCvUm5iH0cjJTuYEjNe gOx+5NVSttKjk0uMbo2Y3IoyVEKoGtFCor1lOHs3bbk8mDqUSl1zeT8bSGmG2b3xMbZM6fUbC mOJooEXdjyWEo+BGzLiGQ1ESHPNj4wpyUIkW78dIfp5AAa8r4J6L6ueP8Ci2CPEdJE8VsnrjU RWa5KjlDo3KzGIkbk68xQUe/hLOMj0IsfsI2D9Y+DKorPlCY+/GFK+vJvvqJpCCoJaDM= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.24 Subject: [Qemu-devel] [PATCH v5 6/6] target-m68k, linux-user: manage FP registers in ucontext 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: Thomas Huth , Riku Voipio , Laurent Vivier , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , Richard Henderson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Laurent Vivier --- linux-user/signal.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/linux-user/signal.c b/linux-user/signal.c index 3d18d1b..d3753e4 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -5673,6 +5673,24 @@ give_sigsegv: force_sigsegv(sig); } +static inline void target_rt_save_fpu_state(struct target_ucontext *uc, + CPUM68KState *env) +{ + int i; + target_fpregset_t *fpregs = &uc->tuc_mcontext.fpregs; + + __put_user(env->fpcr, &fpregs->f_fpcntl[0]); + __put_user(env->fpsr, &fpregs->f_fpcntl[1]); + /* fpiar is not emulated */ + + for (i = 0; i < 8; i++) { + uint32_t high = env->fregs[i].d.high << 16; + __put_user(high, &fpregs->f_fpregs[i * 3]); + __put_user(env->fregs[i].d.low, + (uint64_t *)&fpregs->f_fpregs[i * 3 + 1]); + } +} + static inline int target_rt_setup_ucontext(struct target_ucontext *uc, CPUM68KState *env) { @@ -5699,9 +5717,30 @@ static inline int target_rt_setup_ucontext(struct target_ucontext *uc, __put_user(env->pc, &gregs[16]); __put_user(sr, &gregs[17]); + target_rt_save_fpu_state(uc, env); + return 0; } +static inline void target_rt_restore_fpu_state(CPUM68KState *env, + struct target_ucontext *uc) +{ + int i; + target_fpregset_t *fpregs = &uc->tuc_mcontext.fpregs; + + __get_user(env->fpcr, &fpregs->f_fpcntl[0]); + __get_user(env->fpsr, &fpregs->f_fpcntl[1]); + /* fpiar is not emulated */ + + for (i = 0; i < 8; i++) { + uint32_t high; + __get_user(high, &fpregs->f_fpregs[i * 3]); + env->fregs[i].d.high = high >> 16; + __get_user(env->fregs[i].d.low, + (uint64_t *)&fpregs->f_fpregs[i * 3 + 1]); + } +} + static inline int target_rt_restore_ucontext(CPUM68KState *env, struct target_ucontext *uc) { @@ -5733,6 +5772,8 @@ static inline int target_rt_restore_ucontext(CPUM68KState *env, __get_user(temp, &gregs[17]); cpu_m68k_set_ccr(env, temp); + target_rt_restore_fpu_state(env, uc); + return 0; badframe: