1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2022 SiFive 4 * 5 * Authors: 6 * Vincent Chen <vincent.chen@sifive.com> 7 * Greentime Hu <greentime.hu@sifive.com> 8 */ 9 10 #ifndef __KVM_VCPU_RISCV_VECTOR_H 11 #define __KVM_VCPU_RISCV_VECTOR_H 12 13 #include <linux/types.h> 14 15 #ifdef CONFIG_RISCV_ISA_V 16 #include <asm/vector.h> 17 #include <asm/kvm_host.h> 18 19 static __always_inline void __kvm_riscv_vector_save(struct kvm_cpu_context *context) 20 { 21 __riscv_v_vstate_save(&context->vector, context->vector.datap); 22 } 23 24 static __always_inline void __kvm_riscv_vector_restore(struct kvm_cpu_context *context) 25 { 26 __riscv_v_vstate_restore(&context->vector, context->vector.datap); 27 } 28 29 void kvm_riscv_vcpu_vector_reset(struct kvm_vcpu *vcpu); 30 void kvm_riscv_vcpu_guest_vector_save(struct kvm_cpu_context *cntx, 31 unsigned long *isa); 32 void kvm_riscv_vcpu_guest_vector_restore(struct kvm_cpu_context *cntx, 33 unsigned long *isa); 34 void kvm_riscv_vcpu_host_vector_save(struct kvm_cpu_context *cntx); 35 void kvm_riscv_vcpu_host_vector_restore(struct kvm_cpu_context *cntx); 36 int kvm_riscv_vcpu_alloc_vector_context(struct kvm_vcpu *vcpu, 37 struct kvm_cpu_context *cntx); 38 void kvm_riscv_vcpu_free_vector_context(struct kvm_vcpu *vcpu); 39 #else 40 41 struct kvm_cpu_context; 42 43 static inline void kvm_riscv_vcpu_vector_reset(struct kvm_vcpu *vcpu) 44 { 45 } 46 47 static inline void kvm_riscv_vcpu_guest_vector_save(struct kvm_cpu_context *cntx, 48 unsigned long *isa) 49 { 50 } 51 52 static inline void kvm_riscv_vcpu_guest_vector_restore(struct kvm_cpu_context *cntx, 53 unsigned long *isa) 54 { 55 } 56 57 static inline void kvm_riscv_vcpu_host_vector_save(struct kvm_cpu_context *cntx) 58 { 59 } 60 61 static inline void kvm_riscv_vcpu_host_vector_restore(struct kvm_cpu_context *cntx) 62 { 63 } 64 65 static inline int kvm_riscv_vcpu_alloc_vector_context(struct kvm_vcpu *vcpu, 66 struct kvm_cpu_context *cntx) 67 { 68 return 0; 69 } 70 71 static inline void kvm_riscv_vcpu_free_vector_context(struct kvm_vcpu *vcpu) 72 { 73 } 74 #endif 75 76 int kvm_riscv_vcpu_get_reg_vector(struct kvm_vcpu *vcpu, 77 const struct kvm_one_reg *reg, 78 unsigned long rtype); 79 int kvm_riscv_vcpu_set_reg_vector(struct kvm_vcpu *vcpu, 80 const struct kvm_one_reg *reg, 81 unsigned long rtype); 82 #endif 83