On Tue, Apr 10, 2018 at 09:05:06 -0500, Eric Blake wrote: > On 04/10/2018 07:59 AM, Emilio G. Cota wrote: > > On Tue, Apr 10, 2018 at 11:24:37 +1000, Richard Henderson wrote: > >> On 04/07/2018 04:20 AM, Emilio G. Cota wrote: > >>> + next_page = (ctx->base.pc_first & TARGET_PAGE_MASK) + > >>> TARGET_PAGE_SIZE; > >>> + if (ctx->base.pc_next >= next_page) { > >> > >> This fails for the last page of the address space. > >> Better is > >> > >> page_start = ctx->base.pc_first & TARGET_PAGE_MASK; > >> if (ctx->base.pc_next - page_start >= TARGET_PAGE_SIZE) { > > > > Apart from the variable name change, I fail to see how this (A - B >= C) > > is not equivalent to the above (A => B + C). What am I missing? > > Integer overflow. Adding TARGET_PAGE_SIZE might wrap next_page to 0, > which changes the semantics of the conditional; while performing the > subtraction avoids the case of overflow.
Ah indeed. Thanks. Turns out we have this problem in other targets as well -- will fix. E.