Blame SOURCES/0001-executor-fix-load-of-parameters-smaller-than-64-bits.patch

65e934
From e2b4dd77dec4e3f471b59336ef99b1151638ad38 Mon Sep 17 00:00:00 2001
65e934
From: Wim Taymans <wtaymans@redhat.com>
65e934
Date: Mon, 7 Sep 2015 15:30:36 +0200
65e934
Subject: [PATCH] executor: fix load of parameters smaller than 64 bits
65e934
65e934
Parameters less than 64 bits are passed in just one param register.
65e934
Fixes crashes on ldresnearb and friends in emulated code.
65e934
---
65e934
 orc/orcexecutor.c | 13 +++++++++----
65e934
 1 file changed, 9 insertions(+), 4 deletions(-)
65e934
65e934
diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c
65e934
index 6fe296d..6306d34 100644
65e934
--- a/orc/orcexecutor.c
65e934
+++ b/orc/orcexecutor.c
65e934
@@ -295,10 +295,15 @@ orc_executor_emulate (OrcExecutor *ex)
65e934
       } else if (var->vartype == ORC_VAR_TYPE_PARAM) {
65e934
         opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]];
65e934
         /* FIXME hack */
65e934
-        load_constant (tmpspace[insn->src_args[k]], 8,
65e934
-            (orc_uint64)(orc_uint32)ex->params[insn->src_args[k]] |
65e934
-            (((orc_uint64)(orc_uint32)ex->params[insn->src_args[k] +
65e934
-             (ORC_VAR_T1 - ORC_VAR_P1)])<<32));
65e934
+        if (var->size == 8) {
65e934
+          load_constant (tmpspace[insn->src_args[k]], 8,
65e934
+              (orc_uint64)(orc_uint32)ex->params[insn->src_args[k]] |
65e934
+              (((orc_uint64)(orc_uint32)ex->params[insn->src_args[k] +
65e934
+               (ORC_VAR_T1 - ORC_VAR_P1)])<<32));
65e934
+        } else {
65e934
+          load_constant (tmpspace[insn->src_args[k]], 8,
65e934
+              ex->params[insn->src_args[k]]);
65e934
+        }
65e934
       } else if (var->vartype == ORC_VAR_TYPE_TEMP) {
65e934
         opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]];
65e934
       } else if (var->vartype == ORC_VAR_TYPE_SRC) {
65e934
-- 
65e934
2.4.3
65e934