Il 24/05/2013 12:52, Peter Maydell ha scritto: > On 24 May 2013 09:02, Paolo Bonzini <pbonz...@redhat.com> wrote: >> Il 23/05/2013 20:04, Peter Maydell ha scritto: >>> Shouldn't we be calling the MemoryRegionOps >>> accepts() callback here? What about access alignment constraints >>> and access size restrictions? >> >> Yes, we should. >> >>> What if the validity of the range >>> changes between the time you asked and when you actually do the >>> access? >> >> If that's a concern, you shouldn't use this API, you should just do the >> access and rely on the return value of address_space_rw & friends. > > So when *is* it a good idea to use this API? In real > hardware you don't usually get a "tell me whether this > access would succeed if I did it" bus operation -- you > just do the operation and the memory transaction either > succeeds or it doesn't. Are we modelling something that > really exists in hardware on spapr here?
Well, sPAPR is not hardware. :) It is a paravirtualized interface. Anyhow, I can eliminate all the references to unassigned and basically do this: bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write) { MemoryRegionSection *section; hwaddr l, xlat; while (len > 0) { l = len; section = address_space_translate(as, addr, &xlat, &l, is_write); if (!memory_access_is_direct(section->mr, is_write)) { l = memory_access_size(l, addr); if (!memory_region_access_valid(section->mr, addr1, l) { return false; } } len -= l; addr += l; } return true; } It requires some more changes however. I'll drop this patch. If it's okay for you, I'll send a pull request up to "memory: clean up phys_page_find" and go on with the next series. Paolo