MIPS: Add functions for hypervisor call
authorDavid Daney <david.daney@cavium.com>
Wed, 28 May 2014 21:52:12 +0000 (23:52 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Fri, 30 May 2014 19:01:11 +0000 (21:01 +0200)
Introduce kvm_hypercall[0-3].
Define three new hypercalls for MIPS: GET_CLOCK_FREQ, EXIT_VM, and
CONSOLE_OUTPUT.

[andreas.herrmann:
  * Properly define hypercalls and HC numbers for MIPS
    in kvm_para.h header files]

Signed-off-by: David Daney <david.daney@cavium.com>
Signed-off-by: Andreas Herrmann <andreas.herrmann@caviumnetworks.com>
Cc: linux-mips@linux-mips.org
Cc: James Hogan <james.hogan@imgtec.com>
Cc: kvm@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/7005/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/kvm_para.h [new file with mode: 0644]
arch/mips/include/uapi/asm/kvm_para.h
include/uapi/linux/kvm_para.h

diff --git a/arch/mips/include/asm/kvm_para.h b/arch/mips/include/asm/kvm_para.h
new file mode 100644 (file)
index 0000000..5a9aa91
--- /dev/null
@@ -0,0 +1,109 @@
+#ifndef _ASM_MIPS_KVM_PARA_H
+#define _ASM_MIPS_KVM_PARA_H
+
+#include <uapi/asm/kvm_para.h>
+
+#define KVM_HYPERCALL ".word 0x42000028"
+
+/*
+ * Hypercalls for KVM.
+ *
+ * Hypercall number is passed in v0.
+ * Return value will be placed in v0.
+ * Up to 3 arguments are passed in a0, a1, and a2.
+ */
+static inline unsigned long kvm_hypercall0(unsigned long num)
+{
+       register unsigned long n asm("v0");
+       register unsigned long r asm("v0");
+
+       n = num;
+       __asm__ __volatile__(
+               KVM_HYPERCALL
+               : "=r" (r) : "r" (n) : "memory"
+               );
+
+       return r;
+}
+
+static inline unsigned long kvm_hypercall1(unsigned long num,
+                                       unsigned long arg0)
+{
+       register unsigned long n asm("v0");
+       register unsigned long r asm("v0");
+       register unsigned long a0 asm("a0");
+
+       n = num;
+       a0 = arg0;
+       __asm__ __volatile__(
+               KVM_HYPERCALL
+               : "=r" (r) : "r" (n), "r" (a0) : "memory"
+               );
+
+       return r;
+}
+
+static inline unsigned long kvm_hypercall2(unsigned long num,
+                                       unsigned long arg0, unsigned long arg1)
+{
+       register unsigned long n asm("v0");
+       register unsigned long r asm("v0");
+       register unsigned long a0 asm("a0");
+       register unsigned long a1 asm("a1");
+
+       n = num;
+       a0 = arg0;
+       a1 = arg1;
+       __asm__ __volatile__(
+               KVM_HYPERCALL
+               : "=r" (r) : "r" (n), "r" (a0), "r" (a1) : "memory"
+               );
+
+       return r;
+}
+
+static inline unsigned long kvm_hypercall3(unsigned long num,
+       unsigned long arg0, unsigned long arg1, unsigned long arg2)
+{
+       register unsigned long n asm("v0");
+       register unsigned long r asm("v0");
+       register unsigned long a0 asm("a0");
+       register unsigned long a1 asm("a1");
+       register unsigned long a2 asm("a2");
+
+       n = num;
+       a0 = arg0;
+       a1 = arg1;
+       a2 = arg2;
+       __asm__ __volatile__(
+               KVM_HYPERCALL
+               : "=r" (r) : "r" (n), "r" (a0), "r" (a1), "r" (a2) : "memory"
+               );
+
+       return r;
+}
+
+static inline bool kvm_check_and_clear_guest_paused(void)
+{
+       return false;
+}
+
+static inline unsigned int kvm_arch_para_features(void)
+{
+       return 0;
+}
+
+#ifdef CONFIG_MIPS_PARAVIRT
+static inline bool kvm_para_available(void)
+{
+       return true;
+}
+#else
+static inline bool kvm_para_available(void)
+{
+       return false;
+}
+#endif
+
+
+#endif /* _ASM_MIPS_KVM_PARA_H */
index 14fab8f0b957675dd06bdc00785ca2ec33cd56b9..7e16d7c42e65dbab31edd33bd9c8326183eb5f28 100644 (file)
@@ -1 +1,5 @@
-#include <asm-generic/kvm_para.h>
+#ifndef _UAPI_ASM_MIPS_KVM_PARA_H
+#define _UAPI_ASM_MIPS_KVM_PARA_H
+
+
+#endif /* _UAPI_ASM_MIPS_KVM_PARA_H */
index 2841f86eae0beb1e2f0ae4b3e617d389398a113e..bf6cd7d5cac27883c2feffb0bab762522242ff6e 100644 (file)
@@ -20,6 +20,9 @@
 #define KVM_HC_FEATURES                        3
 #define KVM_HC_PPC_MAP_MAGIC_PAGE      4
 #define KVM_HC_KICK_CPU                        5
+#define KVM_HC_MIPS_GET_CLOCK_FREQ     6
+#define KVM_HC_MIPS_EXIT_VM            7
+#define KVM_HC_MIPS_CONSOLE_OUTPUT     8
 
 /*
  * hypercalls use architecture specific