diff mbox

tcg/mips: Bugfix for crash when running program with qemu-i386.

Message ID 1499397307-13605-1-git-send-email-jiang.biao2@zte.com.cn
State New
Headers show

Commit Message

Jiang Biao July 7, 2017, 3:15 a.m. UTC
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 <jiang.biao2@zte.com.cn>
---
 tcg/mips/tcg-target.inc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Richard Henderson July 7, 2017, 4:12 a.m. UTC | #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<jiang.biao2@zte.com.cn>
> ---
>   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~
diff mbox

Patch

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;