qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/12] linux-user sparc fixes
@ 2019-10-25 11:39 Richard Henderson
  2019-10-25 11:39 ` [PATCH v2 01/12] scripts/qemu-binfmt-conf: Update for sparc64 Richard Henderson
                   ` (13 more replies)
  0 siblings, 14 replies; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

This is a v2 update of 
  https://lists.gnu.org/archive/html/qemu-devel/2019-05/msg04240.html

Some of the v1 patches have been merged, others reworked a bit.

This fixes most of tests/tcg/multiuser/linux-user for sparc64,
except for test_signal.  We're still missing an implementation
of setup_rt_frame.


r~


Richard Henderson (12):
  scripts/qemu-binfmt-conf: Update for sparc64
  tests/tcg/multiarch/linux-test: Fix error check for shmat
  target/sparc: Define an enumeration for accessing env->regwptr
  linux-user/sparc: Use WREG constants in sparc/target_cpu.h
  linux-user/sparc: Begin using WREG constants in sparc/signal.c
  linux-user/sparc: Use WREG_SP constant in sparc/signal.c
  linux-user/sparc: Fix WREG usage in setup_frame
  linux-user/sparc64: Fix target_signal_frame
  linux-user: Rename cpu_clone_regs to cpu_clone_regs_child
  linux-user: Introduce cpu_clone_regs_parent
  linux-user/sparc: Fix cpu_clone_regs_*
  linux-user/alpha: Set r20 secondary return value

 linux-user/aarch64/target_cpu.h    |   7 +-
 linux-user/alpha/target_cpu.h      |  16 ++++-
 linux-user/arm/target_cpu.h        |   7 +-
 linux-user/cris/target_cpu.h       |   7 +-
 linux-user/hppa/target_cpu.h       |   7 +-
 linux-user/i386/target_cpu.h       |   7 +-
 linux-user/m68k/target_cpu.h       |   7 +-
 linux-user/microblaze/target_cpu.h |   7 +-
 linux-user/mips/target_cpu.h       |   7 +-
 linux-user/nios2/target_cpu.h      |   7 +-
 linux-user/openrisc/target_cpu.h   |   8 ++-
 linux-user/ppc/target_cpu.h        |   7 +-
 linux-user/riscv/target_cpu.h      |   7 +-
 linux-user/s390x/target_cpu.h      |   7 +-
 linux-user/sh4/target_cpu.h        |   7 +-
 linux-user/sparc/target_cpu.h      |  64 ++++++++++++------
 linux-user/tilegx/target_cpu.h     |   7 +-
 linux-user/xtensa/target_cpu.h     |   8 ++-
 target/sparc/cpu.h                 |  33 ++++++++++
 linux-user/sparc/signal.c          | 100 ++++++++++-------------------
 linux-user/syscall.c               |   6 +-
 tests/tcg/multiarch/linux-test.c   |   3 +-
 scripts/qemu-binfmt-conf.sh        |   8 ++-
 23 files changed, 238 insertions(+), 106 deletions(-)

-- 
2.17.1



^ permalink raw reply	[flat|nested] 37+ messages in thread

* [PATCH v2 01/12] scripts/qemu-binfmt-conf: Update for sparc64
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-11-05  9:43   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat Richard Henderson
                   ` (12 subsequent siblings)
  13 siblings, 1 reply; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

Also note that we were missing the qemu_target_list entry
for plain sparc; fix that at the same time.

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Tested-by: Laurent Vivier <laurent@vivier.eu>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 scripts/qemu-binfmt-conf.sh | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
index b5a16742a1..9f1580a91c 100755
--- a/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh
@@ -1,8 +1,8 @@
 #!/bin/sh
 # Enable automatic program execution by the kernel.
 
-qemu_target_list="i386 i486 alpha arm armeb sparc32plus ppc ppc64 ppc64le m68k \
-mips mipsel mipsn32 mipsn32el mips64 mips64el \
+qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \
+ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \
 sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \
 microblaze microblazeel or1k x86_64"
 
@@ -38,6 +38,10 @@ sparc32plus_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
 sparc32plus_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'
 sparc32plus_family=sparc
 
+sparc64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2b'
+sparc64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'
+sparc64_family=sparc
+
 ppc_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14'
 ppc_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'
 ppc_family=ppc
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
  2019-10-25 11:39 ` [PATCH v2 01/12] scripts/qemu-binfmt-conf: Update for sparc64 Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-10-25 12:59   ` Philippe Mathieu-Daudé
                     ` (2 more replies)
  2019-10-25 11:39 ` [PATCH v2 03/12] target/sparc: Define an enumeration for accessing env->regwptr Richard Henderson
                   ` (11 subsequent siblings)
  13 siblings, 3 replies; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

The error indicator for this syscall is -1, not 0.

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 tests/tcg/multiarch/linux-test.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/tcg/multiarch/linux-test.c b/tests/tcg/multiarch/linux-test.c
index fa4243fc04..673d7c8a1c 100644
--- a/tests/tcg/multiarch/linux-test.c
+++ b/tests/tcg/multiarch/linux-test.c
@@ -503,8 +503,9 @@ static void test_shm(void)
 
     shmid = chk_error(shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0777));
     ptr = shmat(shmid, NULL, 0);
-    if (!ptr)
+    if (ptr == (void *)-1) {
         error("shmat");
+    }
 
     memset(ptr, 0, SHM_SIZE);
 
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 03/12] target/sparc: Define an enumeration for accessing env->regwptr
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
  2019-10-25 11:39 ` [PATCH v2 01/12] scripts/qemu-binfmt-conf: Update for sparc64 Richard Henderson
  2019-10-25 11:39 ` [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-11-05  9:45   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 04/12] linux-user/sparc: Use WREG constants in sparc/target_cpu.h Richard Henderson
                   ` (10 subsequent siblings)
  13 siblings, 1 reply; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/sparc/cpu.h | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
index 778aa8e073..ae97c7d9f7 100644
--- a/target/sparc/cpu.h
+++ b/target/sparc/cpu.h
@@ -13,6 +13,39 @@
 
 /*#define EXCP_INTERRUPT 0x100*/
 
+/* Windowed register indexes.  */
+enum {
+    WREG_O0,
+    WREG_O1,
+    WREG_O2,
+    WREG_O3,
+    WREG_O4,
+    WREG_O5,
+    WREG_O6,
+    WREG_O7,
+
+    WREG_L0,
+    WREG_L1,
+    WREG_L2,
+    WREG_L3,
+    WREG_L4,
+    WREG_L5,
+    WREG_L6,
+    WREG_L7,
+
+    WREG_I0,
+    WREG_I1,
+    WREG_I2,
+    WREG_I3,
+    WREG_I4,
+    WREG_I5,
+    WREG_I6,
+    WREG_I7,
+
+    WREG_SP = WREG_O6,
+    WREG_FP = WREG_I6,
+};
+
 /* trap definitions */
 #ifndef TARGET_SPARC64
 #define TT_TFAULT   0x01
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 04/12] linux-user/sparc: Use WREG constants in sparc/target_cpu.h
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (2 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 03/12] target/sparc: Define an enumeration for accessing env->regwptr Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-10-25 12:09   ` Laurent Vivier
  2019-11-05  9:49   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 05/12] linux-user/sparc: Begin using WREG constants in sparc/signal.c Richard Henderson
                   ` (9 subsequent siblings)
  13 siblings, 2 replies; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

This fixes a naming bug wherein we used "UREG_FP" to access the
stack pointer.  OTOH, the "UREG_FP" constant was also defined
incorrectly such that it *did* reference the stack pointer.

Note that the kernel legitimately uses the name "FP", because it
utilizes the rolled stack window in processing the system call.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/sparc/target_cpu.h | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
index 1ffc0ae9f2..b30fbc72c4 100644
--- a/linux-user/sparc/target_cpu.h
+++ b/linux-user/sparc/target_cpu.h
@@ -41,15 +41,9 @@ static inline void cpu_set_tls(CPUSPARCState *env, target_ulong newtls)
     env->gregs[7] = newtls;
 }
 
-#ifndef UREG_I6
-#define UREG_I6        6
-#endif
-#ifndef UREG_FP
-#define UREG_FP        UREG_I6
-#endif
-
 static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state)
 {
-    return state->regwptr[UREG_FP];
+    return state->regwptr[WREG_SP];
 }
+
 #endif
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 05/12] linux-user/sparc: Begin using WREG constants in sparc/signal.c
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (3 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 04/12] linux-user/sparc: Use WREG constants in sparc/target_cpu.h Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-10-25 12:16   ` Laurent Vivier
  2019-11-05  9:49   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 06/12] linux-user/sparc: Use WREG_SP constant " Richard Henderson
                   ` (8 subsequent siblings)
  13 siblings, 2 replies; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

This is non-obvious because the UREG constants are in fact wrong.

s/UREG_I/WREG_O/g
s/UREG_O/WREG_I/g
s/UREG_L/WREG_L/g

These substitutions have identical integer values.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/sparc/signal.c | 93 ++++++++++++++-------------------------
 1 file changed, 32 insertions(+), 61 deletions(-)

diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
index ead169fbaa..a967e2db73 100644
--- a/linux-user/sparc/signal.c
+++ b/linux-user/sparc/signal.c
@@ -104,19 +104,8 @@ struct target_rt_signal_frame {
     qemu_siginfo_fpu_t  fpu_state;
 };
 
-#define UREG_O0        16
-#define UREG_O6        22
-#define UREG_I0        0
-#define UREG_I1        1
-#define UREG_I2        2
-#define UREG_I3        3
-#define UREG_I4        4
-#define UREG_I5        5
-#define UREG_I6        6
-#define UREG_I7        7
-#define UREG_L0        8
-#define UREG_FP        UREG_I6
-#define UREG_SP        UREG_O6
+#define UREG_FP        WREG_O6
+#define UREG_SP        WREG_I6
 
 static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
                                      CPUSPARCState *env,
@@ -159,30 +148,12 @@ setup___siginfo(__siginfo_t *si, CPUSPARCState *env, abi_ulong mask)
         __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
     }
     for (i=0; i < 8; i++) {
-        __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
+        __put_user(env->regwptr[WREG_O0 + i], &si->si_regs.u_regs[i+8]);
     }
     __put_user(mask, &si->si_mask);
     return err;
 }
 
-#if 0
-static int
-setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
-                 CPUSPARCState *env, unsigned long mask)
-{
-    int err = 0;
-
-    __put_user(mask, &sc->sigc_mask);
-    __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
-    __put_user(env->pc, &sc->sigc_pc);
-    __put_user(env->npc, &sc->sigc_npc);
-    __put_user(env->psr, &sc->sigc_psr);
-    __put_user(env->gregs[1], &sc->sigc_g1);
-    __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
-
-    return err;
-}
-#endif
 #define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
 
 void setup_frame(int sig, struct target_sigaction *ka,
@@ -221,20 +192,20 @@ void setup_frame(int sig, struct target_sigaction *ka,
     }
 
     for (i = 0; i < 8; i++) {
-        __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
+        __put_user(env->regwptr[i + WREG_L0], &sf->ss.locals[i]);
     }
     for (i = 0; i < 8; i++) {
-        __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
+        __put_user(env->regwptr[i + WREG_O0], &sf->ss.ins[i]);
     }
     if (err)
         goto sigsegv;
 
     /* 3. signal handler back-trampoline and parameters */
     env->regwptr[UREG_FP] = sf_addr;
-    env->regwptr[UREG_I0] = sig;
-    env->regwptr[UREG_I1] = sf_addr +
+    env->regwptr[WREG_O0] = sig;
+    env->regwptr[WREG_O1] = sf_addr +
             offsetof(struct target_signal_frame, info);
-    env->regwptr[UREG_I2] = sf_addr +
+    env->regwptr[WREG_O2] = sf_addr +
             offsetof(struct target_signal_frame, info);
 
     /* 4. signal handler */
@@ -242,11 +213,11 @@ void setup_frame(int sig, struct target_sigaction *ka,
     env->npc = (env->pc + 4);
     /* 5. return to kernel instructions */
     if (ka->ka_restorer) {
-        env->regwptr[UREG_I7] = ka->ka_restorer;
+        env->regwptr[WREG_O7] = ka->ka_restorer;
     } else {
         uint32_t val32;
 
-        env->regwptr[UREG_I7] = sf_addr +
+        env->regwptr[WREG_O7] = sf_addr +
                 offsetof(struct target_signal_frame, insns) - 2 * 4;
 
         /* mov __NR_sigreturn, %g1 */
@@ -316,7 +287,7 @@ long do_sigreturn(CPUSPARCState *env)
         __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
     }
     for (i=0; i < 8; i++) {
-        __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
+        __get_user(env->regwptr[i + WREG_O0], &sf->info.si_regs.u_regs[i+8]);
     }
 
     /* FIXME: implement FPU save/restore:
@@ -433,7 +404,7 @@ void sparc64_set_context(CPUSPARCState *env)
     abi_ulong fp, i7, w_addr;
     unsigned int i;
 
-    ucp_addr = env->regwptr[UREG_I0];
+    ucp_addr = env->regwptr[WREG_O0];
     if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1)) {
         goto do_sigsegv;
     }
@@ -443,7 +414,7 @@ void sparc64_set_context(CPUSPARCState *env)
     if ((pc | npc) & 3) {
         goto do_sigsegv;
     }
-    if (env->regwptr[UREG_I1]) {
+    if (env->regwptr[WREG_O1]) {
         target_sigset_t target_set;
         sigset_t set;
 
@@ -474,19 +445,19 @@ void sparc64_set_context(CPUSPARCState *env)
     __get_user(env->gregs[5], (&(*grp)[SPARC_MC_G5]));
     __get_user(env->gregs[6], (&(*grp)[SPARC_MC_G6]));
     __get_user(env->gregs[7], (&(*grp)[SPARC_MC_G7]));
-    __get_user(env->regwptr[UREG_I0], (&(*grp)[SPARC_MC_O0]));
-    __get_user(env->regwptr[UREG_I1], (&(*grp)[SPARC_MC_O1]));
-    __get_user(env->regwptr[UREG_I2], (&(*grp)[SPARC_MC_O2]));
-    __get_user(env->regwptr[UREG_I3], (&(*grp)[SPARC_MC_O3]));
-    __get_user(env->regwptr[UREG_I4], (&(*grp)[SPARC_MC_O4]));
-    __get_user(env->regwptr[UREG_I5], (&(*grp)[SPARC_MC_O5]));
-    __get_user(env->regwptr[UREG_I6], (&(*grp)[SPARC_MC_O6]));
-    __get_user(env->regwptr[UREG_I7], (&(*grp)[SPARC_MC_O7]));
+    __get_user(env->regwptr[WREG_O0], (&(*grp)[SPARC_MC_O0]));
+    __get_user(env->regwptr[WREG_O1], (&(*grp)[SPARC_MC_O1]));
+    __get_user(env->regwptr[WREG_O2], (&(*grp)[SPARC_MC_O2]));
+    __get_user(env->regwptr[WREG_O3], (&(*grp)[SPARC_MC_O3]));
+    __get_user(env->regwptr[WREG_O4], (&(*grp)[SPARC_MC_O4]));
+    __get_user(env->regwptr[WREG_O5], (&(*grp)[SPARC_MC_O5]));
+    __get_user(env->regwptr[WREG_O6], (&(*grp)[SPARC_MC_O6]));
+    __get_user(env->regwptr[WREG_O7], (&(*grp)[SPARC_MC_O7]));
 
     __get_user(fp, &(ucp->tuc_mcontext.mc_fp));
     __get_user(i7, &(ucp->tuc_mcontext.mc_i7));
 
-    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
+    w_addr = TARGET_STACK_BIAS+env->regwptr[WREG_O6];
     if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
                  abi_ulong) != 0) {
         goto do_sigsegv;
@@ -534,7 +505,7 @@ void sparc64_get_context(CPUSPARCState *env)
     target_sigset_t target_set;
     sigset_t set;
 
-    ucp_addr = env->regwptr[UREG_I0];
+    ucp_addr = env->regwptr[WREG_O0];
     if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0)) {
         goto do_sigsegv;
     }
@@ -580,16 +551,16 @@ void sparc64_get_context(CPUSPARCState *env)
     __put_user(env->gregs[5], &((*grp)[SPARC_MC_G5]));
     __put_user(env->gregs[6], &((*grp)[SPARC_MC_G6]));
     __put_user(env->gregs[7], &((*grp)[SPARC_MC_G7]));
-    __put_user(env->regwptr[UREG_I0], &((*grp)[SPARC_MC_O0]));
-    __put_user(env->regwptr[UREG_I1], &((*grp)[SPARC_MC_O1]));
-    __put_user(env->regwptr[UREG_I2], &((*grp)[SPARC_MC_O2]));
-    __put_user(env->regwptr[UREG_I3], &((*grp)[SPARC_MC_O3]));
-    __put_user(env->regwptr[UREG_I4], &((*grp)[SPARC_MC_O4]));
-    __put_user(env->regwptr[UREG_I5], &((*grp)[SPARC_MC_O5]));
-    __put_user(env->regwptr[UREG_I6], &((*grp)[SPARC_MC_O6]));
-    __put_user(env->regwptr[UREG_I7], &((*grp)[SPARC_MC_O7]));
+    __put_user(env->regwptr[WREG_O0], &((*grp)[SPARC_MC_O0]));
+    __put_user(env->regwptr[WREG_O1], &((*grp)[SPARC_MC_O1]));
+    __put_user(env->regwptr[WREG_O2], &((*grp)[SPARC_MC_O2]));
+    __put_user(env->regwptr[WREG_O3], &((*grp)[SPARC_MC_O3]));
+    __put_user(env->regwptr[WREG_O4], &((*grp)[SPARC_MC_O4]));
+    __put_user(env->regwptr[WREG_O5], &((*grp)[SPARC_MC_O5]));
+    __put_user(env->regwptr[WREG_O6], &((*grp)[SPARC_MC_O6]));
+    __put_user(env->regwptr[WREG_O7], &((*grp)[SPARC_MC_O7]));
 
-    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
+    w_addr = TARGET_STACK_BIAS+env->regwptr[WREG_O6];
     fp = i7 = 0;
     if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
                  abi_ulong) != 0) {
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 06/12] linux-user/sparc: Use WREG_SP constant in sparc/signal.c
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (4 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 05/12] linux-user/sparc: Begin using WREG constants in sparc/signal.c Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-10-25 12:19   ` Laurent Vivier
  2019-11-05  9:50   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 07/12] linux-user/sparc: Fix WREG usage in setup_frame Richard Henderson
                   ` (7 subsequent siblings)
  13 siblings, 2 replies; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

s/UREG_FP/WREG_SP/g

This is non-obvious because the UREG_FP constant is fact wrong.
However, the previous search-and-replace patch made it clear that
UREG_FP expands to WREG_O6, and we can see from the enumeration in
target/sparc/cpu.h that WREG_O6 is in fact WREG_SP, the stack pointer.

The UREG_SP define is unused; remove it.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/sparc/signal.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
index a967e2db73..0db4c5f84f 100644
--- a/linux-user/sparc/signal.c
+++ b/linux-user/sparc/signal.c
@@ -104,9 +104,6 @@ struct target_rt_signal_frame {
     qemu_siginfo_fpu_t  fpu_state;
 };
 
-#define UREG_FP        WREG_O6
-#define UREG_SP        WREG_I6
-
 static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
                                      CPUSPARCState *env,
                                      unsigned long framesize)
@@ -201,7 +198,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
         goto sigsegv;
 
     /* 3. signal handler back-trampoline and parameters */
-    env->regwptr[UREG_FP] = sf_addr;
+    env->regwptr[WREG_SP] = sf_addr;
     env->regwptr[WREG_O0] = sig;
     env->regwptr[WREG_O1] = sf_addr +
             offsetof(struct target_signal_frame, info);
@@ -255,7 +252,7 @@ long do_sigreturn(CPUSPARCState *env)
     sigset_t host_set;
     int i;
 
-    sf_addr = env->regwptr[UREG_FP];
+    sf_addr = env->regwptr[WREG_SP];
     trace_user_do_sigreturn(env, sf_addr);
     if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1)) {
         goto segv_and_exit;
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 07/12] linux-user/sparc: Fix WREG usage in setup_frame
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (5 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 06/12] linux-user/sparc: Use WREG_SP constant " Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-11-05  9:50   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 08/12] linux-user/sparc64: Fix target_signal_frame Richard Henderson
                   ` (6 subsequent siblings)
  13 siblings, 1 reply; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

