Skip to content

Commit 81f0f31

Browse files
mdchitaleavpatel
authored andcommitted
RISCV: KVM: Add sstateen0 context save/restore
Define sstateen0 and add sstateen0 save/restore for guest VCPUs. Signed-off-by: Mayuresh Chitale <[email protected]> Reviewed-by: Andrew Jones <[email protected]> Signed-off-by: Anup Patel <[email protected]>
1 parent db3c01c commit 81f0f31

File tree

3 files changed

+21
-0
lines changed

3 files changed

+21
-0
lines changed

arch/riscv/include/asm/csr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@
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

arch/riscv/include/asm/kvm_host.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
173177
struct 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

arch/riscv/kvm/vcpu.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,16 +621,28 @@ static void kvm_riscv_update_hvip(struct kvm_vcpu *vcpu)
621621

622622
static __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

629635
static __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
/*

0 commit comments

Comments
 (0)