• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _ASM_MIPS_KVM_PARA_H
2 #define _ASM_MIPS_KVM_PARA_H
3 
4 #include <uapi/asm/kvm_para.h>
5 
6 #define KVM_HYPERCALL ".word 0x42000028"
7 
8 /*
9  * Hypercalls for KVM.
10  *
11  * Hypercall number is passed in v0.
12  * Return value will be placed in v0.
13  * Up to 3 arguments are passed in a0, a1, and a2.
14  */
kvm_hypercall0(unsigned long num)15 static inline unsigned long kvm_hypercall0(unsigned long num)
16 {
17 	register unsigned long n asm("v0");
18 	register unsigned long r asm("v0");
19 
20 	n = num;
21 	__asm__ __volatile__(
22 		KVM_HYPERCALL
23 		: "=r" (r) : "r" (n) : "memory"
24 		);
25 
26 	return r;
27 }
28 
kvm_hypercall1(unsigned long num,unsigned long arg0)29 static inline unsigned long kvm_hypercall1(unsigned long num,
30 					unsigned long arg0)
31 {
32 	register unsigned long n asm("v0");
33 	register unsigned long r asm("v0");
34 	register unsigned long a0 asm("a0");
35 
36 	n = num;
37 	a0 = arg0;
38 	__asm__ __volatile__(
39 		KVM_HYPERCALL
40 		: "=r" (r) : "r" (n), "r" (a0) : "memory"
41 		);
42 
43 	return r;
44 }
45 
kvm_hypercall2(unsigned long num,unsigned long arg0,unsigned long arg1)46 static inline unsigned long kvm_hypercall2(unsigned long num,
47 					unsigned long arg0, unsigned long arg1)
48 {
49 	register unsigned long n asm("v0");
50 	register unsigned long r asm("v0");
51 	register unsigned long a0 asm("a0");
52 	register unsigned long a1 asm("a1");
53 
54 	n = num;
55 	a0 = arg0;
56 	a1 = arg1;
57 	__asm__ __volatile__(
58 		KVM_HYPERCALL
59 		: "=r" (r) : "r" (n), "r" (a0), "r" (a1) : "memory"
60 		);
61 
62 	return r;
63 }
64 
kvm_hypercall3(unsigned long num,unsigned long arg0,unsigned long arg1,unsigned long arg2)65 static inline unsigned long kvm_hypercall3(unsigned long num,
66 	unsigned long arg0, unsigned long arg1, unsigned long arg2)
67 {
68 	register unsigned long n asm("v0");
69 	register unsigned long r asm("v0");
70 	register unsigned long a0 asm("a0");
71 	register unsigned long a1 asm("a1");
72 	register unsigned long a2 asm("a2");
73 
74 	n = num;
75 	a0 = arg0;
76 	a1 = arg1;
77 	a2 = arg2;
78 	__asm__ __volatile__(
79 		KVM_HYPERCALL
80 		: "=r" (r) : "r" (n), "r" (a0), "r" (a1), "r" (a2) : "memory"
81 		);
82 
83 	return r;
84 }
85 
kvm_check_and_clear_guest_paused(void)86 static inline bool kvm_check_and_clear_guest_paused(void)
87 {
88 	return false;
89 }
90 
kvm_arch_para_features(void)91 static inline unsigned int kvm_arch_para_features(void)
92 {
93 	return 0;
94 }
95 
96 #ifdef CONFIG_MIPS_PARAVIRT
kvm_para_available(void)97 static inline bool kvm_para_available(void)
98 {
99 	return true;
100 }
101 #else
kvm_para_available(void)102 static inline bool kvm_para_available(void)
103 {
104 	return false;
105 }
106 #endif
107 
108 
109 #endif /* _ASM_MIPS_KVM_PARA_H */
110