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). -- Thanks, David / dhildenb