On Wed, Jun 03, 2020 at 08:05:50PM +0530, P J P wrote: > +-- On Wed, 3 Jun 2020, Gerd Hoffmann wrote --+ > | Hmm, why modify mm_index? Shouldn't we just check it is non-zero > | before calling ati_mm_read/ati_mm_write? > > if (s->regs.mm_index & BIT(31)) { > ... > } else {
} else if (s->regs.mm_index > 3) { > ati_mm_write(s, s->regs.mm_index + addr - MM_DATA, data, size); > } > > Exit condition for recursion is to set (mm_index & BIT(31)), so recursion > would continue even with non-zero values I think. It's wrapped into a case switch for all the registers. The code quoted above is only entered for "addr >= MM_DATA && addr <= MM_DATA+3", so the check should stop recursion. A less strict "s->regs.mm_index > 0" may recurse a few times but will not recurse endless either. cheers, Gerd