Commit | Line | Data |
---|---|---|
90dfdc7c DD |
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 | */ | |
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 | ||
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 | ||
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 | ||
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 | ||
86 | static inline bool kvm_check_and_clear_guest_paused(void) | |
87 | { | |
88 | return false; | |
89 | } | |
90 | ||
91 | static inline unsigned int kvm_arch_para_features(void) | |
92 | { | |
93 | return 0; | |
94 | } | |
95 | ||
96 | #ifdef CONFIG_MIPS_PARAVIRT | |
97 | static inline bool kvm_para_available(void) | |
98 | { | |
99 | return true; | |
100 | } | |
101 | #else | |
102 | static inline bool kvm_para_available(void) | |
103 | { | |
104 | return false; | |
105 | } | |
106 | #endif | |
107 | ||
108 | ||
109 | #endif /* _ASM_MIPS_KVM_PARA_H */ |