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~