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