All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2] tcg constant pool fixups
@ 2017-10-26 15:27 Richard Henderson
  2017-10-26 15:27 ` [Qemu-devel] [PATCH 1/2] tcg: Allow constant pool entries in the prologue Richard Henderson
  2017-10-26 15:27 ` [Qemu-devel] [PATCH 2/2] tcg/s390x: Use constant pool for prologue Richard Henderson
  0 siblings, 2 replies; 5+ messages in thread
From: Richard Henderson @ 2017-10-26 15:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-s390x, laurent.desnogues

As noted by Laurent in private mail, foo-linux-user is currently
broken on aarch64 host in unususal circumstances.  By inspection,
the same thing could happen for armv6 host.  My testing is always
on armv7 hardware, so I wouldn't have seen this.

With that fixed, the s390x code can be simplified a bit to take
advantage of this.

If the s390x maintainers could test this, I would appreciate it. 
The test case is

  ./i386-linux-user/qemu-i386 -B 0x111231000 ./some-static-i386

e.g. using the binary in the busyboxes tarball linked from

  https://wiki.qemu.org/Testing#User_mode_emulation

although any staticly linked binary would work.


r~


Richard Henderson (2):
  tcg: Allow constant pool entries in the prologue
  tcg/s390x: Use constant pool for prologue

 tcg/s390/tcg-target.inc.c | 44 ++++++++++++------------------------------
 tcg/tcg.c                 | 49 ++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 54 insertions(+), 39 deletions(-)

-- 
2.13.6

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

* [Qemu-devel] [PATCH 1/2] tcg: Allow constant pool entries in the prologue
  2017-10-26 15:27 [Qemu-devel] [PATCH 0/2] tcg constant pool fixups Richard Henderson
@ 2017-10-26 15:27 ` Richard Henderson
  2017-10-26 17:44   ` Emilio G. Cota
  2017-10-27  5:09   ` Laurent Desnogues
  2017-10-26 15:27 ` [Qemu-devel] [PATCH 2/2] tcg/s390x: Use constant pool for prologue Richard Henderson
  1 sibling, 2 replies; 5+ messages in thread
From: Richard Henderson @ 2017-10-26 15:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-s390x, laurent.desnogues

Both ARMv6 and AArch64 currently may drop complex guest_base values
into the constant pool.  But generic code wasn't expecting that, and
the pool is not emitted.  Correct that.

Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 tcg/tcg.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 42 insertions(+), 7 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 683ff4abb7..c22f1c4441 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -771,12 +771,32 @@ void tcg_prologue_init(TCGContext *s)
 
     /* Put the prologue at the beginning of code_gen_buffer.  */
     buf0 = s->code_gen_buffer;
+    total_size = s->code_gen_buffer_size;
     s->code_ptr = buf0;
     s->code_buf = buf0;
+    s->data_gen_ptr = NULL;
     s->code_gen_prologue = buf0;
 
+    /* Compute a high-water mark, at which we voluntarily flush the buffer
+       and start over.  The size here is arbitrary, significantly larger
+       than we expect the code generation for any one opcode to require.  */
+    s->code_gen_highwater = s->code_gen_buffer + (total_size - TCG_HIGHWATER);
+
+#ifdef TCG_TARGET_NEED_POOL_LABELS
+    s->pool_labels = NULL;
+#endif
+
     /* Generate the prologue.  */
     tcg_target_qemu_prologue(s);
+
+#ifdef TCG_TARGET_NEED_POOL_LABELS
+    /* Allow the prologue to put e.g. guest_base into a pool entry.  */
+    {
+        bool ok = tcg_out_pool_finalize(s);
+        tcg_debug_assert(ok);
+    }
+#endif
+
     buf1 = s->code_ptr;
     flush_icache_range((uintptr_t)buf0, (uintptr_t)buf1);
 
@@ -785,21 +805,36 @@ void tcg_prologue_init(TCGContext *s)
     s->code_gen_ptr = buf1;
     s->code_gen_buffer = buf1;
     s->code_buf = buf1;
