Skip to content

Commit d21b5d3

Browse files
mdchitaleavpatel
authored andcommitted
RISC-V: KVM: Enable Smstateen accesses
Configure hstateen0 register so that the AIA state and envcfg are accessible to the vcpus. This includes registers such as siselect, sireg, siph, sieh and all the IMISC registers. Signed-off-by: Mayuresh Chitale <[email protected]> Reviewed-by: Andrew Jones <[email protected]> Signed-off-by: Anup Patel <[email protected]>
1 parent fe0bab7 commit d21b5d3

File tree

5 files changed

+38
-1
lines changed

5 files changed

+38
-1
lines changed

arch/riscv/include/asm/csr.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,18 @@
203203
#define ENVCFG_CBIE_INV _AC(0x3, UL)
204204
#define ENVCFG_FIOM _AC(0x1, UL)
205205

206+
/* Smstateen bits */
207+
#define SMSTATEEN0_AIA_IMSIC_SHIFT 58
208+
#define SMSTATEEN0_AIA_IMSIC (_ULL(1) << SMSTATEEN0_AIA_IMSIC_SHIFT)
209+
#define SMSTATEEN0_AIA_SHIFT 59
210+
#define SMSTATEEN0_AIA (_ULL(1) << SMSTATEEN0_AIA_SHIFT)
211+
#define SMSTATEEN0_AIA_ISEL_SHIFT 60
212+
#define SMSTATEEN0_AIA_ISEL (_ULL(1) << SMSTATEEN0_AIA_ISEL_SHIFT)
213+
#define SMSTATEEN0_HSENVCFG_SHIFT 62
214+
#define SMSTATEEN0_HSENVCFG (_ULL(1) << SMSTATEEN0_HSENVCFG_SHIFT)
215+
#define SMSTATEEN0_SSTATEEN0_SHIFT 63
216+
#define SMSTATEEN0_SSTATEEN0 (_ULL(1) << SMSTATEEN0_SSTATEEN0_SHIFT)
217+
206218
/* symbolic CSR names: */
207219
#define CSR_CYCLE 0xc00
208220
#define CSR_TIME 0xc01
@@ -349,6 +361,10 @@
349361
#define CSR_VSIEH 0x214
350362
#define CSR_VSIPH 0x254
351363

364+
/* Hypervisor stateen CSRs */
365+
#define CSR_HSTATEEN0 0x60c
366+
#define CSR_HSTATEEN0H 0x61c
367+
352368
#define CSR_MSTATUS 0x300
353369
#define CSR_MISA 0x301
354370
#define CSR_MIDELEG 0x303

arch/riscv/include/asm/kvm_host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ struct kvm_vcpu_csr {
166166

167167
struct kvm_vcpu_config {
168168
u64 henvcfg;
169+
u64 hstateen0;
169170
};
170171

171172
struct kvm_vcpu_arch {

arch/riscv/include/uapi/asm/kvm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ enum KVM_RISCV_ISA_EXT_ID {
131131
KVM_RISCV_ISA_EXT_ZICSR,
132132
KVM_RISCV_ISA_EXT_ZIFENCEI,
133133
KVM_RISCV_ISA_EXT_ZIHPM,
134+
KVM_RISCV_ISA_EXT_SMSTATEEN,
134135
KVM_RISCV_ISA_EXT_MAX,
135136
};
136137

arch/riscv/kvm/vcpu.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,16 @@ static void kvm_riscv_vcpu_setup_config(struct kvm_vcpu *vcpu)
487487

488488
if (riscv_isa_extension_available(isa, ZICBOZ))
489489
cfg->henvcfg |= ENVCFG_CBZE;
490+
491+
if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN)) {
492+
cfg->hstateen0 |= SMSTATEEN0_HSENVCFG;
493+
if (riscv_isa_extension_available(isa, SSAIA))
494+
cfg->hstateen0 |= SMSTATEEN0_AIA_IMSIC |
495+
SMSTATEEN0_AIA |
496+
SMSTATEEN0_AIA_ISEL;
497+
if (riscv_isa_extension_available(isa, SMSTATEEN))
498+
cfg->hstateen0 |= SMSTATEEN0_SSTATEEN0;
499+
}
490500
}
491501

492502
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
@@ -506,6 +516,11 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
506516
csr_write(CSR_HENVCFG, cfg->henvcfg);
507517
if (IS_ENABLED(CONFIG_32BIT))
508518
csr_write(CSR_HENVCFGH, cfg->henvcfg >> 32);
519+
if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN)) {
520+
csr_write(CSR_HSTATEEN0, cfg->hstateen0);
521+
if (IS_ENABLED(CONFIG_32BIT))
522+
csr_write(CSR_HSTATEEN0H, cfg->hstateen0 >> 32);
523+
}
509524

510525
kvm_riscv_gstage_update_hgatp(vcpu);
511526

arch/riscv/kvm/vcpu_onereg.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static const unsigned long kvm_isa_ext_arr[] = {
3434
[KVM_RISCV_ISA_EXT_M] = RISCV_ISA_EXT_m,
3535
[KVM_RISCV_ISA_EXT_V] = RISCV_ISA_EXT_v,
3636
/* Multi letter extensions (alphabetically sorted) */
37+
KVM_ISA_EXT_ARR(SMSTATEEN),
3738
KVM_ISA_EXT_ARR(SSAIA),
3839
KVM_ISA_EXT_ARR(SSTC),
3940
KVM_ISA_EXT_ARR(SVINVAL),
@@ -80,11 +81,11 @@ static bool kvm_riscv_vcpu_isa_enable_allowed(unsigned long ext)
8081
static bool kvm_riscv_vcpu_isa_disable_allowed(unsigned long ext)
8182
{
8283
switch (ext) {
84+
/* Extensions which don't have any mechanism to disable */
8385
case KVM_RISCV_ISA_EXT_A:
8486
case KVM_RISCV_ISA_EXT_C:
8587
case KVM_RISCV_ISA_EXT_I:
8688
case KVM_RISCV_ISA_EXT_M:
87-
case KVM_RISCV_ISA_EXT_SSAIA:
8889
case KVM_RISCV_ISA_EXT_SSTC:
8990
case KVM_RISCV_ISA_EXT_SVINVAL:
9091
case KVM_RISCV_ISA_EXT_SVNAPOT:
@@ -97,6 +98,9 @@ static bool kvm_riscv_vcpu_isa_disable_allowed(unsigned long ext)
9798
case KVM_RISCV_ISA_EXT_ZIHINTPAUSE:
9899
case KVM_RISCV_ISA_EXT_ZIHPM:
99100
return false;
101+
/* Extensions which can be disabled using Smstateen */
102+
case KVM_RISCV_ISA_EXT_SSAIA:
103+
return riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN);
100104
default:
101105
break;
102106
}

0 commit comments

Comments
 (0)