Tested-by: Artyom Tarasenko <atar4q...@gmail.com> > There's two bugs in phys_page_find_alloc(). When the bottom level L2 > table is populated with IO_MEM_UNASSIGNED, region_offset is then used > for reporting the physical address. First, region_offset may not be > aligned to the base address of the L2 region. And second, region_offset > won't hold the full 36-bit address on a 32-bit host. > > It seems that both can be fixed by returning NULL for unassigned > addresses from phys_page_find(). All callers already handle a NULL > return value. Would this allow any further optimizations to be made? > > Here's a patch to try: > > diff --git a/exec.c b/exec.c > index 49c28b1..77b49c8 100644 > --- a/exec.c > +++ b/exec.c > @@ -434,7 +434,11 @@ static PhysPageDesc > *phys_page_find_alloc(target_phys_addr_t index, int alloc) > > static inline PhysPageDesc *phys_page_find(target_phys_addr_t index) > { > - return phys_page_find_alloc(index, 0); > + PhysPageDesc *pd = phys_page_find_alloc(index, 0); > + if (pd && pd->phys_offset == IO_MEM_UNASSIGNED) { > + return NULL; > + } > + return pd; > } > > static void tlb_protect_code(ram_addr_t ram_addr); > > >
-- Regards, Artyom Tarasenko solaris/sparc under qemu blog: http://tyom.blogspot.com/