On Thu, 7 Mar 2019 15:34:27 +0100 David Hildenbrand <da...@redhat.com> wrote:
> On 07.03.19 15:10, Richard Henderson wrote: > > On 3/7/19 4:15 AM, David Hildenbrand wrote: > >> +void probe_write_access(CPUS390XState *env, uint64_t addr, uint64_t len, > >> + uintptr_t ra) > >> +{ > >> +#ifdef CONFIG_USER_ONLY > >> + if (!h2g_valid(addr) || !h2g_valid(addr + len - 1)) { > >> + s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra); > >> + } > > > > You need > > > > || page_check_range(addr, len, PAGE_WRITE) < 0 > > > > as well. > > Indeed, thanks. > > So it should be > > > +void probe_write_access(CPUS390XState *env, uint64_t addr, uint64_t len, > + uintptr_t ra) > +{ > +#ifdef CONFIG_USER_ONLY > + if (!h2g_valid(addr) || !h2g_valid(addr + len - 1) || > + page_check_range(addr, len, PAGE_WRITE) < 0) { > + s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra); > + } > +#else > + /* test the actual access, not just any access to the page due to LAP */ > + while (len) { > + const uint64_t pagelen = -(addr | -TARGET_PAGE_MASK); > + const uint64_t curlen = MIN(pagelen, len); > + > + probe_write(env, addr, curlen, cpu_mmu_index(env, false), ra); > + addr = wrap_address(env, addr + curlen); > + len -= curlen; > + } > +#endif > +} > > Conny, I can resend if you don't feel like fixing up (or there is more to do). > If that's the only thing, I can easily fold it in.