Blame SOURCES/kvm-tcg-workaround-branch-instruction-overflow-in-tcg_ou.patch

357786
From 1ef4307f6e1299d337bc925ea7bbea41c2f99706 Mon Sep 17 00:00:00 2001
357786
From: Laurent Vivier <lvivier@redhat.com>
357786
Date: Fri, 4 May 2018 09:38:55 +0200
357786
Subject: [PATCH 06/13] tcg: workaround branch instruction overflow in
357786
 tcg_out_qemu_ld/st
357786
357786
RH-Author: Laurent Vivier <lvivier@redhat.com>
357786
Message-id: <20180504093855.30922-1-lvivier@redhat.com>
357786
Patchwork-id: 80025
357786
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH] tcg: workaround branch instruction overflow in tcg_out_qemu_ld/st
357786
Bugzilla: 1574577
357786
RH-Acked-by: Serhii Popovych <spopovyc@redhat.com>
357786
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
357786
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
357786
357786
ppc64 uses a BC instruction to call the tcg_out_qemu_ld/st
357786
slow path. BC instruction uses a relative address encoded
357786
on 14 bits.
357786
357786
The slow path functions are added at the end of the generated
357786
instructions buffer, in the reverse order of the callers.
357786
So more we have slow path functions more the distance between
357786
the caller (BC) and the function increases.
357786
357786
This patch changes the behavior to generate the functions in
357786
the same order of the callers.
357786
357786
Cc: qemu-stable@nongnu.org
357786
Fixes: 15fa08f845 ("tcg: Dynamically allocate TCGOps")
357786
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
357786
Message-Id: <20180429235840.16659-1-lvivier@redhat.com>
357786
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
357786
(cherry picked from commit 6001f7729e12dd1d810291e4cbf83cee8e07441d)
357786
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
357786
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
357786
---
357786
 tcg/tcg-ldst.inc.c | 8 ++++----
357786
 tcg/tcg.c          | 2 +-
357786
 tcg/tcg.h          | 2 +-
357786
 3 files changed, 6 insertions(+), 6 deletions(-)
357786
357786
diff --git a/tcg/tcg-ldst.inc.c b/tcg/tcg-ldst.inc.c
357786
index 0e14cf4..47f41b9 100644
357786
--- a/tcg/tcg-ldst.inc.c
357786
+++ b/tcg/tcg-ldst.inc.c
357786
@@ -30,7 +30,7 @@ typedef struct TCGLabelQemuLdst {
357786
     TCGReg datahi_reg;      /* reg index for high word to be loaded or stored */
357786
     tcg_insn_unit *raddr;   /* gen code addr of the next IR of qemu_ld/st IR */
357786
     tcg_insn_unit *label_ptr[2]; /* label pointers to be updated */
357786
-    struct TCGLabelQemuLdst *next;
357786
+    QSIMPLEQ_ENTRY(TCGLabelQemuLdst) next;
357786
 } TCGLabelQemuLdst;
357786
 
357786
 
357786
@@ -46,7 +46,7 @@ static bool tcg_out_ldst_finalize(TCGContext *s)
357786
     TCGLabelQemuLdst *lb;
357786
 
357786
     /* qemu_ld/st slow paths */
357786
-    for (lb = s->ldst_labels; lb != NULL; lb = lb->next) {
357786
+    QSIMPLEQ_FOREACH(lb, &s->ldst_labels, next) {
357786
         if (lb->is_ld) {
357786
             tcg_out_qemu_ld_slow_path(s, lb);
357786
         } else {
357786
@@ -72,7 +72,7 @@ static inline TCGLabelQemuLdst *new_ldst_label(TCGContext *s)
357786
 {
357786
     TCGLabelQemuLdst *l = tcg_malloc(sizeof(*l));
357786
 
357786
-    l->next = s->ldst_labels;
357786
-    s->ldst_labels = l;
357786
+    QSIMPLEQ_INSERT_TAIL(&s->ldst_labels, l, next);
357786
+
357786
     return l;
357786
 }
357786
diff --git a/tcg/tcg.c b/tcg/tcg.c
357786
index bb24526..b84850b 100644
357786
--- a/tcg/tcg.c
357786
+++ b/tcg/tcg.c
357786
@@ -3324,7 +3324,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
357786
     s->code_ptr = tb->tc.ptr;
357786
 
357786
 #ifdef TCG_TARGET_NEED_LDST_LABELS
357786
-    s->ldst_labels = NULL;
357786
+    QSIMPLEQ_INIT(&s->ldst_labels);
357786
 #endif
357786
 #ifdef TCG_TARGET_NEED_POOL_LABELS
357786
     s->pool_labels = NULL;
357786
diff --git a/tcg/tcg.h b/tcg/tcg.h
357786
index 30896ca..a3076c5 100644
357786
--- a/tcg/tcg.h
357786
+++ b/tcg/tcg.h
357786
@@ -699,7 +699,7 @@ struct TCGContext {
357786
 
357786
     /* These structures are private to tcg-target.inc.c.  */
357786
 #ifdef TCG_TARGET_NEED_LDST_LABELS
357786
-    struct TCGLabelQemuLdst *ldst_labels;
357786
+    QSIMPLEQ_HEAD(ldst_labels, TCGLabelQemuLdst) ldst_labels;
357786
 #endif
357786
 #ifdef TCG_TARGET_NEED_POOL_LABELS
357786
     struct TCGLabelPoolData *pool_labels;
357786
-- 
357786
1.8.3.1
357786