Use WREG_I0 not WREG_O0 in order to properly save the "ins".
The "outs" were saved separately in setup___siginfo.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/sparc/signal.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
index 0db4c5f84f..efb0df7e2b 100644
--- a/linux-user/sparc/signal.c
+++ b/linux-user/sparc/signal.c
@@ -192,7 +192,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
         __put_user(env->regwptr[i + WREG_L0], &sf->ss.locals[i]);
     }
     for (i = 0; i < 8; i++) {
-        __put_user(env->regwptr[i + WREG_O0], &sf->ss.ins[i]);
+        __put_user(env->regwptr[i + WREG_I0], &sf->ss.ins[i]);
     }
     if (err)
         goto sigsegv;
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 08/12] linux-user/sparc64: Fix target_signal_frame
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (6 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 07/12] linux-user/sparc: Fix WREG usage in setup_frame Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-10-25 12:47   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 09/12] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child Richard Henderson
                   ` (5 subsequent siblings)
  13 siblings, 1 reply; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

Instructions are always 4 bytes; use uint32_t not abi_ulong.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/sparc/signal.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
index efb0df7e2b..ecfdf937e4 100644
--- a/linux-user/sparc/signal.c
+++ b/linux-user/sparc/signal.c
@@ -87,7 +87,7 @@ struct target_signal_frame {
     struct sparc_stackf ss;
     __siginfo_t         info;
     abi_ulong           fpu_save;
-    abi_ulong           insns[2] __attribute__ ((aligned (8)));
+    uint32_t            insns[2] __attribute__ ((aligned (8)));
     abi_ulong           extramask[TARGET_NSIG_WORDS - 1];
     abi_ulong           extra_size; /* Should be 0 */
     qemu_siginfo_fpu_t fpu_state;
@@ -98,7 +98,7 @@ struct target_rt_signal_frame {
     abi_ulong           regs[20];
     sigset_t            mask;
     abi_ulong           fpu_save;
-    unsigned int        insns[2];
+    uint32_t            insns[2];
     stack_t             stack;
     unsigned int        extra_size; /* Should be 0 */
     qemu_siginfo_fpu_t  fpu_state;
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 09/12] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (7 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 08/12] linux-user/sparc64: Fix target_signal_frame Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-10-25 13:03   ` Philippe Mathieu-Daudé
  2019-11-05  9:52   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 10/12] linux-user: Introduce cpu_clone_regs_parent Richard Henderson
                   ` (4 subsequent siblings)
  13 siblings, 2 replies; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

We will need a target-specific hook for adjusting registers
in the parent during clone.  To avoid confusion, rename the
one we have to make it clear it affects the child.

At the same time, pass in the flags from the clone syscall.
We will need them for correct behaviour for Sparc.

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
v2: Add flags parameter.
---
 linux-user/aarch64/target_cpu.h    | 3 ++-
 linux-user/alpha/target_cpu.h      | 3 ++-
 linux-user/arm/target_cpu.h        | 3 ++-
 linux-user/cris/target_cpu.h       | 3 ++-
 linux-user/hppa/target_cpu.h       | 3 ++-
 linux-user/i386/target_cpu.h       | 3 ++-
 linux-user/m68k/target_cpu.h       | 3 ++-
 linux-user/microblaze/target_cpu.h | 3 ++-
 linux-user/mips/target_cpu.h       | 3 ++-
 linux-user/nios2/target_cpu.h      | 3 ++-
 linux-user/openrisc/target_cpu.h   | 4 +++-
 linux-user/ppc/target_cpu.h        | 3 ++-
 linux-user/riscv/target_cpu.h      | 3 ++-
 linux-user/s390x/target_cpu.h      | 3 ++-
 linux-user/sh4/target_cpu.h        | 3 ++-
 linux-user/sparc/target_cpu.h      | 3 ++-
 linux-user/tilegx/target_cpu.h     | 3 ++-
 linux-user/xtensa/target_cpu.h     | 4 +++-
 linux-user/syscall.c               | 4 ++--
 19 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/linux-user/aarch64/target_cpu.h b/linux-user/aarch64/target_cpu.h
index a021c95fa4..cd012e0dc1 100644
--- a/linux-user/aarch64/target_cpu.h
+++ b/linux-user/aarch64/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef AARCH64_TARGET_CPU_H
 #define AARCH64_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUARMState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->xregs[31] = newsp;
diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h
index ac4d255ae7..37ba00cf41 100644
--- a/linux-user/alpha/target_cpu.h
+++ b/linux-user/alpha/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef ALPHA_TARGET_CPU_H
 #define ALPHA_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUAlphaState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->ir[IR_SP] = newsp;
diff --git a/linux-user/arm/target_cpu.h b/linux-user/arm/target_cpu.h
index 3f79356a07..6e2ba8ad4b 100644
--- a/linux-user/arm/target_cpu.h
+++ b/linux-user/arm/target_cpu.h
@@ -41,7 +41,8 @@ static inline unsigned long arm_max_reserved_va(CPUState *cs)
 }
 #define MAX_RESERVED_VA  arm_max_reserved_va
 
-static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUARMState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regs[13] = newsp;
diff --git a/linux-user/cris/target_cpu.h b/linux-user/cris/target_cpu.h
index 2309343979..eacc4d8d13 100644
--- a/linux-user/cris/target_cpu.h
+++ b/linux-user/cris/target_cpu.h
@@ -20,7 +20,8 @@
 #ifndef CRIS_TARGET_CPU_H
 #define CRIS_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUCRISState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUCRISState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regs[14] = newsp;
diff --git a/linux-user/hppa/target_cpu.h b/linux-user/hppa/target_cpu.h
index 1c539bdbd6..f250770790 100644
--- a/linux-user/hppa/target_cpu.h
+++ b/linux-user/hppa/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef HPPA_TARGET_CPU_H
 #define HPPA_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUHPPAState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUHPPAState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->gr[30] = newsp;
diff --git a/linux-user/i386/target_cpu.h b/linux-user/i386/target_cpu.h
index ece04d0966..1fadbf57c3 100644
--- a/linux-user/i386/target_cpu.h
+++ b/linux-user/i386/target_cpu.h
@@ -20,7 +20,8 @@
 #ifndef I386_TARGET_CPU_H
 #define I386_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUX86State *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUX86State *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regs[R_ESP] = newsp;
diff --git a/linux-user/m68k/target_cpu.h b/linux-user/m68k/target_cpu.h
index bc7446fbaf..57b647bc07 100644
--- a/linux-user/m68k/target_cpu.h
+++ b/linux-user/m68k/target_cpu.h
@@ -21,7 +21,8 @@
 #ifndef M68K_TARGET_CPU_H
 #define M68K_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUM68KState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUM68KState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->aregs[7] = newsp;
diff --git a/linux-user/microblaze/target_cpu.h b/linux-user/microblaze/target_cpu.h
index 73e139938c..e9bc0fce65 100644
--- a/linux-user/microblaze/target_cpu.h
+++ b/linux-user/microblaze/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef MICROBLAZE_TARGET_CPU_H
 #define MICROBLAZE_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUMBState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUMBState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regs[R_SP] = newsp;
diff --git a/linux-user/mips/target_cpu.h b/linux-user/mips/target_cpu.h
index 02cf5eeff7..8601f712e0 100644
--- a/linux-user/mips/target_cpu.h
+++ b/linux-user/mips/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef MIPS_TARGET_CPU_H
 #define MIPS_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUMIPSState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUMIPSState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->active_tc.gpr[29] = newsp;
diff --git a/linux-user/nios2/target_cpu.h b/linux-user/nios2/target_cpu.h
index 5596c05c9c..fe5de7a9e3 100644
--- a/linux-user/nios2/target_cpu.h
+++ b/linux-user/nios2/target_cpu.h
@@ -20,7 +20,8 @@
 #ifndef NIOS2_TARGET_CPU_H
 #define NIOS2_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUNios2State *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUNios2State *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regs[R_SP] = newsp;
diff --git a/linux-user/openrisc/target_cpu.h b/linux-user/openrisc/target_cpu.h
index 32ff135089..309cf3eeb7 100644
--- a/linux-user/openrisc/target_cpu.h
+++ b/linux-user/openrisc/target_cpu.h
@@ -20,7 +20,9 @@
 #ifndef OPENRISC_TARGET_CPU_H
 #define OPENRISC_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUOpenRISCState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUOpenRISCState *env,
+                                        target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         cpu_set_gpr(env, 1, newsp);
diff --git a/linux-user/ppc/target_cpu.h b/linux-user/ppc/target_cpu.h
index c4641834e7..028b28312c 100644
--- a/linux-user/ppc/target_cpu.h
+++ b/linux-user/ppc/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef PPC_TARGET_CPU_H
 #define PPC_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUPPCState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUPPCState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->gpr[1] = newsp;
diff --git a/linux-user/riscv/target_cpu.h b/linux-user/riscv/target_cpu.h
index 90f9a4171e..26dcafab1c 100644
--- a/linux-user/riscv/target_cpu.h
+++ b/linux-user/riscv/target_cpu.h
@@ -1,7 +1,8 @@
 #ifndef RISCV_TARGET_CPU_H
 #define RISCV_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPURISCVState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPURISCVState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->gpr[xSP] = newsp;
diff --git a/linux-user/s390x/target_cpu.h b/linux-user/s390x/target_cpu.h
index aa181ceaee..0b19e42f75 100644
--- a/linux-user/s390x/target_cpu.h
+++ b/linux-user/s390x/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef S390X_TARGET_CPU_H
 #define S390X_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUS390XState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUS390XState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regs[15] = newsp;
diff --git a/linux-user/sh4/target_cpu.h b/linux-user/sh4/target_cpu.h
index b0be9a2c1b..857af43ee3 100644
--- a/linux-user/sh4/target_cpu.h
+++ b/linux-user/sh4/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef SH4_TARGET_CPU_H
 #define SH4_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUSH4State *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUSH4State *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->gregs[15] = newsp;
diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
index b30fbc72c4..029b0fc547 100644
--- a/linux-user/sparc/target_cpu.h
+++ b/linux-user/sparc/target_cpu.h
@@ -20,7 +20,8 @@
 #ifndef SPARC_TARGET_CPU_H
 #define SPARC_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUSPARCState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regwptr[22] = newsp;
diff --git a/linux-user/tilegx/target_cpu.h b/linux-user/tilegx/target_cpu.h
index d1aa5824f2..0523dc414c 100644
--- a/linux-user/tilegx/target_cpu.h
+++ b/linux-user/tilegx/target_cpu.h
@@ -19,7 +19,8 @@
 #ifndef TILEGX_TARGET_CPU_H
 #define TILEGX_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUTLGState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUTLGState *env, target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regs[TILEGX_R_SP] = newsp;
diff --git a/linux-user/xtensa/target_cpu.h b/linux-user/xtensa/target_cpu.h
index e31efe3ea0..84f67d469e 100644
--- a/linux-user/xtensa/target_cpu.h
+++ b/linux-user/xtensa/target_cpu.h
@@ -4,7 +4,9 @@
 #ifndef XTENSA_TARGET_CPU_H
 #define XTENSA_TARGET_CPU_H
 
-static inline void cpu_clone_regs(CPUXtensaState *env, target_ulong newsp)
+static inline void cpu_clone_regs_child(CPUXtensaState *env,
+                                        target_ulong newsp,
+                                        unsigned flags)
 {
     if (newsp) {
         env->regs[1] = newsp;
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index f1ab81b917..a07d4b4774 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5718,7 +5718,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
         /* we create a new CPU instance. */
         new_env = cpu_copy(env);
         /* Init regs that differ from the parent.  */
-        cpu_clone_regs(new_env, newsp);
+        cpu_clone_regs_child(new_env, newsp, flags);
         new_cpu = env_cpu(new_env);
         new_cpu->opaque = ts;
         ts->bprm = parent_ts->bprm;
@@ -5797,7 +5797,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
         ret = fork();
         if (ret == 0) {
             /* Child Process.  */
-            cpu_clone_regs(env, newsp);
+            cpu_clone_regs_child(env, newsp, flags);
             fork_end(1);
             /* There is a race condition here.  The parent process could
                theoretically read the TID in the child process before the child
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 10/12] linux-user: Introduce cpu_clone_regs_parent
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (8 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 09/12] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-10-25 13:04   ` Philippe Mathieu-Daudé
  2019-11-05  9:52   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 11/12] linux-user/sparc: Fix cpu_clone_regs_* Richard Henderson
                   ` (3 subsequent siblings)
  13 siblings, 2 replies; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

We will need a target-specific hook for adjusting registers
in the parent during clone.  Add an empty inline function for
each target, and invoke it from the proper places.

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/aarch64/target_cpu.h    | 4 ++++
 linux-user/alpha/target_cpu.h      | 4 ++++
 linux-user/arm/target_cpu.h        | 4 ++++
 linux-user/cris/target_cpu.h       | 4 ++++
 linux-user/hppa/target_cpu.h       | 4 ++++
 linux-user/i386/target_cpu.h       | 4 ++++
 linux-user/m68k/target_cpu.h       | 4 ++++
 linux-user/microblaze/target_cpu.h | 4 ++++
 linux-user/mips/target_cpu.h       | 4 ++++
 linux-user/nios2/target_cpu.h      | 4 ++++
 linux-user/openrisc/target_cpu.h   | 4 ++++
 linux-user/ppc/target_cpu.h        | 4 ++++
 linux-user/riscv/target_cpu.h      | 4 ++++
 linux-user/s390x/target_cpu.h      | 4 ++++
 linux-user/sh4/target_cpu.h        | 4 ++++
 linux-user/sparc/target_cpu.h      | 4 ++++
 linux-user/tilegx/target_cpu.h     | 4 ++++
 linux-user/xtensa/target_cpu.h     | 4 ++++
 linux-user/syscall.c               | 2 ++
 19 files changed, 74 insertions(+)

diff --git a/linux-user/aarch64/target_cpu.h b/linux-user/aarch64/target_cpu.h
index cd012e0dc1..6cc02e7dcd 100644
--- a/linux-user/aarch64/target_cpu.h
+++ b/linux-user/aarch64/target_cpu.h
@@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUARMState *env, target_ulong newsp,
     env->xregs[0] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUARMState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
 {
     /* Note that AArch64 Linux keeps the TLS pointer in TPIDR; this is
diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h
index 37ba00cf41..dd25e18f47 100644
--- a/linux-user/alpha/target_cpu.h
+++ b/linux-user/alpha/target_cpu.h
@@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp,
     env->ir[IR_A3] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUAlphaState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls)
 {
     env->unique = newtls;
diff --git a/linux-user/arm/target_cpu.h b/linux-user/arm/target_cpu.h
index 6e2ba8ad4b..2747211b24 100644
--- a/linux-user/arm/target_cpu.h
+++ b/linux-user/arm/target_cpu.h
@@ -50,6 +50,10 @@ static inline void cpu_clone_regs_child(CPUARMState *env, target_ulong newsp,
     env->regs[0] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUARMState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
 {
     if (access_secure_reg(env)) {
diff --git a/linux-user/cris/target_cpu.h b/linux-user/cris/target_cpu.h
index eacc4d8d13..74ead55c81 100644
--- a/linux-user/cris/target_cpu.h
+++ b/linux-user/cris/target_cpu.h
@@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUCRISState *env, target_ulong newsp,
     env->regs[10] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUCRISState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUCRISState *env, target_ulong newtls)
 {
     env->pregs[PR_PID] = (env->pregs[PR_PID] & 0xff) | newtls;
diff --git a/linux-user/hppa/target_cpu.h b/linux-user/hppa/target_cpu.h
index f250770790..71654b3cd4 100644
--- a/linux-user/hppa/target_cpu.h
+++ b/linux-user/hppa/target_cpu.h
@@ -32,6 +32,10 @@ static inline void cpu_clone_regs_child(CPUHPPAState *env, target_ulong newsp,
     env->iaoq_b = env->gr[31] + 4;
 }
 
+static inline void cpu_clone_regs_parent(CPUHPPAState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUHPPAState *env, target_ulong newtls)
 {
     env->cr[27] = newtls;
diff --git a/linux-user/i386/target_cpu.h b/linux-user/i386/target_cpu.h
index 1fadbf57c3..0b44530854 100644
--- a/linux-user/i386/target_cpu.h
+++ b/linux-user/i386/target_cpu.h
@@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUX86State *env, target_ulong newsp,
     env->regs[R_EAX] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUX86State *env, unsigned flags)
+{
+}
+
 #if defined(TARGET_ABI32)
 abi_long do_set_thread_area(CPUX86State *env, abi_ulong ptr);
 
diff --git a/linux-user/m68k/target_cpu.h b/linux-user/m68k/target_cpu.h
index 57b647bc07..c3f288dfe8 100644
--- a/linux-user/m68k/target_cpu.h
+++ b/linux-user/m68k/target_cpu.h
@@ -30,6 +30,10 @@ static inline void cpu_clone_regs_child(CPUM68KState *env, target_ulong newsp,
     env->dregs[0] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUM68KState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUM68KState *env, target_ulong newtls)
 {
     CPUState *cs = env_cpu(env);
diff --git a/linux-user/microblaze/target_cpu.h b/linux-user/microblaze/target_cpu.h
index e9bc0fce65..ce7b22ece7 100644
--- a/linux-user/microblaze/target_cpu.h
+++ b/linux-user/microblaze/target_cpu.h
@@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUMBState *env, target_ulong newsp,
     env->regs[3] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUMBState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUMBState *env, target_ulong newtls)
 {
     env->regs[21] = newtls;
diff --git a/linux-user/mips/target_cpu.h b/linux-user/mips/target_cpu.h
index 8601f712e0..758ae4d933 100644
--- a/linux-user/mips/target_cpu.h
+++ b/linux-user/mips/target_cpu.h
@@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUMIPSState *env, target_ulong newsp,
     env->active_tc.gpr[2] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUMIPSState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUMIPSState *env, target_ulong newtls)
 {
     env->active_tc.CP0_UserLocal = newtls;
diff --git a/linux-user/nios2/target_cpu.h b/linux-user/nios2/target_cpu.h
index fe5de7a9e3..50f0381067 100644
--- a/linux-user/nios2/target_cpu.h
+++ b/linux-user/nios2/target_cpu.h
@@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUNios2State *env, target_ulong newsp,
     env->regs[R_RET0] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUNios2State *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUNios2State *env, target_ulong newtls)
 {
     /*
diff --git a/linux-user/openrisc/target_cpu.h b/linux-user/openrisc/target_cpu.h
index 309cf3eeb7..74370d67c4 100644
--- a/linux-user/openrisc/target_cpu.h
+++ b/linux-user/openrisc/target_cpu.h
@@ -30,6 +30,10 @@ static inline void cpu_clone_regs_child(CPUOpenRISCState *env,
     cpu_set_gpr(env, 11, 0);
 }
 
+static inline void cpu_clone_regs_parent(CPUOpenRISCState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUOpenRISCState *env, target_ulong newtls)
 {
     cpu_set_gpr(env, 10, newtls);
diff --git a/linux-user/ppc/target_cpu.h b/linux-user/ppc/target_cpu.h
index 028b28312c..76b67d2882 100644
--- a/linux-user/ppc/target_cpu.h
+++ b/linux-user/ppc/target_cpu.h
@@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUPPCState *env, target_ulong newsp,
     env->gpr[3] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUPPCState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUPPCState *env, target_ulong newtls)
 {
 #if defined(TARGET_PPC64)
diff --git a/linux-user/riscv/target_cpu.h b/linux-user/riscv/target_cpu.h
index 26dcafab1c..9c642367a3 100644
--- a/linux-user/riscv/target_cpu.h
+++ b/linux-user/riscv/target_cpu.h
@@ -11,6 +11,10 @@ static inline void cpu_clone_regs_child(CPURISCVState *env, target_ulong newsp,
     env->gpr[xA0] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPURISCVState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPURISCVState *env, target_ulong newtls)
 {
     env->gpr[xTP] = newtls;
diff --git a/linux-user/s390x/target_cpu.h b/linux-user/s390x/target_cpu.h
index 0b19e42f75..7cd71e2dba 100644
--- a/linux-user/s390x/target_cpu.h
+++ b/linux-user/s390x/target_cpu.h
@@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUS390XState *env, target_ulong newsp,
     env->regs[2] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUS390XState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUS390XState *env, target_ulong newtls)
 {
     env->aregs[0] = newtls >> 32;
diff --git a/linux-user/sh4/target_cpu.h b/linux-user/sh4/target_cpu.h
index 857af43ee3..5114f19424 100644
--- a/linux-user/sh4/target_cpu.h
+++ b/linux-user/sh4/target_cpu.h
@@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUSH4State *env, target_ulong newsp,
     env->gregs[0] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUSH4State *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUSH4State *env, target_ulong newtls)
 {
   env->gbr = newtls;
diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
index 029b0fc547..8ff706adce 100644
--- a/linux-user/sparc/target_cpu.h
+++ b/linux-user/sparc/target_cpu.h
@@ -37,6 +37,10 @@ static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
 #endif
 }
 
+static inline void cpu_clone_regs_parent(CPUSPARCState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUSPARCState *env, target_ulong newtls)
 {
     env->gregs[7] = newtls;
diff --git a/linux-user/tilegx/target_cpu.h b/linux-user/tilegx/target_cpu.h
index 0523dc414c..316b7a639c 100644
--- a/linux-user/tilegx/target_cpu.h
+++ b/linux-user/tilegx/target_cpu.h
@@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUTLGState *env, target_ulong newsp,
     env->regs[TILEGX_R_RE] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUTLGState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUTLGState *env, target_ulong newtls)
 {
     env->regs[TILEGX_R_TP] = newtls;
diff --git a/linux-user/xtensa/target_cpu.h b/linux-user/xtensa/target_cpu.h
index 84f67d469e..0c77bafd66 100644
--- a/linux-user/xtensa/target_cpu.h
+++ b/linux-user/xtensa/target_cpu.h
@@ -16,6 +16,10 @@ static inline void cpu_clone_regs_child(CPUXtensaState *env,
     env->regs[2] = 0;
 }
 
+static inline void cpu_clone_regs_parent(CPUXtensaState *env, unsigned flags)
+{
+}
+
 static inline void cpu_set_tls(CPUXtensaState *env, target_ulong newtls)
 {
     env->uregs[THREADPTR] = newtls;
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index a07d4b4774..ed18bcc825 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5719,6 +5719,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
         new_env = cpu_copy(env);
         /* Init regs that differ from the parent.  */
         cpu_clone_regs_child(new_env, newsp, flags);
+        cpu_clone_regs_parent(env, flags);
         new_cpu = env_cpu(new_env);
         new_cpu->opaque = ts;
         ts->bprm = parent_ts->bprm;
@@ -5815,6 +5816,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
             if (flags & CLONE_CHILD_CLEARTID)
                 ts->child_tidptr = child_tidptr;
         } else {
+            cpu_clone_regs_parent(env, flags);
             fork_end(0);
         }
     }
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 11/12] linux-user/sparc: Fix cpu_clone_regs_*
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (9 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 10/12] linux-user: Introduce cpu_clone_regs_parent Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-11-05  9:54   ` Laurent Vivier
  2019-10-25 11:39 ` [PATCH v2 12/12] linux-user/alpha: Set r20 secondary return value Richard Henderson
                   ` (2 subsequent siblings)
  13 siblings, 1 reply; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

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>
---
v2: Take CLONE_VM into account when performing syscall return.
---
 linux-user/sparc/target_cpu.h | 47 ++++++++++++++++++++++++++++-------
 1 file changed, 38 insertions(+), 9 deletions(-)

diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
index 8ff706adce..14b2158969 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)
 {
-    if (newsp) {
-        env->regwptr[22] = newsp;
-    }
-    /* syscall return for clone child: 0, and clear CF since
-     * this counts as a success return value.
+    /*
+     * After cpu_copy, env->regwptr is pointing into the old env.
+     * Update the new cpu to use its own register window.
      */
-    env->regwptr[0] = 0;
-#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
-    env->xcc &= ~PSR_CARRY;
+    env->regwptr = env->regbase + (env->cwp * 16);
+
+    if (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->psr &= ~PSR_CARRY;
+        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;
+    }
+
+    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;
+#else
+        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.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH v2 12/12] linux-user/alpha: Set r20 secondary return value
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (10 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 11/12] linux-user/sparc: Fix cpu_clone_regs_* Richard Henderson
@ 2019-10-25 11:39 ` Richard Henderson
  2019-10-25 12:56   ` Laurent Vivier
  2019-11-05  9:53   ` Laurent Vivier
  2019-10-25 12:50 ` [PATCH v2 00/12] linux-user sparc fixes Laurent Vivier
  2019-10-26  7:02 ` no-reply
  13 siblings, 2 replies; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 11:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.bennee, laurent

This value is not, as far as I know, used by any linux software,
but it is set by the kernel and is part of the ABI.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
v2: Do not set the parent secondary return if SETTLS.
---
 linux-user/alpha/target_cpu.h | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h
index dd25e18f47..ad408ab5cc 100644
--- a/linux-user/alpha/target_cpu.h
+++ b/linux-user/alpha/target_cpu.h
@@ -27,10 +27,19 @@ static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp,
     }
     env->ir[IR_V0] = 0;
     env->ir[IR_A3] = 0;
+    env->ir[IR_A4] = 1;  /* OSF/1 secondary return: child */
 }
 
 static inline void cpu_clone_regs_parent(CPUAlphaState *env, unsigned flags)
 {
+    /*
+     * OSF/1 secondary return: parent
+     * Note that the kernel does not do this if SETTLS, because the
+     * settls argument register is still live after copy_thread.
+     */
+    if (!(flags & CLONE_SETTLS)) {
+        env->ir[IR_A4] = 0;
+    }
 }
 
 static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls)
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 04/12] linux-user/sparc: Use WREG constants in sparc/target_cpu.h
  2019-10-25 11:39 ` [PATCH v2 04/12] linux-user/sparc: Use WREG constants in sparc/target_cpu.h Richard Henderson
