|
|
ae23c9 |
From 3319e2fd5b151695f30f8574bbd9250f86a96e16 Mon Sep 17 00:00:00 2001
|
|
|
ae23c9 |
From: Laurent Vivier <lvivier@redhat.com>
|
|
|
ae23c9 |
Date: Thu, 3 May 2018 14:59:08 +0100
|
|
|
ae23c9 |
Subject: tcg: workaround branch instruction overflow in tcg_out_qemu_ld/st
|
|
|
ae23c9 |
|
|
|
ae23c9 |
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
|
|
ae23c9 |
Message-id: <20180503145908.8110-1-lvivier@redhat.com>
|
|
|
ae23c9 |
Patchwork-id: 80019
|
|
|
ae23c9 |
O-Subject: [qemu-kvm RHEL8/virt212 PATCH] tcg: workaround branch instruction overflow in tcg_out_qemu_ld/st
|
|
|
ae23c9 |
Bugzilla: 1571145
|
|
|
ae23c9 |
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
|
ae23c9 |
RH-Acked-by: Serhii Popovych <spopovyc@redhat.com>
|
|
|
ae23c9 |
RH-Acked-by: David Gibson <dgibson@redhat.com>
|
|
|
ae23c9 |
|
|
|
ae23c9 |
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1571145
|
|
|
ae23c9 |
BRANCH:rhel8/master-2.12.0
|
|
|
ae23c9 |
UPSTREAM: https://github.com/qemu/qemu/commit/6001f7729e12dd1d810291e4cbf83cee8e07441d
|
|
|
ae23c9 |
BREW: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=15973114
|
|
|
ae23c9 |
|
|
|
ae23c9 |
ppc64 uses a BC instruction to call the tcg_out_qemu_ld/st
|
|
|
ae23c9 |
slow path. BC instruction uses a relative address encoded
|
|
|
ae23c9 |
on 14 bits.
|
|
|
ae23c9 |
|
|
|
ae23c9 |
The slow path functions are added at the end of the generated
|
|
|
ae23c9 |
instructions buffer, in the reverse order of the callers.
|
|
|
ae23c9 |
So more we have slow path functions more the distance between
|
|
|
ae23c9 |
the caller (BC) and the function increases.
|
|
|
ae23c9 |
|
|
|
ae23c9 |
This patch changes the behavior to generate the functions in
|
|
|
ae23c9 |
the same order of the callers.
|
|
|
ae23c9 |
|
|
|
ae23c9 |
Cc: qemu-stable@nongnu.org
|
|
|
ae23c9 |
Fixes: 15fa08f845 ("tcg: Dynamically allocate TCGOps")
|
|
|
ae23c9 |
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
ae23c9 |
Message-Id: <20180429235840.16659-1-lvivier@redhat.com>
|
|
|
ae23c9 |
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
|
|
|
ae23c9 |
(cherry picked from commit 6001f7729e12dd1d810291e4cbf83cee8e07441d)
|
|
|
ae23c9 |
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
ae23c9 |
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
|
ae23c9 |
---
|
|
|
ae23c9 |
tcg/tcg-ldst.inc.c | 8 ++++----
|
|
|
ae23c9 |
tcg/tcg.c | 2 +-
|
|
|
ae23c9 |
tcg/tcg.h | 2 +-
|
|
|
ae23c9 |
3 files changed, 6 insertions(+), 6 deletions(-)
|
|
|
ae23c9 |
|
|
|
ae23c9 |
diff --git a/tcg/tcg-ldst.inc.c b/tcg/tcg-ldst.inc.c
|
|
|
ae23c9 |
index 0e14cf4..47f41b9 100644
|
|
|
ae23c9 |
--- a/tcg/tcg-ldst.inc.c
|
|
|
ae23c9 |
+++ b/tcg/tcg-ldst.inc.c
|
|
|
ae23c9 |
@@ -30,7 +30,7 @@ typedef struct TCGLabelQemuLdst {
|
|
|
ae23c9 |
TCGReg datahi_reg; /* reg index for high word to be loaded or stored */
|
|
|
ae23c9 |
tcg_insn_unit *raddr; /* gen code addr of the next IR of qemu_ld/st IR */
|
|
|
ae23c9 |
tcg_insn_unit *label_ptr[2]; /* label pointers to be updated */
|
|
|
ae23c9 |
- struct TCGLabelQemuLdst *next;
|
|
|
ae23c9 |
+ QSIMPLEQ_ENTRY(TCGLabelQemuLdst) next;
|
|
|
ae23c9 |
} TCGLabelQemuLdst;
|
|
|
ae23c9 |
|
|
|
ae23c9 |
|
|
|
ae23c9 |
@@ -46,7 +46,7 @@ static bool tcg_out_ldst_finalize(TCGContext *s)
|
|
|
ae23c9 |
TCGLabelQemuLdst *lb;
|
|
|
ae23c9 |
|
|
|
ae23c9 |
/* qemu_ld/st slow paths */
|
|
|
ae23c9 |
- for (lb = s->ldst_labels; lb != NULL; lb = lb->next) {
|
|
|
ae23c9 |
+ QSIMPLEQ_FOREACH(lb, &s->ldst_labels, next) {
|
|
|
ae23c9 |
if (lb->is_ld) {
|
|
|
ae23c9 |
tcg_out_qemu_ld_slow_path(s, lb);
|
|
|
ae23c9 |
} else {
|
|
|
ae23c9 |
@@ -72,7 +72,7 @@ static inline TCGLabelQemuLdst *new_ldst_label(TCGContext *s)
|
|
|
ae23c9 |
{
|
|
|
ae23c9 |
TCGLabelQemuLdst *l = tcg_malloc(sizeof(*l));
|
|
|
ae23c9 |
|
|
|
ae23c9 |
- l->next = s->ldst_labels;
|
|
|
ae23c9 |
- s->ldst_labels = l;
|
|
|
ae23c9 |
+ QSIMPLEQ_INSERT_TAIL(&s->ldst_labels, l, next);
|
|
|
ae23c9 |
+
|
|
|
ae23c9 |
return l;
|
|
|
ae23c9 |
}
|
|
|
ae23c9 |
diff --git a/tcg/tcg.c b/tcg/tcg.c
|
|
|
ae23c9 |
index bb24526..b84850b 100644
|
|
|
ae23c9 |
--- a/tcg/tcg.c
|
|
|
ae23c9 |
+++ b/tcg/tcg.c
|
|
|
ae23c9 |
@@ -3324,7 +3324,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
|
|
|
ae23c9 |
s->code_ptr = tb->tc.ptr;
|
|
|
ae23c9 |
|
|
|
ae23c9 |
#ifdef TCG_TARGET_NEED_LDST_LABELS
|
|
|
ae23c9 |
- s->ldst_labels = NULL;
|
|
|
ae23c9 |
+ QSIMPLEQ_INIT(&s->ldst_labels);
|
|
|
ae23c9 |
#endif
|
|
|
ae23c9 |
#ifdef TCG_TARGET_NEED_POOL_LABELS
|
|
|
ae23c9 |
s->pool_labels = NULL;
|
|
|
ae23c9 |
diff --git a/tcg/tcg.h b/tcg/tcg.h
|
|
|
ae23c9 |
index 30896ca..a3076c5 100644
|
|
|
ae23c9 |
--- a/tcg/tcg.h
|
|
|
ae23c9 |
+++ b/tcg/tcg.h
|
|
|
ae23c9 |
@@ -699,7 +699,7 @@ struct TCGContext {
|
|
|
ae23c9 |
|
|
|
ae23c9 |
/* These structures are private to tcg-target.inc.c. */
|
|
|
ae23c9 |
#ifdef TCG_TARGET_NEED_LDST_LABELS
|
|
|
ae23c9 |
- struct TCGLabelQemuLdst *ldst_labels;
|
|
|
ae23c9 |
+ QSIMPLEQ_HEAD(ldst_labels, TCGLabelQemuLdst) ldst_labels;
|
|
|
ae23c9 |
#endif
|
|
|
ae23c9 |
#ifdef TCG_TARGET_NEED_POOL_LABELS
|
|
|
ae23c9 |
struct TCGLabelPoolData *pool_labels;
|
|
|
ae23c9 |
--
|
|
|
ae23c9 |
1.8.3.1
|
|
|
ae23c9 |
|