| @@ -0,0 +1,109 @@ |
| | 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 */ |