@ 2019-10-25 12:09   ` Laurent Vivier
  2019-11-05  9:49   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-10-25 12:09 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> This fixes a naming bug wherein we used "UREG_FP" to access the
> stack pointer.  OTOH, the "UREG_FP" constant was also defined
> incorrectly such that it *did* reference the stack pointer.
> 
> Note that the kernel legitimately uses the name "FP", because it
> utilizes the rolled stack window in processing the system call.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/sparc/target_cpu.h | 10 ++--------
>  1 file changed, 2 insertions(+), 8 deletions(-)
> 
> diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
> index 1ffc0ae9f2..b30fbc72c4 100644
> --- a/linux-user/sparc/target_cpu.h
> +++ b/linux-user/sparc/target_cpu.h
> @@ -41,15 +41,9 @@ static inline void cpu_set_tls(CPUSPARCState *env, target_ulong newtls)
>      env->gregs[7] = newtls;
>  }
>  
> -#ifndef UREG_I6
> -#define UREG_I6        6
> -#endif
> -#ifndef UREG_FP
> -#define UREG_FP        UREG_I6
> -#endif
> -
>  static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state)
>  {
> -    return state->regwptr[UREG_FP];
> +    return state->regwptr[WREG_SP];
>  }
> +
>  #endif
> 

Reviewed-by: Laurent Vivier <laurent@vivier.eu>


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 05/12] linux-user/sparc: Begin using WREG constants in sparc/signal.c
  2019-10-25 11:39 ` [PATCH v2 05/12] linux-user/sparc: Begin using WREG constants in sparc/signal.c Richard Henderson
@ 2019-10-25 12:16   ` Laurent Vivier
  2019-11-05  9:49   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-10-25 12:16 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> This is non-obvious because the UREG constants are in fact wrong.
> 
> s/UREG_I/WREG_O/g
> s/UREG_O/WREG_I/g
> s/UREG_L/WREG_L/g
> 
> These substitutions have identical integer values.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/sparc/signal.c | 93 ++++++++++++++-------------------------
>  1 file changed, 32 insertions(+), 61 deletions(-)
> 
> diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
> index ead169fbaa..a967e2db73 100644
> --- a/linux-user/sparc/signal.c
> +++ b/linux-user/sparc/signal.c
> @@ -104,19 +104,8 @@ struct target_rt_signal_frame {
>      qemu_siginfo_fpu_t  fpu_state;
>  };
>  
> -#define UREG_O0        16
> -#define UREG_O6        22
> -#define UREG_I0        0
> -#define UREG_I1        1
> -#define UREG_I2        2
> -#define UREG_I3        3
> -#define UREG_I4        4
> -#define UREG_I5        5
> -#define UREG_I6        6
> -#define UREG_I7        7
> -#define UREG_L0        8
> -#define UREG_FP        UREG_I6
> -#define UREG_SP        UREG_O6
> +#define UREG_FP        WREG_O6
> +#define UREG_SP        WREG_I6
>  
>  static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
>                                       CPUSPARCState *env,
> @@ -159,30 +148,12 @@ setup___siginfo(__siginfo_t *si, CPUSPARCState *env, abi_ulong mask)
>          __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
>      }
>      for (i=0; i < 8; i++) {
> -        __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
> +        __put_user(env->regwptr[WREG_O0 + i], &si->si_regs.u_regs[i+8]);
>      }
>      __put_user(mask, &si->si_mask);
>      return err;
>  }
>  
> -#if 0
> -static int
> -setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
> -                 CPUSPARCState *env, unsigned long mask)
> -{
> -    int err = 0;
> -
> -    __put_user(mask, &sc->sigc_mask);
> -    __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
> -    __put_user(env->pc, &sc->sigc_pc);
> -    __put_user(env->npc, &sc->sigc_npc);
> -    __put_user(env->psr, &sc->sigc_psr);
> -    __put_user(env->gregs[1], &sc->sigc_g1);
> -    __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
> -
> -    return err;
> -}
> -#endif
>  #define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
>  
>  void setup_frame(int sig, struct target_sigaction *ka,
> @@ -221,20 +192,20 @@ void setup_frame(int sig, struct target_sigaction *ka,
>      }
>  
>      for (i = 0; i < 8; i++) {
> -        __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
> +        __put_user(env->regwptr[i + WREG_L0], &sf->ss.locals[i]);
>      }
>      for (i = 0; i < 8; i++) {
> -        __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
> +        __put_user(env->regwptr[i + WREG_O0], &sf->ss.ins[i]);
>      }
>      if (err)
>          goto sigsegv;
>  
>      /* 3. signal handler back-trampoline and parameters */
>      env->regwptr[UREG_FP] = sf_addr;
> -    env->regwptr[UREG_I0] = sig;
> -    env->regwptr[UREG_I1] = sf_addr +
> +    env->regwptr[WREG_O0] = sig;
> +    env->regwptr[WREG_O1] = sf_addr +
>              offsetof(struct target_signal_frame, info);
> -    env->regwptr[UREG_I2] = sf_addr +
> +    env->regwptr[WREG_O2] = sf_addr +
>              offsetof(struct target_signal_frame, info);
>  
>      /* 4. signal handler */
> @@ -242,11 +213,11 @@ void setup_frame(int sig, struct target_sigaction *ka,
>      env->npc = (env->pc + 4);
>      /* 5. return to kernel instructions */
>      if (ka->ka_restorer) {
> -        env->regwptr[UREG_I7] = ka->ka_restorer;
> +        env->regwptr[WREG_O7] = ka->ka_restorer;
>      } else {
>          uint32_t val32;
>  
> -        env->regwptr[UREG_I7] = sf_addr +
> +        env->regwptr[WREG_O7] = sf_addr +
>                  offsetof(struct target_signal_frame, insns) - 2 * 4;
>  
>          /* mov __NR_sigreturn, %g1 */
> @@ -316,7 +287,7 @@ long do_sigreturn(CPUSPARCState *env)
>          __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
>      }
>      for (i=0; i < 8; i++) {
> -        __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
> +        __get_user(env->regwptr[i + WREG_O0], &sf->info.si_regs.u_regs[i+8]);
>      }
>  
>      /* FIXME: implement FPU save/restore:
> @@ -433,7 +404,7 @@ void sparc64_set_context(CPUSPARCState *env)
>      abi_ulong fp, i7, w_addr;
>      unsigned int i;
>  
> -    ucp_addr = env->regwptr[UREG_I0];
> +    ucp_addr = env->regwptr[WREG_O0];
>      if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1)) {
>          goto do_sigsegv;
>      }
> @@ -443,7 +414,7 @@ void sparc64_set_context(CPUSPARCState *env)
>      if ((pc | npc) & 3) {
>          goto do_sigsegv;
>      }
> -    if (env->regwptr[UREG_I1]) {
> +    if (env->regwptr[WREG_O1]) {
>          target_sigset_t target_set;
>          sigset_t set;
>  
> @@ -474,19 +445,19 @@ void sparc64_set_context(CPUSPARCState *env)
>      __get_user(env->gregs[5], (&(*grp)[SPARC_MC_G5]));
>      __get_user(env->gregs[6], (&(*grp)[SPARC_MC_G6]));
>      __get_user(env->gregs[7], (&(*grp)[SPARC_MC_G7]));
> -    __get_user(env->regwptr[UREG_I0], (&(*grp)[SPARC_MC_O0]));
> -    __get_user(env->regwptr[UREG_I1], (&(*grp)[SPARC_MC_O1]));
> -    __get_user(env->regwptr[UREG_I2], (&(*grp)[SPARC_MC_O2]));
> -    __get_user(env->regwptr[UREG_I3], (&(*grp)[SPARC_MC_O3]));
> -    __get_user(env->regwptr[UREG_I4], (&(*grp)[SPARC_MC_O4]));
> -    __get_user(env->regwptr[UREG_I5], (&(*grp)[SPARC_MC_O5]));
> -    __get_user(env->regwptr[UREG_I6], (&(*grp)[SPARC_MC_O6]));
> -    __get_user(env->regwptr[UREG_I7], (&(*grp)[SPARC_MC_O7]));
> +    __get_user(env->regwptr[WREG_O0], (&(*grp)[SPARC_MC_O0]));
> +    __get_user(env->regwptr[WREG_O1], (&(*grp)[SPARC_MC_O1]));
> +    __get_user(env->regwptr[WREG_O2], (&(*grp)[SPARC_MC_O2]));
> +    __get_user(env->regwptr[WREG_O3], (&(*grp)[SPARC_MC_O3]));
> +    __get_user(env->regwptr[WREG_O4], (&(*grp)[SPARC_MC_O4]));
> +    __get_user(env->regwptr[WREG_O5], (&(*grp)[SPARC_MC_O5]));
> +    __get_user(env->regwptr[WREG_O6], (&(*grp)[SPARC_MC_O6]));
> +    __get_user(env->regwptr[WREG_O7], (&(*grp)[SPARC_MC_O7]));
>  
>      __get_user(fp, &(ucp->tuc_mcontext.mc_fp));
>      __get_user(i7, &(ucp->tuc_mcontext.mc_i7));
>  
> -    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
> +    w_addr = TARGET_STACK_BIAS+env->regwptr[WREG_O6];
>      if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
>                   abi_ulong) != 0) {
>          goto do_sigsegv;
> @@ -534,7 +505,7 @@ void sparc64_get_context(CPUSPARCState *env)
>      target_sigset_t target_set;
>      sigset_t set;
>  
> -    ucp_addr = env->regwptr[UREG_I0];
> +    ucp_addr = env->regwptr[WREG_O0];
>      if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0)) {
>          goto do_sigsegv;
>      }
> @@ -580,16 +551,16 @@ void sparc64_get_context(CPUSPARCState *env)
>      __put_user(env->gregs[5], &((*grp)[SPARC_MC_G5]));
>      __put_user(env->gregs[6], &((*grp)[SPARC_MC_G6]));
>      __put_user(env->gregs[7], &((*grp)[SPARC_MC_G7]));
> -    __put_user(env->regwptr[UREG_I0], &((*grp)[SPARC_MC_O0]));
> -    __put_user(env->regwptr[UREG_I1], &((*grp)[SPARC_MC_O1]));
> -    __put_user(env->regwptr[UREG_I2], &((*grp)[SPARC_MC_O2]));
> -    __put_user(env->regwptr[UREG_I3], &((*grp)[SPARC_MC_O3]));
> -    __put_user(env->regwptr[UREG_I4], &((*grp)[SPARC_MC_O4]));
> -    __put_user(env->regwptr[UREG_I5], &((*grp)[SPARC_MC_O5]));
> -    __put_user(env->regwptr[UREG_I6], &((*grp)[SPARC_MC_O6]));
> -    __put_user(env->regwptr[UREG_I7], &((*grp)[SPARC_MC_O7]));
> +    __put_user(env->regwptr[WREG_O0], &((*grp)[SPARC_MC_O0]));
> +    __put_user(env->regwptr[WREG_O1], &((*grp)[SPARC_MC_O1]));
> +    __put_user(env->regwptr[WREG_O2], &((*grp)[SPARC_MC_O2]));
> +    __put_user(env->regwptr[WREG_O3], &((*grp)[SPARC_MC_O3]));
> +    __put_user(env->regwptr[WREG_O4], &((*grp)[SPARC_MC_O4]));
> +    __put_user(env->regwptr[WREG_O5], &((*grp)[SPARC_MC_O5]));
> +    __put_user(env->regwptr[WREG_O6], &((*grp)[SPARC_MC_O6]));
> +    __put_user(env->regwptr[WREG_O7], &((*grp)[SPARC_MC_O7]));
>  
> -    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
> +    w_addr = TARGET_STACK_BIAS+env->regwptr[WREG_O6];
>      fp = i7 = 0;
>      if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
>                   abi_ulong) != 0) {
> 

Reviewed-by: Laurent Vivier <laurent@vivier.eu>



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 06/12] linux-user/sparc: Use WREG_SP constant in sparc/signal.c
  2019-10-25 11:39 ` [PATCH v2 06/12] linux-user/sparc: Use WREG_SP constant " Richard Henderson
@ 2019-10-25 12:19   ` Laurent Vivier
  2019-11-05  9:50   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-10-25 12:19 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> s/UREG_FP/WREG_SP/g
> 
> This is non-obvious because the UREG_FP constant is fact wrong.
> However, the previous search-and-replace patch made it clear that
> UREG_FP expands to WREG_O6, and we can see from the enumeration in
> target/sparc/cpu.h that WREG_O6 is in fact WREG_SP, the stack pointer.
> 
> The UREG_SP define is unused; remove it.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/sparc/signal.c | 7 ++-----
>  1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
> index a967e2db73..0db4c5f84f 100644
> --- a/linux-user/sparc/signal.c
> +++ b/linux-user/sparc/signal.c
> @@ -104,9 +104,6 @@ struct target_rt_signal_frame {
>      qemu_siginfo_fpu_t  fpu_state;
>  };
>  
> -#define UREG_FP        WREG_O6
> -#define UREG_SP        WREG_I6
> -
>  static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
>                                       CPUSPARCState *env,
>                                       unsigned long framesize)
> @@ -201,7 +198,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
>          goto sigsegv;
>  
>      /* 3. signal handler back-trampoline and parameters */
> -    env->regwptr[UREG_FP] = sf_addr;
> +    env->regwptr[WREG_SP] = sf_addr;
>      env->regwptr[WREG_O0] = sig;
>      env->regwptr[WREG_O1] = sf_addr +
>              offsetof(struct target_signal_frame, info);
> @@ -255,7 +252,7 @@ long do_sigreturn(CPUSPARCState *env)
>      sigset_t host_set;
>      int i;
>  
> -    sf_addr = env->regwptr[UREG_FP];
> +    sf_addr = env->regwptr[WREG_SP];
>      trace_user_do_sigreturn(env, sf_addr);
>      if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1)) {
>          goto segv_and_exit;
> 

Reviewed-by: Laurent Vivier <laurent@vivier.eu>



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 08/12] linux-user/sparc64: Fix target_signal_frame
  2019-10-25 11:39 ` [PATCH v2 08/12] linux-user/sparc64: Fix target_signal_frame Richard Henderson
@ 2019-10-25 12:47   ` Laurent Vivier
  2019-10-25 13:38     ` Richard Henderson
  0 siblings, 1 reply; 37+ messages in thread
From: Laurent Vivier @ 2019-10-25 12:47 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> Instructions are always 4 bytes; use uint32_t not abi_ulong.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/sparc/signal.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
> index efb0df7e2b..ecfdf937e4 100644
> --- a/linux-user/sparc/signal.c
> +++ b/linux-user/sparc/signal.c
> @@ -87,7 +87,7 @@ struct target_signal_frame {
>      struct sparc_stackf ss;
>      __siginfo_t         info;
>      abi_ulong           fpu_save;
> -    abi_ulong           insns[2] __attribute__ ((aligned (8)));
> +    uint32_t            insns[2] __attribute__ ((aligned (8)));
>      abi_ulong           extramask[TARGET_NSIG_WORDS - 1];
>      abi_ulong           extra_size; /* Should be 0 */
>      qemu_siginfo_fpu_t fpu_state;
> @@ -98,7 +98,7 @@ struct target_rt_signal_frame {
>      abi_ulong           regs[20];
>      sigset_t            mask;
>      abi_ulong           fpu_save;
> -    unsigned int        insns[2];
> +    uint32_t            insns[2];
>      stack_t             stack;
>      unsigned int        extra_size; /* Should be 0 */
>      qemu_siginfo_fpu_t  fpu_state;
> 

This definition is used by sparc and sparc64 (sparc64/signal.c includes
sparc/signal.c), so the definition was valid before your changes for
sparc and not good for sparc64. Moreover rt_signal_frame for sparc64
doesn't look like this one (and signal_frame doesn't exist).

Perhaps you should consider to introduce a specific file for sparc64?
Thanks,

Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 00/12] linux-user sparc fixes
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (11 preceding siblings ...)
  2019-10-25 11:39 ` [PATCH v2 12/12] linux-user/alpha: Set r20 secondary return value Richard Henderson
@ 2019-10-25 12:50 ` Laurent Vivier
  2019-10-26  7:02 ` no-reply
  13 siblings, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-10-25 12:50 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> This is a v2 update of 
>   https://lists.gnu.org/archive/html/qemu-devel/2019-05/msg04240.html
> 
> Some of the v1 patches have been merged, others reworked a bit.
> 
> This fixes most of tests/tcg/multiuser/linux-user for sparc64,

There are also some aarch64 and alpha fixes...

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 12/12] linux-user/alpha: Set r20 secondary return value
  2019-10-25 11:39 ` [PATCH v2 12/12] linux-user/alpha: Set r20 secondary return value Richard Henderson
