All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: "Mark Cave-Ayland" <mark.cave-ayland@ilande.co.uk>,
	"Riku Voipio" <riku.voipio@iki.fi>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Laurent Vivier" <laurent@vivier.eu>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Artyom Tarasenko" <atar4qemu@gmail.com>
Subject: [PULL 12/13] linux-user/sparc: Fix cpu_clone_regs_*
Date: Tue,  5 Nov 2019 19:11:18 +0100	[thread overview]
Message-ID: <20191105181119.26779-13-laurent@vivier.eu> (raw)
In-Reply-To: <20191105181119.26779-1-laurent@vivier.eu>

From: Richard Henderson <richard.henderson@linaro.org>

We failed to set the secondary return value in %o1
we failed to advance the PC past the syscall,
we failed to adjust regwptr into the new structure,
we stored the stack pointer into the wrong register.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20191025113921.9412-12-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 linux-user/sparc/target_cpu.h | 43 +++++++++++++++++++++++++++++------
 1 file changed, 36 insertions(+), 7 deletions(-)

diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
index 8ff706adcef7..14b21589699b 100644
--- a/linux-user/sparc/target_cpu.h
+++ b/linux-user/sparc/target_cpu.h
@@ -23,22 +23,51 @@
 static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
                                         unsigned flags)
 {
+    /*
+     * After cpu_copy, env->regwptr is pointing into the old env.
+     * Update the new cpu to use its own register window.
+     */
+    env->regwptr = env->regbase + (env->cwp * 16);
+
     if (newsp) {
-        env->regwptr[22] = newsp;
+        /* When changing stacks, do it with clean register windows.  */
+#ifdef TARGET_SPARC64
+        env->cansave = env->nwindows - 2;
+        env->cleanwin = env->nwindows - 2;
+        env->canrestore = 0;
+#else
+        env->wim = 1 << env->cwp;
+#endif
+        /* ??? The kernel appears to copy one stack frame to the new stack. */
+        /* ??? The kernel force aligns the new stack. */
+        env->regwptr[WREG_SP] = newsp;
     }
-    /* syscall return for clone child: 0, and clear CF since
-     * this counts as a success return value.
-     */
-    env->regwptr[0] = 0;
+
+    if (flags & CLONE_VM) {
+        /*
+         * Syscall return for clone child: %o0 = 0 and clear CF since this
+         * counts as a success return value.  Advance the PC past the syscall.
+         * For fork child, all of this happens in cpu_loop, and we must not
+         * do the pc advance twice.
+         */
+        env->regwptr[WREG_O0] = 0;
 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
-    env->xcc &= ~PSR_CARRY;
+        env->xcc &= ~PSR_CARRY;
 #else
-    env->psr &= ~PSR_CARRY;
+        env->psr &= ~PSR_CARRY;
 #endif
+        env->pc = env->npc;
+        env->npc = env->npc + 4;
+    }
+
+    /* Set the second return value for the child: %o1 = 1.  */
+    env->regwptr[WREG_O1] = 1;
 }
 
 static inline void cpu_clone_regs_parent(CPUSPARCState *env, unsigned flags)
 {
+    /* Set the second return value for the parent: %o1 = 0.  */
+    env->regwptr[WREG_O1] = 0;
 }
 
 static inline void cpu_set_tls(CPUSPARCState *env, target_ulong newtls)
-- 
2.21.0



  parent reply	other threads:[~2019-11-05 18:21 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-05 18:11 [PULL 00/13] Linux user for 4.2 patches Laurent Vivier
2019-11-05 18:11 ` [PULL 01/13] linux-user: Support for NETLINK socket options Laurent Vivier
2019-11-05 18:11 ` [PULL 02/13] scripts/qemu-binfmt-conf: Update for sparc64 Laurent Vivier
2019-11-05 18:11 ` [PULL 03/13] tests/tcg/multiarch/linux-test: Fix error check for shmat Laurent Vivier
2019-11-05 18:11 ` [PULL 04/13] target/sparc: Define an enumeration for accessing env->regwptr Laurent Vivier
2019-11-05 18:11 ` [PULL 05/13] linux-user/sparc: Use WREG constants in sparc/target_cpu.h Laurent Vivier
2019-11-05 18:11 ` [PULL 06/13] linux-user/sparc: Begin using WREG constants in sparc/signal.c Laurent Vivier
2019-11-05 18:11 ` [PULL 07/13] linux-user/sparc: Use WREG_SP constant " Laurent Vivier
2019-11-05 18:11 ` [PULL 08/13] linux-user/sparc: Fix WREG usage in setup_frame Laurent Vivier
2019-11-05 18:11 ` [PULL 09/13] linux-user/sparc64: Fix target_signal_frame Laurent Vivier
2019-11-05 18:11 ` [PULL 10/13] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child Laurent Vivier
2019-11-05 18:11 ` [PULL 11/13] linux-user: Introduce cpu_clone_regs_parent Laurent Vivier
2019-11-05 18:11 ` Laurent Vivier [this message]
2019-11-05 18:11 ` [PULL 13/13] linux-user/alpha: Set r20 secondary return value Laurent Vivier
2019-11-05 22:06 ` [PULL 00/13] Linux user for 4.2 patches no-reply
2019-11-05 22:14   ` Laurent Vivier
2019-11-05 22:56     ` Philippe Mathieu-Daudé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191105181119.26779-13-laurent@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=alex.bennee@linaro.org \
    --cc=atar4qemu@gmail.com \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=riku.voipio@iki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.