-    total_size = s->code_gen_buffer_size - prologue_size;
+    total_size -= prologue_size;
     s->code_gen_buffer_size = total_size;
 
-    /* Compute a high-water mark, at which we voluntarily flush the buffer
-       and start over.  The size here is arbitrary, significantly larger
-       than we expect the code generation for any one opcode to require.  */
-    s->code_gen_highwater = s->code_gen_buffer + (total_size - TCG_HIGHWATER);
-
     tcg_register_jit(s->code_gen_buffer, total_size);
 
 #ifdef DEBUG_DISAS
     if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
         qemu_log_lock();
         qemu_log("PROLOGUE: [size=%zu]\n", prologue_size);
-        log_disas(buf0, prologue_size);
+        if (s->data_gen_ptr) {
+            size_t code_size = s->data_gen_ptr - buf0;
+            size_t data_size = prologue_size - code_size;
+            size_t i;
+
+            log_disas(buf0, code_size);
+
+            for (i = 0; i < data_size; i += sizeof(tcg_target_ulong)) {
+                if (sizeof(tcg_target_ulong) == 8) {
+                    qemu_log("0x%08" PRIxPTR ":  .quad  0x%016" PRIx64 "\n",
+                             (uintptr_t)s->data_gen_ptr + i,
+                             *(uint64_t *)(s->data_gen_ptr + i));
+                } else {
+                    qemu_log("0x%08" PRIxPTR ":  .long  0x%08x\n",
+                             (uintptr_t)s->data_gen_ptr + i,
+                             *(uint32_t *)(s->data_gen_ptr + i));
+                }
+            }
+        } else {
+            log_disas(buf0, prologue_size);
+        }
         qemu_log("\n");
         qemu_log_flush();
         qemu_log_unlock();
-- 
2.13.6

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

* [Qemu-devel] [PATCH 2/2] tcg/s390x: Use constant pool for prologue
  2017-10-26 15:27 [Qemu-devel] [PATCH 0/2] tcg constant pool fixups Richard Henderson
  2017-10-26 15:27 ` [Qemu-devel] [PATCH 1/2] tcg: Allow constant pool entries in the prologue Richard Henderson
@ 2017-10-26 15:27 ` Richard Henderson
  1 sibling, 0 replies; 5+ messages in thread
From: Richard Henderson @ 2017-10-26 15:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-s390x, laurent.desnogues

Rather than have separate code only used for guest_base,
rely on a recent change to handle constant pool entries.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 tcg/s390/tcg-target.inc.c | 44 ++++++++++++--------------------------------
 1 file changed, 12 insertions(+), 32 deletions(-)

diff --git a/tcg/s390/tcg-target.inc.c b/tcg/s390/tcg-target.inc.c
index 38a7cdab75..9af6dcef05 100644
--- a/tcg/s390/tcg-target.inc.c
+++ b/tcg/s390/tcg-target.inc.c
@@ -555,9 +555,6 @@ static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg dst, TCGReg src)
 static const S390Opcode lli_insns[4] = {
     RI_LLILL, RI_LLILH, RI_LLIHL, RI_LLIHH
 };
-static const S390Opcode ii_insns[4] = {
-    RI_IILL, RI_IILH, RI_IIHL, RI_IIHH
-};
 
 static bool maybe_out_small_movi(TCGContext *s, TCGType type,
                                  TCGReg ret, tcg_target_long sval)
@@ -647,36 +644,19 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret,
         return;
     }
 
