File tree Expand file tree Collapse file tree 3 files changed +21
-0
lines changed
Expand file tree Collapse file tree 3 files changed +21
-0
lines changed Original file line number Diff line number Diff line change 288288#define CSR_STVEC 0x105
289289#define CSR_SCOUNTEREN 0x106
290290#define CSR_SENVCFG 0x10a
291+ #define CSR_SSTATEEN0 0x10c
291292#define CSR_SSCRATCH 0x140
292293#define CSR_SEPC 0x141
293294#define CSR_SCAUSE 0x142
Original file line number Diff line number Diff line change @@ -170,6 +170,10 @@ struct kvm_vcpu_config {
170170 u64 hstateen0 ;
171171};
172172
173+ struct kvm_vcpu_smstateen_csr {
174+ unsigned long sstateen0 ;
175+ };
176+
173177struct kvm_vcpu_arch {
174178 /* VCPU ran at least once */
175179 bool ran_atleast_once ;
@@ -190,6 +194,7 @@ struct kvm_vcpu_arch {
190194 unsigned long host_stvec ;
191195 unsigned long host_scounteren ;
192196 unsigned long host_senvcfg ;
197+ unsigned long host_sstateen0 ;
193198
194199 /* CPU context of Host */
195200 struct kvm_cpu_context host_context ;
@@ -200,6 +205,9 @@ struct kvm_vcpu_arch {
200205 /* CPU CSR context of Guest VCPU */
201206 struct kvm_vcpu_csr guest_csr ;
202207
208+ /* CPU Smstateen CSR context of Guest VCPU */
209+ struct kvm_vcpu_smstateen_csr smstateen_csr ;
210+
203211 /* CPU context upon Guest VCPU reset */
204212 struct kvm_cpu_context guest_reset_context ;
205213
Original file line number Diff line number Diff line change @@ -621,16 +621,28 @@ static void kvm_riscv_update_hvip(struct kvm_vcpu *vcpu)
621621
622622static __always_inline void kvm_riscv_vcpu_swap_in_guest_state (struct kvm_vcpu * vcpu )
623623{
624+ struct kvm_vcpu_smstateen_csr * smcsr = & vcpu -> arch .smstateen_csr ;
624625 struct kvm_vcpu_csr * csr = & vcpu -> arch .guest_csr ;
626+ struct kvm_vcpu_config * cfg = & vcpu -> arch .cfg ;
625627
626628 vcpu -> arch .host_senvcfg = csr_swap (CSR_SENVCFG , csr -> senvcfg );
629+ if (riscv_has_extension_unlikely (RISCV_ISA_EXT_SMSTATEEN ) &&
630+ (cfg -> hstateen0 & SMSTATEEN0_SSTATEEN0 ))
631+ vcpu -> arch .host_sstateen0 = csr_swap (CSR_SSTATEEN0 ,
632+ smcsr -> sstateen0 );
627633}
628634
629635static __always_inline void kvm_riscv_vcpu_swap_in_host_state (struct kvm_vcpu * vcpu )
630636{
637+ struct kvm_vcpu_smstateen_csr * smcsr = & vcpu -> arch .smstateen_csr ;
631638 struct kvm_vcpu_csr * csr = & vcpu -> arch .guest_csr ;
639+ struct kvm_vcpu_config * cfg = & vcpu -> arch .cfg ;
632640
633641 csr -> senvcfg = csr_swap (CSR_SENVCFG , vcpu -> arch .host_senvcfg );
642+ if (riscv_has_extension_unlikely (RISCV_ISA_EXT_SMSTATEEN ) &&
643+ (cfg -> hstateen0 & SMSTATEEN0_SSTATEEN0 ))
644+ smcsr -> sstateen0 = csr_swap (CSR_SSTATEEN0 ,
645+ vcpu -> arch .host_sstateen0 );
634646}
635647
636648/*
You can’t perform that action at this time.
0 commit comments