* Re: [Qemu-devel] [PATCH] tcg/mips: Bugfix for crash whenrunningprogram with qemu-i386.
@ 2017-07-10 3:15 jiang.biao2
2017-07-10 5:44 ` Richard Henderson
0 siblings, 1 reply; 2+ messages in thread
From: jiang.biao2 @ 2017-07-10 3:15 UTC (permalink / raw)
To: rth
Cc: qemu-devel, james.hogan, zhong.weidong, wang.liang82,
shi.zhongbing, jinguojie, jiang.yong5
> On 07/09/2017 04:04 PM, jiang.biao2@zte.com.cn wrote:
> > >> 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)
> >
> > >
> >
> > Got it, but the real problem is for addr_regl instead of guest_base.
>
> Guest base is a problem simply because we require a temporary for it, and we
> were trying to put two temporaries into the same register.
>
> If we retain guest_base in a register all of the time, then (1) we do not have
> to recompute it for every memory load and (2) we do not need a temporary for it.
>
> > > > 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.
> >
> > It uses base(TCG_REG_A0) for temperary use for guest_base in this case.
>
> No it doesn't. It computes guest_base into a register in the prologue:
>
> > #ifndef CONFIG_SOFTMMU
> > if (guest_base) {
> > tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, guest_base)
> > tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG)
> > }
> > #endif
>
> and then it uses a reg+reg addressing mode during qemu_ld/st:
>
> > rbase = guest_base ? TCG_GUEST_BASE_REG : 0
> ....
> > insn = qemu_ldx_opc[opc & (MO_SIZE | MO_BSWAP)]
> > tcg_out32(s, insn | TAB(datalo, rbase, addrlo))
>
> Obviously mips doesn't have a reg+reg addressing mode, so a PADD instruction is
> required, but otherwise you can use the same scheme. Using TCG_REG_S1 on mips
> for TCG_GUEST_BASE_REG would be fine.
Understood. guest_base is a problem indeed, and it would be better to be like that.
However, the bug I mentioned here seems to have no direct connect with the
guest_base problem. It lies in the following code,
> if (TCG_TARGET_REG_BITS > TARGET_LONG_BITS) {
> tcg_out_ext32u(s, base, addr_regl)
> addr_regl = base //problem is here.
> }
this section of code is to extend the addr_regl to 64bit, and use *base* as temp
intermedia. The real intention could be to extend addr_regl into base, and then
move base back to addr_regl for later use, but it wrongly assigning base to
addr_regl directly, which will cause crash for every use of tcg_out_qemu_st.
My intention is to fix this bug, and intend to use TCG_TMP0 for temporary use
for addr_regl.
As for the guest_base problem, I'll try to optimize it later, taking ppc code for
reference.
thanks for your advise and help.
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] tcg/mips: Bugfix for crash whenrunningprogram with qemu-i386.
2017-07-10 3:15 [Qemu-devel] [PATCH] tcg/mips: Bugfix for crash whenrunningprogram with qemu-i386 jiang.biao2
@ 2017-07-10 5:44 ` Richard Henderson
0 siblings, 0 replies; 2+ messages in thread
From: Richard Henderson @ 2017-07-10 5:44 UTC (permalink / raw)
To: jiang.biao2
Cc: qemu-devel, james.hogan, zhong.weidong, wang.liang82,
shi.zhongbing, jinguojie, jiang.yong5
On 07/09/2017 05:15 PM, jiang.biao2@zte.com.cn wrote:
> It lies in the following code,
>
> > if (TCG_TARGET_REG_BITS > TARGET_LONG_BITS) {
> > tcg_out_ext32u(s, base, addr_regl);
> > addr_regl = base; //problem is here.
> > }
>
> this section of code is to extend the addr_regl to 64bit, and use *base* as temp
> intermedia. The real intention could be to extend addr_regl into base, and then
> move base back to addr_regl for later use, but it wrongly assigning base to
> addr_regl directly, which will cause crash for every use of tcg_out_qemu_st.
The intent is to zero-extend addr_regl into a temporary; base = A0, and at this
point is known to be unused. Afterward, whenever we talk about the low part of
the address, we want to use the temporary and not the original input.
For example, if addr_regl = S0, and guest_base = S1, then we want
dext a0, s0, 31, 0
dadd a0, s1, a0
instead of
dext a0, s0, 31, 0
mov s0, a0
dadd a0, s1, s0
> My intention is to fix this bug, and intend to use TCG_TMP0 for temporary use
> for addr_regl.
That is also fine; there's nothing magic about using base = A0 for the temporary.
r~
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-07-10 5:46 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-10 3:15 [Qemu-devel] [PATCH] tcg/mips: Bugfix for crash whenrunningprogram with qemu-i386 jiang.biao2
2017-07-10 5:44 ` Richard Henderson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.