> This looks a bit odd if you don't realize that kvm already handled the > exception. But I don't really have a better idea. > >> } >> return; >> } > >> @@ -645,9 +657,12 @@ void ioinst_handle_chsc(S390CPU *cpu, uint32_t ipb, >> uintptr_t ra) >> if (!s390_cpu_virt_mem_write(cpu, addr + len, reg, res, >> be16_to_cpu(res->len))) { >> setcc(cpu, 0); /* Command execution complete */ >> + } else { >> + s390_cpu_virt_mem_handle_exc(cpu, ra); >> } >> } >> >> + > > unrelated whitespace
ack, will drop. > >> #define SCHM_REG1_RES(_reg) (_reg & 0x000000000ffffffc) >> #define SCHM_REG1_MBK(_reg) ((_reg & 0x00000000f0000000) >> 28) >> #define SCHM_REG1_UPD(_reg) ((_reg & 0x0000000000000002) >> 1) >> diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c >> index 31e3f3f415..39da9aeef4 100644 >> --- a/target/s390x/mmu_helper.c >> +++ b/target/s390x/mmu_helper.c >> @@ -22,6 +22,7 @@ >> #include "internal.h" >> #include "kvm_s390x.h" >> #include "sysemu/kvm.h" >> +#include "exec/exec-all.h" >> #include "trace.h" >> #include "hw/s390x/storage-keys.h" >> >> @@ -458,7 +459,7 @@ static int translate_pages(S390CPU *cpu, vaddr addr, int >> nr_pages, >> } >> if (!address_space_access_valid(&address_space_memory, pages[i], >> TARGET_PAGE_SIZE, is_write)) { >> - program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO); >> + trigger_pgm_exception(env, PGM_ADDRESSING, ILEN_AUTO); > > Why did you change this? "For TCG, there was one case where a cpu loop exit was triggered. Fix that up." Wasn't worth a separate patch :) > >> return -EFAULT; >> } >> addr += TARGET_PAGE_SIZE; >> @@ -478,6 +479,9 @@ static int translate_pages(S390CPU *cpu, vaddr addr, int >> nr_pages, >> * >> * Copy from/to guest memory using logical addresses. Note that we inject a >> * program interrupt in case there is an error while accessing the memory. >> + * >> + * This function will always return (also for TCG), make sure to call >> + * s390_cpu_virt_mem_handle_exc() to properly exit the CPU loop. >> */ >> int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void >> *hostbuf, >> int len, bool is_write) >> @@ -514,6 +518,19 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, >> uint8_t ar, void *hostbuf, >> return ret; >> } >> >> +void s390_cpu_virt_mem_handle_exc(S390CPU *cpu, uintptr_t ra) >> +{ >> + /* KVM will handle the interrupt automatically, TCG has to exit the TB >> */ >> + #ifdef CONFIG_TCG > > Please move the #ifdef/#endif to the beginning of the line. Oh, yes. > >> + if (tcg_enabled()) { >> + if (ra) { >> + cpu_restore_state(CPU(cpu), ra); >> + } >> + cpu_loop_exit(CPU(cpu)); >> + } >> + #endif >> +} >> + >> /** >> * Translate a real address into a physical (absolute) address. >> * @param raddr the real address > -- Thanks, David / dhildenb