Andy Lutomirski <luto@xxxxxxxxxx> writes: > On Sat, Mar 7, 2020 at 7:47 AM Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote: >> The host knows exactly when it injects a async PF and it can store CR2 >> and reason of that async PF in flight. >> >> On the next VMEXIT it checks whether apf_reason is 0. If apf_reason is 0 >> then it knows that the guest has read CR2 and apf_reason. All good >> nothing to worry about. >> >> If not it needs to be careful. >> >> As long as the apf_reason of the last async #PF is not cleared by the >> guest no new async #PF can be injected. That's already correct because >> in that case IF==0 which prevents a nested async #PF. >> >> If MCE, NMI trigger a real pagefault then the #PF injection needs to >> clear apf_reason and set the correct CR2. When that #PF returns then the >> old CR2 and apf_reason need to be restored. > > How is the host supposed to know when the #PF returns? Intercepting > IRET sounds like a bad idea and, in any case, is not actually a > reliable indication that #PF returned. The host does not care about the IRET. It solely has to check whether apf_reason is 0 or not. That way it knows that the guest has read CR2 and apf_reason. Thanks, tglx