On 10/2/19 9:47 AM, Richard Henderson wrote: > There is still the special case of EXECUTE of MVCL, which I suspect must have > some failure mode that we're not considering -- the setting and clearing of > ex_value can't help. I have a suspicion that we need to special case that > within helper_ex, just so that ex_value doesn't enter into it.
I had a walk and a think. I now believe that we're ok: (1) TB with EXECUTE runs, at address Ae - env->psw_addr stored with Ae. - helper_ex() runs, memory address Am computed from D2a(X2a,B2a) or from psw.addr+RI2. - env->ex_value stored with memory value modified by R1a (2) TB of executee runs, - env->ex_value stored with 0. - helper_mvcl() runs, using and updating R1b, R1b+1, R2b, R2b+1. (3a) helper_mvcl() completes, - TB of executee continues, psw.addr += ilen. - Next instruction is the one following EXECUTE. (3b) helper_mvcl() exits to main loop, - cpu_loop_exit_restore() unwinds psw.addr = Ae. - Next instruction is the EXECUTE itself... - goto 1. If we can agree that the result is undefined if registers R1a, X2a, B2a overlap R1b, R1b+1, R2b, R2b+1, or if the memory address Am is modified by the interrupted MVCL, then we're ok. r~