Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at nocache-cleanup 187 lines 4.4 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _ASM_LOONGARCH_KVM_PARA_H 3#define _ASM_LOONGARCH_KVM_PARA_H 4 5#include <uapi/asm/kvm_para.h> 6 7/* 8 * Hypercall code field 9 */ 10#define HYPERVISOR_KVM 1 11#define HYPERVISOR_VENDOR_SHIFT 8 12#define HYPERCALL_ENCODE(vendor, code) ((vendor << HYPERVISOR_VENDOR_SHIFT) + code) 13 14#define KVM_HCALL_CODE_SERVICE 0 15#define KVM_HCALL_CODE_SWDBG 1 16#define KVM_HCALL_CODE_USER_SERVICE 2 17 18#define KVM_HCALL_SERVICE HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_SERVICE) 19#define KVM_HCALL_FUNC_IPI 1 20#define KVM_HCALL_FUNC_NOTIFY 2 21 22#define KVM_HCALL_SWDBG HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_SWDBG) 23 24#define KVM_HCALL_USER_SERVICE HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_USER_SERVICE) 25 26/* 27 * LoongArch hypercall return code 28 */ 29#define KVM_HCALL_SUCCESS 0 30#define KVM_HCALL_INVALID_CODE -1UL 31#define KVM_HCALL_INVALID_PARAMETER -2UL 32 33#define KVM_STEAL_PHYS_VALID BIT_ULL(0) 34#define KVM_STEAL_PHYS_MASK GENMASK_ULL(63, 6) 35 36struct kvm_steal_time { 37 __u64 steal; 38 __u32 version; 39 __u32 flags; 40 __u32 pad[12]; 41}; 42 43/* 44 * Hypercall interface for KVM hypervisor 45 * 46 * a0: function identifier 47 * a1-a5: args 48 * Return value will be placed in a0. 49 * Up to 5 arguments are passed in a1, a2, a3, a4, a5. 50 */ 51static __always_inline long kvm_hypercall0(u64 fid) 52{ 53 register long ret asm("a0"); 54 register unsigned long fun asm("a0") = fid; 55 56 __asm__ __volatile__( 57 "hvcl "__stringify(KVM_HCALL_SERVICE) 58 : "=r" (ret) 59 : "r" (fun) 60 : "memory" 61 ); 62 63 return ret; 64} 65 66static __always_inline long kvm_hypercall1(u64 fid, unsigned long arg0) 67{ 68 register long ret asm("a0"); 69 register unsigned long fun asm("a0") = fid; 70 register unsigned long a1 asm("a1") = arg0; 71 72 __asm__ __volatile__( 73 "hvcl "__stringify(KVM_HCALL_SERVICE) 74 : "=r" (ret) 75 : "r" (fun), "r" (a1) 76 : "memory" 77 ); 78 79 return ret; 80} 81 82static __always_inline long kvm_hypercall2(u64 fid, 83 unsigned long arg0, unsigned long arg1) 84{ 85 register long ret asm("a0"); 86 register unsigned long fun asm("a0") = fid; 87 register unsigned long a1 asm("a1") = arg0; 88 register unsigned long a2 asm("a2") = arg1; 89 90 __asm__ __volatile__( 91 "hvcl "__stringify(KVM_HCALL_SERVICE) 92 : "=r" (ret) 93 : "r" (fun), "r" (a1), "r" (a2) 94 : "memory" 95 ); 96 97 return ret; 98} 99 100static __always_inline long kvm_hypercall3(u64 fid, 101 unsigned long arg0, unsigned long arg1, unsigned long arg2) 102{ 103 register long ret asm("a0"); 104 register unsigned long fun asm("a0") = fid; 105 register unsigned long a1 asm("a1") = arg0; 106 register unsigned long a2 asm("a2") = arg1; 107 register unsigned long a3 asm("a3") = arg2; 108 109 __asm__ __volatile__( 110 "hvcl "__stringify(KVM_HCALL_SERVICE) 111 : "=r" (ret) 112 : "r" (fun), "r" (a1), "r" (a2), "r" (a3) 113 : "memory" 114 ); 115 116 return ret; 117} 118 119static __always_inline long kvm_hypercall4(u64 fid, 120 unsigned long arg0, unsigned long arg1, 121 unsigned long arg2, unsigned long arg3) 122{ 123 register long ret asm("a0"); 124 register unsigned long fun asm("a0") = fid; 125 register unsigned long a1 asm("a1") = arg0; 126 register unsigned long a2 asm("a2") = arg1; 127 register unsigned long a3 asm("a3") = arg2; 128 register unsigned long a4 asm("a4") = arg3; 129 130 __asm__ __volatile__( 131 "hvcl "__stringify(KVM_HCALL_SERVICE) 132 : "=r" (ret) 133 : "r"(fun), "r" (a1), "r" (a2), "r" (a3), "r" (a4) 134 : "memory" 135 ); 136 137 return ret; 138} 139 140static __always_inline long kvm_hypercall5(u64 fid, 141 unsigned long arg0, unsigned long arg1, 142 unsigned long arg2, unsigned long arg3, unsigned long arg4) 143{ 144 register long ret asm("a0"); 145 register unsigned long fun asm("a0") = fid; 146 register unsigned long a1 asm("a1") = arg0; 147 register unsigned long a2 asm("a2") = arg1; 148 register unsigned long a3 asm("a3") = arg2; 149 register unsigned long a4 asm("a4") = arg3; 150 register unsigned long a5 asm("a5") = arg4; 151 152 __asm__ __volatile__( 153 "hvcl "__stringify(KVM_HCALL_SERVICE) 154 : "=r" (ret) 155 : "r"(fun), "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5) 156 : "memory" 157 ); 158 159 return ret; 160} 161 162#ifdef CONFIG_PARAVIRT 163bool kvm_para_available(void); 164unsigned int kvm_arch_para_features(void); 165#else 166static inline bool kvm_para_available(void) 167{ 168 return false; 169} 170 171static inline unsigned int kvm_arch_para_features(void) 172{ 173 return 0; 174} 175#endif 176 177static inline unsigned int kvm_arch_para_hints(void) 178{ 179 return 0; 180} 181 182static inline bool kvm_check_and_clear_guest_paused(void) 183{ 184 return false; 185} 186 187#endif /* _ASM_LOONGARCH_KVM_PARA_H */