@ 2019-10-25 12:56   ` Laurent Vivier
  2019-11-05  9:53   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-10-25 12:56 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> This value is not, as far as I know, used by any linux software,
> but it is set by the kernel and is part of the ABI.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> v2: Do not set the parent secondary return if SETTLS.
> ---
>  linux-user/alpha/target_cpu.h | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h
> index dd25e18f47..ad408ab5cc 100644
> --- a/linux-user/alpha/target_cpu.h
> +++ b/linux-user/alpha/target_cpu.h
> @@ -27,10 +27,19 @@ static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp,
>      }
>      env->ir[IR_V0] = 0;
>      env->ir[IR_A3] = 0;
> +    env->ir[IR_A4] = 1;  /* OSF/1 secondary return: child */
>  }
>  
>  static inline void cpu_clone_regs_parent(CPUAlphaState *env, unsigned flags)
>  {
> +    /*
> +     * OSF/1 secondary return: parent
> +     * Note that the kernel does not do this if SETTLS, because the
> +     * settls argument register is still live after copy_thread.
> +     */
> +    if (!(flags & CLONE_SETTLS)) {
> +        env->ir[IR_A4] = 0;
> +    }
>  }
>  
>  static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls)
> 

Reviewed-by: Laurent Vivier <laurent@vivier.eu>



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat
  2019-10-25 11:39 ` [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat Richard Henderson
@ 2019-10-25 12:59   ` Philippe Mathieu-Daudé
  2019-10-25 13:00   ` Philippe Mathieu-Daudé
  2019-11-05  9:45   ` Laurent Vivier
  2 siblings, 0 replies; 37+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-25 12:59 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent

On 10/25/19 1:39 PM, Richard Henderson wrote:
> The error indicator for this syscall is -1, not 0.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   tests/tcg/multiarch/linux-test.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/tcg/multiarch/linux-test.c b/tests/tcg/multiarch/linux-test.c
> index fa4243fc04..673d7c8a1c 100644
> --- a/tests/tcg/multiarch/linux-test.c
> +++ b/tests/tcg/multiarch/linux-test.c
> @@ -503,8 +503,9 @@ static void test_shm(void)
>   
>       shmid = chk_error(shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0777));
>       ptr = shmat(shmid, NULL, 0);
> -    if (!ptr)
> +    if (ptr == (void *)-1) {

Oops.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

>           error("shmat");
> +    }
>   
>       memset(ptr, 0, SHM_SIZE);
>   
> 



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat
  2019-10-25 11:39 ` [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat Richard Henderson
  2019-10-25 12:59   ` Philippe Mathieu-Daudé
@ 2019-10-25 13:00   ` Philippe Mathieu-Daudé
  2019-11-05  9:45   ` Laurent Vivier
  2 siblings, 0 replies; 37+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-25 13:00 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent

On 10/25/19 1:39 PM, Richard Henderson wrote:
> The error indicator for this syscall is -1, not 0.
> 

Fixes: e374bfa35bf

A more than 15 years old bug :>

> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   tests/tcg/multiarch/linux-test.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/tcg/multiarch/linux-test.c b/tests/tcg/multiarch/linux-test.c
> index fa4243fc04..673d7c8a1c 100644
> --- a/tests/tcg/multiarch/linux-test.c
> +++ b/tests/tcg/multiarch/linux-test.c
> @@ -503,8 +503,9 @@ static void test_shm(void)
>   
>       shmid = chk_error(shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0777));
>       ptr = shmat(shmid, NULL, 0);
> -    if (!ptr)
> +    if (ptr == (void *)-1) {
>           error("shmat");
> +    }
>   
>       memset(ptr, 0, SHM_SIZE);
>   
> 



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 09/12] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child
  2019-10-25 11:39 ` [PATCH v2 09/12] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child Richard Henderson
@ 2019-10-25 13:03   ` Philippe Mathieu-Daudé
  2019-11-05  9:52   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-25 13:03 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent

On 10/25/19 1:39 PM, Richard Henderson wrote:
> We will need a target-specific hook for adjusting registers
> in the parent during clone.  To avoid confusion, rename the
> one we have to make it clear it affects the child.
> 
> At the same time, pass in the flags from the clone syscall.
> We will need them for correct behaviour for Sparc.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> v2: Add flags parameter.
> ---
>   linux-user/aarch64/target_cpu.h    | 3 ++-
>   linux-user/alpha/target_cpu.h      | 3 ++-
>   linux-user/arm/target_cpu.h        | 3 ++-
>   linux-user/cris/target_cpu.h       | 3 ++-
>   linux-user/hppa/target_cpu.h       | 3 ++-
>   linux-user/i386/target_cpu.h       | 3 ++-
>   linux-user/m68k/target_cpu.h       | 3 ++-
>   linux-user/microblaze/target_cpu.h | 3 ++-
>   linux-user/mips/target_cpu.h       | 3 ++-
>   linux-user/nios2/target_cpu.h      | 3 ++-
>   linux-user/openrisc/target_cpu.h   | 4 +++-
>   linux-user/ppc/target_cpu.h        | 3 ++-
>   linux-user/riscv/target_cpu.h      | 3 ++-
>   linux-user/s390x/target_cpu.h      | 3 ++-
>   linux-user/sh4/target_cpu.h        | 3 ++-
>   linux-user/sparc/target_cpu.h      | 3 ++-
>   linux-user/tilegx/target_cpu.h     | 3 ++-
>   linux-user/xtensa/target_cpu.h     | 4 +++-
>   linux-user/syscall.c               | 4 ++--
>   19 files changed, 40 insertions(+), 20 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 10/12] linux-user: Introduce cpu_clone_regs_parent
  2019-10-25 11:39 ` [PATCH v2 10/12] linux-user: Introduce cpu_clone_regs_parent Richard Henderson
@ 2019-10-25 13:04   ` Philippe Mathieu-Daudé
  2019-11-05  9:52   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-25 13:04 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent

On 10/25/19 1:39 PM, Richard Henderson wrote:
> We will need a target-specific hook for adjusting registers
> in the parent during clone.  Add an empty inline function for
> each target, and invoke it from the proper places.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   linux-user/aarch64/target_cpu.h    | 4 ++++
>   linux-user/alpha/target_cpu.h      | 4 ++++
>   linux-user/arm/target_cpu.h        | 4 ++++
>   linux-user/cris/target_cpu.h       | 4 ++++
>   linux-user/hppa/target_cpu.h       | 4 ++++
>   linux-user/i386/target_cpu.h       | 4 ++++
>   linux-user/m68k/target_cpu.h       | 4 ++++
>   linux-user/microblaze/target_cpu.h | 4 ++++
>   linux-user/mips/target_cpu.h       | 4 ++++
>   linux-user/nios2/target_cpu.h      | 4 ++++
>   linux-user/openrisc/target_cpu.h   | 4 ++++
>   linux-user/ppc/target_cpu.h        | 4 ++++
>   linux-user/riscv/target_cpu.h      | 4 ++++
>   linux-user/s390x/target_cpu.h      | 4 ++++
>   linux-user/sh4/target_cpu.h        | 4 ++++
>   linux-user/sparc/target_cpu.h      | 4 ++++
>   linux-user/tilegx/target_cpu.h     | 4 ++++
>   linux-user/xtensa/target_cpu.h     | 4 ++++
>   linux-user/syscall.c               | 2 ++
>   19 files changed, 74 insertions(+)

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 08/12] linux-user/sparc64: Fix target_signal_frame
  2019-10-25 12:47   ` Laurent Vivier
@ 2019-10-25 13:38     ` Richard Henderson
  2019-10-25 13:43       ` Laurent Vivier
  0 siblings, 1 reply; 37+ messages in thread
From: Richard Henderson @ 2019-10-25 13:38 UTC (permalink / raw)
  To: Laurent Vivier, qemu-devel; +Cc: alex.bennee

On 10/25/19 8:47 AM, Laurent Vivier wrote:
> Le 25/10/2019 à 13:39, Richard Henderson a écrit :
>> Instructions are always 4 bytes; use uint32_t not abi_ulong.
>>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>>  linux-user/sparc/signal.c | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
>> index efb0df7e2b..ecfdf937e4 100644
>> --- a/linux-user/sparc/signal.c
>> +++ b/linux-user/sparc/signal.c
>> @@ -87,7 +87,7 @@ struct target_signal_frame {
>>      struct sparc_stackf ss;
>>      __siginfo_t         info;
>>      abi_ulong           fpu_save;
>> -    abi_ulong           insns[2] __attribute__ ((aligned (8)));
>> +    uint32_t            insns[2] __attribute__ ((aligned (8)));
>>      abi_ulong           extramask[TARGET_NSIG_WORDS - 1];
>>      abi_ulong           extra_size; /* Should be 0 */
>>      qemu_siginfo_fpu_t fpu_state;
>> @@ -98,7 +98,7 @@ struct target_rt_signal_frame {
>>      abi_ulong           regs[20];
>>      sigset_t            mask;
>>      abi_ulong           fpu_save;
>> -    unsigned int        insns[2];
>> +    uint32_t            insns[2];
>>      stack_t             stack;
>>      unsigned int        extra_size; /* Should be 0 */
>>      qemu_siginfo_fpu_t  fpu_state;
>>
> 
> This definition is used by sparc and sparc64 (sparc64/signal.c includes
> sparc/signal.c), so the definition was valid before your changes for
> sparc and not good for sparc64. Moreover rt_signal_frame for sparc64
> doesn't look like this one (and signal_frame doesn't exist).

You're right that target_rt_signal_frame isn't correct for sparc64.  But we
also don't implement setup_rt_frame yet, so it's also currently unused.

What's here is just good enough to make setup_frame work, and that is correct
for both sparc and sparc64.


r~


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 08/12] linux-user/sparc64: Fix target_signal_frame
  2019-10-25 13:38     ` Richard Henderson
@ 2019-10-25 13:43       ` Laurent Vivier
  0 siblings, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-10-25 13:43 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 15:38, Richard Henderson a écrit :
> On 10/25/19 8:47 AM, Laurent Vivier wrote:
>> Le 25/10/2019 à 13:39, Richard Henderson a écrit :
>>> Instructions are always 4 bytes; use uint32_t not abi_ulong.
>>>
>>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>>> ---
>>>  linux-user/sparc/signal.c | 4 ++--
>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
>>> index efb0df7e2b..ecfdf937e4 100644
>>> --- a/linux-user/sparc/signal.c
>>> +++ b/linux-user/sparc/signal.c
>>> @@ -87,7 +87,7 @@ struct target_signal_frame {
>>>      struct sparc_stackf ss;
>>>      __siginfo_t         info;
>>>      abi_ulong           fpu_save;
>>> -    abi_ulong           insns[2] __attribute__ ((aligned (8)));
>>> +    uint32_t            insns[2] __attribute__ ((aligned (8)));
>>>      abi_ulong           extramask[TARGET_NSIG_WORDS - 1];
>>>      abi_ulong           extra_size; /* Should be 0 */
>>>      qemu_siginfo_fpu_t fpu_state;
>>> @@ -98,7 +98,7 @@ struct target_rt_signal_frame {
>>>      abi_ulong           regs[20];
>>>      sigset_t            mask;
>>>      abi_ulong           fpu_save;
>>> -    unsigned int        insns[2];
>>> +    uint32_t            insns[2];
>>>      stack_t             stack;
>>>      unsigned int        extra_size; /* Should be 0 */
>>>      qemu_siginfo_fpu_t  fpu_state;
>>>
>>
>> This definition is used by sparc and sparc64 (sparc64/signal.c includes
>> sparc/signal.c), so the definition was valid before your changes for
>> sparc and not good for sparc64. Moreover rt_signal_frame for sparc64
>> doesn't look like this one (and signal_frame doesn't exist).
> 
> You're right that target_rt_signal_frame isn't correct for sparc64.  But we
> also don't implement setup_rt_frame yet, so it's also currently unused.
> 
> What's here is just good enough to make setup_frame work, and that is correct
> for both sparc and sparc64.

ok

Reviewed-by: Laurent Vivier <laurent@vivier.eu>




^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 00/12] linux-user sparc fixes
  2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
                   ` (12 preceding siblings ...)
  2019-10-25 12:50 ` [PATCH v2 00/12] linux-user sparc fixes Laurent Vivier
@ 2019-10-26  7:02 ` no-reply
  13 siblings, 0 replies; 37+ messages in thread
From: no-reply @ 2019-10-26  7:02 UTC (permalink / raw)
  To: richard.henderson; +Cc: alex.bennee, qemu-devel, laurent

Patchew URL: https://patchew.org/QEMU/20191025113921.9412-1-richard.henderson@linaro.org/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Subject: [PATCH v2 00/12] linux-user sparc fixes
Type: series
Message-id: 20191025113921.9412-1-richard.henderson@linaro.org

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Switched to a new branch 'test'
10a58e6 linux-user/alpha: Set r20 secondary return value
5eb8e13 linux-user/sparc: Fix cpu_clone_regs_*
1fe4085 linux-user: Introduce cpu_clone_regs_parent
c6bf6f2 linux-user: Rename cpu_clone_regs to cpu_clone_regs_child
1e0a916 linux-user/sparc64: Fix target_signal_frame
b250d74 linux-user/sparc: Fix WREG usage in setup_frame
a8508ed linux-user/sparc: Use WREG_SP constant in sparc/signal.c
9b12e1c linux-user/sparc: Begin using WREG constants in sparc/signal.c
0da4e3e linux-user/sparc: Use WREG constants in sparc/target_cpu.h
2bab940 target/sparc: Define an enumeration for accessing env->regwptr
dfc8869 tests/tcg/multiarch/linux-test: Fix error check for shmat
32ef6cd scripts/qemu-binfmt-conf: Update for sparc64

=== OUTPUT BEGIN ===
1/12 Checking commit 32ef6cd7742f (scripts/qemu-binfmt-conf: Update for sparc64)
WARNING: line over 80 characters
#34: FILE: scripts/qemu-binfmt-conf.sh:41:
+sparc64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2b'

ERROR: line over 90 characters
#35: FILE: scripts/qemu-binfmt-conf.sh:42:
+sparc64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'

total: 1 errors, 1 warnings, 20 lines checked

Patch 1/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

2/12 Checking commit dfc8869ba150 (tests/tcg/multiarch/linux-test: Fix error check for shmat)
3/12 Checking commit 2bab94043648 (target/sparc: Define an enumeration for accessing env->regwptr)
4/12 Checking commit 0da4e3e1f98e (linux-user/sparc: Use WREG constants in sparc/target_cpu.h)
5/12 Checking commit 9b12e1c8e388 (linux-user/sparc: Begin using WREG constants in sparc/signal.c)
ERROR: spaces required around that '+' (ctx:VxV)
#49: FILE: linux-user/sparc/signal.c:151:
+        __put_user(env->regwptr[WREG_O0 + i], &si->si_regs.u_regs[i+8]);
                                                                    ^

ERROR: spaces required around that '+' (ctx:VxV)
#121: FILE: linux-user/sparc/signal.c:290:
+        __get_user(env->regwptr[i + WREG_O0], &sf->info.si_regs.u_regs[i+8]);
                                                                         ^

ERROR: spaces required around that '+' (ctx:VxV)
#168: FILE: linux-user/sparc/signal.c:460:
+    w_addr = TARGET_STACK_BIAS+env->regwptr[WREG_O6];
                               ^

ERROR: spaces required around that '+' (ctx:VxV)
#203: FILE: linux-user/sparc/signal.c:563:
+    w_addr = TARGET_STACK_BIAS+env->regwptr[WREG_O6];
                               ^

total: 4 errors, 0 warnings, 175 lines checked

Patch 5/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

6/12 Checking commit a8508ed3e8ff (linux-user/sparc: Use WREG_SP constant in sparc/signal.c)
7/12 Checking commit b250d74fed90 (linux-user/sparc: Fix WREG usage in setup_frame)
8/12 Checking commit 1e0a916d1fca (linux-user/sparc64: Fix target_signal_frame)
ERROR: space prohibited between function name and open parenthesis '('
#21: FILE: linux-user/sparc/signal.c:90:
+    uint32_t            insns[2] __attribute__ ((aligned (8)));

total: 1 errors, 0 warnings, 16 lines checked

Patch 8/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

9/12 Checking commit c6bf6f2ab73f (linux-user: Rename cpu_clone_regs to cpu_clone_regs_child)
10/12 Checking commit 1fe40851fad6 (linux-user: Introduce cpu_clone_regs_parent)
11/12 Checking commit 5eb8e1397a6b (linux-user/sparc: Fix cpu_clone_regs_*)
12/12 Checking commit 10a58e689746 (linux-user/alpha: Set r20 secondary return value)
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/20191025113921.9412-1-richard.henderson@linaro.org/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 01/12] scripts/qemu-binfmt-conf: Update for sparc64
  2019-10-25 11:39 ` [PATCH v2 01/12] scripts/qemu-binfmt-conf: Update for sparc64 Richard Henderson
@ 2019-11-05  9:43   ` Laurent Vivier
  0 siblings, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:43 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> Also note that we were missing the qemu_target_list entry
> for plain sparc; fix that at the same time.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Tested-by: Laurent Vivier <laurent@vivier.eu>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  scripts/qemu-binfmt-conf.sh | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
> index b5a16742a1..9f1580a91c 100755
> --- a/scripts/qemu-binfmt-conf.sh
> +++ b/scripts/qemu-binfmt-conf.sh
> @@ -1,8 +1,8 @@
>  #!/bin/sh
>  # Enable automatic program execution by the kernel.
>  
> -qemu_target_list="i386 i486 alpha arm armeb sparc32plus ppc ppc64 ppc64le m68k \
> -mips mipsel mipsn32 mipsn32el mips64 mips64el \
> +qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \
> +ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \
>  sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \
>  microblaze microblazeel or1k x86_64"
>  
> @@ -38,6 +38,10 @@ sparc32plus_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
>  sparc32plus_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'
>  sparc32plus_family=sparc
>  
> +sparc64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2b'
> +sparc64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'
> +sparc64_family=sparc
> +
>  ppc_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14'
>  ppc_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'
>  ppc_family=ppc
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat
  2019-10-25 11:39 ` [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat Richard Henderson
  2019-10-25 12:59   ` Philippe Mathieu-Daudé
  2019-10-25 13:00   ` Philippe Mathieu-Daudé
@ 2019-11-05  9:45   ` Laurent Vivier
  2 siblings, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:45 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> The error indicator for this syscall is -1, not 0.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  tests/tcg/multiarch/linux-test.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/tcg/multiarch/linux-test.c b/tests/tcg/multiarch/linux-test.c
> index fa4243fc04..673d7c8a1c 100644
> --- a/tests/tcg/multiarch/linux-test.c
> +++ b/tests/tcg/multiarch/linux-test.c
> @@ -503,8 +503,9 @@ static void test_shm(void)
>  
>      shmid = chk_error(shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0777));
>      ptr = shmat(shmid, NULL, 0);
> -    if (!ptr)
> +    if (ptr == (void *)-1) {
>          error("shmat");
> +    }
>  
>      memset(ptr, 0, SHM_SIZE);
>  
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 03/12] target/sparc: Define an enumeration for accessing env->regwptr
  2019-10-25 11:39 ` [PATCH v2 03/12] target/sparc: Define an enumeration for accessing env->regwptr Richard Henderson
@ 2019-11-05  9:45   ` Laurent Vivier
  0 siblings, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:45 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  target/sparc/cpu.h | 33 +++++++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
> 
> diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
> index 778aa8e073..ae97c7d9f7 100644
> --- a/target/sparc/cpu.h
> +++ b/target/sparc/cpu.h
> @@ -13,6 +13,39 @@
>  
>  /*#define EXCP_INTERRUPT 0x100*/
>  
> +/* Windowed register indexes.  */
> +enum {
> +    WREG_O0,
> +    WREG_O1,
> +    WREG_O2,
> +    WREG_O3,
> +    WREG_O4,
> +    WREG_O5,
> +    WREG_O6,
> +    WREG_O7,
> +
> +    WREG_L0,
> +    WREG_L1,
> +    WREG_L2,
> +    WREG_L3,
> +    WREG_L4,
> +    WREG_L5,
> +    WREG_L6,
> +    WREG_L7,
> +
> +    WREG_I0,
> +    WREG_I1,
> +    WREG_I2,
> +    WREG_I3,
> +    WREG_I4,
> +    WREG_I5,
> +    WREG_I6,
> +    WREG_I7,
> +
> +    WREG_SP = WREG_O6,
> +    WREG_FP = WREG_I6,
> +};
> +
>  /* trap definitions */
>  #ifndef TARGET_SPARC64
>  #define TT_TFAULT   0x01
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 04/12] linux-user/sparc: Use WREG constants in sparc/target_cpu.h
  2019-10-25 11:39 ` [PATCH v2 04/12] linux-user/sparc: Use WREG constants in sparc/target_cpu.h Richard Henderson
  2019-10-25 12:09   ` Laurent Vivier
@ 2019-11-05  9:49   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:49 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> This fixes a naming bug wherein we used "UREG_FP" to access the
> stack pointer.  OTOH, the "UREG_FP" constant was also defined
> incorrectly such that it *did* reference the stack pointer.
> 
> Note that the kernel legitimately uses the name "FP", because it
> utilizes the rolled stack window in processing the system call.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/sparc/target_cpu.h | 10 ++--------
>  1 file changed, 2 insertions(+), 8 deletions(-)
> 
> diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
> index 1ffc0ae9f2..b30fbc72c4 100644
> --- a/linux-user/sparc/target_cpu.h
> +++ b/linux-user/sparc/target_cpu.h
> @@ -41,15 +41,9 @@ static inline void cpu_set_tls(CPUSPARCState *env, target_ulong newtls)
>      env->gregs[7] = newtls;
>  }
>  
> -#ifndef UREG_I6
> -#define UREG_I6        6
> -#endif
> -#ifndef UREG_FP
> -#define UREG_FP        UREG_I6
> -#endif
> -
>  static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state)
>  {
> -    return state->regwptr[UREG_FP];
> +    return state->regwptr[WREG_SP];
>  }
> +
>  #endif
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 05/12] linux-user/sparc: Begin using WREG constants in sparc/signal.c
  2019-10-25 11:39 ` [PATCH v2 05/12] linux-user/sparc: Begin using WREG constants in sparc/signal.c Richard Henderson
  2019-10-25 12:16   ` Laurent Vivier
@ 2019-11-05  9:49   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:49 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> This is non-obvious because the UREG constants are in fact wrong.
> 
> s/UREG_I/WREG_O/g
> s/UREG_O/WREG_I/g
> s/UREG_L/WREG_L/g
> 
> These substitutions have identical integer values.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/sparc/signal.c | 93 ++++++++++++++-------------------------
>  1 file changed, 32 insertions(+), 61 deletions(-)
> 
> diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
> index ead169fbaa..a967e2db73 100644
> --- a/linux-user/sparc/signal.c
> +++ b/linux-user/sparc/signal.c
> @@ -104,19 +104,8 @@ struct target_rt_signal_frame {
>      qemu_siginfo_fpu_t  fpu_state;
>  };
>  
> -#define UREG_O0        16
> -#define UREG_O6        22
> -#define UREG_I0        0
> -#define UREG_I1        1
> -#define UREG_I2        2
> -#define UREG_I3        3
> -#define UREG_I4        4
> -#define UREG_I5        5
> -#define UREG_I6        6
> -#define UREG_I7        7
> -#define UREG_L0        8
> -#define UREG_FP        UREG_I6
> -#define UREG_SP        UREG_O6
> +#define UREG_FP        WREG_O6
> +#define UREG_SP        WREG_I6
>  
>  static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
>                                       CPUSPARCState *env,
> @@ -159,30 +148,12 @@ setup___siginfo(__siginfo_t *si, CPUSPARCState *env, abi_ulong mask)
>          __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
>      }
>      for (i=0; i < 8; i++) {
> -        __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
> +        __put_user(env->regwptr[WREG_O0 + i], &si->si_regs.u_regs[i+8]);
>      }
>      __put_user(mask, &si->si_mask);
>      return err;
>  }
>  
> -#if 0
> -static int
> -setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
> -                 CPUSPARCState *env, unsigned long mask)
> -{
> -    int err = 0;
> -
> -    __put_user(mask, &sc->sigc_mask);
> -    __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
> -    __put_user(env->pc, &sc->sigc_pc);
> -    __put_user(env->npc, &sc->sigc_npc);
> -    __put_user(env->psr, &sc->sigc_psr);
> -    __put_user(env->gregs[1], &sc->sigc_g1);
> -    __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
> -
> -    return err;
> -}
> -#endif
>  #define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
>  
>  void setup_frame(int sig, struct target_sigaction *ka,
> @@ -221,20 +192,20 @@ void setup_frame(int sig, struct target_sigaction *ka,
>      }
>  
>      for (i = 0; i < 8; i++) {
> -        __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
> +        __put_user(env->regwptr[i + WREG_L0], &sf->ss.locals[i]);
>      }
>      for (i = 0; i < 8; i++) {
> -        __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
> +        __put_user(env->regwptr[i + WREG_O0], &sf->ss.ins[i]);
>      }
>      if (err)
>          goto sigsegv;
>  
>      /* 3. signal handler back-trampoline and parameters */
>      env->regwptr[UREG_FP] = sf_addr;
> -    env->regwptr[UREG_I0] = sig;
> -    env->regwptr[UREG_I1] = sf_addr +
> +    env->regwptr[WREG_O0] = sig;
> +    env->regwptr[WREG_O1] = sf_addr +
>              offsetof(struct target_signal_frame, info);
> -    env->regwptr[UREG_I2] = sf_addr +
> +    env->regwptr[WREG_O2] = sf_addr +
>              offsetof(struct target_signal_frame, info);
>  
>      /* 4. signal handler */
> @@ -242,11 +213,11 @@ void setup_frame(int sig, struct target_sigaction *ka,
>      env->npc = (env->pc + 4);
>      /* 5. return to kernel instructions */
>      if (ka->ka_restorer) {
> -        env->regwptr[UREG_I7] = ka->ka_restorer;
> +        env->regwptr[WREG_O7] = ka->ka_restorer;
>      } else {
>          uint32_t val32;
>  
> -        env->regwptr[UREG_I7] = sf_addr +
> +        env->regwptr[WREG_O7] = sf_addr +
>                  offsetof(struct target_signal_frame, insns) - 2 * 4;
>  
>          /* mov __NR_sigreturn, %g1 */
> @@ -316,7 +287,7 @@ long do_sigreturn(CPUSPARCState *env)
>          __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
>      }
>      for (i=0; i < 8; i++) {
> -        __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
> +        __get_user(env->regwptr[i + WREG_O0], &sf->info.si_regs.u_regs[i+8]);
>      }
>  
>      /* FIXME: implement FPU save/restore:
> @@ -433,7 +404,7 @@ void sparc64_set_context(CPUSPARCState *env)
>      abi_ulong fp, i7, w_addr;
>      unsigned int i;
>  
> -    ucp_addr = env->regwptr[UREG_I0];
> +    ucp_addr = env->regwptr[WREG_O0];
>      if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1)) {
>          goto do_sigsegv;
>      }
> @@ -443,7 +414,7 @@ void sparc64_set_context(CPUSPARCState *env)
>      if ((pc | npc) & 3) {
>          goto do_sigsegv;
>      }
> -    if (env->regwptr[UREG_I1]) {
> +    if (env->regwptr[WREG_O1]) {
>          target_sigset_t target_set;
>          sigset_t set;
>  
> @@ -474,19 +445,19 @@ void sparc64_set_context(CPUSPARCState *env)
>      __get_user(env->gregs[5], (&(*grp)[SPARC_MC_G5]));
>      __get_user(env->gregs[6], (&(*grp)[SPARC_MC_G6]));
>      __get_user(env->gregs[7], (&(*grp)[SPARC_MC_G7]));
> -    __get_user(env->regwptr[UREG_I0], (&(*grp)[SPARC_MC_O0]));
> -    __get_user(env->regwptr[UREG_I1], (&(*grp)[SPARC_MC_O1]));
> -    __get_user(env->regwptr[UREG_I2], (&(*grp)[SPARC_MC_O2]));
> -    __get_user(env->regwptr[UREG_I3], (&(*grp)[SPARC_MC_O3]));
> -    __get_user(env->regwptr[UREG_I4], (&(*grp)[SPARC_MC_O4]));
> -    __get_user(env->regwptr[UREG_I5], (&(*grp)[SPARC_MC_O5]));
> -    __get_user(env->regwptr[UREG_I6], (&(*grp)[SPARC_MC_O6]));
> -    __get_user(env->regwptr[UREG_I7], (&(*grp)[SPARC_MC_O7]));
> +    __get_user(env->regwptr[WREG_O0], (&(*grp)[SPARC_MC_O0]));
> +    __get_user(env->regwptr[WREG_O1], (&(*grp)[SPARC_MC_O1]));
> +    __get_user(env->regwptr[WREG_O2], (&(*grp)[SPARC_MC_O2]));
> +    __get_user(env->regwptr[WREG_O3], (&(*grp)[SPARC_MC_O3]));
> +    __get_user(env->regwptr[WREG_O4], (&(*grp)[SPARC_MC_O4]));
> +    __get_user(env->regwptr[WREG_O5], (&(*grp)[SPARC_MC_O5]));
> +    __get_user(env->regwptr[WREG_O6], (&(*grp)[SPARC_MC_O6]));
> +    __get_user(env->regwptr[WREG_O7], (&(*grp)[SPARC_MC_O7]));
>  
>      __get_user(fp, &(ucp->tuc_mcontext.mc_fp));
>      __get_user(i7, &(ucp->tuc_mcontext.mc_i7));
>  
> -    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
> +    w_addr = TARGET_STACK_BIAS+env->regwptr[WREG_O6];
>      if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
>                   abi_ulong) != 0) {
>          goto do_sigsegv;
> @@ -534,7 +505,7 @@ void sparc64_get_context(CPUSPARCState *env)
>      target_sigset_t target_set;
>      sigset_t set;
>  
> -    ucp_addr = env->regwptr[UREG_I0];
> +    ucp_addr = env->regwptr[WREG_O0];
>      if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0)) {
>          goto do_sigsegv;
>      }
> @@ -580,16 +551,16 @@ void sparc64_get_context(CPUSPARCState *env)
>      __put_user(env->gregs[5], &((*grp)[SPARC_MC_G5]));
>      __put_user(env->gregs[6], &((*grp)[SPARC_MC_G6]));
>      __put_user(env->gregs[7], &((*grp)[SPARC_MC_G7]));
> -    __put_user(env->regwptr[UREG_I0], &((*grp)[SPARC_MC_O0]));
> -    __put_user(env->regwptr[UREG_I1], &((*grp)[SPARC_MC_O1]));
> -    __put_user(env->regwptr[UREG_I2], &((*grp)[SPARC_MC_O2]));
> -    __put_user(env->regwptr[UREG_I3], &((*grp)[SPARC_MC_O3]));
> -    __put_user(env->regwptr[UREG_I4], &((*grp)[SPARC_MC_O4]));
> -    __put_user(env->regwptr[UREG_I5], &((*grp)[SPARC_MC_O5]));
> -    __put_user(env->regwptr[UREG_I6], &((*grp)[SPARC_MC_O6]));
> -    __put_user(env->regwptr[UREG_I7], &((*grp)[SPARC_MC_O7]));
> +    __put_user(env->regwptr[WREG_O0], &((*grp)[SPARC_MC_O0]));
> +    __put_user(env->regwptr[WREG_O1], &((*grp)[SPARC_MC_O1]));
> +    __put_user(env->regwptr[WREG_O2], &((*grp)[SPARC_MC_O2]));
> +    __put_user(env->regwptr[WREG_O3], &((*grp)[SPARC_MC_O3]));
> +    __put_user(env->regwptr[WREG_O4], &((*grp)[SPARC_MC_O4]));
> +    __put_user(env->regwptr[WREG_O5], &((*grp)[SPARC_MC_O5]));
> +    __put_user(env->regwptr[WREG_O6], &((*grp)[SPARC_MC_O6]));
> +    __put_user(env->regwptr[WREG_O7], &((*grp)[SPARC_MC_O7]));
>  
> -    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
> +    w_addr = TARGET_STACK_BIAS+env->regwptr[WREG_O6];
>      fp = i7 = 0;
>      if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
>                   abi_ulong) != 0) {
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 06/12] linux-user/sparc: Use WREG_SP constant in sparc/signal.c
  2019-10-25 11:39 ` [PATCH v2 06/12] linux-user/sparc: Use WREG_SP constant " Richard Henderson
  2019-10-25 12:19   ` Laurent Vivier
@ 2019-11-05  9:50   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:50 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> s/UREG_FP/WREG_SP/g
> 
> This is non-obvious because the UREG_FP constant is fact wrong.
> However, the previous search-and-replace patch made it clear that
> UREG_FP expands to WREG_O6, and we can see from the enumeration in
> target/sparc/cpu.h that WREG_O6 is in fact WREG_SP, the stack pointer.
> 
> The UREG_SP define is unused; remove it.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/sparc/signal.c | 7 ++-----
>  1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
> index a967e2db73..0db4c5f84f 100644
> --- a/linux-user/sparc/signal.c
> +++ b/linux-user/sparc/signal.c
> @@ -104,9 +104,6 @@ struct target_rt_signal_frame {
>      qemu_siginfo_fpu_t  fpu_state;
>  };
>  
> -#define UREG_FP        WREG_O6
> -#define UREG_SP        WREG_I6
> -
>  static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
>                                       CPUSPARCState *env,
>                                       unsigned long framesize)
> @@ -201,7 +198,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
>          goto sigsegv;
>  
>      /* 3. signal handler back-trampoline and parameters */
> -    env->regwptr[UREG_FP] = sf_addr;
> +    env->regwptr[WREG_SP] = sf_addr;
>      env->regwptr[WREG_O0] = sig;
>      env->regwptr[WREG_O1] = sf_addr +
>              offsetof(struct target_signal_frame, info);
> @@ -255,7 +252,7 @@ long do_sigreturn(CPUSPARCState *env)
>      sigset_t host_set;
>      int i;
>  
> -    sf_addr = env->regwptr[UREG_FP];
> +    sf_addr = env->regwptr[WREG_SP];
>      trace_user_do_sigreturn(env, sf_addr);
>      if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1)) {
>          goto segv_and_exit;
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 07/12] linux-user/sparc: Fix WREG usage in setup_frame
  2019-10-25 11:39 ` [PATCH v2 07/12] linux-user/sparc: Fix WREG usage in setup_frame Richard Henderson
@ 2019-11-05  9:50   ` Laurent Vivier
  0 siblings, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:50 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> Use WREG_I0 not WREG_O0 in order to properly save the "ins".
> The "outs" were saved separately in setup___siginfo.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/sparc/signal.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
> index 0db4c5f84f..efb0df7e2b 100644
> --- a/linux-user/sparc/signal.c
> +++ b/linux-user/sparc/signal.c
> @@ -192,7 +192,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
>          __put_user(env->regwptr[i + WREG_L0], &sf->ss.locals[i]);
>      }
>      for (i = 0; i < 8; i++) {
> -        __put_user(env->regwptr[i + WREG_O0], &sf->ss.ins[i]);
> +        __put_user(env->regwptr[i + WREG_I0], &sf->ss.ins[i]);
>      }
>      if (err)
>          goto sigsegv;
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 09/12] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child
  2019-10-25 11:39 ` [PATCH v2 09/12] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child Richard Henderson
  2019-10-25 13:03   ` Philippe Mathieu-Daudé
@ 2019-11-05  9:52   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:52 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> We will need a target-specific hook for adjusting registers
> in the parent during clone.  To avoid confusion, rename the
> one we have to make it clear it affects the child.
> 
> At the same time, pass in the flags from the clone syscall.
> We will need them for correct behaviour for Sparc.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> v2: Add flags parameter.
> ---
>  linux-user/aarch64/target_cpu.h    | 3 ++-
>  linux-user/alpha/target_cpu.h      | 3 ++-
>  linux-user/arm/target_cpu.h        | 3 ++-
>  linux-user/cris/target_cpu.h       | 3 ++-
>  linux-user/hppa/target_cpu.h       | 3 ++-
>  linux-user/i386/target_cpu.h       | 3 ++-
>  linux-user/m68k/target_cpu.h       | 3 ++-
>  linux-user/microblaze/target_cpu.h | 3 ++-
>  linux-user/mips/target_cpu.h       | 3 ++-
>  linux-user/nios2/target_cpu.h      | 3 ++-
>  linux-user/openrisc/target_cpu.h   | 4 +++-
>  linux-user/ppc/target_cpu.h        | 3 ++-
>  linux-user/riscv/target_cpu.h      | 3 ++-
>  linux-user/s390x/target_cpu.h      | 3 ++-
>  linux-user/sh4/target_cpu.h        | 3 ++-
>  linux-user/sparc/target_cpu.h      | 3 ++-
>  linux-user/tilegx/target_cpu.h     | 3 ++-
>  linux-user/xtensa/target_cpu.h     | 4 +++-
>  linux-user/syscall.c               | 4 ++--
>  19 files changed, 40 insertions(+), 20 deletions(-)
> 
> diff --git a/linux-user/aarch64/target_cpu.h b/linux-user/aarch64/target_cpu.h
> index a021c95fa4..cd012e0dc1 100644
> --- a/linux-user/aarch64/target_cpu.h
> +++ b/linux-user/aarch64/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef AARCH64_TARGET_CPU_H
>  #define AARCH64_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUARMState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->xregs[31] = newsp;
> diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h
> index ac4d255ae7..37ba00cf41 100644
> --- a/linux-user/alpha/target_cpu.h
> +++ b/linux-user/alpha/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef ALPHA_TARGET_CPU_H
>  #define ALPHA_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUAlphaState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->ir[IR_SP] = newsp;
> diff --git a/linux-user/arm/target_cpu.h b/linux-user/arm/target_cpu.h
> index 3f79356a07..6e2ba8ad4b 100644
> --- a/linux-user/arm/target_cpu.h
> +++ b/linux-user/arm/target_cpu.h
> @@ -41,7 +41,8 @@ static inline unsigned long arm_max_reserved_va(CPUState *cs)
>  }
>  #define MAX_RESERVED_VA  arm_max_reserved_va
>  
> -static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUARMState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regs[13] = newsp;
> diff --git a/linux-user/cris/target_cpu.h b/linux-user/cris/target_cpu.h
> index 2309343979..eacc4d8d13 100644
> --- a/linux-user/cris/target_cpu.h
> +++ b/linux-user/cris/target_cpu.h
> @@ -20,7 +20,8 @@
>  #ifndef CRIS_TARGET_CPU_H
>  #define CRIS_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUCRISState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUCRISState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regs[14] = newsp;
> diff --git a/linux-user/hppa/target_cpu.h b/linux-user/hppa/target_cpu.h
> index 1c539bdbd6..f250770790 100644
> --- a/linux-user/hppa/target_cpu.h
> +++ b/linux-user/hppa/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef HPPA_TARGET_CPU_H
>  #define HPPA_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUHPPAState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUHPPAState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->gr[30] = newsp;
> diff --git a/linux-user/i386/target_cpu.h b/linux-user/i386/target_cpu.h
> index ece04d0966..1fadbf57c3 100644
> --- a/linux-user/i386/target_cpu.h
> +++ b/linux-user/i386/target_cpu.h
> @@ -20,7 +20,8 @@
>  #ifndef I386_TARGET_CPU_H
>  #define I386_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUX86State *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUX86State *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regs[R_ESP] = newsp;
> diff --git a/linux-user/m68k/target_cpu.h b/linux-user/m68k/target_cpu.h
> index bc7446fbaf..57b647bc07 100644
> --- a/linux-user/m68k/target_cpu.h
> +++ b/linux-user/m68k/target_cpu.h
> @@ -21,7 +21,8 @@
>  #ifndef M68K_TARGET_CPU_H
>  #define M68K_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUM68KState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUM68KState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->aregs[7] = newsp;
> diff --git a/linux-user/microblaze/target_cpu.h b/linux-user/microblaze/target_cpu.h
> index 73e139938c..e9bc0fce65 100644
> --- a/linux-user/microblaze/target_cpu.h
> +++ b/linux-user/microblaze/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef MICROBLAZE_TARGET_CPU_H
>  #define MICROBLAZE_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUMBState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUMBState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regs[R_SP] = newsp;
> diff --git a/linux-user/mips/target_cpu.h b/linux-user/mips/target_cpu.h
> index 02cf5eeff7..8601f712e0 100644
> --- a/linux-user/mips/target_cpu.h
> +++ b/linux-user/mips/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef MIPS_TARGET_CPU_H
>  #define MIPS_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUMIPSState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUMIPSState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->active_tc.gpr[29] = newsp;
> diff --git a/linux-user/nios2/target_cpu.h b/linux-user/nios2/target_cpu.h
> index 5596c05c9c..fe5de7a9e3 100644
> --- a/linux-user/nios2/target_cpu.h
> +++ b/linux-user/nios2/target_cpu.h
> @@ -20,7 +20,8 @@
>  #ifndef NIOS2_TARGET_CPU_H
>  #define NIOS2_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUNios2State *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUNios2State *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regs[R_SP] = newsp;
> diff --git a/linux-user/openrisc/target_cpu.h b/linux-user/openrisc/target_cpu.h
> index 32ff135089..309cf3eeb7 100644
> --- a/linux-user/openrisc/target_cpu.h
> +++ b/linux-user/openrisc/target_cpu.h
> @@ -20,7 +20,9 @@
>  #ifndef OPENRISC_TARGET_CPU_H
>  #define OPENRISC_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUOpenRISCState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUOpenRISCState *env,
> +                                        target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          cpu_set_gpr(env, 1, newsp);
> diff --git a/linux-user/ppc/target_cpu.h b/linux-user/ppc/target_cpu.h
> index c4641834e7..028b28312c 100644
> --- a/linux-user/ppc/target_cpu.h
> +++ b/linux-user/ppc/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef PPC_TARGET_CPU_H
>  #define PPC_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUPPCState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUPPCState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->gpr[1] = newsp;
> diff --git a/linux-user/riscv/target_cpu.h b/linux-user/riscv/target_cpu.h
> index 90f9a4171e..26dcafab1c 100644
> --- a/linux-user/riscv/target_cpu.h
> +++ b/linux-user/riscv/target_cpu.h
> @@ -1,7 +1,8 @@
>  #ifndef RISCV_TARGET_CPU_H
>  #define RISCV_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPURISCVState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPURISCVState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->gpr[xSP] = newsp;
> diff --git a/linux-user/s390x/target_cpu.h b/linux-user/s390x/target_cpu.h
> index aa181ceaee..0b19e42f75 100644
> --- a/linux-user/s390x/target_cpu.h
> +++ b/linux-user/s390x/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef S390X_TARGET_CPU_H
>  #define S390X_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUS390XState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUS390XState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regs[15] = newsp;
> diff --git a/linux-user/sh4/target_cpu.h b/linux-user/sh4/target_cpu.h
> index b0be9a2c1b..857af43ee3 100644
> --- a/linux-user/sh4/target_cpu.h
> +++ b/linux-user/sh4/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef SH4_TARGET_CPU_H
>  #define SH4_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUSH4State *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUSH4State *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->gregs[15] = newsp;
> diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
> index b30fbc72c4..029b0fc547 100644
> --- a/linux-user/sparc/target_cpu.h
> +++ b/linux-user/sparc/target_cpu.h
> @@ -20,7 +20,8 @@
>  #ifndef SPARC_TARGET_CPU_H
>  #define SPARC_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUSPARCState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regwptr[22] = newsp;
> diff --git a/linux-user/tilegx/target_cpu.h b/linux-user/tilegx/target_cpu.h
> index d1aa5824f2..0523dc414c 100644
> --- a/linux-user/tilegx/target_cpu.h
> +++ b/linux-user/tilegx/target_cpu.h
> @@ -19,7 +19,8 @@
>  #ifndef TILEGX_TARGET_CPU_H
>  #define TILEGX_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUTLGState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUTLGState *env, target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regs[TILEGX_R_SP] = newsp;
> diff --git a/linux-user/xtensa/target_cpu.h b/linux-user/xtensa/target_cpu.h
> index e31efe3ea0..84f67d469e 100644
> --- a/linux-user/xtensa/target_cpu.h
> +++ b/linux-user/xtensa/target_cpu.h
> @@ -4,7 +4,9 @@
>  #ifndef XTENSA_TARGET_CPU_H
>  #define XTENSA_TARGET_CPU_H
>  
> -static inline void cpu_clone_regs(CPUXtensaState *env, target_ulong newsp)
> +static inline void cpu_clone_regs_child(CPUXtensaState *env,
> +                                        target_ulong newsp,
> +                                        unsigned flags)
>  {
>      if (newsp) {
>          env->regs[1] = newsp;
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index f1ab81b917..a07d4b4774 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -5718,7 +5718,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
>          /* we create a new CPU instance. */
>          new_env = cpu_copy(env);
>          /* Init regs that differ from the parent.  */
> -        cpu_clone_regs(new_env, newsp);
> +        cpu_clone_regs_child(new_env, newsp, flags);
>          new_cpu = env_cpu(new_env);
>          new_cpu->opaque = ts;
>          ts->bprm = parent_ts->bprm;
> @@ -5797,7 +5797,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
>          ret = fork();
>          if (ret == 0) {
>              /* Child Process.  */
> -            cpu_clone_regs(env, newsp);
> +            cpu_clone_regs_child(env, newsp, flags);
>              fork_end(1);
>              /* There is a race condition here.  The parent process could
>                 theoretically read the TID in the child process before the child
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 10/12] linux-user: Introduce cpu_clone_regs_parent
  2019-10-25 11:39 ` [PATCH v2 10/12] linux-user: Introduce cpu_clone_regs_parent Richard Henderson
  2019-10-25 13:04   ` Philippe Mathieu-Daudé
@ 2019-11-05  9:52   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:52 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> We will need a target-specific hook for adjusting registers
> in the parent during clone.  Add an empty inline function for
> each target, and invoke it from the proper places.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/aarch64/target_cpu.h    | 4 ++++
>  linux-user/alpha/target_cpu.h      | 4 ++++
>  linux-user/arm/target_cpu.h        | 4 ++++
>  linux-user/cris/target_cpu.h       | 4 ++++
>  linux-user/hppa/target_cpu.h       | 4 ++++
>  linux-user/i386/target_cpu.h       | 4 ++++
>  linux-user/m68k/target_cpu.h       | 4 ++++
>  linux-user/microblaze/target_cpu.h | 4 ++++
>  linux-user/mips/target_cpu.h       | 4 ++++
>  linux-user/nios2/target_cpu.h      | 4 ++++
>  linux-user/openrisc/target_cpu.h   | 4 ++++
>  linux-user/ppc/target_cpu.h        | 4 ++++
>  linux-user/riscv/target_cpu.h      | 4 ++++
>  linux-user/s390x/target_cpu.h      | 4 ++++
>  linux-user/sh4/target_cpu.h        | 4 ++++
>  linux-user/sparc/target_cpu.h      | 4 ++++
>  linux-user/tilegx/target_cpu.h     | 4 ++++
>  linux-user/xtensa/target_cpu.h     | 4 ++++
>  linux-user/syscall.c               | 2 ++
>  19 files changed, 74 insertions(+)
> 
> diff --git a/linux-user/aarch64/target_cpu.h b/linux-user/aarch64/target_cpu.h
> index cd012e0dc1..6cc02e7dcd 100644
> --- a/linux-user/aarch64/target_cpu.h
> +++ b/linux-user/aarch64/target_cpu.h
> @@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUARMState *env, target_ulong newsp,
>      env->xregs[0] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUARMState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
>  {
>      /* Note that AArch64 Linux keeps the TLS pointer in TPIDR; this is
> diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h
> index 37ba00cf41..dd25e18f47 100644
> --- a/linux-user/alpha/target_cpu.h
> +++ b/linux-user/alpha/target_cpu.h
> @@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp,
>      env->ir[IR_A3] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUAlphaState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls)
>  {
>      env->unique = newtls;
> diff --git a/linux-user/arm/target_cpu.h b/linux-user/arm/target_cpu.h
> index 6e2ba8ad4b..2747211b24 100644
> --- a/linux-user/arm/target_cpu.h
> +++ b/linux-user/arm/target_cpu.h
> @@ -50,6 +50,10 @@ static inline void cpu_clone_regs_child(CPUARMState *env, target_ulong newsp,
>      env->regs[0] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUARMState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
>  {
>      if (access_secure_reg(env)) {
> diff --git a/linux-user/cris/target_cpu.h b/linux-user/cris/target_cpu.h
> index eacc4d8d13..74ead55c81 100644
> --- a/linux-user/cris/target_cpu.h
> +++ b/linux-user/cris/target_cpu.h
> @@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUCRISState *env, target_ulong newsp,
>      env->regs[10] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUCRISState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUCRISState *env, target_ulong newtls)
>  {
>      env->pregs[PR_PID] = (env->pregs[PR_PID] & 0xff) | newtls;
> diff --git a/linux-user/hppa/target_cpu.h b/linux-user/hppa/target_cpu.h
> index f250770790..71654b3cd4 100644
> --- a/linux-user/hppa/target_cpu.h
> +++ b/linux-user/hppa/target_cpu.h
> @@ -32,6 +32,10 @@ static inline void cpu_clone_regs_child(CPUHPPAState *env, target_ulong newsp,
>      env->iaoq_b = env->gr[31] + 4;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUHPPAState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUHPPAState *env, target_ulong newtls)
>  {
>      env->cr[27] = newtls;
> diff --git a/linux-user/i386/target_cpu.h b/linux-user/i386/target_cpu.h
> index 1fadbf57c3..0b44530854 100644
> --- a/linux-user/i386/target_cpu.h
> +++ b/linux-user/i386/target_cpu.h
> @@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUX86State *env, target_ulong newsp,
>      env->regs[R_EAX] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUX86State *env, unsigned flags)
> +{
> +}
> +
>  #if defined(TARGET_ABI32)
>  abi_long do_set_thread_area(CPUX86State *env, abi_ulong ptr);
>  
> diff --git a/linux-user/m68k/target_cpu.h b/linux-user/m68k/target_cpu.h
> index 57b647bc07..c3f288dfe8 100644
> --- a/linux-user/m68k/target_cpu.h
> +++ b/linux-user/m68k/target_cpu.h
> @@ -30,6 +30,10 @@ static inline void cpu_clone_regs_child(CPUM68KState *env, target_ulong newsp,
>      env->dregs[0] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUM68KState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUM68KState *env, target_ulong newtls)
>  {
>      CPUState *cs = env_cpu(env);
> diff --git a/linux-user/microblaze/target_cpu.h b/linux-user/microblaze/target_cpu.h
> index e9bc0fce65..ce7b22ece7 100644
> --- a/linux-user/microblaze/target_cpu.h
> +++ b/linux-user/microblaze/target_cpu.h
> @@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUMBState *env, target_ulong newsp,
>      env->regs[3] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUMBState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUMBState *env, target_ulong newtls)
>  {
>      env->regs[21] = newtls;
> diff --git a/linux-user/mips/target_cpu.h b/linux-user/mips/target_cpu.h
> index 8601f712e0..758ae4d933 100644
> --- a/linux-user/mips/target_cpu.h
> +++ b/linux-user/mips/target_cpu.h
> @@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUMIPSState *env, target_ulong newsp,
>      env->active_tc.gpr[2] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUMIPSState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUMIPSState *env, target_ulong newtls)
>  {
>      env->active_tc.CP0_UserLocal = newtls;
> diff --git a/linux-user/nios2/target_cpu.h b/linux-user/nios2/target_cpu.h
> index fe5de7a9e3..50f0381067 100644
> --- a/linux-user/nios2/target_cpu.h
> +++ b/linux-user/nios2/target_cpu.h
> @@ -29,6 +29,10 @@ static inline void cpu_clone_regs_child(CPUNios2State *env, target_ulong newsp,
>      env->regs[R_RET0] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUNios2State *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUNios2State *env, target_ulong newtls)
>  {
>      /*
> diff --git a/linux-user/openrisc/target_cpu.h b/linux-user/openrisc/target_cpu.h
> index 309cf3eeb7..74370d67c4 100644
> --- a/linux-user/openrisc/target_cpu.h
> +++ b/linux-user/openrisc/target_cpu.h
> @@ -30,6 +30,10 @@ static inline void cpu_clone_regs_child(CPUOpenRISCState *env,
>      cpu_set_gpr(env, 11, 0);
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUOpenRISCState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUOpenRISCState *env, target_ulong newtls)
>  {
>      cpu_set_gpr(env, 10, newtls);
> diff --git a/linux-user/ppc/target_cpu.h b/linux-user/ppc/target_cpu.h
> index 028b28312c..76b67d2882 100644
> --- a/linux-user/ppc/target_cpu.h
> +++ b/linux-user/ppc/target_cpu.h
> @@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUPPCState *env, target_ulong newsp,
>      env->gpr[3] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUPPCState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUPPCState *env, target_ulong newtls)
>  {
>  #if defined(TARGET_PPC64)
> diff --git a/linux-user/riscv/target_cpu.h b/linux-user/riscv/target_cpu.h
> index 26dcafab1c..9c642367a3 100644
> --- a/linux-user/riscv/target_cpu.h
> +++ b/linux-user/riscv/target_cpu.h
> @@ -11,6 +11,10 @@ static inline void cpu_clone_regs_child(CPURISCVState *env, target_ulong newsp,
>      env->gpr[xA0] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPURISCVState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPURISCVState *env, target_ulong newtls)
>  {
>      env->gpr[xTP] = newtls;
> diff --git a/linux-user/s390x/target_cpu.h b/linux-user/s390x/target_cpu.h
> index 0b19e42f75..7cd71e2dba 100644
> --- a/linux-user/s390x/target_cpu.h
> +++ b/linux-user/s390x/target_cpu.h
> @@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUS390XState *env, target_ulong newsp,
>      env->regs[2] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUS390XState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUS390XState *env, target_ulong newtls)
>  {
>      env->aregs[0] = newtls >> 32;
> diff --git a/linux-user/sh4/target_cpu.h b/linux-user/sh4/target_cpu.h
> index 857af43ee3..5114f19424 100644
> --- a/linux-user/sh4/target_cpu.h
> +++ b/linux-user/sh4/target_cpu.h
> @@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUSH4State *env, target_ulong newsp,
>      env->gregs[0] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUSH4State *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUSH4State *env, target_ulong newtls)
>  {
>    env->gbr = newtls;
> diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
> index 029b0fc547..8ff706adce 100644
> --- a/linux-user/sparc/target_cpu.h
> +++ b/linux-user/sparc/target_cpu.h
> @@ -37,6 +37,10 @@ static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
>  #endif
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUSPARCState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUSPARCState *env, target_ulong newtls)
>  {
>      env->gregs[7] = newtls;
> diff --git a/linux-user/tilegx/target_cpu.h b/linux-user/tilegx/target_cpu.h
> index 0523dc414c..316b7a639c 100644
> --- a/linux-user/tilegx/target_cpu.h
> +++ b/linux-user/tilegx/target_cpu.h
> @@ -28,6 +28,10 @@ static inline void cpu_clone_regs_child(CPUTLGState *env, target_ulong newsp,
>      env->regs[TILEGX_R_RE] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUTLGState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUTLGState *env, target_ulong newtls)
>  {
>      env->regs[TILEGX_R_TP] = newtls;
> diff --git a/linux-user/xtensa/target_cpu.h b/linux-user/xtensa/target_cpu.h
> index 84f67d469e..0c77bafd66 100644
> --- a/linux-user/xtensa/target_cpu.h
> +++ b/linux-user/xtensa/target_cpu.h
> @@ -16,6 +16,10 @@ static inline void cpu_clone_regs_child(CPUXtensaState *env,
>      env->regs[2] = 0;
>  }
>  
> +static inline void cpu_clone_regs_parent(CPUXtensaState *env, unsigned flags)
> +{
> +}
> +
>  static inline void cpu_set_tls(CPUXtensaState *env, target_ulong newtls)
>  {
>      env->uregs[THREADPTR] = newtls;
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index a07d4b4774..ed18bcc825 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -5719,6 +5719,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
>          new_env = cpu_copy(env);
>          /* Init regs that differ from the parent.  */
>          cpu_clone_regs_child(new_env, newsp, flags);
> +        cpu_clone_regs_parent(env, flags);
>          new_cpu = env_cpu(new_env);
>          new_cpu->opaque = ts;
>          ts->bprm = parent_ts->bprm;
> @@ -5815,6 +5816,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
>              if (flags & CLONE_CHILD_CLEARTID)
>                  ts->child_tidptr = child_tidptr;
>          } else {
> +            cpu_clone_regs_parent(env, flags);
>              fork_end(0);
>          }
>      }
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 12/12] linux-user/alpha: Set r20 secondary return value
  2019-10-25 11:39 ` [PATCH v2 12/12] linux-user/alpha: Set r20 secondary return value Richard Henderson
  2019-10-25 12:56   ` Laurent Vivier
@ 2019-11-05  9:53   ` Laurent Vivier
  1 sibling, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:53 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> This value is not, as far as I know, used by any linux software,
> but it is set by the kernel and is part of the ABI.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> v2: Do not set the parent secondary return if SETTLS.
> ---
>  linux-user/alpha/target_cpu.h | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h
> index dd25e18f47..ad408ab5cc 100644
> --- a/linux-user/alpha/target_cpu.h
> +++ b/linux-user/alpha/target_cpu.h
> @@ -27,10 +27,19 @@ static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp,
>      }
>      env->ir[IR_V0] = 0;
>      env->ir[IR_A3] = 0;
> +    env->ir[IR_A4] = 1;  /* OSF/1 secondary return: child */
>  }
>  
>  static inline void cpu_clone_regs_parent(CPUAlphaState *env, unsigned flags)
>  {
> +    /*
> +     * OSF/1 secondary return: parent
> +     * Note that the kernel does not do this if SETTLS, because the
> +     * settls argument register is still live after copy_thread.
> +     */
> +    if (!(flags & CLONE_SETTLS)) {
> +        env->ir[IR_A4] = 0;
> +    }
>  }
>  
>  static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls)
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH v2 11/12] linux-user/sparc: Fix cpu_clone_regs_*
  2019-10-25 11:39 ` [PATCH v2 11/12] linux-user/sparc: Fix cpu_clone_regs_* Richard Henderson
@ 2019-11-05  9:54   ` Laurent Vivier
  0 siblings, 0 replies; 37+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:54 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: alex.bennee