-    /* When allowed, stuff it in the constant pool.  */
-    if (!in_prologue) {
-        if (USE_REG_TB) {
-            tcg_out_insn(s, RXY, LG, ret, TCG_REG_TB, TCG_REG_NONE, 0);
-            new_pool_label(s, sval, R_390_20, s->code_ptr - 2,
-                           -(intptr_t)s->code_gen_ptr);
-        } else {
-            tcg_out_insn(s, RIL, LGRL, ret, 0);
-            new_pool_label(s, sval, R_390_PC32DBL, s->code_ptr - 2, 2);
-        }
-        return;
-    }
-
-    /* What's left is for the prologue, loading GUEST_BASE, and because
-       it failed to match above, is known to be a full 64-bit quantity.
-       We could try more than this, but it probably wouldn't pay off.  */
-    if (s390_facilities & FACILITY_EXT_IMM) {
-        tcg_out_insn(s, RIL, LLILF, ret, uval);
-        tcg_out_insn(s, RIL, IIHF, ret, uval >> 32);
+    /* Otherwise, stuff it in the constant pool.  */
+    if (s390_facilities & FACILITY_GEN_INST_EXT) {
+        tcg_out_insn(s, RIL, LGRL, ret, 0);
+        new_pool_label(s, sval, R_390_PC32DBL, s->code_ptr - 2, 2);
+    } else if (USE_REG_TB && !in_prologue) {
+        tcg_out_insn(s, RXY, LG, ret, TCG_REG_TB, TCG_REG_NONE, 0);
+        new_pool_label(s, sval, R_390_20, s->code_ptr - 2,
+                       -(intptr_t)s->code_gen_ptr);
     } else {
-        const S390Opcode *insns = lli_insns;
-        int i;
-
-        for (i = 0; i < 4; i++) {
-            uint16_t part = uval >> (16 * i);
-            if (part) {
-                tcg_out_insn_RI(s, insns[i], ret, part);
-                insns = ii_insns;
-            }
-        }
+        TCGReg base = ret ? ret : TCG_TMP0;
+        tcg_out_insn(s, RIL, LARL, base, 0);
+        new_pool_label(s, sval, R_390_PC32DBL, s->code_ptr - 2, 2);
+        tcg_out_insn(s, RXY, LG, ret, base, TCG_REG_NONE, 0);
     }
 }
 
-- 
2.13.6

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

* Re: [Qemu-devel] [PATCH 1/2] tcg: Allow constant pool entries in the prologue
  2017-10-26 15:27 ` [Qemu-devel] [PATCH 1/2] tcg: Allow constant pool entries in the prologue Richard Henderson
@ 2017-10-26 17:44   ` Emilio G. Cota
  2017-10-27  5:09   ` Laurent Desnogues
  1 sibling, 0 replies; 5+ messages in thread
From: Emilio G. Cota @ 2017-10-26 17:44 UTC (permalink / raw)
  To: Richard Henderson; +Cc: qemu-devel, laurent.desnogues, qemu-s390x

On Thu, Oct 26, 2017 at 17:27:03 +0200, Richard Henderson wrote:
> Both ARMv6 and AArch64 currently may drop complex guest_base values
> into the constant pool.  But generic code wasn't expecting that, and
> the pool is not emitted.  Correct that.
> 
> Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

Tested-by: Emilio G. Cota <cota@braap.org>

on an aarch64 host.

		Emilio

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

* Re: [Qemu-devel] [PATCH 1/2] tcg: Allow constant pool entries in the prologue
  2017-10-26 15:27 ` [Qemu-devel] [PATCH 1/2] tcg: Allow constant pool entries in the prologue Richard Henderson
  2017-10-26 17:44   ` Emilio G. Cota
@ 2017-10-27  5:09   ` Laurent Desnogues
  1 sibling, 0 replies; 5+ messages in thread
From: Laurent Desnogues @ 2017-10-27  5:09 UTC (permalink / raw)
  To: Richard Henderson; +Cc: qemu-devel

Hello,

On Thu, Oct 26, 2017 at 5:27 PM, Richard Henderson
<richard.henderson@linaro.org> wrote:
> Both ARMv6 and AArch64 currently may drop complex guest_base values
> into the constant pool.  But generic code wasn't expecting that, and
> the pool is not emitted.  Correct that.
>
> Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>

on an AArch64 host and with running qemu on qemu.

Thanks for taking care of the issue,

Laurent

