[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 21/21] sparc-linux-user: Enable NPTL
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH 21/21] sparc-linux-user: Enable NPTL |
Date: |
Tue, 18 Oct 2011 11:50:43 -0700 |
??? 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 <address@hidden>
Cc: Riku Voipio <address@hidden>
---
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
- [Qemu-devel] [PATCH 09/21] target-sparc: Change fpr representation to doubles., (continued)
- [Qemu-devel] [PATCH 09/21] target-sparc: Change fpr representation to doubles., Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 14/21] target-sparc: Implement fpack{16, 32, fix}., Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 10/21] tcg: Optimize some forms of deposit., Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 08/21] target-sparc: Undo cpu_fpr rename., Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 20/21] sparc-linux-user: Add some missing syscall numbers, Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 07/21] target-sparc: Extract float128 move to a function., Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 21/21] sparc-linux-user: Enable NPTL,
Richard Henderson <=
- [Qemu-devel] [PATCH 03/21] target-sparc: Add accessors for double-precision fpr access., Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 18/21] target-sparc: Tidy fpack32., Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 16/21] target-sparc: Implement ALIGNADDR* inline., Richard Henderson, 2011/10/18
- [Qemu-devel] [PATCH 19/21] target-sparc: Implement FALIGNDATA inline., Richard Henderson, 2011/10/18
- Re: [Qemu-devel] [PATCH 00/21] Sparc FPU/VIS improvements, Blue Swirl, 2011/10/18
- [Qemu-devel] [PATCH 17/21] target-sparc: Implement BMASK/BSHUFFLE., Richard Henderson, 2011/10/18