On Fri, Aug 2, 2019 at 2:00 PM Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: > > On 02/08/19 09:47, Anup Patel wrote: > > + /* Save Host SSTATUS, HSTATUS, SCRATCH and STVEC */ > > + csrr t0, CSR_SSTATUS > > + REG_S t0, (KVM_ARCH_HOST_SSTATUS)(a0) > > + csrr t1, CSR_HSTATUS > > + REG_S t1, (KVM_ARCH_HOST_HSTATUS)(a0) > > + csrr t2, CSR_SSCRATCH > > + REG_S t2, (KVM_ARCH_HOST_SSCRATCH)(a0) > > + csrr t3, CSR_STVEC > > + REG_S t3, (KVM_ARCH_HOST_STVEC)(a0) > > + > > A possible optimization: if these cannot change while Linux runs (I am > thinking especially of STVEC and HSTATUS, but perhaps SSCRATCH can be > saved on kvm_arch_vcpu_load too) you can avoid the csrr and store. Actual exception vector of Host Linux is different so we switch STVEC every time. HSTATUS.SPV is set whenever we come back from Guest world so while we are in in-kernel run loop with interrupts enabled we can get external interrupt and HSTATUS.SPV bit can affect SRET of interrupt handler. To handle this we switch HSTATUS every time. The world switch code uses SSCRATCH to save vcpu->arch pointer which is later used on return path. Now, I did not want to restrict Host Linux from using SSCRATCH for some other purpose hence we switch SSCRATCH every time. Regards, Anup