s390x/tcg: don't exit the cpu loop in s390_cpu_virt_mem_rw()
s390_cpu_virt_mem_rw() must always return, so callers can react on an exception (e.g. see ioinst_handle_stcrw()). Therefore, using program_interrupt() is wrong. Fix that up. Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20171130162744.25442-9-david@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
98ee9bedc7
commit
820613b1c1
@ -64,7 +64,9 @@ static void trigger_access_exception(CPUS390XState *env, uint32_t type,
|
|||||||
kvm_s390_access_exception(cpu, type, tec);
|
kvm_s390_access_exception(cpu, type, tec);
|
||||||
} else {
|
} else {
|
||||||
CPUState *cs = CPU(cpu);
|
CPUState *cs = CPU(cpu);
|
||||||
stq_phys(cs->as, env->psa + offsetof(LowCore, trans_exc_code), tec);
|
if (type != PGM_ADDRESSING) {
|
||||||
|
stq_phys(cs->as, env->psa + offsetof(LowCore, trans_exc_code), tec);
|
||||||
|
}
|
||||||
trigger_pgm_exception(env, type, ilen);
|
trigger_pgm_exception(env, type, ilen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -443,7 +445,8 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* translate_pages: Translate a set of consecutive logical page addresses
|
* translate_pages: Translate a set of consecutive logical page addresses
|
||||||
* to absolute addresses
|
* to absolute addresses. This function is used for TCG and old KVM without
|
||||||
|
* the MEMOP interface.
|
||||||
*/
|
*/
|
||||||
static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages,
|
static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages,
|
||||||
target_ulong *pages, bool is_write)
|
target_ulong *pages, bool is_write)
|
||||||
@ -459,7 +462,7 @@ static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages,
|
|||||||
}
|
}
|
||||||
if (!address_space_access_valid(&address_space_memory, pages[i],
|
if (!address_space_access_valid(&address_space_memory, pages[i],
|
||||||
TARGET_PAGE_SIZE, is_write)) {
|
TARGET_PAGE_SIZE, is_write)) {
|
||||||
program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO);
|
trigger_access_exception(env, PGM_ADDRESSING, ILEN_AUTO, 0);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
addr += TARGET_PAGE_SIZE;
|
addr += TARGET_PAGE_SIZE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user