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

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