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. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature