qemu-devel.nongnu.org archive mirror
 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@nongnu.org

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