Le 25/10/2019 à 13:39, Richard Henderson a écrit :
> 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>
> ---
> v2: Take CLONE_VM into account when performing syscall return.
> ---
>  linux-user/sparc/target_cpu.h | 47 ++++++++++++++++++++++++++++-------
>  1 file changed, 38 insertions(+), 9 deletions(-)
> 
> diff --git a/linux-user/sparc/target_cpu.h b/linux-user/sparc/target_cpu.h
> index 8ff706adce..14b2158969 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)
>  {
> -    if (newsp) {
> -        env->regwptr[22] = newsp;
> -    }
> -    /* syscall return for clone child: 0, and clear CF since
> -     * this counts as a success return value.
> +    /*
> +     * After cpu_copy, env->regwptr is pointing into the old env.
> +     * Update the new cpu to use its own register window.
>       */
> -    env->regwptr[0] = 0;
> -#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
> -    env->xcc &= ~PSR_CARRY;
> +    env->regwptr = env->regbase + (env->cwp * 16);
> +
> +    if (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->psr &= ~PSR_CARRY;
> +        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;
> +    }
> +
> +    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;
> +#else
> +        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)
> 

Applied to my linux-user branch.

Thanks,
Laurent


^ permalink raw reply	[flat|nested] 37+ messages in thread

