Message ID | 20190926162615.31168-12-richard.henderson@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/s390: Use tcg unwinding for ilen | expand |
On 26.09.19 18:26, Richard Henderson wrote: > Do not raise the exception directly within translate_pages, > but pass it back so that caller may do so. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/s390x/mmu_helper.c | 20 ++++++++++---------- > 1 file changed, 10 insertions(+), 10 deletions(-) > > diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c > index a9219942b1..5ecd9ee87e 100644 > --- a/target/s390x/mmu_helper.c > +++ b/target/s390x/mmu_helper.c > @@ -423,25 +423,22 @@ nodat: > * the MEMOP interface. > */ > static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages, > - target_ulong *pages, bool is_write) > + target_ulong *pages, bool is_write, uint64_t *tec) > { > uint64_t asc = cpu->env.psw.mask & PSW_MASK_ASC; > CPUS390XState *env = &cpu->env; > int ret, i, pflags; > > for (i = 0; i < nr_pages; i++) { > - uint64_t tec; > - > - ret = mmu_translate(env, addr, is_write, asc, &pages[i], &pflags, &tec); > + ret = mmu_translate(env, addr, is_write, asc, &pages[i], &pflags, tec); > if (ret) { > - trigger_access_exception(env, ret, ILEN_AUTO, tec); > - return -EFAULT; > + return ret; > } > if (!address_space_access_valid(&address_space_memory, pages[i], > TARGET_PAGE_SIZE, is_write, > MEMTXATTRS_UNSPECIFIED)) { > - trigger_access_exception(env, PGM_ADDRESSING, ILEN_AUTO, 0); > - return -EFAULT; > + *tec = 0; /* unused */ > + return PGM_ADDRESSING; > } > addr += TARGET_PAGE_SIZE; > } > @@ -469,6 +466,7 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf, > { > int currlen, nr_pages, i; > target_ulong *pages; > + uint64_t tec; > int ret; > > if (kvm_enabled()) { > @@ -482,8 +480,10 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf, > + 1; > pages = g_malloc(nr_pages * sizeof(*pages)); > > - ret = translate_pages(cpu, laddr, nr_pages, pages, is_write); > - if (ret == 0 && hostbuf != NULL) { > + ret = translate_pages(cpu, laddr, nr_pages, pages, is_write, &tec); > + if (ret) { > + trigger_access_exception(&cpu->env, ret, ILEN_AUTO, tec); > + } else if (hostbuf != NULL) { > /* Copy data by stepping through the area page by page */ > for (i = 0; i < nr_pages; i++) { > currlen = MIN(len, TARGET_PAGE_SIZE - (laddr % TARGET_PAGE_SIZE)); > Reviewed-by: David Hildenbrand <david@redhat.com>
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c index a9219942b1..5ecd9ee87e 100644 --- a/target/s390x/mmu_helper.c +++ b/target/s390x/mmu_helper.c @@ -423,25 +423,22 @@ nodat: * the MEMOP interface. */ static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages, - target_ulong *pages, bool is_write) + target_ulong *pages, bool is_write, uint64_t *tec) { uint64_t asc = cpu->env.psw.mask & PSW_MASK_ASC; CPUS390XState *env = &cpu->env; int ret, i, pflags; for (i = 0; i < nr_pages; i++) { - uint64_t tec; - - ret = mmu_translate(env, addr, is_write, asc, &pages[i], &pflags, &tec); + ret = mmu_translate(env, addr, is_write, asc, &pages[i], &pflags, tec); if (ret) { - trigger_access_exception(env, ret, ILEN_AUTO, tec); - return -EFAULT; + return ret; } if (!address_space_access_valid(&address_space_memory, pages[i], TARGET_PAGE_SIZE, is_write, MEMTXATTRS_UNSPECIFIED)) { - trigger_access_exception(env, PGM_ADDRESSING, ILEN_AUTO, 0); - return -EFAULT; + *tec = 0; /* unused */ + return PGM_ADDRESSING; } addr += TARGET_PAGE_SIZE; } @@ -469,6 +466,7 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf, { int currlen, nr_pages, i; target_ulong *pages; + uint64_t tec; int ret; if (kvm_enabled()) { @@ -482,8 +480,10 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf, + 1; pages = g_malloc(nr_pages * sizeof(*pages)); - ret = translate_pages(cpu, laddr, nr_pages, pages, is_write); - if (ret == 0 && hostbuf != NULL) { + ret = translate_pages(cpu, laddr, nr_pages, pages, is_write, &tec); + if (ret) { + trigger_access_exception(&cpu->env, ret, ILEN_AUTO, tec); + } else if (hostbuf != NULL) { /* Copy data by stepping through the area page by page */ for (i = 0; i < nr_pages; i++) { currlen = MIN(len, TARGET_PAGE_SIZE - (laddr % TARGET_PAGE_SIZE));
Do not raise the exception directly within translate_pages, but pass it back so that caller may do so. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/s390x/mmu_helper.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)