[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] tcg/mips: Bugfix for crash when running program
From: |
Richard Henderson |
Subject: |
Re: [Qemu-devel] [PATCH] tcg/mips: Bugfix for crash when running program with qemu-i386. |
Date: |
Thu, 6 Jul 2017 18:12:12 -1000 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 |
On 07/06/2017 05:15 PM, Jiang Biao wrote:
When running a helloworld program with qemu-i386 in linux-user
mode on Loongson 3A3000, it will crash. This patch fix the bug.
Signed-off-by: Jiang Biao<address@hidden>
---
tcg/mips/tcg-target.inc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tcg/mips/tcg-target.inc.c b/tcg/mips/tcg-target.inc.c
index 8cff9a6..e6fedc9 100644
--- a/tcg/mips/tcg-target.inc.c
+++ b/tcg/mips/tcg-target.inc.c
@@ -1540,7 +1540,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg
*args, bool is_64)
#else
if (TCG_TARGET_REG_BITS > TARGET_LONG_BITS) {
tcg_out_ext32u(s, base, addr_regl);
- addr_regl = base;
+ tcg_out_mov(s, TCG_TYPE_PTR, addr_regl, base);
}
if (guest_base == 0 && data_regl != addr_regl) {
base = addr_regl;
This is wrong, because you're not allowed to modify the input operands.
Try this, just a few lines lower in the function:
- tcg_out_movi(s, TCG_TYPE_PTR, base, guest_base);
- tcg_out_opc_reg(s, ALIAS_PADD, base, base, addr_regl);
+ tcg_out_movi(s, TCG_TYPE_PTR, TCG_TMP0, guest_base);
+ tcg_out_opc_reg(s, ALIAS_PADD, base, TCG_TMP0, addr_regl);
and you'll need the same change within tcg_out_qemu_st.
Better would be to reserve a register for the guest_base, like we do for ppc.
See all of the uses of TCG_GUEST_BASE_REG in tcg/ppc/tcg-target.inc.c.
r~