end of thread, other threads:[~2019-11-05  9:58 UTC | newest]

Thread overview: 37+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-25 11:39 [PATCH v2 00/12] linux-user sparc fixes Richard Henderson
2019-10-25 11:39 ` [PATCH v2 01/12] scripts/qemu-binfmt-conf: Update for sparc64 Richard Henderson
2019-11-05  9:43   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 02/12] tests/tcg/multiarch/linux-test: Fix error check for shmat Richard Henderson
2019-10-25 12:59   ` Philippe Mathieu-Daudé
2019-10-25 13:00   ` Philippe Mathieu-Daudé
2019-11-05  9:45   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 03/12] target/sparc: Define an enumeration for accessing env->regwptr Richard Henderson
2019-11-05  9:45   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 04/12] linux-user/sparc: Use WREG constants in sparc/target_cpu.h Richard Henderson
2019-10-25 12:09   ` Laurent Vivier
2019-11-05  9:49   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 05/12] linux-user/sparc: Begin using WREG constants in sparc/signal.c Richard Henderson
2019-10-25 12:16   ` Laurent Vivier
2019-11-05  9:49   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 06/12] linux-user/sparc: Use WREG_SP constant " Richard Henderson
2019-10-25 12:19   ` Laurent Vivier
2019-11-05  9:50   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 07/12] linux-user/sparc: Fix WREG usage in setup_frame Richard Henderson
2019-11-05  9:50   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 08/12] linux-user/sparc64: Fix target_signal_frame Richard Henderson
2019-10-25 12:47   ` Laurent Vivier
2019-10-25 13:38     ` Richard Henderson
2019-10-25 13:43       ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 09/12] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child Richard Henderson
2019-10-25 13:03   ` Philippe Mathieu-Daudé
2019-11-05  9:52   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 10/12] linux-user: Introduce cpu_clone_regs_parent Richard Henderson
2019-10-25 13:04   ` Philippe Mathieu-Daudé
2019-11-05  9:52   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 11/12] linux-user/sparc: Fix cpu_clone_regs_* Richard Henderson
2019-11-05  9:54   ` Laurent Vivier
2019-10-25 11:39 ` [PATCH v2 12/12] linux-user/alpha: Set r20 secondary return value Richard Henderson
2019-10-25 12:56   ` Laurent Vivier
2019-11-05  9:53   ` Laurent Vivier
2019-10-25 12:50 ` [PATCH v2 00/12] linux-user sparc fixes Laurent Vivier
2019-10-26  7:02 ` no-reply

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).