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 void kvm_riscv_vcpu_free_vector_context(struct kvm_vcpu *vcpu); 38 void kvm_riscv_register_vctx_callback(void (*func)(void)); 39 void kvm_riscv_unregister_vctx_callback(void); 40 void kvm_riscv_vcpu_flush_vector(void); 41 42 static inline void kvm_riscv_v_init(void) 43 { 44 if (has_vector()) 45 kvm_riscv_register_vctx_callback(&kvm_riscv_vcpu_flush_vector); 46 } 47 48 static inline void kvm_riscv_v_exit(void) 49 { 50 if (has_vector()) 51 kvm_riscv_unregister_vctx_callback(); 52 } 53 54 #else 55 56 struct kvm_cpu_context; 57 58 static inline void kvm_riscv_vcpu_vector_reset(struct kvm_vcpu *vcpu) 59 { 60 } 61 62 static inline void kvm_riscv_vcpu_guest_vector_save(struct kvm_cpu_context *cntx, 63 unsigned long *isa) 64 { 65 } 66 67 static inline void kvm_riscv_vcpu_guest_vector_restore(struct kvm_cpu_context *cntx, 68 unsigned long *isa) 69 { 70 } 71 72 static inline void kvm_riscv_vcpu_host_vector_save(struct kvm_cpu_context *cntx) 73 { 74 } 75 76 static inline void kvm_riscv_vcpu_host_vector_restore(struct kvm_cpu_context *cntx) 77 { 78 } 79 80 static inline int kvm_riscv_vcpu_alloc_vector_context(struct kvm_vcpu *vcpu) 81 { 82 return 0; 83 } 84 85 static inline void kvm_riscv_vcpu_free_vector_context(struct kvm_vcpu *vcpu) 86 { 87 } 88 89 static inline void kvm_riscv_v_init(void) 90 { 91 } 92 93 static inline void kvm_riscv_v_exit(void) 94 { 95 } 96 #endif 97 98 int kvm_riscv_vcpu_get_reg_vector(struct kvm_vcpu *vcpu, 99 const struct kvm_one_reg *reg); 100 int kvm_riscv_vcpu_set_reg_vector(struct kvm_vcpu *vcpu, 101 const struct kvm_one_reg *reg); 102 #endif 103