linux/arch/x86/include/asm/kvm_para.h
<<
>>
Prefs
   1#ifndef _ASM_X86_KVM_PARA_H
   2#define _ASM_X86_KVM_PARA_H
   3
   4#include <asm/processor.h>
   5#include <asm/alternative.h>
   6#include <uapi/asm/kvm_para.h>
   7
   8extern void kvmclock_init(void);
   9extern int kvm_register_clock(char *txt);
  10
  11#ifdef CONFIG_KVM_GUEST
  12bool kvm_check_and_clear_guest_paused(void);
  13#else
  14static inline bool kvm_check_and_clear_guest_paused(void)
  15{
  16        return false;
  17}
  18#endif /* CONFIG_KVM_GUEST */
  19
  20#define KVM_HYPERCALL \
  21        ALTERNATIVE(".byte 0x0f,0x01,0xc1", ".byte 0x0f,0x01,0xd9", X86_FEATURE_VMMCALL)
  22
  23/* For KVM hypercalls, a three-byte sequence of either the vmcall or the vmmcall
  24 * instruction.  The hypervisor may replace it with something else but only the
  25 * instructions are guaranteed to be supported.
  26 *
  27 * Up to four arguments may be passed in rbx, rcx, rdx, and rsi respectively.
  28 * The hypercall number should be placed in rax and the return value will be
  29 * placed in rax.  No other registers will be clobbered unless explicitly
  30 * noted by the particular hypercall.
  31 */
  32
  33static inline long kvm_hypercall0(unsigned int nr)
  34{
  35        long ret;
  36        asm volatile(KVM_HYPERCALL
  37                     : "=a"(ret)
  38                     : "a"(nr)
  39                     : "memory");
  40        return ret;
  41}
  42
  43static inline long kvm_hypercall1(unsigned int nr, unsigned long p1)
  44{
  45        long ret;
  46        asm volatile(KVM_HYPERCALL
  47                     : "=a"(ret)
  48                     : "a"(nr), "b"(p1)
  49                     : "memory");
  50        return ret;
  51}
  52
  53static inline long kvm_hypercall2(unsigned int nr, unsigned long p1,
  54                                  unsigned long p2)
  55{
  56        long ret;
  57        asm volatile(KVM_HYPERCALL
  58                     : "=a"(ret)
  59                     : "a"(nr), "b"(p1), "c"(p2)
  60                     : "memory");
  61        return ret;
  62}
  63
  64static inline long kvm_hypercall3(unsigned int nr, unsigned long p1,
  65                                  unsigned long p2, unsigned long p3)
  66{
  67        long ret;
  68        asm volatile(KVM_HYPERCALL
  69                     : "=a"(ret)
  70                     : "a"(nr), "b"(p1), "c"(p2), "d"(p3)
  71                     : "memory");
  72        return ret;
  73}
  74
  75static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,
  76                                  unsigned long p2, unsigned long p3,
  77                                  unsigned long p4)
  78{
  79        long ret;
  80        asm volatile(KVM_HYPERCALL
  81                     : "=a"(ret)
  82                     : "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4)
  83                     : "memory");
  84        return ret;
  85}
  86
  87#ifdef CONFIG_KVM_GUEST
  88bool kvm_para_available(void);
  89unsigned int kvm_arch_para_features(void);
  90void __init kvm_guest_init(void);
  91void kvm_async_pf_task_wait(u32 token);
  92void kvm_async_pf_task_wake(u32 token);
  93u32 kvm_read_and_reset_pf_reason(void);
  94extern void kvm_disable_steal_time(void);
  95
  96#ifdef CONFIG_PARAVIRT_SPINLOCKS
  97void __init kvm_spinlock_init(void);
  98#else /* !CONFIG_PARAVIRT_SPINLOCKS */
  99static inline void kvm_spinlock_init(void)
 100{
 101}
 102#endif /* CONFIG_PARAVIRT_SPINLOCKS */
 103
 104#else /* CONFIG_KVM_GUEST */
 105#define kvm_guest_init() do {} while (0)
 106#define kvm_async_pf_task_wait(T) do {} while(0)
 107#define kvm_async_pf_task_wake(T) do {} while(0)
 108
 109static inline bool kvm_para_available(void)
 110{
 111        return false;
 112}
 113
 114static inline unsigned int kvm_arch_para_features(void)
 115{
 116        return 0;
 117}
 118
 119static inline u32 kvm_read_and_reset_pf_reason(void)
 120{
 121        return 0;
 122}
 123
 124static inline void kvm_disable_steal_time(void)
 125{
 126        return;
 127}
 128#endif
 129
 130#endif /* _ASM_X86_KVM_PARA_H */
 131