|
|
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 |
|