Re: [RFC PATCH v2 08/19] RISC-V: KVM: Implement VCPU world-switch

From: Anup Patel
Date: Fri Aug 02 2019 - 04:44:07 EST


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