> ---
>  tcg/tcg.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index 683ff4abb7..c22f1c4441 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -771,12 +771,32 @@ void tcg_prologue_init(TCGContext *s)
>
>      /* Put the prologue at the beginning of code_gen_buffer.  */
>      buf0 = s->code_gen_buffer;
> +    total_size = s->code_gen_buffer_size;
>      s->code_ptr = buf0;
>      s->code_buf = buf0;
> +    s->data_gen_ptr = NULL;
>      s->code_gen_prologue = buf0;
>
> +    /* Compute a high-water mark, at which we voluntarily flush the buffer
> +       and start over.  The size here is arbitrary, significantly larger
> +       than we expect the code generation for any one opcode to require.  */
> +    s->code_gen_highwater = s->code_gen_buffer + (total_size - TCG_HIGHWATER);
> +
> +#ifdef TCG_TARGET_NEED_POOL_LABELS
> +    s->pool_labels = NULL;
> +#endif
> +
>      /* Generate the prologue.  */
>      tcg_target_qemu_prologue(s);
> +
> +#ifdef TCG_TARGET_NEED_POOL_LABELS
> +    /* Allow the prologue to put e.g. guest_base into a pool entry.  */
> +    {
> +        bool ok = tcg_out_pool_finalize(s);
> +        tcg_debug_assert(ok);
> +    }
> +#endif
> +
>      buf1 = s->code_ptr;
>      flush_icache_range((uintptr_t)buf0, (uintptr_t)buf1);
>
> @@ -785,21 +805,36 @@ void tcg_prologue_init(TCGContext *s)
>      s->code_gen_ptr = buf1;
>      s->code_gen_buffer = buf1;
>      s->code_buf = buf1;
> -    total_size = s->code_gen_buffer_size - prologue_size;
> +    total_size -= prologue_size;
>      s->code_gen_buffer_size = total_size;
>
> -    /* Compute a high-water mark, at which we voluntarily flush the buffer
> -       and start over.  The size here is arbitrary, significantly larger
> -       than we expect the code generation for any one opcode to require.  */
> -    s->code_gen_highwater = s->code_gen_buffer + (total_size - TCG_HIGHWATER);
> -
>      tcg_register_jit(s->code_gen_buffer, total_size);
>
>  #ifdef DEBUG_DISAS
>      if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
>          qemu_log_lock();
>          qemu_log("PROLOGUE: [size=%zu]\n", prologue_size);
> -        log_disas(buf0, prologue_size);
> +        if (s->data_gen_ptr) {
> +            size_t code_size = s->data_gen_ptr - buf0;
> +            size_t data_size = prologue_size - code_size;
> +            size_t i;
> +
> +            log_disas(buf0, code_size);
> +
> +            for (i = 0; i < data_size; i += sizeof(tcg_target_ulong)) {
> +                if (sizeof(tcg_target_ulong) == 8) {
> +                    qemu_log("0x%08" PRIxPTR ":  .quad  0x%016" PRIx64 "\n",
> +                             (uintptr_t)s->data_gen_ptr + i,
> +                             *(uint64_t *)(s->data_gen_ptr + i));
> +                } else {
> +                    qemu_log("0x%08" PRIxPTR ":  .long  0x%08x\n",
> +                             (uintptr_t)s->data_gen_ptr + i,
> +                             *(uint32_t *)(s->data_gen_ptr + i));
> +                }
> +            }
> +        } else {
> +            log_disas(buf0, prologue_size);
> +        }
>          qemu_log("\n");
>          qemu_log_flush();
>          qemu_log_unlock();
> --
> 2.13.6
>

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

end of thread, other threads:[~2017-10-27  5:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-26 15:27 [Qemu-devel] [PATCH 0/2] tcg constant pool fixups Richard Henderson
2017-10-26 15:27 ` [Qemu-devel] [PATCH 1/2] tcg: Allow constant pool entries in the prologue Richard Henderson
2017-10-26 17:44   ` Emilio G. Cota
2017-10-27  5:09   ` Laurent Desnogues
2017-10-26 15:27 ` [Qemu-devel] [PATCH 2/2] tcg/s390x: Use constant pool for prologue Richard Henderson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.