yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

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

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