Loading arch/riscv/include/asm/kvm_host.h +1 −0 Original line number Diff line number Diff line Loading @@ -228,6 +228,7 @@ void kvm_riscv_stage2_vmid_update(struct kvm_vcpu *vcpu); void __kvm_riscv_unpriv_trap(void); void kvm_riscv_vcpu_wfi(struct kvm_vcpu *vcpu); unsigned long kvm_riscv_vcpu_unpriv_read(struct kvm_vcpu *vcpu, bool read_insn, unsigned long guest_addr, Loading arch/riscv/include/asm/kvm_vcpu_sbi.h +4 −1 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ #define KVM_SBI_IMPID 3 #define KVM_SBI_VERSION_MAJOR 0 #define KVM_SBI_VERSION_MINOR 2 #define KVM_SBI_VERSION_MINOR 3 struct kvm_vcpu_sbi_extension { unsigned long extid_start; Loading @@ -28,6 +28,9 @@ struct kvm_vcpu_sbi_extension { }; void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run); void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu, struct kvm_run *run, u32 type, u64 flags); const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext(unsigned long extid); #endif /* __RISCV_KVM_VCPU_SBI_H__ */ arch/riscv/include/asm/sbi.h +22 −5 Original line number Diff line number Diff line Loading @@ -71,15 +71,32 @@ enum sbi_ext_hsm_fid { SBI_EXT_HSM_HART_START = 0, SBI_EXT_HSM_HART_STOP, SBI_EXT_HSM_HART_STATUS, SBI_EXT_HSM_HART_SUSPEND, }; enum sbi_hsm_hart_status { SBI_HSM_HART_STATUS_STARTED = 0, SBI_HSM_HART_STATUS_STOPPED, SBI_HSM_HART_STATUS_START_PENDING, SBI_HSM_HART_STATUS_STOP_PENDING, enum sbi_hsm_hart_state { SBI_HSM_STATE_STARTED = 0, SBI_HSM_STATE_STOPPED, SBI_HSM_STATE_START_PENDING, SBI_HSM_STATE_STOP_PENDING, SBI_HSM_STATE_SUSPENDED, SBI_HSM_STATE_SUSPEND_PENDING, SBI_HSM_STATE_RESUME_PENDING, }; #define SBI_HSM_SUSP_BASE_MASK 0x7fffffff #define SBI_HSM_SUSP_NON_RET_BIT 0x80000000 #define SBI_HSM_SUSP_PLAT_BASE 0x10000000 #define SBI_HSM_SUSPEND_RET_DEFAULT 0x00000000 #define SBI_HSM_SUSPEND_RET_PLATFORM SBI_HSM_SUSP_PLAT_BASE #define SBI_HSM_SUSPEND_RET_LAST SBI_HSM_SUSP_BASE_MASK #define SBI_HSM_SUSPEND_NON_RET_DEFAULT SBI_HSM_SUSP_NON_RET_BIT #define SBI_HSM_SUSPEND_NON_RET_PLATFORM (SBI_HSM_SUSP_NON_RET_BIT | \ SBI_HSM_SUSP_PLAT_BASE) #define SBI_HSM_SUSPEND_NON_RET_LAST (SBI_HSM_SUSP_NON_RET_BIT | \ SBI_HSM_SUSP_BASE_MASK) enum sbi_ext_srst_fid { SBI_EXT_SRST_RESET = 0, }; Loading arch/riscv/kernel/cpu_ops_sbi.c +1 −1 Original line number Diff line number Diff line Loading @@ -111,7 +111,7 @@ static int sbi_cpu_is_stopped(unsigned int cpuid) rc = sbi_hsm_hart_get_status(hartid); if (rc == SBI_HSM_HART_STATUS_STOPPED) if (rc == SBI_HSM_STATE_STOPPED) return 0; return rc; } Loading arch/riscv/kvm/vcpu_exit.c +16 −6 Original line number Diff line number Diff line Loading @@ -144,12 +144,7 @@ static int system_opcode_insn(struct kvm_vcpu *vcpu, { if ((insn & INSN_MASK_WFI) == INSN_MATCH_WFI) { vcpu->stat.wfi_exit_stat++; if (!kvm_arch_vcpu_runnable(vcpu)) { srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); kvm_vcpu_halt(vcpu); vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); kvm_clear_request(KVM_REQ_UNHALT, vcpu); } kvm_riscv_vcpu_wfi(vcpu); vcpu->arch.guest_context.sepc += INSN_LEN(insn); return 1; } Loading Loading @@ -453,6 +448,21 @@ static int stage2_page_fault(struct kvm_vcpu *vcpu, struct kvm_run *run, return 1; } /** * kvm_riscv_vcpu_wfi -- Emulate wait for interrupt (WFI) behaviour * * @vcpu: The VCPU pointer */ void kvm_riscv_vcpu_wfi(struct kvm_vcpu *vcpu) { if (!kvm_arch_vcpu_runnable(vcpu)) { srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); kvm_vcpu_halt(vcpu); vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); kvm_clear_request(KVM_REQ_UNHALT, vcpu); } } /** * kvm_riscv_vcpu_unpriv_read -- Read machine word from Guest memory * Loading Loading
arch/riscv/include/asm/kvm_host.h +1 −0 Original line number Diff line number Diff line Loading @@ -228,6 +228,7 @@ void kvm_riscv_stage2_vmid_update(struct kvm_vcpu *vcpu); void __kvm_riscv_unpriv_trap(void); void kvm_riscv_vcpu_wfi(struct kvm_vcpu *vcpu); unsigned long kvm_riscv_vcpu_unpriv_read(struct kvm_vcpu *vcpu, bool read_insn, unsigned long guest_addr, Loading
arch/riscv/include/asm/kvm_vcpu_sbi.h +4 −1 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ #define KVM_SBI_IMPID 3 #define KVM_SBI_VERSION_MAJOR 0 #define KVM_SBI_VERSION_MINOR 2 #define KVM_SBI_VERSION_MINOR 3 struct kvm_vcpu_sbi_extension { unsigned long extid_start; Loading @@ -28,6 +28,9 @@ struct kvm_vcpu_sbi_extension { }; void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run); void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu, struct kvm_run *run, u32 type, u64 flags); const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext(unsigned long extid); #endif /* __RISCV_KVM_VCPU_SBI_H__ */
arch/riscv/include/asm/sbi.h +22 −5 Original line number Diff line number Diff line Loading @@ -71,15 +71,32 @@ enum sbi_ext_hsm_fid { SBI_EXT_HSM_HART_START = 0, SBI_EXT_HSM_HART_STOP, SBI_EXT_HSM_HART_STATUS, SBI_EXT_HSM_HART_SUSPEND, }; enum sbi_hsm_hart_status { SBI_HSM_HART_STATUS_STARTED = 0, SBI_HSM_HART_STATUS_STOPPED, SBI_HSM_HART_STATUS_START_PENDING, SBI_HSM_HART_STATUS_STOP_PENDING, enum sbi_hsm_hart_state { SBI_HSM_STATE_STARTED = 0, SBI_HSM_STATE_STOPPED, SBI_HSM_STATE_START_PENDING, SBI_HSM_STATE_STOP_PENDING, SBI_HSM_STATE_SUSPENDED, SBI_HSM_STATE_SUSPEND_PENDING, SBI_HSM_STATE_RESUME_PENDING, }; #define SBI_HSM_SUSP_BASE_MASK 0x7fffffff #define SBI_HSM_SUSP_NON_RET_BIT 0x80000000 #define SBI_HSM_SUSP_PLAT_BASE 0x10000000 #define SBI_HSM_SUSPEND_RET_DEFAULT 0x00000000 #define SBI_HSM_SUSPEND_RET_PLATFORM SBI_HSM_SUSP_PLAT_BASE #define SBI_HSM_SUSPEND_RET_LAST SBI_HSM_SUSP_BASE_MASK #define SBI_HSM_SUSPEND_NON_RET_DEFAULT SBI_HSM_SUSP_NON_RET_BIT #define SBI_HSM_SUSPEND_NON_RET_PLATFORM (SBI_HSM_SUSP_NON_RET_BIT | \ SBI_HSM_SUSP_PLAT_BASE) #define SBI_HSM_SUSPEND_NON_RET_LAST (SBI_HSM_SUSP_NON_RET_BIT | \ SBI_HSM_SUSP_BASE_MASK) enum sbi_ext_srst_fid { SBI_EXT_SRST_RESET = 0, }; Loading
arch/riscv/kernel/cpu_ops_sbi.c +1 −1 Original line number Diff line number Diff line Loading @@ -111,7 +111,7 @@ static int sbi_cpu_is_stopped(unsigned int cpuid) rc = sbi_hsm_hart_get_status(hartid); if (rc == SBI_HSM_HART_STATUS_STOPPED) if (rc == SBI_HSM_STATE_STOPPED) return 0; return rc; } Loading
arch/riscv/kvm/vcpu_exit.c +16 −6 Original line number Diff line number Diff line Loading @@ -144,12 +144,7 @@ static int system_opcode_insn(struct kvm_vcpu *vcpu, { if ((insn & INSN_MASK_WFI) == INSN_MATCH_WFI) { vcpu->stat.wfi_exit_stat++; if (!kvm_arch_vcpu_runnable(vcpu)) { srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); kvm_vcpu_halt(vcpu); vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); kvm_clear_request(KVM_REQ_UNHALT, vcpu); } kvm_riscv_vcpu_wfi(vcpu); vcpu->arch.guest_context.sepc += INSN_LEN(insn); return 1; } Loading Loading @@ -453,6 +448,21 @@ static int stage2_page_fault(struct kvm_vcpu *vcpu, struct kvm_run *run, return 1; } /** * kvm_riscv_vcpu_wfi -- Emulate wait for interrupt (WFI) behaviour * * @vcpu: The VCPU pointer */ void kvm_riscv_vcpu_wfi(struct kvm_vcpu *vcpu) { if (!kvm_arch_vcpu_runnable(vcpu)) { srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx); kvm_vcpu_halt(vcpu); vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); kvm_clear_request(KVM_REQ_UNHALT, vcpu); } } /** * kvm_riscv_vcpu_unpriv_read -- Read machine word from Guest memory * Loading