qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Richard Henderson <rth@twiddle.net>
To: qemu-devel@nongnu.org
Cc: blauwirbel@gmail.com, Riku Voipio <riku.voipio@iki.fi>
Subject: [Qemu-devel] [PATCH 21/21] sparc-linux-user: Enable NPTL
Date: Tue, 18 Oct 2011 11:50:43 -0700	[thread overview]
Message-ID: <1318963843-25100-22-git-send-email-rth@twiddle.net> (raw)
In-Reply-To: <1318963843-25100-1-git-send-email-rth@twiddle.net>

??? This doesn't work yet.  The new thread crashes more or less
immediately in the translated code, and then TCG aborts.

Perhaps some of that cpu_reset is really required?  The problem
with it is that it zeros pc/npc, which also sends us off into
nevernever land.  Perhaps cpu_clone_regs should take both the
old and new env, and move the copy/reset/update into cpu-specific
code?  That would certainly avoid the ifdef there...

Anyone see what's going wrong?

Not-signed-off-by: Richard Henderson <rth@twiddle.net>
Cc: Riku Voipio <riku.voipio@iki.fi>
---
 configure            |    3 +++
 linux-user/syscall.c |   12 +++++++++++-
 target-sparc/cpu.h   |   30 +++++++++++++++++++++++++-----
 3 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/configure b/configure
index 283ba81..8df9a6d 100755
--- a/configure
+++ b/configure
@@ -3313,11 +3313,13 @@ case "$target_arch2" in
   ;;
   sparc)
     target_phys_bits=64
+    target_nptl="yes"
   ;;
   sparc64)
     TARGET_BASE_ARCH=sparc
     target_phys_bits=64
     target_long_alignment=8
+    target_nptl="yes"
   ;;
   sparc32plus)
     TARGET_ARCH=sparc64
@@ -3325,6 +3327,7 @@ case "$target_arch2" in
     TARGET_ABI_DIR=sparc
     echo "TARGET_ABI32=y" >> $config_target_mak
     target_phys_bits=64
+    target_nptl="yes"
   ;;
   s390x)
     target_nptl="yes"
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 7735008..dfd7a89 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -3961,6 +3961,12 @@ static void *clone_func(void *arg)
     /* Wait until the parent has finshed initializing the tls state.  */
     pthread_mutex_lock(&clone_lock);
     pthread_mutex_unlock(&clone_lock);
+
+#ifdef TARGET_SPARC
+    /* Funny calling conventions for Sparc: the new TID is in %o0.  */
+    env->regwptr[0] = info->tid;
+#endif
+
     cpu_loop(env);
     /* never exits */
     return NULL;
@@ -4006,8 +4012,12 @@ static int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp,
         init_task_state(ts);
         /* we create a new CPU instance. */
         new_env = cpu_copy(env);
-#if defined(TARGET_I386) || defined(TARGET_SPARC) || defined(TARGET_PPC)
+#if defined(TARGET_I386) || defined(TARGET_PPC)
         cpu_reset(new_env);
+#elif defined(TARGET_SPARC)
+        /* Funny calling conventions for Sparc: %o1 == 0 for parent,
+           and == 1 for child.  We handle the later in cpu_clone_regs.  */
+        env->regwptr[1] = 0;
 #endif
         /* Init regs that differ from the parent.  */
         cpu_clone_regs(new_env, newsp);
diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
index 71a890c..2c7d67b 100644
--- a/target-sparc/cpu.h
+++ b/target-sparc/cpu.h
@@ -675,12 +675,32 @@ static inline int cpu_pil_allowed(CPUState *env1, int pil)
 #if defined(CONFIG_USER_ONLY)
 static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
 {
-    if (newsp)
+    if (newsp) {
+        if (TARGET_VIRT_ADDR_SPACE_BITS == 32) {
+            newsp &= 0xffffffff;
+        }
         env->regwptr[22] = newsp;
-    env->regwptr[0] = 0;
-    /* FIXME: Do we also need to clear CF?  */
-    /* XXXXX */
-    printf ("HELPME: %s:%d\n", __FILE__, __LINE__);
+    }
+
+    /* Glibc tests for syscall error (carry set) before testing for
+       parent or child.  We must signal success.  */
+#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
+    env->xcc &= ~PSR_CARRY;
+#else
+    env->psr &= ~PSR_CARRY;
+#endif
+
+    /* Indicate child.  */
+    env->regwptr[1] = 1;
+
+    /* Next instruction.  */
+    env->pc = env->npc;
+    env->npc = env->npc + 4;
+}
+
+static inline void cpu_set_tls(CPUState *env, target_ulong newtls)
+{
+    env->gregs[7] = newtls;
 }
 #endif
 
-- 
1.7.6.4

  parent reply	other threads:[~2011-10-18 19:08 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-18 18:50 [Qemu-devel] [PATCH 00/21] Sparc FPU/VIS improvements Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 01/21] target-sparc: Add accessors for single-precision fpr access Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 02/21] target-sparc: Mark fprs dirty in store accessor Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 03/21] target-sparc: Add accessors for double-precision fpr access Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 04/21] target-sparc: Pass float64 parameters instead of dt0/1 temporaries Richard Henderson
2011-10-18 20:04   ` Blue Swirl
2011-10-18 20:07     ` Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 05/21] target-sparc: Make VIS helpers const when possible Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 06/21] target-sparc: Extract common code for floating-point operations Richard Henderson
2011-10-18 20:24   ` Blue Swirl
2011-10-18 22:21     ` Richard Henderson
2011-10-23 11:34       ` Blue Swirl
2011-10-18 18:50 ` [Qemu-devel] [PATCH 07/21] target-sparc: Extract float128 move to a function Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 08/21] target-sparc: Undo cpu_fpr rename Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 09/21] target-sparc: Change fpr representation to doubles Richard Henderson
2011-10-18 20:28   ` Blue Swirl
2011-10-18 22:25     ` Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 10/21] tcg: Optimize some forms of deposit Richard Henderson
2011-10-18 20:30   ` Blue Swirl
2011-10-18 22:27     ` Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 11/21] target-sparc: Do exceptions management fully inside the helpers Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 12/21] sparc-linux-user: Handle SIGILL Richard Henderson
2011-10-18 20:32   ` Blue Swirl
2011-10-18 22:27     ` Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 13/21] target-sparc: Implement PDIST Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 14/21] target-sparc: Implement fpack{16, 32, fix} Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 15/21] target-sparc: Implement EDGE* instructions Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 16/21] target-sparc: Implement ALIGNADDR* inline Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 17/21] target-sparc: Implement BMASK/BSHUFFLE Richard Henderson
2011-10-18 20:36   ` Blue Swirl
2011-10-18 18:50 ` [Qemu-devel] [PATCH 18/21] target-sparc: Tidy fpack32 Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 19/21] target-sparc: Implement FALIGNDATA inline Richard Henderson
2011-10-18 18:50 ` [Qemu-devel] [PATCH 20/21] sparc-linux-user: Add some missing syscall numbers Richard Henderson
2011-10-18 18:50 ` Richard Henderson [this message]
2011-10-18 19:50 ` [Qemu-devel] [PATCH 00/21] Sparc FPU/VIS improvements Blue Swirl
2011-10-18 20:03   ` Richard Henderson
2011-10-18 20:19     ` Blue Swirl

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=1318963843-25100-22-git-send-email-rth@twiddle.net \
    --to=rth@twiddle.net \
    --cc=blauwirbel@gmail.com \
    --cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).