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 288
288
#define CSR_STVEC 0x105
289
289
#define CSR_SCOUNTEREN 0x106
290
290
#define CSR_SENVCFG 0x10a
291
+ #define CSR_SSTATEEN0 0x10c
291
292
#define CSR_SSCRATCH 0x140
292
293
#define CSR_SEPC 0x141
293
294
#define CSR_SCAUSE 0x142
Original file line number Diff line number Diff line change @@ -170,6 +170,10 @@ struct kvm_vcpu_config {
170
170
u64 hstateen0 ;
171
171
};
172
172
173
+ struct kvm_vcpu_smstateen_csr {
174
+ unsigned long sstateen0 ;
175
+ };
176
+
173
177
struct kvm_vcpu_arch {
174
178
/* VCPU ran at least once */
175
179
bool ran_atleast_once ;
@@ -190,6 +194,7 @@ struct kvm_vcpu_arch {
190
194
unsigned long host_stvec ;
191
195
unsigned long host_scounteren ;
192
196
unsigned long host_senvcfg ;
197
+ unsigned long host_sstateen0 ;
193
198
194
199
/* CPU context of Host */
195
200
struct kvm_cpu_context host_context ;
@@ -200,6 +205,9 @@ struct kvm_vcpu_arch {
200
205
/* CPU CSR context of Guest VCPU */
201
206
struct kvm_vcpu_csr guest_csr ;
202
207
208
+ /* CPU Smstateen CSR context of Guest VCPU */
209
+ struct kvm_vcpu_smstateen_csr smstateen_csr ;
210
+
203
211
/* CPU context upon Guest VCPU reset */
204
212
struct kvm_cpu_context guest_reset_context ;
205
213
Original file line number Diff line number Diff line change @@ -621,16 +621,28 @@ static void kvm_riscv_update_hvip(struct kvm_vcpu *vcpu)
621
621
622
622
static __always_inline void kvm_riscv_vcpu_swap_in_guest_state (struct kvm_vcpu * vcpu )
623
623
{
624
+ struct kvm_vcpu_smstateen_csr * smcsr = & vcpu -> arch .smstateen_csr ;
624
625
struct kvm_vcpu_csr * csr = & vcpu -> arch .guest_csr ;
626
+ struct kvm_vcpu_config * cfg = & vcpu -> arch .cfg ;
625
627
626
628
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 );
627
633
}
628
634
629
635
static __always_inline void kvm_riscv_vcpu_swap_in_host_state (struct kvm_vcpu * vcpu )
630
636
{
637
+ struct kvm_vcpu_smstateen_csr * smcsr = & vcpu -> arch .smstateen_csr ;
631
638
struct kvm_vcpu_csr * csr = & vcpu -> arch .guest_csr ;
639
+ struct kvm_vcpu_config * cfg = & vcpu -> arch .cfg ;
632
640
633
641
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 );
634
646
}
635
647
636
648
/*
You can’t perform that action at this time.
0 commit comments