Merge remote-tracking branch 'qemu-kvm/uq/master' into staging
This commit is contained in:
		
						commit
						d6034a3a61
					
				| 
						 | 
				
			
			@ -14,7 +14,7 @@ endif
 | 
			
		|||
 | 
			
		||||
TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
 | 
			
		||||
$(call set-vpath, $(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw)
 | 
			
		||||
QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
 | 
			
		||||
QEMU_CFLAGS+= -I.. -I../linux-headers -I$(TARGET_PATH) -DNEED_CPU_H
 | 
			
		||||
 | 
			
		||||
include $(SRC_PATH)/Makefile.objs
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,8 +37,6 @@ ifndef CONFIG_HAIKU
 | 
			
		|||
LIBS+=-lm
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
kvm.o kvm-all.o vhost.o vhost_net.o kvmclock.o: QEMU_CFLAGS+=$(KVM_CFLAGS)
 | 
			
		||||
 | 
			
		||||
config-target.h: config-target.h-timestamp
 | 
			
		||||
config-target.h-timestamp: config-target.mak
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,8 +113,7 @@ curl=""
 | 
			
		|||
curses=""
 | 
			
		||||
docs=""
 | 
			
		||||
fdt=""
 | 
			
		||||
kvm=""
 | 
			
		||||
kvm_para=""
 | 
			
		||||
kvm="yes"
 | 
			
		||||
nptl=""
 | 
			
		||||
sdl=""
 | 
			
		||||
vnc="yes"
 | 
			
		||||
| 
						 | 
				
			
			@ -130,7 +129,7 @@ xen=""
 | 
			
		|||
xen_ctrl_version=""
 | 
			
		||||
linux_aio=""
 | 
			
		||||
attr=""
 | 
			
		||||
vhost_net=""
 | 
			
		||||
vhost_net="yes"
 | 
			
		||||
xfs=""
 | 
			
		||||
 | 
			
		||||
gprof="no"
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +165,6 @@ guest_base=""
 | 
			
		|||
uname_release=""
 | 
			
		||||
io_thread="no"
 | 
			
		||||
mixemu="no"
 | 
			
		||||
kerneldir=""
 | 
			
		||||
aix="no"
 | 
			
		||||
blobs="yes"
 | 
			
		||||
pkgversion=""
 | 
			
		||||
| 
						 | 
				
			
			@ -715,8 +713,6 @@ for opt do
 | 
			
		|||
  ;;
 | 
			
		||||
  --disable-blobs) blobs="no"
 | 
			
		||||
  ;;
 | 
			
		||||
  --kerneldir=*) kerneldir="$optarg"
 | 
			
		||||
  ;;
 | 
			
		||||
  --with-pkgversion=*) pkgversion=" ($optarg)"
 | 
			
		||||
  ;;
 | 
			
		||||
  --disable-docs) docs="no"
 | 
			
		||||
| 
						 | 
				
			
			@ -1005,7 +1001,6 @@ echo "  --disable-attr           disables attr and xattr support"
 | 
			
		|||
echo "  --enable-attr            enable attr and xattr support"
 | 
			
		||||
echo "  --enable-io-thread       enable IO thread"
 | 
			
		||||
echo "  --disable-blobs          disable installing provided firmware blobs"
 | 
			
		||||
echo "  --kerneldir=PATH         look for kernel includes in PATH"
 | 
			
		||||
echo "  --enable-docs            enable documentation build"
 | 
			
		||||
echo "  --disable-docs           disable documentation build"
 | 
			
		||||
echo "  --disable-vhost-net      disable vhost-net acceleration support"
 | 
			
		||||
| 
						 | 
				
			
			@ -1805,124 +1800,6 @@ EOF
 | 
			
		|||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
##########################################
 | 
			
		||||
# kvm probe
 | 
			
		||||
if test "$kvm" != "no" ; then
 | 
			
		||||
    cat > $TMPC <<EOF
 | 
			
		||||
#include <linux/kvm.h>
 | 
			
		||||
#if !defined(KVM_API_VERSION) || KVM_API_VERSION < 12 || KVM_API_VERSION > 12
 | 
			
		||||
#error Invalid KVM version
 | 
			
		||||
#endif
 | 
			
		||||
EOF
 | 
			
		||||
    must_have_caps="KVM_CAP_USER_MEMORY \
 | 
			
		||||
                    KVM_CAP_DESTROY_MEMORY_REGION_WORKS \
 | 
			
		||||
                    KVM_CAP_COALESCED_MMIO \
 | 
			
		||||
                    KVM_CAP_SYNC_MMU \
 | 
			
		||||
                   "
 | 
			
		||||
    if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) ; then
 | 
			
		||||
      must_have_caps="$caps \
 | 
			
		||||
                      KVM_CAP_SET_TSS_ADDR \
 | 
			
		||||
                      KVM_CAP_EXT_CPUID \
 | 
			
		||||
                      KVM_CAP_CLOCKSOURCE \
 | 
			
		||||
                      KVM_CAP_NOP_IO_DELAY \
 | 
			
		||||
                      KVM_CAP_PV_MMU \
 | 
			
		||||
                      KVM_CAP_MP_STATE \
 | 
			
		||||
                      KVM_CAP_USER_NMI \
 | 
			
		||||
                     "
 | 
			
		||||
    fi
 | 
			
		||||
    for c in $must_have_caps ; do
 | 
			
		||||
      cat >> $TMPC <<EOF
 | 
			
		||||
#if !defined($c)
 | 
			
		||||
#error Missing KVM capability $c
 | 
			
		||||
#endif
 | 
			
		||||
EOF
 | 
			
		||||
    done
 | 
			
		||||
    cat >> $TMPC <<EOF
 | 
			
		||||
int main(void) { return 0; }
 | 
			
		||||
EOF
 | 
			
		||||
  if test "$kerneldir" != "" ; then
 | 
			
		||||
      kvm_cflags=-I"$kerneldir"/include
 | 
			
		||||
      if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) \
 | 
			
		||||
         -a -d "$kerneldir/arch/x86/include" ; then
 | 
			
		||||
            kvm_cflags="$kvm_cflags -I$kerneldir/arch/x86/include"
 | 
			
		||||
	elif test "$cpu" = "ppc" -a -d "$kerneldir/arch/powerpc/include" ; then
 | 
			
		||||
	    kvm_cflags="$kvm_cflags -I$kerneldir/arch/powerpc/include"
 | 
			
		||||
	elif test "$cpu" = "s390x" -a -d "$kerneldir/arch/s390/include" ; then
 | 
			
		||||
	    kvm_cflags="$kvm_cflags -I$kerneldir/arch/s390/include"
 | 
			
		||||
        elif test -d "$kerneldir/arch/$cpu/include" ; then
 | 
			
		||||
            kvm_cflags="$kvm_cflags -I$kerneldir/arch/$cpu/include"
 | 
			
		||||
      fi
 | 
			
		||||
  else
 | 
			
		||||
    kvm_cflags=`$pkg_config --cflags kvm-kmod 2>/dev/null`
 | 
			
		||||
  fi
 | 
			
		||||
  if compile_prog "$kvm_cflags" "" ; then
 | 
			
		||||
    kvm=yes
 | 
			
		||||
    cat > $TMPC <<EOF
 | 
			
		||||
#include <linux/kvm_para.h>
 | 
			
		||||
int main(void) { return 0; }
 | 
			
		||||
EOF
 | 
			
		||||
    if compile_prog "$kvm_cflags" "" ; then
 | 
			
		||||
      kvm_para=yes
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    if test "$kvm" = "yes" ; then
 | 
			
		||||
      if has awk && has grep; then
 | 
			
		||||
        kvmerr=`LANG=C $cc $QEMU_CFLAGS -o $TMPE $kvm_cflags $TMPC 2>&1 \
 | 
			
		||||
	| grep "error: " \
 | 
			
		||||
	| awk -F "error: " '{if (NR>1) printf(", "); printf("%s",$2);}'`
 | 
			
		||||
        if test "$kvmerr" != "" ; then
 | 
			
		||||
          echo -e "${kvmerr}\n\
 | 
			
		||||
NOTE: To enable KVM support, update your kernel to 2.6.29+ or install \
 | 
			
		||||
recent kvm-kmod from http://sourceforge.net/projects/kvm."
 | 
			
		||||
        fi
 | 
			
		||||
      fi
 | 
			
		||||
      feature_not_found "kvm"
 | 
			
		||||
    fi
 | 
			
		||||
    kvm=no
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
##########################################
 | 
			
		||||
# test for ppc kvm pvr setting
 | 
			
		||||
 | 
			
		||||
if test "$kvm" = "yes" && test "$cpu" = "ppc" -o "$cpu" = "ppc64"; then
 | 
			
		||||
            cat > $TMPC <<EOF
 | 
			
		||||
    #include <asm/kvm.h>
 | 
			
		||||
    int main(void) { struct kvm_sregs s; s.pvr = 0; return 0; }
 | 
			
		||||
EOF
 | 
			
		||||
    if compile_prog "$kvm_cflags" "" ; then
 | 
			
		||||
        kvm_ppc_pvr=yes
 | 
			
		||||
    else
 | 
			
		||||
        kvm_ppc_pvr=no
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
##########################################
 | 
			
		||||
# test for vhost net
 | 
			
		||||
 | 
			
		||||
if test "$vhost_net" != "no"; then
 | 
			
		||||
    if test "$kvm" != "no"; then
 | 
			
		||||
            cat > $TMPC <<EOF
 | 
			
		||||
    #include <linux/vhost.h>
 | 
			
		||||
    int main(void) { return 0; }
 | 
			
		||||
EOF
 | 
			
		||||
            if compile_prog "$kvm_cflags" "" ; then
 | 
			
		||||
                vhost_net=yes
 | 
			
		||||
            else
 | 
			
		||||
                if test "$vhost_net" = "yes" ; then
 | 
			
		||||
                    feature_not_found "vhost-net"
 | 
			
		||||
                fi
 | 
			
		||||
                vhost_net=no
 | 
			
		||||
            fi
 | 
			
		||||
    else
 | 
			
		||||
            if test "$vhost_net" = "yes" ; then
 | 
			
		||||
                echo "NOTE: vhost-net feature requires KVM (--enable-kvm)."
 | 
			
		||||
                feature_not_found "vhost-net"
 | 
			
		||||
            fi
 | 
			
		||||
            vhost_net=no
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
##########################################
 | 
			
		||||
# pthread probe
 | 
			
		||||
PTHREADLIBS_LIST="-lpthread -lpthreadGC2"
 | 
			
		||||
| 
						 | 
				
			
			@ -3373,16 +3250,9 @@ case "$target_arch2" in
 | 
			
		|||
      \( "$target_arch2" = "x86_64" -a "$cpu" = "i386"   \) -o \
 | 
			
		||||
      \( "$target_arch2" = "i386"   -a "$cpu" = "x86_64" \) \) ; then
 | 
			
		||||
      echo "CONFIG_KVM=y" >> $config_target_mak
 | 
			
		||||
      echo "KVM_CFLAGS=$kvm_cflags" >> $config_target_mak
 | 
			
		||||
      if test "$kvm_para" = "yes"; then
 | 
			
		||||
        echo "CONFIG_KVM_PARA=y" >> $config_target_mak
 | 
			
		||||
      fi
 | 
			
		||||
      if test $vhost_net = "yes" ; then
 | 
			
		||||
        echo "CONFIG_VHOST_NET=y" >> $config_target_mak
 | 
			
		||||
      fi
 | 
			
		||||
      if test "$kvm_ppc_pvr" = "yes" ; then
 | 
			
		||||
        echo "CONFIG_KVM_PPC_PVR=y" >> $config_target_mak
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
esac
 | 
			
		||||
if test "$target_bigendian" = "yes" ; then
 | 
			
		||||
| 
						 | 
				
			
			@ -3573,6 +3443,21 @@ if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
 | 
			
		|||
  esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# use included Linux headers
 | 
			
		||||
includes="-I\$(SRC_PATH)/linux-headers $includes"
 | 
			
		||||
mkdir -p linux-headers
 | 
			
		||||
case "$cpu" in
 | 
			
		||||
i386|x86_64)
 | 
			
		||||
  symlink $source_path/linux-headers/asm-x86 linux-headers/asm
 | 
			
		||||
  ;;
 | 
			
		||||
ppcemb|ppc|ppc64)
 | 
			
		||||
  symlink $source_path/linux-headers/asm-x86 linux-headers/asm
 | 
			
		||||
  ;;
 | 
			
		||||
s390x)
 | 
			
		||||
  symlink $source_path/linux-headers/asm-s390 linux-headers/asm
 | 
			
		||||
  ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
echo "LDFLAGS+=$ldflags" >> $config_target_mak
 | 
			
		||||
echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
 | 
			
		||||
echo "QEMU_INCLUDES+=$includes" >> $config_target_mak
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,6 @@
 | 
			
		|||
#include "exec.h"
 | 
			
		||||
#include "disas.h"
 | 
			
		||||
#include "tcg.h"
 | 
			
		||||
#include "kvm.h"
 | 
			
		||||
#include "qemu-barrier.h"
 | 
			
		||||
 | 
			
		||||
#if defined(__sparc__) && !defined(CONFIG_SOLARIS)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,8 +17,6 @@
 | 
			
		|||
#include "kvm.h"
 | 
			
		||||
#include "kvmclock.h"
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_KVM_PARA) && defined(KVM_CAP_ADJUST_CLOCK)
 | 
			
		||||
 | 
			
		||||
#include <linux/kvm.h>
 | 
			
		||||
#include <linux/kvm_para.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -120,10 +118,3 @@ static void kvmclock_register_device(void)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
device_init(kvmclock_register_device);
 | 
			
		||||
 | 
			
		||||
#else /* !(CONFIG_KVM_PARA && KVM_CAP_ADJUST_CLOCK) */
 | 
			
		||||
 | 
			
		||||
void kvmclock_create(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif /* !(CONFIG_KVM_PARA && KVM_CAP_ADJUST_CLOCK) */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								kvm-all.c
								
								
								
								
							
							
						
						
									
										13
									
								
								kvm-all.c
								
								
								
								
							| 
						 | 
				
			
			@ -757,35 +757,26 @@ int kvm_init(void)
 | 
			
		|||
    s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO);
 | 
			
		||||
 | 
			
		||||
    s->broken_set_mem_region = 1;
 | 
			
		||||
#ifdef KVM_CAP_JOIN_MEMORY_REGIONS_WORKS
 | 
			
		||||
    ret = kvm_check_extension(s, KVM_CAP_JOIN_MEMORY_REGIONS_WORKS);
 | 
			
		||||
    if (ret > 0) {
 | 
			
		||||
        s->broken_set_mem_region = 0;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    s->vcpu_events = 0;
 | 
			
		||||
#ifdef KVM_CAP_VCPU_EVENTS
 | 
			
		||||
    s->vcpu_events = kvm_check_extension(s, KVM_CAP_VCPU_EVENTS);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    s->robust_singlestep = 0;
 | 
			
		||||
#ifdef KVM_CAP_X86_ROBUST_SINGLESTEP
 | 
			
		||||
    s->robust_singlestep =
 | 
			
		||||
        kvm_check_extension(s, KVM_CAP_X86_ROBUST_SINGLESTEP);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    s->debugregs = 0;
 | 
			
		||||
#ifdef KVM_CAP_DEBUGREGS
 | 
			
		||||
    s->debugregs = kvm_check_extension(s, KVM_CAP_DEBUGREGS);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    s->xsave = 0;
 | 
			
		||||
#ifdef KVM_CAP_XSAVE
 | 
			
		||||
    s->xsave = kvm_check_extension(s, KVM_CAP_XSAVE);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    s->xcrs = 0;
 | 
			
		||||
#ifdef KVM_CAP_XCRS
 | 
			
		||||
    s->xcrs = kvm_check_extension(s, KVM_CAP_XCRS);
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -855,7 +846,6 @@ static void kvm_handle_io(uint16_t port, void *data, int direction, int size,
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_INTERNAL_ERROR_DATA
 | 
			
		||||
static int kvm_handle_internal_error(CPUState *env, struct kvm_run *run)
 | 
			
		||||
{
 | 
			
		||||
    fprintf(stderr, "KVM internal error.");
 | 
			
		||||
| 
						 | 
				
			
			@ -882,7 +872,6 @@ static int kvm_handle_internal_error(CPUState *env, struct kvm_run *run)
 | 
			
		|||
     */
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void kvm_flush_coalesced_mmio_buffer(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1013,11 +1002,9 @@ int kvm_cpu_exec(CPUState *env)
 | 
			
		|||
                    (uint64_t)run->hw.hardware_exit_reason);
 | 
			
		||||
            ret = -1;
 | 
			
		||||
            break;
 | 
			
		||||
#ifdef KVM_CAP_INTERNAL_ERROR_DATA
 | 
			
		||||
        case KVM_EXIT_INTERNAL_ERROR:
 | 
			
		||||
            ret = kvm_handle_internal_error(env, run);
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
        default:
 | 
			
		||||
            DPRINTF("kvm_arch_handle_exit\n");
 | 
			
		||||
            ret = kvm_arch_handle_exit(env, run);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								kvm-stub.c
								
								
								
								
							
							
						
						
									
										18
									
								
								kvm-stub.c
								
								
								
								
							| 
						 | 
				
			
			@ -42,11 +42,6 @@ int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
 | 
			
		|||
    return -ENOSYS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int kvm_check_extension(KVMState *s, unsigned int extension)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int kvm_init(void)
 | 
			
		||||
{
 | 
			
		||||
    return -ENOSYS;
 | 
			
		||||
| 
						 | 
				
			
			@ -78,16 +73,6 @@ int kvm_has_sync_mmu(void)
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int kvm_has_vcpu_events(void)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int kvm_has_robust_singlestep(void)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int kvm_has_many_ioeventfds(void)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -99,8 +84,7 @@ void kvm_setup_guest_memory(void *start, size_t size)
 | 
			
		|||
 | 
			
		||||
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
 | 
			
		||||
{
 | 
			
		||||
    tb_flush(env);
 | 
			
		||||
    return 0;
 | 
			
		||||
    return -ENOSYS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								kvm.h
								
								
								
								
							
							
						
						
									
										2
									
								
								kvm.h
								
								
								
								
							| 
						 | 
				
			
			@ -157,7 +157,7 @@ bool kvm_arch_stop_on_emulation_error(CPUState *env);
 | 
			
		|||
 | 
			
		||||
int kvm_check_extension(KVMState *s, unsigned int extension);
 | 
			
		||||
 | 
			
		||||
uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
 | 
			
		||||
uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
 | 
			
		||||
                                      uint32_t index, int reg);
 | 
			
		||||
void kvm_cpu_synchronize_state(CPUState *env);
 | 
			
		||||
void kvm_cpu_synchronize_post_reset(CPUState *env);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,356 @@
 | 
			
		|||
 | 
			
		||||
   NOTE! This copyright does *not* cover user programs that use kernel
 | 
			
		||||
 services by normal system calls - this is merely considered normal use
 | 
			
		||||
 of the kernel, and does *not* fall under the heading of "derived work".
 | 
			
		||||
 Also note that the GPL below is copyrighted by the Free Software
 | 
			
		||||
 Foundation, but the instance of code that it refers to (the Linux
 | 
			
		||||
 kernel) is copyrighted by me and others who actually wrote it.
 | 
			
		||||
 | 
			
		||||
 Also note that the only valid version of the GPL as far as the kernel
 | 
			
		||||
 is concerned is _this_ particular version of the license (ie v2, not
 | 
			
		||||
 v2.2 or v3.x or whatever), unless explicitly otherwise stated.
 | 
			
		||||
 | 
			
		||||
			Linus Torvalds
 | 
			
		||||
 | 
			
		||||
----------------------------------------
 | 
			
		||||
 | 
			
		||||
		    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
		       Version 2, June 1991
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
			
		||||
                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
			
		||||
 of this license document, but changing it is not allowed.
 | 
			
		||||
 | 
			
		||||
			    Preamble
 | 
			
		||||
 | 
			
		||||
  The licenses for most software are designed to take away your
 | 
			
		||||
freedom to share and change it.  By contrast, the GNU General Public
 | 
			
		||||
License is intended to guarantee your freedom to share and change free
 | 
			
		||||
software--to make sure the software is free for all its users.  This
 | 
			
		||||
General Public License applies to most of the Free Software
 | 
			
		||||
Foundation's software and to any other program whose authors commit to
 | 
			
		||||
using it.  (Some other Free Software Foundation software is covered by
 | 
			
		||||
the GNU Library General Public License instead.)  You can apply it to
 | 
			
		||||
your programs, too.
 | 
			
		||||
 | 
			
		||||
  When we speak of free software, we are referring to freedom, not
 | 
			
		||||
price.  Our General Public Licenses are designed to make sure that you
 | 
			
		||||
have the freedom to distribute copies of free software (and charge for
 | 
			
		||||
this service if you wish), that you receive source code or can get it
 | 
			
		||||
if you want it, that you can change the software or use pieces of it
 | 
			
		||||
in new free programs; and that you know you can do these things.
 | 
			
		||||
 | 
			
		||||
  To protect your rights, we need to make restrictions that forbid
 | 
			
		||||
anyone to deny you these rights or to ask you to surrender the rights.
 | 
			
		||||
These restrictions translate to certain responsibilities for you if you
 | 
			
		||||
distribute copies of the software, or if you modify it.
 | 
			
		||||
 | 
			
		||||
  For example, if you distribute copies of such a program, whether
 | 
			
		||||
gratis or for a fee, you must give the recipients all the rights that
 | 
			
		||||
you have.  You must make sure that they, too, receive or can get the
 | 
			
		||||
source code.  And you must show them these terms so they know their
 | 
			
		||||
rights.
 | 
			
		||||
 | 
			
		||||
  We protect your rights with two steps: (1) copyright the software, and
 | 
			
		||||
(2) offer you this license which gives you legal permission to copy,
 | 
			
		||||
distribute and/or modify the software.
 | 
			
		||||
 | 
			
		||||
  Also, for each author's protection and ours, we want to make certain
 | 
			
		||||
that everyone understands that there is no warranty for this free
 | 
			
		||||
software.  If the software is modified by someone else and passed on, we
 | 
			
		||||
want its recipients to know that what they have is not the original, so
 | 
			
		||||
that any problems introduced by others will not reflect on the original
 | 
			
		||||
authors' reputations.
 | 
			
		||||
 | 
			
		||||
  Finally, any free program is threatened constantly by software
 | 
			
		||||
patents.  We wish to avoid the danger that redistributors of a free
 | 
			
		||||
program will individually obtain patent licenses, in effect making the
 | 
			
		||||
program proprietary.  To prevent this, we have made it clear that any
 | 
			
		||||
patent must be licensed for everyone's free use or not licensed at all.
 | 
			
		||||
 | 
			
		||||
  The precise terms and conditions for copying, distribution and
 | 
			
		||||
modification follow.
 | 
			
		||||
 | 
			
		||||
		    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
			
		||||
 | 
			
		||||
  0. This License applies to any program or other work which contains
 | 
			
		||||
a notice placed by the copyright holder saying it may be distributed
 | 
			
		||||
under the terms of this General Public License.  The "Program", below,
 | 
			
		||||
refers to any such program or work, and a "work based on the Program"
 | 
			
		||||
means either the Program or any derivative work under copyright law:
 | 
			
		||||
that is to say, a work containing the Program or a portion of it,
 | 
			
		||||
either verbatim or with modifications and/or translated into another
 | 
			
		||||
language.  (Hereinafter, translation is included without limitation in
 | 
			
		||||
the term "modification".)  Each licensee is addressed as "you".
 | 
			
		||||
 | 
			
		||||
Activities other than copying, distribution and modification are not
 | 
			
		||||
covered by this License; they are outside its scope.  The act of
 | 
			
		||||
running the Program is not restricted, and the output from the Program
 | 
			
		||||
is covered only if its contents constitute a work based on the
 | 
			
		||||
Program (independent of having been made by running the Program).
 | 
			
		||||
Whether that is true depends on what the Program does.
 | 
			
		||||
 | 
			
		||||
  1. You may copy and distribute verbatim copies of the Program's
 | 
			
		||||
source code as you receive it, in any medium, provided that you
 | 
			
		||||
conspicuously and appropriately publish on each copy an appropriate
 | 
			
		||||
copyright notice and disclaimer of warranty; keep intact all the
 | 
			
		||||
notices that refer to this License and to the absence of any warranty;
 | 
			
		||||
and give any other recipients of the Program a copy of this License
 | 
			
		||||
along with the Program.
 | 
			
		||||
 | 
			
		||||
You may charge a fee for the physical act of transferring a copy, and
 | 
			
		||||
you may at your option offer warranty protection in exchange for a fee.
 | 
			
		||||
 | 
			
		||||
  2. You may modify your copy or copies of the Program or any portion
 | 
			
		||||
of it, thus forming a work based on the Program, and copy and
 | 
			
		||||
distribute such modifications or work under the terms of Section 1
 | 
			
		||||
above, provided that you also meet all of these conditions:
 | 
			
		||||
 | 
			
		||||
    a) You must cause the modified files to carry prominent notices
 | 
			
		||||
    stating that you changed the files and the date of any change.
 | 
			
		||||
 | 
			
		||||
    b) You must cause any work that you distribute or publish, that in
 | 
			
		||||
    whole or in part contains or is derived from the Program or any
 | 
			
		||||
    part thereof, to be licensed as a whole at no charge to all third
 | 
			
		||||
    parties under the terms of this License.
 | 
			
		||||
 | 
			
		||||
    c) If the modified program normally reads commands interactively
 | 
			
		||||
    when run, you must cause it, when started running for such
 | 
			
		||||
    interactive use in the most ordinary way, to print or display an
 | 
			
		||||
    announcement including an appropriate copyright notice and a
 | 
			
		||||
    notice that there is no warranty (or else, saying that you provide
 | 
			
		||||
    a warranty) and that users may redistribute the program under
 | 
			
		||||
    these conditions, and telling the user how to view a copy of this
 | 
			
		||||
    License.  (Exception: if the Program itself is interactive but
 | 
			
		||||
    does not normally print such an announcement, your work based on
 | 
			
		||||
    the Program is not required to print an announcement.)
 | 
			
		||||
 | 
			
		||||
These requirements apply to the modified work as a whole.  If
 | 
			
		||||
identifiable sections of that work are not derived from the Program,
 | 
			
		||||
and can be reasonably considered independent and separate works in
 | 
			
		||||
themselves, then this License, and its terms, do not apply to those
 | 
			
		||||
sections when you distribute them as separate works.  But when you
 | 
			
		||||
distribute the same sections as part of a whole which is a work based
 | 
			
		||||
on the Program, the distribution of the whole must be on the terms of
 | 
			
		||||
this License, whose permissions for other licensees extend to the
 | 
			
		||||
entire whole, and thus to each and every part regardless of who wrote it.
 | 
			
		||||
 | 
			
		||||
Thus, it is not the intent of this section to claim rights or contest
 | 
			
		||||
your rights to work written entirely by you; rather, the intent is to
 | 
			
		||||
exercise the right to control the distribution of derivative or
 | 
			
		||||
collective works based on the Program.
 | 
			
		||||
 | 
			
		||||
In addition, mere aggregation of another work not based on the Program
 | 
			
		||||
with the Program (or with a work based on the Program) on a volume of
 | 
			
		||||
a storage or distribution medium does not bring the other work under
 | 
			
		||||
the scope of this License.
 | 
			
		||||
 | 
			
		||||
  3. You may copy and distribute the Program (or a work based on it,
 | 
			
		||||
under Section 2) in object code or executable form under the terms of
 | 
			
		||||
Sections 1 and 2 above provided that you also do one of the following:
 | 
			
		||||
 | 
			
		||||
    a) Accompany it with the complete corresponding machine-readable
 | 
			
		||||
    source code, which must be distributed under the terms of Sections
 | 
			
		||||
    1 and 2 above on a medium customarily used for software interchange; or,
 | 
			
		||||
 | 
			
		||||
    b) Accompany it with a written offer, valid for at least three
 | 
			
		||||
    years, to give any third party, for a charge no more than your
 | 
			
		||||
    cost of physically performing source distribution, a complete
 | 
			
		||||
    machine-readable copy of the corresponding source code, to be
 | 
			
		||||
    distributed under the terms of Sections 1 and 2 above on a medium
 | 
			
		||||
    customarily used for software interchange; or,
 | 
			
		||||
 | 
			
		||||
    c) Accompany it with the information you received as to the offer
 | 
			
		||||
    to distribute corresponding source code.  (This alternative is
 | 
			
		||||
    allowed only for noncommercial distribution and only if you
 | 
			
		||||
    received the program in object code or executable form with such
 | 
			
		||||
    an offer, in accord with Subsection b above.)
 | 
			
		||||
 | 
			
		||||
The source code for a work means the preferred form of the work for
 | 
			
		||||
making modifications to it.  For an executable work, complete source
 | 
			
		||||
code means all the source code for all modules it contains, plus any
 | 
			
		||||
associated interface definition files, plus the scripts used to
 | 
			
		||||
control compilation and installation of the executable.  However, as a
 | 
			
		||||
special exception, the source code distributed need not include
 | 
			
		||||
anything that is normally distributed (in either source or binary
 | 
			
		||||
form) with the major components (compiler, kernel, and so on) of the
 | 
			
		||||
operating system on which the executable runs, unless that component
 | 
			
		||||
itself accompanies the executable.
 | 
			
		||||
 | 
			
		||||
If distribution of executable or object code is made by offering
 | 
			
		||||
access to copy from a designated place, then offering equivalent
 | 
			
		||||
access to copy the source code from the same place counts as
 | 
			
		||||
distribution of the source code, even though third parties are not
 | 
			
		||||
compelled to copy the source along with the object code.
 | 
			
		||||
 | 
			
		||||
  4. You may not copy, modify, sublicense, or distribute the Program
 | 
			
		||||
except as expressly provided under this License.  Any attempt
 | 
			
		||||
otherwise to copy, modify, sublicense or distribute the Program is
 | 
			
		||||
void, and will automatically terminate your rights under this License.
 | 
			
		||||
However, parties who have received copies, or rights, from you under
 | 
			
		||||
this License will not have their licenses terminated so long as such
 | 
			
		||||
parties remain in full compliance.
 | 
			
		||||
 | 
			
		||||
  5. You are not required to accept this License, since you have not
 | 
			
		||||
signed it.  However, nothing else grants you permission to modify or
 | 
			
		||||
distribute the Program or its derivative works.  These actions are
 | 
			
		||||
prohibited by law if you do not accept this License.  Therefore, by
 | 
			
		||||
modifying or distributing the Program (or any work based on the
 | 
			
		||||
Program), you indicate your acceptance of this License to do so, and
 | 
			
		||||
all its terms and conditions for copying, distributing or modifying
 | 
			
		||||
the Program or works based on it.
 | 
			
		||||
 | 
			
		||||
  6. Each time you redistribute the Program (or any work based on the
 | 
			
		||||
Program), the recipient automatically receives a license from the
 | 
			
		||||
original licensor to copy, distribute or modify the Program subject to
 | 
			
		||||
these terms and conditions.  You may not impose any further
 | 
			
		||||
restrictions on the recipients' exercise of the rights granted herein.
 | 
			
		||||
You are not responsible for enforcing compliance by third parties to
 | 
			
		||||
this License.
 | 
			
		||||
 | 
			
		||||
  7. If, as a consequence of a court judgment or allegation of patent
 | 
			
		||||
infringement or for any other reason (not limited to patent issues),
 | 
			
		||||
conditions are imposed on you (whether by court order, agreement or
 | 
			
		||||
otherwise) that contradict the conditions of this License, they do not
 | 
			
		||||
excuse you from the conditions of this License.  If you cannot
 | 
			
		||||
distribute so as to satisfy simultaneously your obligations under this
 | 
			
		||||
License and any other pertinent obligations, then as a consequence you
 | 
			
		||||
may not distribute the Program at all.  For example, if a patent
 | 
			
		||||
license would not permit royalty-free redistribution of the Program by
 | 
			
		||||
all those who receive copies directly or indirectly through you, then
 | 
			
		||||
the only way you could satisfy both it and this License would be to
 | 
			
		||||
refrain entirely from distribution of the Program.
 | 
			
		||||
 | 
			
		||||
If any portion of this section is held invalid or unenforceable under
 | 
			
		||||
any particular circumstance, the balance of the section is intended to
 | 
			
		||||
apply and the section as a whole is intended to apply in other
 | 
			
		||||
circumstances.
 | 
			
		||||
 | 
			
		||||
It is not the purpose of this section to induce you to infringe any
 | 
			
		||||
patents or other property right claims or to contest validity of any
 | 
			
		||||
such claims; this section has the sole purpose of protecting the
 | 
			
		||||
integrity of the free software distribution system, which is
 | 
			
		||||
implemented by public license practices.  Many people have made
 | 
			
		||||
generous contributions to the wide range of software distributed
 | 
			
		||||
through that system in reliance on consistent application of that
 | 
			
		||||
system; it is up to the author/donor to decide if he or she is willing
 | 
			
		||||
to distribute software through any other system and a licensee cannot
 | 
			
		||||
impose that choice.
 | 
			
		||||
 | 
			
		||||
This section is intended to make thoroughly clear what is believed to
 | 
			
		||||
be a consequence of the rest of this License.
 | 
			
		||||
 | 
			
		||||
  8. If the distribution and/or use of the Program is restricted in
 | 
			
		||||
certain countries either by patents or by copyrighted interfaces, the
 | 
			
		||||
original copyright holder who places the Program under this License
 | 
			
		||||
may add an explicit geographical distribution limitation excluding
 | 
			
		||||
those countries, so that distribution is permitted only in or among
 | 
			
		||||
countries not thus excluded.  In such case, this License incorporates
 | 
			
		||||
the limitation as if written in the body of this License.
 | 
			
		||||
 | 
			
		||||
  9. The Free Software Foundation may publish revised and/or new versions
 | 
			
		||||
of the General Public License from time to time.  Such new versions will
 | 
			
		||||
be similar in spirit to the present version, but may differ in detail to
 | 
			
		||||
address new problems or concerns.
 | 
			
		||||
 | 
			
		||||
Each version is given a distinguishing version number.  If the Program
 | 
			
		||||
specifies a version number of this License which applies to it and "any
 | 
			
		||||
later version", you have the option of following the terms and conditions
 | 
			
		||||
either of that version or of any later version published by the Free
 | 
			
		||||
Software Foundation.  If the Program does not specify a version number of
 | 
			
		||||
this License, you may choose any version ever published by the Free Software
 | 
			
		||||
Foundation.
 | 
			
		||||
 | 
			
		||||
  10. If you wish to incorporate parts of the Program into other free
 | 
			
		||||
programs whose distribution conditions are different, write to the author
 | 
			
		||||
to ask for permission.  For software which is copyrighted by the Free
 | 
			
		||||
Software Foundation, write to the Free Software Foundation; we sometimes
 | 
			
		||||
make exceptions for this.  Our decision will be guided by the two goals
 | 
			
		||||
of preserving the free status of all derivatives of our free software and
 | 
			
		||||
of promoting the sharing and reuse of software generally.
 | 
			
		||||
 | 
			
		||||
			    NO WARRANTY
 | 
			
		||||
 | 
			
		||||
  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 | 
			
		||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
 | 
			
		||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 | 
			
		||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 | 
			
		||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
			
		||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
 | 
			
		||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
 | 
			
		||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 | 
			
		||||
REPAIR OR CORRECTION.
 | 
			
		||||
 | 
			
		||||
  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
			
		||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 | 
			
		||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 | 
			
		||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 | 
			
		||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 | 
			
		||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 | 
			
		||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 | 
			
		||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 | 
			
		||||
POSSIBILITY OF SUCH DAMAGES.
 | 
			
		||||
 | 
			
		||||
		     END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
	    How to Apply These Terms to Your New Programs
 | 
			
		||||
 | 
			
		||||
  If you develop a new program, and you want it to be of the greatest
 | 
			
		||||
possible use to the public, the best way to achieve this is to make it
 | 
			
		||||
free software which everyone can redistribute and change under these terms.
 | 
			
		||||
 | 
			
		||||
  To do so, attach the following notices to the program.  It is safest
 | 
			
		||||
to attach them to the start of each source file to most effectively
 | 
			
		||||
convey the exclusion of warranty; and each file should have at least
 | 
			
		||||
the "copyright" line and a pointer to where the full notice is found.
 | 
			
		||||
 | 
			
		||||
    <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
    Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License
 | 
			
		||||
    along with this program; if not, write to the Free Software
 | 
			
		||||
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Also add information on how to contact you by electronic and paper mail.
 | 
			
		||||
 | 
			
		||||
If the program is interactive, make it output a short notice like this
 | 
			
		||||
when it starts in an interactive mode:
 | 
			
		||||
 | 
			
		||||
    Gnomovision version 69, Copyright (C) year name of author
 | 
			
		||||
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 | 
			
		||||
    This is free software, and you are welcome to redistribute it
 | 
			
		||||
    under certain conditions; type `show c' for details.
 | 
			
		||||
 | 
			
		||||
The hypothetical commands `show w' and `show c' should show the appropriate
 | 
			
		||||
parts of the General Public License.  Of course, the commands you use may
 | 
			
		||||
be called something other than `show w' and `show c'; they could even be
 | 
			
		||||
mouse-clicks or menu items--whatever suits your program.
 | 
			
		||||
 | 
			
		||||
You should also get your employer (if you work as a programmer) or your
 | 
			
		||||
school, if any, to sign a "copyright disclaimer" for the program, if
 | 
			
		||||
necessary.  Here is a sample; alter the names:
 | 
			
		||||
 | 
			
		||||
  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 | 
			
		||||
  `Gnomovision' (which makes passes at compilers) written by James Hacker.
 | 
			
		||||
 | 
			
		||||
  <signature of Ty Coon>, 1 April 1989
 | 
			
		||||
  Ty Coon, President of Vice
 | 
			
		||||
 | 
			
		||||
This General Public License does not permit incorporating your program into
 | 
			
		||||
proprietary programs.  If your program is a subroutine library, you may
 | 
			
		||||
consider it more useful to permit linking proprietary applications with the
 | 
			
		||||
library.  If this is what you want to do, use the GNU Library General
 | 
			
		||||
Public License instead of this License.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
Automatically imported Linux kernel headers.
 | 
			
		||||
Only use scripts/update-linux-headers.sh to update!
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,275 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License, version 2, as
 | 
			
		||||
 * published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright IBM Corp. 2007
 | 
			
		||||
 *
 | 
			
		||||
 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LINUX_KVM_POWERPC_H
 | 
			
		||||
#define __LINUX_KVM_POWERPC_H
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
 | 
			
		||||
struct kvm_regs {
 | 
			
		||||
	__u64 pc;
 | 
			
		||||
	__u64 cr;
 | 
			
		||||
	__u64 ctr;
 | 
			
		||||
	__u64 lr;
 | 
			
		||||
	__u64 xer;
 | 
			
		||||
	__u64 msr;
 | 
			
		||||
	__u64 srr0;
 | 
			
		||||
	__u64 srr1;
 | 
			
		||||
	__u64 pid;
 | 
			
		||||
 | 
			
		||||
	__u64 sprg0;
 | 
			
		||||
	__u64 sprg1;
 | 
			
		||||
	__u64 sprg2;
 | 
			
		||||
	__u64 sprg3;
 | 
			
		||||
	__u64 sprg4;
 | 
			
		||||
	__u64 sprg5;
 | 
			
		||||
	__u64 sprg6;
 | 
			
		||||
	__u64 sprg7;
 | 
			
		||||
 | 
			
		||||
	__u64 gpr[32];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_SREGS_E_IMPL_NONE	0
 | 
			
		||||
#define KVM_SREGS_E_IMPL_FSL	1
 | 
			
		||||
 | 
			
		||||
#define KVM_SREGS_E_FSL_PIDn	(1 << 0) /* PID1/PID2 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Feature bits indicate which sections of the sregs struct are valid,
 | 
			
		||||
 * both in KVM_GET_SREGS and KVM_SET_SREGS.  On KVM_SET_SREGS, registers
 | 
			
		||||
 * corresponding to unset feature bits will not be modified.  This allows
 | 
			
		||||
 * restoring a checkpoint made without that feature, while keeping the
 | 
			
		||||
 * default values of the new registers.
 | 
			
		||||
 *
 | 
			
		||||
 * KVM_SREGS_E_BASE contains:
 | 
			
		||||
 * CSRR0/1 (refers to SRR2/3 on 40x)
 | 
			
		||||
 * ESR
 | 
			
		||||
 * DEAR
 | 
			
		||||
 * MCSR
 | 
			
		||||
 * TSR
 | 
			
		||||
 * TCR
 | 
			
		||||
 * DEC
 | 
			
		||||
 * TB
 | 
			
		||||
 * VRSAVE (USPRG0)
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_SREGS_E_BASE		(1 << 0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * KVM_SREGS_E_ARCH206 contains:
 | 
			
		||||
 *
 | 
			
		||||
 * PIR
 | 
			
		||||
 * MCSRR0/1
 | 
			
		||||
 * DECAR
 | 
			
		||||
 * IVPR
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_SREGS_E_ARCH206		(1 << 1)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Contains EPCR, plus the upper half of 64-bit registers
 | 
			
		||||
 * that are 32-bit on 32-bit implementations.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_SREGS_E_64			(1 << 2)
 | 
			
		||||
 | 
			
		||||
#define KVM_SREGS_E_SPRG8		(1 << 3)
 | 
			
		||||
#define KVM_SREGS_E_MCIVPR		(1 << 4)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IVORs are used -- contains IVOR0-15, plus additional IVORs
 | 
			
		||||
 * in combination with an appropriate feature bit.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_SREGS_E_IVOR		(1 << 5)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Contains MAS0-4, MAS6-7, TLBnCFG, MMUCFG.
 | 
			
		||||
 * Also TLBnPS if MMUCFG[MAVN] = 1.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_SREGS_E_ARCH206_MMU		(1 << 6)
 | 
			
		||||
 | 
			
		||||
/* DBSR, DBCR, IAC, DAC, DVC */
 | 
			
		||||
#define KVM_SREGS_E_DEBUG		(1 << 7)
 | 
			
		||||
 | 
			
		||||
/* Enhanced debug -- DSRR0/1, SPRG9 */
 | 
			
		||||
#define KVM_SREGS_E_ED			(1 << 8)
 | 
			
		||||
 | 
			
		||||
/* Embedded Floating Point (SPE) -- IVOR32-34 if KVM_SREGS_E_IVOR */
 | 
			
		||||
#define KVM_SREGS_E_SPE			(1 << 9)
 | 
			
		||||
 | 
			
		||||
/* External Proxy (EXP) -- EPR */
 | 
			
		||||
#define KVM_SREGS_EXP			(1 << 10)
 | 
			
		||||
 | 
			
		||||
/* External PID (E.PD) -- EPSC/EPLC */
 | 
			
		||||
#define KVM_SREGS_E_PD			(1 << 11)
 | 
			
		||||
 | 
			
		||||
/* Processor Control (E.PC) -- IVOR36-37 if KVM_SREGS_E_IVOR */
 | 
			
		||||
#define KVM_SREGS_E_PC			(1 << 12)
 | 
			
		||||
 | 
			
		||||
/* Page table (E.PT) -- EPTCFG */
 | 
			
		||||
#define KVM_SREGS_E_PT			(1 << 13)
 | 
			
		||||
 | 
			
		||||
/* Embedded Performance Monitor (E.PM) -- IVOR35 if KVM_SREGS_E_IVOR */
 | 
			
		||||
#define KVM_SREGS_E_PM			(1 << 14)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Special updates:
 | 
			
		||||
 *
 | 
			
		||||
 * Some registers may change even while a vcpu is not running.
 | 
			
		||||
 * To avoid losing these changes, by default these registers are
 | 
			
		||||
 * not updated by KVM_SET_SREGS.  To force an update, set the bit
 | 
			
		||||
 * in u.e.update_special corresponding to the register to be updated.
 | 
			
		||||
 *
 | 
			
		||||
 * The update_special field is zero on return from KVM_GET_SREGS.
 | 
			
		||||
 *
 | 
			
		||||
 * When restoring a checkpoint, the caller can set update_special
 | 
			
		||||
 * to 0xffffffff to ensure that everything is restored, even new features
 | 
			
		||||
 * that the caller doesn't know about.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_SREGS_E_UPDATE_MCSR		(1 << 0)
 | 
			
		||||
#define KVM_SREGS_E_UPDATE_TSR		(1 << 1)
 | 
			
		||||
#define KVM_SREGS_E_UPDATE_DEC		(1 << 2)
 | 
			
		||||
#define KVM_SREGS_E_UPDATE_DBSR		(1 << 3)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * In KVM_SET_SREGS, reserved/pad fields must be left untouched from a
 | 
			
		||||
 * previous KVM_GET_REGS.
 | 
			
		||||
 *
 | 
			
		||||
 * Unless otherwise indicated, setting any register with KVM_SET_SREGS
 | 
			
		||||
 * directly sets its value.  It does not trigger any special semantics such
 | 
			
		||||
 * as write-one-to-clear.  Calling KVM_SET_SREGS on an unmodified struct
 | 
			
		||||
 * just received from KVM_GET_SREGS is always a no-op.
 | 
			
		||||
 */
 | 
			
		||||
struct kvm_sregs {
 | 
			
		||||
	__u32 pvr;
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			__u64 sdr1;
 | 
			
		||||
			struct {
 | 
			
		||||
				struct {
 | 
			
		||||
					__u64 slbe;
 | 
			
		||||
					__u64 slbv;
 | 
			
		||||
				} slb[64];
 | 
			
		||||
			} ppc64;
 | 
			
		||||
			struct {
 | 
			
		||||
				__u32 sr[16];
 | 
			
		||||
				__u64 ibat[8];
 | 
			
		||||
				__u64 dbat[8];
 | 
			
		||||
			} ppc32;
 | 
			
		||||
		} s;
 | 
			
		||||
		struct {
 | 
			
		||||
			union {
 | 
			
		||||
				struct { /* KVM_SREGS_E_IMPL_FSL */
 | 
			
		||||
					__u32 features; /* KVM_SREGS_E_FSL_ */
 | 
			
		||||
					__u32 svr;
 | 
			
		||||
					__u64 mcar;
 | 
			
		||||
					__u32 hid0;
 | 
			
		||||
 | 
			
		||||
					/* KVM_SREGS_E_FSL_PIDn */
 | 
			
		||||
					__u32 pid1, pid2;
 | 
			
		||||
				} fsl;
 | 
			
		||||
				__u8 pad[256];
 | 
			
		||||
			} impl;
 | 
			
		||||
 | 
			
		||||
			__u32 features; /* KVM_SREGS_E_ */
 | 
			
		||||
			__u32 impl_id;	/* KVM_SREGS_E_IMPL_ */
 | 
			
		||||
			__u32 update_special; /* KVM_SREGS_E_UPDATE_ */
 | 
			
		||||
			__u32 pir;	/* read-only */
 | 
			
		||||
			__u64 sprg8;
 | 
			
		||||
			__u64 sprg9;	/* E.ED */
 | 
			
		||||
			__u64 csrr0;
 | 
			
		||||
			__u64 dsrr0;	/* E.ED */
 | 
			
		||||
			__u64 mcsrr0;
 | 
			
		||||
			__u32 csrr1;
 | 
			
		||||
			__u32 dsrr1;	/* E.ED */
 | 
			
		||||
			__u32 mcsrr1;
 | 
			
		||||
			__u32 esr;
 | 
			
		||||
			__u64 dear;
 | 
			
		||||
			__u64 ivpr;
 | 
			
		||||
			__u64 mcivpr;
 | 
			
		||||
			__u64 mcsr;	/* KVM_SREGS_E_UPDATE_MCSR */
 | 
			
		||||
 | 
			
		||||
			__u32 tsr;	/* KVM_SREGS_E_UPDATE_TSR */
 | 
			
		||||
			__u32 tcr;
 | 
			
		||||
			__u32 decar;
 | 
			
		||||
			__u32 dec;	/* KVM_SREGS_E_UPDATE_DEC */
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
			 * Userspace can read TB directly, but the
 | 
			
		||||
			 * value reported here is consistent with "dec".
 | 
			
		||||
			 *
 | 
			
		||||
			 * Read-only.
 | 
			
		||||
			 */
 | 
			
		||||
			__u64 tb;
 | 
			
		||||
 | 
			
		||||
			__u32 dbsr;	/* KVM_SREGS_E_UPDATE_DBSR */
 | 
			
		||||
			__u32 dbcr[3];
 | 
			
		||||
			__u32 iac[4];
 | 
			
		||||
			__u32 dac[2];
 | 
			
		||||
			__u32 dvc[2];
 | 
			
		||||
			__u8 num_iac;	/* read-only */
 | 
			
		||||
			__u8 num_dac;	/* read-only */
 | 
			
		||||
			__u8 num_dvc;	/* read-only */
 | 
			
		||||
			__u8 pad;
 | 
			
		||||
 | 
			
		||||
			__u32 epr;	/* EXP */
 | 
			
		||||
			__u32 vrsave;	/* a.k.a. USPRG0 */
 | 
			
		||||
			__u32 epcr;	/* KVM_SREGS_E_64 */
 | 
			
		||||
 | 
			
		||||
			__u32 mas0;
 | 
			
		||||
			__u32 mas1;
 | 
			
		||||
			__u64 mas2;
 | 
			
		||||
			__u64 mas7_3;
 | 
			
		||||
			__u32 mas4;
 | 
			
		||||
			__u32 mas6;
 | 
			
		||||
 | 
			
		||||
			__u32 ivor_low[16]; /* IVOR0-15 */
 | 
			
		||||
			__u32 ivor_high[18]; /* IVOR32+, plus room to expand */
 | 
			
		||||
 | 
			
		||||
			__u32 mmucfg;	/* read-only */
 | 
			
		||||
			__u32 eptcfg;	/* E.PT, read-only */
 | 
			
		||||
			__u32 tlbcfg[4];/* read-only */
 | 
			
		||||
			__u32 tlbps[4]; /* read-only */
 | 
			
		||||
 | 
			
		||||
			__u32 eplc, epsc; /* E.PD */
 | 
			
		||||
		} e;
 | 
			
		||||
		__u8 pad[1020];
 | 
			
		||||
	} u;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_fpu {
 | 
			
		||||
	__u64 fpr[32];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_debug_exit_arch {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_GUEST_DEBUG */
 | 
			
		||||
struct kvm_guest_debug_arch {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_REG_MASK		0x001f
 | 
			
		||||
#define KVM_REG_EXT_MASK	0xffe0
 | 
			
		||||
#define KVM_REG_GPR		0x0000
 | 
			
		||||
#define KVM_REG_FPR		0x0020
 | 
			
		||||
#define KVM_REG_QPR		0x0040
 | 
			
		||||
#define KVM_REG_FQPR		0x0060
 | 
			
		||||
 | 
			
		||||
#define KVM_INTERRUPT_SET	-1U
 | 
			
		||||
#define KVM_INTERRUPT_UNSET	-2U
 | 
			
		||||
#define KVM_INTERRUPT_SET_LEVEL	-3U
 | 
			
		||||
 | 
			
		||||
#endif /* __LINUX_KVM_POWERPC_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License, version 2, as
 | 
			
		||||
 * published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright IBM Corp. 2008
 | 
			
		||||
 *
 | 
			
		||||
 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __POWERPC_KVM_PARA_H__
 | 
			
		||||
#define __POWERPC_KVM_PARA_H__
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
 | 
			
		||||
struct kvm_vcpu_arch_shared {
 | 
			
		||||
	__u64 scratch1;
 | 
			
		||||
	__u64 scratch2;
 | 
			
		||||
	__u64 scratch3;
 | 
			
		||||
	__u64 critical;		/* Guest may not get interrupts if == r1 */
 | 
			
		||||
	__u64 sprg0;
 | 
			
		||||
	__u64 sprg1;
 | 
			
		||||
	__u64 sprg2;
 | 
			
		||||
	__u64 sprg3;
 | 
			
		||||
	__u64 srr0;
 | 
			
		||||
	__u64 srr1;
 | 
			
		||||
	__u64 dar;
 | 
			
		||||
	__u64 msr;
 | 
			
		||||
	__u32 dsisr;
 | 
			
		||||
	__u32 int_pending;	/* Tells the guest if we have an interrupt */
 | 
			
		||||
	__u32 sr[16];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_SC_MAGIC_R0		0x4b564d21 /* "KVM!" */
 | 
			
		||||
#define HC_VENDOR_KVM		(42 << 16)
 | 
			
		||||
#define HC_EV_SUCCESS		0
 | 
			
		||||
#define HC_EV_UNIMPLEMENTED	12
 | 
			
		||||
 | 
			
		||||
#define KVM_FEATURE_MAGIC_PAGE	1
 | 
			
		||||
 | 
			
		||||
#define KVM_MAGIC_FEAT_SR	(1 << 0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* __POWERPC_KVM_PARA_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
#ifndef __LINUX_KVM_S390_H
 | 
			
		||||
#define __LINUX_KVM_S390_H
 | 
			
		||||
/*
 | 
			
		||||
 * asm-s390/kvm.h - KVM s390 specific structures and definitions
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright IBM Corp. 2008
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License (version 2 only)
 | 
			
		||||
 * as published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 *    Author(s): Carsten Otte <cotte@de.ibm.com>
 | 
			
		||||
 *               Christian Borntraeger <borntraeger@de.ibm.com>
 | 
			
		||||
 */
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
 | 
			
		||||
#define __KVM_S390
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_REGS and KVM_SET_REGS */
 | 
			
		||||
struct kvm_regs {
 | 
			
		||||
	/* general purpose regs for s390 */
 | 
			
		||||
	__u64 gprs[16];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_SREGS and KVM_SET_SREGS */
 | 
			
		||||
struct kvm_sregs {
 | 
			
		||||
	__u32 acrs[16];
 | 
			
		||||
	__u64 crs[16];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_FPU and KVM_SET_FPU */
 | 
			
		||||
struct kvm_fpu {
 | 
			
		||||
	__u32 fpc;
 | 
			
		||||
	__u64 fprs[16];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_debug_exit_arch {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_GUEST_DEBUG */
 | 
			
		||||
struct kvm_guest_debug_arch {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
/*
 | 
			
		||||
 * asm-s390/kvm_para.h - definition for paravirtual devices on s390
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright IBM Corp. 2008
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License (version 2 only)
 | 
			
		||||
 * as published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 *    Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __S390_KVM_PARA_H
 | 
			
		||||
#define __S390_KVM_PARA_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* __S390_KVM_PARA_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,193 @@
 | 
			
		|||
#ifndef _ASM_X86_HYPERV_H
 | 
			
		||||
#define _ASM_X86_HYPERV_H
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
 | 
			
		||||
 * is set by CPUID(HvCpuIdFunctionVersionAndFeatures).
 | 
			
		||||
 */
 | 
			
		||||
#define HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS	0x40000000
 | 
			
		||||
#define HYPERV_CPUID_INTERFACE			0x40000001
 | 
			
		||||
#define HYPERV_CPUID_VERSION			0x40000002
 | 
			
		||||
#define HYPERV_CPUID_FEATURES			0x40000003
 | 
			
		||||
#define HYPERV_CPUID_ENLIGHTMENT_INFO		0x40000004
 | 
			
		||||
#define HYPERV_CPUID_IMPLEMENT_LIMITS		0x40000005
 | 
			
		||||
 | 
			
		||||
#define HYPERV_HYPERVISOR_PRESENT_BIT		0x80000000
 | 
			
		||||
#define HYPERV_CPUID_MIN			0x40000005
 | 
			
		||||
#define HYPERV_CPUID_MAX			0x4000ffff
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Feature identification. EAX indicates which features are available
 | 
			
		||||
 * to the partition based upon the current partition privileges.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* VP Runtime (HV_X64_MSR_VP_RUNTIME) available */
 | 
			
		||||
#define HV_X64_MSR_VP_RUNTIME_AVAILABLE		(1 << 0)
 | 
			
		||||
/* Partition Reference Counter (HV_X64_MSR_TIME_REF_COUNT) available*/
 | 
			
		||||
#define HV_X64_MSR_TIME_REF_COUNT_AVAILABLE	(1 << 1)
 | 
			
		||||
/*
 | 
			
		||||
 * Basic SynIC MSRs (HV_X64_MSR_SCONTROL through HV_X64_MSR_EOM
 | 
			
		||||
 * and HV_X64_MSR_SINT0 through HV_X64_MSR_SINT15) available
 | 
			
		||||
 */
 | 
			
		||||
#define HV_X64_MSR_SYNIC_AVAILABLE		(1 << 2)
 | 
			
		||||
/*
 | 
			
		||||
 * Synthetic Timer MSRs (HV_X64_MSR_STIMER0_CONFIG through
 | 
			
		||||
 * HV_X64_MSR_STIMER3_COUNT) available
 | 
			
		||||
 */
 | 
			
		||||
#define HV_X64_MSR_SYNTIMER_AVAILABLE		(1 << 3)
 | 
			
		||||
/*
 | 
			
		||||
 * APIC access MSRs (HV_X64_MSR_EOI, HV_X64_MSR_ICR and HV_X64_MSR_TPR)
 | 
			
		||||
 * are available
 | 
			
		||||
 */
 | 
			
		||||
#define HV_X64_MSR_APIC_ACCESS_AVAILABLE	(1 << 4)
 | 
			
		||||
/* Hypercall MSRs (HV_X64_MSR_GUEST_OS_ID and HV_X64_MSR_HYPERCALL) available*/
 | 
			
		||||
#define HV_X64_MSR_HYPERCALL_AVAILABLE		(1 << 5)
 | 
			
		||||
/* Access virtual processor index MSR (HV_X64_MSR_VP_INDEX) available*/
 | 
			
		||||
#define HV_X64_MSR_VP_INDEX_AVAILABLE		(1 << 6)
 | 
			
		||||
/* Virtual system reset MSR (HV_X64_MSR_RESET) is available*/
 | 
			
		||||
#define HV_X64_MSR_RESET_AVAILABLE		(1 << 7)
 | 
			
		||||
 /*
 | 
			
		||||
  * Access statistics pages MSRs (HV_X64_MSR_STATS_PARTITION_RETAIL_PAGE,
 | 
			
		||||
  * HV_X64_MSR_STATS_PARTITION_INTERNAL_PAGE, HV_X64_MSR_STATS_VP_RETAIL_PAGE,
 | 
			
		||||
  * HV_X64_MSR_STATS_VP_INTERNAL_PAGE) available
 | 
			
		||||
  */
 | 
			
		||||
#define HV_X64_MSR_STAT_PAGES_AVAILABLE		(1 << 8)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Feature identification: EBX indicates which flags were specified at
 | 
			
		||||
 * partition creation. The format is the same as the partition creation
 | 
			
		||||
 * flag structure defined in section Partition Creation Flags.
 | 
			
		||||
 */
 | 
			
		||||
#define HV_X64_CREATE_PARTITIONS		(1 << 0)
 | 
			
		||||
#define HV_X64_ACCESS_PARTITION_ID		(1 << 1)
 | 
			
		||||
#define HV_X64_ACCESS_MEMORY_POOL		(1 << 2)
 | 
			
		||||
#define HV_X64_ADJUST_MESSAGE_BUFFERS		(1 << 3)
 | 
			
		||||
#define HV_X64_POST_MESSAGES			(1 << 4)
 | 
			
		||||
#define HV_X64_SIGNAL_EVENTS			(1 << 5)
 | 
			
		||||
#define HV_X64_CREATE_PORT			(1 << 6)
 | 
			
		||||
#define HV_X64_CONNECT_PORT			(1 << 7)
 | 
			
		||||
#define HV_X64_ACCESS_STATS			(1 << 8)
 | 
			
		||||
#define HV_X64_DEBUGGING			(1 << 11)
 | 
			
		||||
#define HV_X64_CPU_POWER_MANAGEMENT		(1 << 12)
 | 
			
		||||
#define HV_X64_CONFIGURE_PROFILER		(1 << 13)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Feature identification. EDX indicates which miscellaneous features
 | 
			
		||||
 * are available to the partition.
 | 
			
		||||
 */
 | 
			
		||||
/* The MWAIT instruction is available (per section MONITOR / MWAIT) */
 | 
			
		||||
#define HV_X64_MWAIT_AVAILABLE				(1 << 0)
 | 
			
		||||
/* Guest debugging support is available */
 | 
			
		||||
#define HV_X64_GUEST_DEBUGGING_AVAILABLE		(1 << 1)
 | 
			
		||||
/* Performance Monitor support is available*/
 | 
			
		||||
#define HV_X64_PERF_MONITOR_AVAILABLE			(1 << 2)
 | 
			
		||||
/* Support for physical CPU dynamic partitioning events is available*/
 | 
			
		||||
#define HV_X64_CPU_DYNAMIC_PARTITIONING_AVAILABLE	(1 << 3)
 | 
			
		||||
/*
 | 
			
		||||
 * Support for passing hypercall input parameter block via XMM
 | 
			
		||||
 * registers is available
 | 
			
		||||
 */
 | 
			
		||||
#define HV_X64_HYPERCALL_PARAMS_XMM_AVAILABLE		(1 << 4)
 | 
			
		||||
/* Support for a virtual guest idle state is available */
 | 
			
		||||
#define HV_X64_GUEST_IDLE_STATE_AVAILABLE		(1 << 5)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Implementation recommendations. Indicates which behaviors the hypervisor
 | 
			
		||||
 * recommends the OS implement for optimal performance.
 | 
			
		||||
 */
 | 
			
		||||
 /*
 | 
			
		||||
  * Recommend using hypercall for address space switches rather
 | 
			
		||||
  * than MOV to CR3 instruction
 | 
			
		||||
  */
 | 
			
		||||
#define HV_X64_MWAIT_RECOMMENDED		(1 << 0)
 | 
			
		||||
/* Recommend using hypercall for local TLB flushes rather
 | 
			
		||||
 * than INVLPG or MOV to CR3 instructions */
 | 
			
		||||
#define HV_X64_LOCAL_TLB_FLUSH_RECOMMENDED	(1 << 1)
 | 
			
		||||
/*
 | 
			
		||||
 * Recommend using hypercall for remote TLB flushes rather
 | 
			
		||||
 * than inter-processor interrupts
 | 
			
		||||
 */
 | 
			
		||||
#define HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED	(1 << 2)
 | 
			
		||||
/*
 | 
			
		||||
 * Recommend using MSRs for accessing APIC registers
 | 
			
		||||
 * EOI, ICR and TPR rather than their memory-mapped counterparts
 | 
			
		||||
 */
 | 
			
		||||
#define HV_X64_APIC_ACCESS_RECOMMENDED		(1 << 3)
 | 
			
		||||
/* Recommend using the hypervisor-provided MSR to initiate a system RESET */
 | 
			
		||||
#define HV_X64_SYSTEM_RESET_RECOMMENDED		(1 << 4)
 | 
			
		||||
/*
 | 
			
		||||
 * Recommend using relaxed timing for this partition. If used,
 | 
			
		||||
 * the VM should disable any watchdog timeouts that rely on the
 | 
			
		||||
 * timely delivery of external interrupts
 | 
			
		||||
 */
 | 
			
		||||
#define HV_X64_RELAXED_TIMING_RECOMMENDED	(1 << 5)
 | 
			
		||||
 | 
			
		||||
/* MSR used to identify the guest OS. */
 | 
			
		||||
#define HV_X64_MSR_GUEST_OS_ID			0x40000000
 | 
			
		||||
 | 
			
		||||
/* MSR used to setup pages used to communicate with the hypervisor. */
 | 
			
		||||
#define HV_X64_MSR_HYPERCALL			0x40000001
 | 
			
		||||
 | 
			
		||||
/* MSR used to provide vcpu index */
 | 
			
		||||
#define HV_X64_MSR_VP_INDEX			0x40000002
 | 
			
		||||
 | 
			
		||||
/* MSR used to read the per-partition time reference counter */
 | 
			
		||||
#define HV_X64_MSR_TIME_REF_COUNT		0x40000020
 | 
			
		||||
 | 
			
		||||
/* Define the virtual APIC registers */
 | 
			
		||||
#define HV_X64_MSR_EOI				0x40000070
 | 
			
		||||
#define HV_X64_MSR_ICR				0x40000071
 | 
			
		||||
#define HV_X64_MSR_TPR				0x40000072
 | 
			
		||||
#define HV_X64_MSR_APIC_ASSIST_PAGE		0x40000073
 | 
			
		||||
 | 
			
		||||
/* Define synthetic interrupt controller model specific registers. */
 | 
			
		||||
#define HV_X64_MSR_SCONTROL			0x40000080
 | 
			
		||||
#define HV_X64_MSR_SVERSION			0x40000081
 | 
			
		||||
#define HV_X64_MSR_SIEFP			0x40000082
 | 
			
		||||
#define HV_X64_MSR_SIMP				0x40000083
 | 
			
		||||
#define HV_X64_MSR_EOM				0x40000084
 | 
			
		||||
#define HV_X64_MSR_SINT0			0x40000090
 | 
			
		||||
#define HV_X64_MSR_SINT1			0x40000091
 | 
			
		||||
#define HV_X64_MSR_SINT2			0x40000092
 | 
			
		||||
#define HV_X64_MSR_SINT3			0x40000093
 | 
			
		||||
#define HV_X64_MSR_SINT4			0x40000094
 | 
			
		||||
#define HV_X64_MSR_SINT5			0x40000095
 | 
			
		||||
#define HV_X64_MSR_SINT6			0x40000096
 | 
			
		||||
#define HV_X64_MSR_SINT7			0x40000097
 | 
			
		||||
#define HV_X64_MSR_SINT8			0x40000098
 | 
			
		||||
#define HV_X64_MSR_SINT9			0x40000099
 | 
			
		||||
#define HV_X64_MSR_SINT10			0x4000009A
 | 
			
		||||
#define HV_X64_MSR_SINT11			0x4000009B
 | 
			
		||||
#define HV_X64_MSR_SINT12			0x4000009C
 | 
			
		||||
#define HV_X64_MSR_SINT13			0x4000009D
 | 
			
		||||
#define HV_X64_MSR_SINT14			0x4000009E
 | 
			
		||||
#define HV_X64_MSR_SINT15			0x4000009F
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define HV_X64_MSR_HYPERCALL_ENABLE		0x00000001
 | 
			
		||||
#define HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_SHIFT	12
 | 
			
		||||
#define HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_MASK	\
 | 
			
		||||
		(~((1ull << HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_SHIFT) - 1))
 | 
			
		||||
 | 
			
		||||
/* Declare the various hypercall operations. */
 | 
			
		||||
#define HV_X64_HV_NOTIFY_LONG_SPIN_WAIT		0x0008
 | 
			
		||||
 | 
			
		||||
#define HV_X64_MSR_APIC_ASSIST_PAGE_ENABLE		0x00000001
 | 
			
		||||
#define HV_X64_MSR_APIC_ASSIST_PAGE_ADDRESS_SHIFT	12
 | 
			
		||||
#define HV_X64_MSR_APIC_ASSIST_PAGE_ADDRESS_MASK	\
 | 
			
		||||
		(~((1ull << HV_X64_MSR_APIC_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
 | 
			
		||||
 | 
			
		||||
#define HV_PROCESSOR_POWER_STATE_C0		0
 | 
			
		||||
#define HV_PROCESSOR_POWER_STATE_C1		1
 | 
			
		||||
#define HV_PROCESSOR_POWER_STATE_C2		2
 | 
			
		||||
#define HV_PROCESSOR_POWER_STATE_C3		3
 | 
			
		||||
 | 
			
		||||
/* hypercall status code */
 | 
			
		||||
#define HV_STATUS_SUCCESS			0
 | 
			
		||||
#define HV_STATUS_INVALID_HYPERCALL_CODE	2
 | 
			
		||||
#define HV_STATUS_INVALID_HYPERCALL_INPUT	3
 | 
			
		||||
#define HV_STATUS_INVALID_ALIGNMENT		4
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,324 @@
 | 
			
		|||
#ifndef _ASM_X86_KVM_H
 | 
			
		||||
#define _ASM_X86_KVM_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * KVM x86 specific structures and definitions
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
#include <linux/ioctl.h>
 | 
			
		||||
 | 
			
		||||
/* Select x86 specific features in <linux/kvm.h> */
 | 
			
		||||
#define __KVM_HAVE_PIT
 | 
			
		||||
#define __KVM_HAVE_IOAPIC
 | 
			
		||||
#define __KVM_HAVE_DEVICE_ASSIGNMENT
 | 
			
		||||
#define __KVM_HAVE_MSI
 | 
			
		||||
#define __KVM_HAVE_USER_NMI
 | 
			
		||||
#define __KVM_HAVE_GUEST_DEBUG
 | 
			
		||||
#define __KVM_HAVE_MSIX
 | 
			
		||||
#define __KVM_HAVE_MCE
 | 
			
		||||
#define __KVM_HAVE_PIT_STATE2
 | 
			
		||||
#define __KVM_HAVE_XEN_HVM
 | 
			
		||||
#define __KVM_HAVE_VCPU_EVENTS
 | 
			
		||||
#define __KVM_HAVE_DEBUGREGS
 | 
			
		||||
#define __KVM_HAVE_XSAVE
 | 
			
		||||
#define __KVM_HAVE_XCRS
 | 
			
		||||
 | 
			
		||||
/* Architectural interrupt line count. */
 | 
			
		||||
#define KVM_NR_INTERRUPTS 256
 | 
			
		||||
 | 
			
		||||
struct kvm_memory_alias {
 | 
			
		||||
	__u32 slot;  /* this has a different namespace than memory slots */
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u64 guest_phys_addr;
 | 
			
		||||
	__u64 memory_size;
 | 
			
		||||
	__u64 target_phys_addr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */
 | 
			
		||||
struct kvm_pic_state {
 | 
			
		||||
	__u8 last_irr;	/* edge detection */
 | 
			
		||||
	__u8 irr;		/* interrupt request register */
 | 
			
		||||
	__u8 imr;		/* interrupt mask register */
 | 
			
		||||
	__u8 isr;		/* interrupt service register */
 | 
			
		||||
	__u8 priority_add;	/* highest irq priority */
 | 
			
		||||
	__u8 irq_base;
 | 
			
		||||
	__u8 read_reg_select;
 | 
			
		||||
	__u8 poll;
 | 
			
		||||
	__u8 special_mask;
 | 
			
		||||
	__u8 init_state;
 | 
			
		||||
	__u8 auto_eoi;
 | 
			
		||||
	__u8 rotate_on_auto_eoi;
 | 
			
		||||
	__u8 special_fully_nested_mode;
 | 
			
		||||
	__u8 init4;		/* true if 4 byte init */
 | 
			
		||||
	__u8 elcr;		/* PIIX edge/trigger selection */
 | 
			
		||||
	__u8 elcr_mask;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_IOAPIC_NUM_PINS  24
 | 
			
		||||
struct kvm_ioapic_state {
 | 
			
		||||
	__u64 base_address;
 | 
			
		||||
	__u32 ioregsel;
 | 
			
		||||
	__u32 id;
 | 
			
		||||
	__u32 irr;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
	union {
 | 
			
		||||
		__u64 bits;
 | 
			
		||||
		struct {
 | 
			
		||||
			__u8 vector;
 | 
			
		||||
			__u8 delivery_mode:3;
 | 
			
		||||
			__u8 dest_mode:1;
 | 
			
		||||
			__u8 delivery_status:1;
 | 
			
		||||
			__u8 polarity:1;
 | 
			
		||||
			__u8 remote_irr:1;
 | 
			
		||||
			__u8 trig_mode:1;
 | 
			
		||||
			__u8 mask:1;
 | 
			
		||||
			__u8 reserve:7;
 | 
			
		||||
			__u8 reserved[4];
 | 
			
		||||
			__u8 dest_id;
 | 
			
		||||
		} fields;
 | 
			
		||||
	} redirtbl[KVM_IOAPIC_NUM_PINS];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_IRQCHIP_PIC_MASTER   0
 | 
			
		||||
#define KVM_IRQCHIP_PIC_SLAVE    1
 | 
			
		||||
#define KVM_IRQCHIP_IOAPIC       2
 | 
			
		||||
#define KVM_NR_IRQCHIPS          3
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_REGS and KVM_SET_REGS */
 | 
			
		||||
struct kvm_regs {
 | 
			
		||||
	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
 | 
			
		||||
	__u64 rax, rbx, rcx, rdx;
 | 
			
		||||
	__u64 rsi, rdi, rsp, rbp;
 | 
			
		||||
	__u64 r8,  r9,  r10, r11;
 | 
			
		||||
	__u64 r12, r13, r14, r15;
 | 
			
		||||
	__u64 rip, rflags;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_LAPIC and KVM_SET_LAPIC */
 | 
			
		||||
#define KVM_APIC_REG_SIZE 0x400
 | 
			
		||||
struct kvm_lapic_state {
 | 
			
		||||
	char regs[KVM_APIC_REG_SIZE];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_segment {
 | 
			
		||||
	__u64 base;
 | 
			
		||||
	__u32 limit;
 | 
			
		||||
	__u16 selector;
 | 
			
		||||
	__u8  type;
 | 
			
		||||
	__u8  present, dpl, db, s, l, g, avl;
 | 
			
		||||
	__u8  unusable;
 | 
			
		||||
	__u8  padding;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_dtable {
 | 
			
		||||
	__u64 base;
 | 
			
		||||
	__u16 limit;
 | 
			
		||||
	__u16 padding[3];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_SREGS and KVM_SET_SREGS */
 | 
			
		||||
struct kvm_sregs {
 | 
			
		||||
	/* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */
 | 
			
		||||
	struct kvm_segment cs, ds, es, fs, gs, ss;
 | 
			
		||||
	struct kvm_segment tr, ldt;
 | 
			
		||||
	struct kvm_dtable gdt, idt;
 | 
			
		||||
	__u64 cr0, cr2, cr3, cr4, cr8;
 | 
			
		||||
	__u64 efer;
 | 
			
		||||
	__u64 apic_base;
 | 
			
		||||
	__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_FPU and KVM_SET_FPU */
 | 
			
		||||
struct kvm_fpu {
 | 
			
		||||
	__u8  fpr[8][16];
 | 
			
		||||
	__u16 fcw;
 | 
			
		||||
	__u16 fsw;
 | 
			
		||||
	__u8  ftwx;  /* in fxsave format */
 | 
			
		||||
	__u8  pad1;
 | 
			
		||||
	__u16 last_opcode;
 | 
			
		||||
	__u64 last_ip;
 | 
			
		||||
	__u64 last_dp;
 | 
			
		||||
	__u8  xmm[16][16];
 | 
			
		||||
	__u32 mxcsr;
 | 
			
		||||
	__u32 pad2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_msr_entry {
 | 
			
		||||
	__u32 index;
 | 
			
		||||
	__u32 reserved;
 | 
			
		||||
	__u64 data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_MSRS and KVM_SET_MSRS */
 | 
			
		||||
struct kvm_msrs {
 | 
			
		||||
	__u32 nmsrs; /* number of msrs in entries */
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
 | 
			
		||||
	struct kvm_msr_entry entries[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_MSR_INDEX_LIST */
 | 
			
		||||
struct kvm_msr_list {
 | 
			
		||||
	__u32 nmsrs; /* number of msrs in entries */
 | 
			
		||||
	__u32 indices[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct kvm_cpuid_entry {
 | 
			
		||||
	__u32 function;
 | 
			
		||||
	__u32 eax;
 | 
			
		||||
	__u32 ebx;
 | 
			
		||||
	__u32 ecx;
 | 
			
		||||
	__u32 edx;
 | 
			
		||||
	__u32 padding;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_CPUID */
 | 
			
		||||
struct kvm_cpuid {
 | 
			
		||||
	__u32 nent;
 | 
			
		||||
	__u32 padding;
 | 
			
		||||
	struct kvm_cpuid_entry entries[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_cpuid_entry2 {
 | 
			
		||||
	__u32 function;
 | 
			
		||||
	__u32 index;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 eax;
 | 
			
		||||
	__u32 ebx;
 | 
			
		||||
	__u32 ecx;
 | 
			
		||||
	__u32 edx;
 | 
			
		||||
	__u32 padding[3];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX 1
 | 
			
		||||
#define KVM_CPUID_FLAG_STATEFUL_FUNC    2
 | 
			
		||||
#define KVM_CPUID_FLAG_STATE_READ_NEXT  4
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_CPUID2 */
 | 
			
		||||
struct kvm_cpuid2 {
 | 
			
		||||
	__u32 nent;
 | 
			
		||||
	__u32 padding;
 | 
			
		||||
	struct kvm_cpuid_entry2 entries[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_PIT and KVM_SET_PIT */
 | 
			
		||||
struct kvm_pit_channel_state {
 | 
			
		||||
	__u32 count; /* can be 65536 */
 | 
			
		||||
	__u16 latched_count;
 | 
			
		||||
	__u8 count_latched;
 | 
			
		||||
	__u8 status_latched;
 | 
			
		||||
	__u8 status;
 | 
			
		||||
	__u8 read_state;
 | 
			
		||||
	__u8 write_state;
 | 
			
		||||
	__u8 write_latch;
 | 
			
		||||
	__u8 rw_mode;
 | 
			
		||||
	__u8 mode;
 | 
			
		||||
	__u8 bcd;
 | 
			
		||||
	__u8 gate;
 | 
			
		||||
	__s64 count_load_time;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_debug_exit_arch {
 | 
			
		||||
	__u32 exception;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
	__u64 pc;
 | 
			
		||||
	__u64 dr6;
 | 
			
		||||
	__u64 dr7;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_GUESTDBG_USE_SW_BP		0x00010000
 | 
			
		||||
#define KVM_GUESTDBG_USE_HW_BP		0x00020000
 | 
			
		||||
#define KVM_GUESTDBG_INJECT_DB		0x00040000
 | 
			
		||||
#define KVM_GUESTDBG_INJECT_BP		0x00080000
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_GUEST_DEBUG */
 | 
			
		||||
struct kvm_guest_debug_arch {
 | 
			
		||||
	__u64 debugreg[8];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_pit_state {
 | 
			
		||||
	struct kvm_pit_channel_state channels[3];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_PIT_FLAGS_HPET_LEGACY  0x00000001
 | 
			
		||||
 | 
			
		||||
struct kvm_pit_state2 {
 | 
			
		||||
	struct kvm_pit_channel_state channels[3];
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 reserved[9];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_reinject_control {
 | 
			
		||||
	__u8 pit_reinject;
 | 
			
		||||
	__u8 reserved[31];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */
 | 
			
		||||
#define KVM_VCPUEVENT_VALID_NMI_PENDING	0x00000001
 | 
			
		||||
#define KVM_VCPUEVENT_VALID_SIPI_VECTOR	0x00000002
 | 
			
		||||
#define KVM_VCPUEVENT_VALID_SHADOW	0x00000004
 | 
			
		||||
 | 
			
		||||
/* Interrupt shadow states */
 | 
			
		||||
#define KVM_X86_SHADOW_INT_MOV_SS	0x01
 | 
			
		||||
#define KVM_X86_SHADOW_INT_STI		0x02
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET/SET_VCPU_EVENTS */
 | 
			
		||||
struct kvm_vcpu_events {
 | 
			
		||||
	struct {
 | 
			
		||||
		__u8 injected;
 | 
			
		||||
		__u8 nr;
 | 
			
		||||
		__u8 has_error_code;
 | 
			
		||||
		__u8 pad;
 | 
			
		||||
		__u32 error_code;
 | 
			
		||||
	} exception;
 | 
			
		||||
	struct {
 | 
			
		||||
		__u8 injected;
 | 
			
		||||
		__u8 nr;
 | 
			
		||||
		__u8 soft;
 | 
			
		||||
		__u8 shadow;
 | 
			
		||||
	} interrupt;
 | 
			
		||||
	struct {
 | 
			
		||||
		__u8 injected;
 | 
			
		||||
		__u8 pending;
 | 
			
		||||
		__u8 masked;
 | 
			
		||||
		__u8 pad;
 | 
			
		||||
	} nmi;
 | 
			
		||||
	__u32 sipi_vector;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 reserved[10];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET/SET_DEBUGREGS */
 | 
			
		||||
struct kvm_debugregs {
 | 
			
		||||
	__u64 db[4];
 | 
			
		||||
	__u64 dr6;
 | 
			
		||||
	__u64 dr7;
 | 
			
		||||
	__u64 flags;
 | 
			
		||||
	__u64 reserved[9];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_CAP_XSAVE */
 | 
			
		||||
struct kvm_xsave {
 | 
			
		||||
	__u32 region[1024];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_MAX_XCRS	16
 | 
			
		||||
 | 
			
		||||
struct kvm_xcr {
 | 
			
		||||
	__u32 xcr;
 | 
			
		||||
	__u32 reserved;
 | 
			
		||||
	__u64 value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_xcrs {
 | 
			
		||||
	__u32 nr_xcrs;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	struct kvm_xcr xcrs[KVM_MAX_XCRS];
 | 
			
		||||
	__u64 padding[16];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_X86_KVM_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
#ifndef _ASM_X86_KVM_PARA_H
 | 
			
		||||
#define _ASM_X86_KVM_PARA_H
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
#include <asm/hyperv.h>
 | 
			
		||||
 | 
			
		||||
/* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx.  It
 | 
			
		||||
 * should be used to determine that a VM is running under KVM.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_CPUID_SIGNATURE	0x40000000
 | 
			
		||||
 | 
			
		||||
/* This CPUID returns a feature bitmap in eax.  Before enabling a particular
 | 
			
		||||
 * paravirtualization, the appropriate feature bit should be checked.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_CPUID_FEATURES	0x40000001
 | 
			
		||||
#define KVM_FEATURE_CLOCKSOURCE		0
 | 
			
		||||
#define KVM_FEATURE_NOP_IO_DELAY	1
 | 
			
		||||
#define KVM_FEATURE_MMU_OP		2
 | 
			
		||||
/* This indicates that the new set of kvmclock msrs
 | 
			
		||||
 * are available. The use of 0x11 and 0x12 is deprecated
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_FEATURE_CLOCKSOURCE2        3
 | 
			
		||||
#define KVM_FEATURE_ASYNC_PF		4
 | 
			
		||||
 | 
			
		||||
/* The last 8 bits are used to indicate how to interpret the flags field
 | 
			
		||||
 * in pvclock structure. If no bits are set, all flags are ignored.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_FEATURE_CLOCKSOURCE_STABLE_BIT	24
 | 
			
		||||
 | 
			
		||||
#define MSR_KVM_WALL_CLOCK  0x11
 | 
			
		||||
#define MSR_KVM_SYSTEM_TIME 0x12
 | 
			
		||||
 | 
			
		||||
/* Custom MSRs falls in the range 0x4b564d00-0x4b564dff */
 | 
			
		||||
#define MSR_KVM_WALL_CLOCK_NEW  0x4b564d00
 | 
			
		||||
#define MSR_KVM_SYSTEM_TIME_NEW 0x4b564d01
 | 
			
		||||
#define MSR_KVM_ASYNC_PF_EN 0x4b564d02
 | 
			
		||||
 | 
			
		||||
#define KVM_MAX_MMU_OP_BATCH           32
 | 
			
		||||
 | 
			
		||||
#define KVM_ASYNC_PF_ENABLED			(1 << 0)
 | 
			
		||||
#define KVM_ASYNC_PF_SEND_ALWAYS		(1 << 1)
 | 
			
		||||
 | 
			
		||||
/* Operations for KVM_HC_MMU_OP */
 | 
			
		||||
#define KVM_MMU_OP_WRITE_PTE            1
 | 
			
		||||
#define KVM_MMU_OP_FLUSH_TLB	        2
 | 
			
		||||
#define KVM_MMU_OP_RELEASE_PT	        3
 | 
			
		||||
 | 
			
		||||
/* Payload for KVM_HC_MMU_OP */
 | 
			
		||||
struct kvm_mmu_op_header {
 | 
			
		||||
	__u32 op;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_mmu_op_write_pte {
 | 
			
		||||
	struct kvm_mmu_op_header header;
 | 
			
		||||
	__u64 pte_phys;
 | 
			
		||||
	__u64 pte_val;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_mmu_op_flush_tlb {
 | 
			
		||||
	struct kvm_mmu_op_header header;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_mmu_op_release_pt {
 | 
			
		||||
	struct kvm_mmu_op_header header;
 | 
			
		||||
	__u64 pt_phys;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_PV_REASON_PAGE_NOT_PRESENT 1
 | 
			
		||||
#define KVM_PV_REASON_PAGE_READY 2
 | 
			
		||||
 | 
			
		||||
struct kvm_vcpu_pv_apf_data {
 | 
			
		||||
	__u32 reason;
 | 
			
		||||
	__u8 pad[60];
 | 
			
		||||
	__u32 enabled;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_X86_KVM_PARA_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,804 @@
 | 
			
		|||
#ifndef __LINUX_KVM_H
 | 
			
		||||
#define __LINUX_KVM_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Userspace interface for /dev/kvm - kernel based virtual machine
 | 
			
		||||
 *
 | 
			
		||||
 * Note: you must update KVM_API_VERSION if you change this interface.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
 | 
			
		||||
#include <linux/ioctl.h>
 | 
			
		||||
#include <asm/kvm.h>
 | 
			
		||||
 | 
			
		||||
#define KVM_API_VERSION 12
 | 
			
		||||
 | 
			
		||||
/* *** Deprecated interfaces *** */
 | 
			
		||||
 | 
			
		||||
#define KVM_TRC_SHIFT           16
 | 
			
		||||
 | 
			
		||||
#define KVM_TRC_ENTRYEXIT       (1 << KVM_TRC_SHIFT)
 | 
			
		||||
#define KVM_TRC_HANDLER         (1 << (KVM_TRC_SHIFT + 1))
 | 
			
		||||
 | 
			
		||||
#define KVM_TRC_VMENTRY         (KVM_TRC_ENTRYEXIT + 0x01)
 | 
			
		||||
#define KVM_TRC_VMEXIT          (KVM_TRC_ENTRYEXIT + 0x02)
 | 
			
		||||
#define KVM_TRC_PAGE_FAULT      (KVM_TRC_HANDLER + 0x01)
 | 
			
		||||
 | 
			
		||||
#define KVM_TRC_HEAD_SIZE       12
 | 
			
		||||
#define KVM_TRC_CYCLE_SIZE      8
 | 
			
		||||
#define KVM_TRC_EXTRA_MAX       7
 | 
			
		||||
 | 
			
		||||
#define KVM_TRC_INJ_VIRQ         (KVM_TRC_HANDLER + 0x02)
 | 
			
		||||
#define KVM_TRC_REDELIVER_EVT    (KVM_TRC_HANDLER + 0x03)
 | 
			
		||||
#define KVM_TRC_PEND_INTR        (KVM_TRC_HANDLER + 0x04)
 | 
			
		||||
#define KVM_TRC_IO_READ          (KVM_TRC_HANDLER + 0x05)
 | 
			
		||||
#define KVM_TRC_IO_WRITE         (KVM_TRC_HANDLER + 0x06)
 | 
			
		||||
#define KVM_TRC_CR_READ          (KVM_TRC_HANDLER + 0x07)
 | 
			
		||||
#define KVM_TRC_CR_WRITE         (KVM_TRC_HANDLER + 0x08)
 | 
			
		||||
#define KVM_TRC_DR_READ          (KVM_TRC_HANDLER + 0x09)
 | 
			
		||||
#define KVM_TRC_DR_WRITE         (KVM_TRC_HANDLER + 0x0A)
 | 
			
		||||
#define KVM_TRC_MSR_READ         (KVM_TRC_HANDLER + 0x0B)
 | 
			
		||||
#define KVM_TRC_MSR_WRITE        (KVM_TRC_HANDLER + 0x0C)
 | 
			
		||||
#define KVM_TRC_CPUID            (KVM_TRC_HANDLER + 0x0D)
 | 
			
		||||
#define KVM_TRC_INTR             (KVM_TRC_HANDLER + 0x0E)
 | 
			
		||||
#define KVM_TRC_NMI              (KVM_TRC_HANDLER + 0x0F)
 | 
			
		||||
#define KVM_TRC_VMMCALL          (KVM_TRC_HANDLER + 0x10)
 | 
			
		||||
#define KVM_TRC_HLT              (KVM_TRC_HANDLER + 0x11)
 | 
			
		||||
#define KVM_TRC_CLTS             (KVM_TRC_HANDLER + 0x12)
 | 
			
		||||
#define KVM_TRC_LMSW             (KVM_TRC_HANDLER + 0x13)
 | 
			
		||||
#define KVM_TRC_APIC_ACCESS      (KVM_TRC_HANDLER + 0x14)
 | 
			
		||||
#define KVM_TRC_TDP_FAULT        (KVM_TRC_HANDLER + 0x15)
 | 
			
		||||
#define KVM_TRC_GTLB_WRITE       (KVM_TRC_HANDLER + 0x16)
 | 
			
		||||
#define KVM_TRC_STLB_WRITE       (KVM_TRC_HANDLER + 0x17)
 | 
			
		||||
#define KVM_TRC_STLB_INVAL       (KVM_TRC_HANDLER + 0x18)
 | 
			
		||||
#define KVM_TRC_PPC_INSTR        (KVM_TRC_HANDLER + 0x19)
 | 
			
		||||
 | 
			
		||||
struct kvm_user_trace_setup {
 | 
			
		||||
	__u32 buf_size;
 | 
			
		||||
	__u32 buf_nr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define __KVM_DEPRECATED_MAIN_W_0x06 \
 | 
			
		||||
	_IOW(KVMIO, 0x06, struct kvm_user_trace_setup)
 | 
			
		||||
#define __KVM_DEPRECATED_MAIN_0x07 _IO(KVMIO, 0x07)
 | 
			
		||||
#define __KVM_DEPRECATED_MAIN_0x08 _IO(KVMIO, 0x08)
 | 
			
		||||
 | 
			
		||||
#define __KVM_DEPRECATED_VM_R_0x70 _IOR(KVMIO, 0x70, struct kvm_assigned_irq)
 | 
			
		||||
 | 
			
		||||
struct kvm_breakpoint {
 | 
			
		||||
	__u32 enabled;
 | 
			
		||||
	__u32 padding;
 | 
			
		||||
	__u64 address;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_debug_guest {
 | 
			
		||||
	__u32 enabled;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
	struct kvm_breakpoint breakpoints[4];
 | 
			
		||||
	__u32 singlestep;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define __KVM_DEPRECATED_VCPU_W_0x87 _IOW(KVMIO, 0x87, struct kvm_debug_guest)
 | 
			
		||||
 | 
			
		||||
/* *** End of deprecated interfaces *** */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* for KVM_CREATE_MEMORY_REGION */
 | 
			
		||||
struct kvm_memory_region {
 | 
			
		||||
	__u32 slot;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u64 guest_phys_addr;
 | 
			
		||||
	__u64 memory_size; /* bytes */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_USER_MEMORY_REGION */
 | 
			
		||||
struct kvm_userspace_memory_region {
 | 
			
		||||
	__u32 slot;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u64 guest_phys_addr;
 | 
			
		||||
	__u64 memory_size; /* bytes */
 | 
			
		||||
	__u64 userspace_addr; /* start of the userspace allocated memory */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for kvm_memory_region::flags */
 | 
			
		||||
#define KVM_MEM_LOG_DIRTY_PAGES  1UL
 | 
			
		||||
#define KVM_MEMSLOT_INVALID      (1UL << 1)
 | 
			
		||||
 | 
			
		||||
/* for KVM_IRQ_LINE */
 | 
			
		||||
struct kvm_irq_level {
 | 
			
		||||
	/*
 | 
			
		||||
	 * ACPI gsi notion of irq.
 | 
			
		||||
	 * For IA-64 (APIC model) IOAPIC0: irq 0-23; IOAPIC1: irq 24-47..
 | 
			
		||||
	 * For X86 (standard AT mode) PIC0/1: irq 0-15. IOAPIC0: 0-23..
 | 
			
		||||
	 */
 | 
			
		||||
	union {
 | 
			
		||||
		__u32 irq;
 | 
			
		||||
		__s32 status;
 | 
			
		||||
	};
 | 
			
		||||
	__u32 level;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct kvm_irqchip {
 | 
			
		||||
	__u32 chip_id;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
        union {
 | 
			
		||||
		char dummy[512];  /* reserving space */
 | 
			
		||||
#ifdef __KVM_HAVE_PIT
 | 
			
		||||
		struct kvm_pic_state pic;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __KVM_HAVE_IOAPIC
 | 
			
		||||
		struct kvm_ioapic_state ioapic;
 | 
			
		||||
#endif
 | 
			
		||||
	} chip;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_CREATE_PIT2 */
 | 
			
		||||
struct kvm_pit_config {
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 pad[15];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_PIT_SPEAKER_DUMMY     1
 | 
			
		||||
 | 
			
		||||
#define KVM_EXIT_UNKNOWN          0
 | 
			
		||||
#define KVM_EXIT_EXCEPTION        1
 | 
			
		||||
#define KVM_EXIT_IO               2
 | 
			
		||||
#define KVM_EXIT_HYPERCALL        3
 | 
			
		||||
#define KVM_EXIT_DEBUG            4
 | 
			
		||||
#define KVM_EXIT_HLT              5
 | 
			
		||||
#define KVM_EXIT_MMIO             6
 | 
			
		||||
#define KVM_EXIT_IRQ_WINDOW_OPEN  7
 | 
			
		||||
#define KVM_EXIT_SHUTDOWN         8
 | 
			
		||||
#define KVM_EXIT_FAIL_ENTRY       9
 | 
			
		||||
#define KVM_EXIT_INTR             10
 | 
			
		||||
#define KVM_EXIT_SET_TPR          11
 | 
			
		||||
#define KVM_EXIT_TPR_ACCESS       12
 | 
			
		||||
#define KVM_EXIT_S390_SIEIC       13
 | 
			
		||||
#define KVM_EXIT_S390_RESET       14
 | 
			
		||||
#define KVM_EXIT_DCR              15
 | 
			
		||||
#define KVM_EXIT_NMI              16
 | 
			
		||||
#define KVM_EXIT_INTERNAL_ERROR   17
 | 
			
		||||
#define KVM_EXIT_OSI              18
 | 
			
		||||
 | 
			
		||||
/* For KVM_EXIT_INTERNAL_ERROR */
 | 
			
		||||
#define KVM_INTERNAL_ERROR_EMULATION 1
 | 
			
		||||
#define KVM_INTERNAL_ERROR_SIMUL_EX 2
 | 
			
		||||
 | 
			
		||||
/* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */
 | 
			
		||||
struct kvm_run {
 | 
			
		||||
	/* in */
 | 
			
		||||
	__u8 request_interrupt_window;
 | 
			
		||||
	__u8 padding1[7];
 | 
			
		||||
 | 
			
		||||
	/* out */
 | 
			
		||||
	__u32 exit_reason;
 | 
			
		||||
	__u8 ready_for_interrupt_injection;
 | 
			
		||||
	__u8 if_flag;
 | 
			
		||||
	__u8 padding2[2];
 | 
			
		||||
 | 
			
		||||
	/* in (pre_kvm_run), out (post_kvm_run) */
 | 
			
		||||
	__u64 cr8;
 | 
			
		||||
	__u64 apic_base;
 | 
			
		||||
 | 
			
		||||
#ifdef __KVM_S390
 | 
			
		||||
	/* the processor status word for s390 */
 | 
			
		||||
	__u64 psw_mask; /* psw upper half */
 | 
			
		||||
	__u64 psw_addr; /* psw lower half */
 | 
			
		||||
#endif
 | 
			
		||||
	union {
 | 
			
		||||
		/* KVM_EXIT_UNKNOWN */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u64 hardware_exit_reason;
 | 
			
		||||
		} hw;
 | 
			
		||||
		/* KVM_EXIT_FAIL_ENTRY */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u64 hardware_entry_failure_reason;
 | 
			
		||||
		} fail_entry;
 | 
			
		||||
		/* KVM_EXIT_EXCEPTION */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u32 exception;
 | 
			
		||||
			__u32 error_code;
 | 
			
		||||
		} ex;
 | 
			
		||||
		/* KVM_EXIT_IO */
 | 
			
		||||
		struct {
 | 
			
		||||
#define KVM_EXIT_IO_IN  0
 | 
			
		||||
#define KVM_EXIT_IO_OUT 1
 | 
			
		||||
			__u8 direction;
 | 
			
		||||
			__u8 size; /* bytes */
 | 
			
		||||
			__u16 port;
 | 
			
		||||
			__u32 count;
 | 
			
		||||
			__u64 data_offset; /* relative to kvm_run start */
 | 
			
		||||
		} io;
 | 
			
		||||
		struct {
 | 
			
		||||
			struct kvm_debug_exit_arch arch;
 | 
			
		||||
		} debug;
 | 
			
		||||
		/* KVM_EXIT_MMIO */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u64 phys_addr;
 | 
			
		||||
			__u8  data[8];
 | 
			
		||||
			__u32 len;
 | 
			
		||||
			__u8  is_write;
 | 
			
		||||
		} mmio;
 | 
			
		||||
		/* KVM_EXIT_HYPERCALL */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u64 nr;
 | 
			
		||||
			__u64 args[6];
 | 
			
		||||
			__u64 ret;
 | 
			
		||||
			__u32 longmode;
 | 
			
		||||
			__u32 pad;
 | 
			
		||||
		} hypercall;
 | 
			
		||||
		/* KVM_EXIT_TPR_ACCESS */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u64 rip;
 | 
			
		||||
			__u32 is_write;
 | 
			
		||||
			__u32 pad;
 | 
			
		||||
		} tpr_access;
 | 
			
		||||
		/* KVM_EXIT_S390_SIEIC */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u8 icptcode;
 | 
			
		||||
			__u16 ipa;
 | 
			
		||||
			__u32 ipb;
 | 
			
		||||
		} s390_sieic;
 | 
			
		||||
		/* KVM_EXIT_S390_RESET */
 | 
			
		||||
#define KVM_S390_RESET_POR       1
 | 
			
		||||
#define KVM_S390_RESET_CLEAR     2
 | 
			
		||||
#define KVM_S390_RESET_SUBSYSTEM 4
 | 
			
		||||
#define KVM_S390_RESET_CPU_INIT  8
 | 
			
		||||
#define KVM_S390_RESET_IPL       16
 | 
			
		||||
		__u64 s390_reset_flags;
 | 
			
		||||
		/* KVM_EXIT_DCR */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u32 dcrn;
 | 
			
		||||
			__u32 data;
 | 
			
		||||
			__u8  is_write;
 | 
			
		||||
		} dcr;
 | 
			
		||||
		struct {
 | 
			
		||||
			__u32 suberror;
 | 
			
		||||
			/* Available with KVM_CAP_INTERNAL_ERROR_DATA: */
 | 
			
		||||
			__u32 ndata;
 | 
			
		||||
			__u64 data[16];
 | 
			
		||||
		} internal;
 | 
			
		||||
		/* KVM_EXIT_OSI */
 | 
			
		||||
		struct {
 | 
			
		||||
			__u64 gprs[32];
 | 
			
		||||
		} osi;
 | 
			
		||||
		/* Fix the size of the union. */
 | 
			
		||||
		char padding[256];
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */
 | 
			
		||||
 | 
			
		||||
struct kvm_coalesced_mmio_zone {
 | 
			
		||||
	__u64 addr;
 | 
			
		||||
	__u32 size;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_coalesced_mmio {
 | 
			
		||||
	__u64 phys_addr;
 | 
			
		||||
	__u32 len;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
	__u8  data[8];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_coalesced_mmio_ring {
 | 
			
		||||
	__u32 first, last;
 | 
			
		||||
	struct kvm_coalesced_mmio coalesced_mmio[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_COALESCED_MMIO_MAX \
 | 
			
		||||
	((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / \
 | 
			
		||||
	 sizeof(struct kvm_coalesced_mmio))
 | 
			
		||||
 | 
			
		||||
/* for KVM_TRANSLATE */
 | 
			
		||||
struct kvm_translation {
 | 
			
		||||
	/* in */
 | 
			
		||||
	__u64 linear_address;
 | 
			
		||||
 | 
			
		||||
	/* out */
 | 
			
		||||
	__u64 physical_address;
 | 
			
		||||
	__u8  valid;
 | 
			
		||||
	__u8  writeable;
 | 
			
		||||
	__u8  usermode;
 | 
			
		||||
	__u8  pad[5];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_INTERRUPT */
 | 
			
		||||
struct kvm_interrupt {
 | 
			
		||||
	/* in */
 | 
			
		||||
	__u32 irq;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_GET_DIRTY_LOG */
 | 
			
		||||
struct kvm_dirty_log {
 | 
			
		||||
	__u32 slot;
 | 
			
		||||
	__u32 padding1;
 | 
			
		||||
	union {
 | 
			
		||||
		void *dirty_bitmap; /* one bit per page */
 | 
			
		||||
		__u64 padding2;
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_SIGNAL_MASK */
 | 
			
		||||
struct kvm_signal_mask {
 | 
			
		||||
	__u32 len;
 | 
			
		||||
	__u8  sigset[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_TPR_ACCESS_REPORTING */
 | 
			
		||||
struct kvm_tpr_access_ctl {
 | 
			
		||||
	__u32 enabled;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 reserved[8];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_VAPIC_ADDR */
 | 
			
		||||
struct kvm_vapic_addr {
 | 
			
		||||
	__u64 vapic_addr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_MPSTATE */
 | 
			
		||||
 | 
			
		||||
#define KVM_MP_STATE_RUNNABLE          0
 | 
			
		||||
#define KVM_MP_STATE_UNINITIALIZED     1
 | 
			
		||||
#define KVM_MP_STATE_INIT_RECEIVED     2
 | 
			
		||||
#define KVM_MP_STATE_HALTED            3
 | 
			
		||||
#define KVM_MP_STATE_SIPI_RECEIVED     4
 | 
			
		||||
 | 
			
		||||
struct kvm_mp_state {
 | 
			
		||||
	__u32 mp_state;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_s390_psw {
 | 
			
		||||
	__u64 mask;
 | 
			
		||||
	__u64 addr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* valid values for type in kvm_s390_interrupt */
 | 
			
		||||
#define KVM_S390_SIGP_STOP		0xfffe0000u
 | 
			
		||||
#define KVM_S390_PROGRAM_INT		0xfffe0001u
 | 
			
		||||
#define KVM_S390_SIGP_SET_PREFIX	0xfffe0002u
 | 
			
		||||
#define KVM_S390_RESTART		0xfffe0003u
 | 
			
		||||
#define KVM_S390_INT_VIRTIO		0xffff2603u
 | 
			
		||||
#define KVM_S390_INT_SERVICE		0xffff2401u
 | 
			
		||||
#define KVM_S390_INT_EMERGENCY		0xffff1201u
 | 
			
		||||
 | 
			
		||||
struct kvm_s390_interrupt {
 | 
			
		||||
	__u32 type;
 | 
			
		||||
	__u32 parm;
 | 
			
		||||
	__u64 parm64;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_SET_GUEST_DEBUG */
 | 
			
		||||
 | 
			
		||||
#define KVM_GUESTDBG_ENABLE		0x00000001
 | 
			
		||||
#define KVM_GUESTDBG_SINGLESTEP		0x00000002
 | 
			
		||||
 | 
			
		||||
struct kvm_guest_debug {
 | 
			
		||||
	__u32 control;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
	struct kvm_guest_debug_arch arch;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	kvm_ioeventfd_flag_nr_datamatch,
 | 
			
		||||
	kvm_ioeventfd_flag_nr_pio,
 | 
			
		||||
	kvm_ioeventfd_flag_nr_deassign,
 | 
			
		||||
	kvm_ioeventfd_flag_nr_max,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_IOEVENTFD_FLAG_DATAMATCH (1 << kvm_ioeventfd_flag_nr_datamatch)
 | 
			
		||||
#define KVM_IOEVENTFD_FLAG_PIO       (1 << kvm_ioeventfd_flag_nr_pio)
 | 
			
		||||
#define KVM_IOEVENTFD_FLAG_DEASSIGN  (1 << kvm_ioeventfd_flag_nr_deassign)
 | 
			
		||||
 | 
			
		||||
#define KVM_IOEVENTFD_VALID_FLAG_MASK  ((1 << kvm_ioeventfd_flag_nr_max) - 1)
 | 
			
		||||
 | 
			
		||||
struct kvm_ioeventfd {
 | 
			
		||||
	__u64 datamatch;
 | 
			
		||||
	__u64 addr;        /* legal pio/mmio address */
 | 
			
		||||
	__u32 len;         /* 1, 2, 4, or 8 bytes    */
 | 
			
		||||
	__s32 fd;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u8  pad[36];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_ENABLE_CAP */
 | 
			
		||||
struct kvm_enable_cap {
 | 
			
		||||
	/* in */
 | 
			
		||||
	__u32 cap;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u64 args[4];
 | 
			
		||||
	__u8  pad[64];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* for KVM_PPC_GET_PVINFO */
 | 
			
		||||
struct kvm_ppc_pvinfo {
 | 
			
		||||
	/* out */
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 hcall[4];
 | 
			
		||||
	__u8  pad[108];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVMIO 0xAE
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ioctls for /dev/kvm fds:
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_GET_API_VERSION       _IO(KVMIO,   0x00)
 | 
			
		||||
#define KVM_CREATE_VM             _IO(KVMIO,   0x01) /* returns a VM fd */
 | 
			
		||||
#define KVM_GET_MSR_INDEX_LIST    _IOWR(KVMIO, 0x02, struct kvm_msr_list)
 | 
			
		||||
 | 
			
		||||
#define KVM_S390_ENABLE_SIE       _IO(KVMIO,   0x06)
 | 
			
		||||
/*
 | 
			
		||||
 * Check if a kvm extension is available.  Argument is extension number,
 | 
			
		||||
 * return is 1 (yes) or 0 (no, sorry).
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_CHECK_EXTENSION       _IO(KVMIO,   0x03)
 | 
			
		||||
/*
 | 
			
		||||
 * Get size for mmap(vcpu_fd)
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_GET_VCPU_MMAP_SIZE    _IO(KVMIO,   0x04) /* in bytes */
 | 
			
		||||
#define KVM_GET_SUPPORTED_CPUID   _IOWR(KVMIO, 0x05, struct kvm_cpuid2)
 | 
			
		||||
#define KVM_TRACE_ENABLE          __KVM_DEPRECATED_MAIN_W_0x06
 | 
			
		||||
#define KVM_TRACE_PAUSE           __KVM_DEPRECATED_MAIN_0x07
 | 
			
		||||
#define KVM_TRACE_DISABLE         __KVM_DEPRECATED_MAIN_0x08
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Extension capability list.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_CAP_IRQCHIP	  0
 | 
			
		||||
#define KVM_CAP_HLT	  1
 | 
			
		||||
#define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2
 | 
			
		||||
#define KVM_CAP_USER_MEMORY 3
 | 
			
		||||
#define KVM_CAP_SET_TSS_ADDR 4
 | 
			
		||||
#define KVM_CAP_VAPIC 6
 | 
			
		||||
#define KVM_CAP_EXT_CPUID 7
 | 
			
		||||
#define KVM_CAP_CLOCKSOURCE 8
 | 
			
		||||
#define KVM_CAP_NR_VCPUS 9       /* returns max vcpus per vm */
 | 
			
		||||
#define KVM_CAP_NR_MEMSLOTS 10   /* returns max memory slots per vm */
 | 
			
		||||
#define KVM_CAP_PIT 11
 | 
			
		||||
#define KVM_CAP_NOP_IO_DELAY 12
 | 
			
		||||
#define KVM_CAP_PV_MMU 13
 | 
			
		||||
#define KVM_CAP_MP_STATE 14
 | 
			
		||||
#define KVM_CAP_COALESCED_MMIO 15
 | 
			
		||||
#define KVM_CAP_SYNC_MMU 16  /* Changes to host mmap are reflected in guest */
 | 
			
		||||
#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
 | 
			
		||||
#define KVM_CAP_DEVICE_ASSIGNMENT 17
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_IOMMU 18
 | 
			
		||||
#ifdef __KVM_HAVE_MSI
 | 
			
		||||
#define KVM_CAP_DEVICE_MSI 20
 | 
			
		||||
#endif
 | 
			
		||||
/* Bug in KVM_SET_USER_MEMORY_REGION fixed: */
 | 
			
		||||
#define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21
 | 
			
		||||
#ifdef __KVM_HAVE_USER_NMI
 | 
			
		||||
#define KVM_CAP_USER_NMI 22
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __KVM_HAVE_GUEST_DEBUG
 | 
			
		||||
#define KVM_CAP_SET_GUEST_DEBUG 23
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __KVM_HAVE_PIT
 | 
			
		||||
#define KVM_CAP_REINJECT_CONTROL 24
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __KVM_HAVE_IOAPIC
 | 
			
		||||
#define KVM_CAP_IRQ_ROUTING 25
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_IRQ_INJECT_STATUS 26
 | 
			
		||||
#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
 | 
			
		||||
#define KVM_CAP_DEVICE_DEASSIGNMENT 27
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __KVM_HAVE_MSIX
 | 
			
		||||
#define KVM_CAP_DEVICE_MSIX 28
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_ASSIGN_DEV_IRQ 29
 | 
			
		||||
/* Another bug in KVM_SET_USER_MEMORY_REGION fixed: */
 | 
			
		||||
#define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30
 | 
			
		||||
#ifdef __KVM_HAVE_MCE
 | 
			
		||||
#define KVM_CAP_MCE 31
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_IRQFD 32
 | 
			
		||||
#ifdef __KVM_HAVE_PIT
 | 
			
		||||
#define KVM_CAP_PIT2 33
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_SET_BOOT_CPU_ID 34
 | 
			
		||||
#ifdef __KVM_HAVE_PIT_STATE2
 | 
			
		||||
#define KVM_CAP_PIT_STATE2 35
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_IOEVENTFD 36
 | 
			
		||||
#define KVM_CAP_SET_IDENTITY_MAP_ADDR 37
 | 
			
		||||
#ifdef __KVM_HAVE_XEN_HVM
 | 
			
		||||
#define KVM_CAP_XEN_HVM 38
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_ADJUST_CLOCK 39
 | 
			
		||||
#define KVM_CAP_INTERNAL_ERROR_DATA 40
 | 
			
		||||
#ifdef __KVM_HAVE_VCPU_EVENTS
 | 
			
		||||
#define KVM_CAP_VCPU_EVENTS 41
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_S390_PSW 42
 | 
			
		||||
#define KVM_CAP_PPC_SEGSTATE 43
 | 
			
		||||
#define KVM_CAP_HYPERV 44
 | 
			
		||||
#define KVM_CAP_HYPERV_VAPIC 45
 | 
			
		||||
#define KVM_CAP_HYPERV_SPIN 46
 | 
			
		||||
#define KVM_CAP_PCI_SEGMENT 47
 | 
			
		||||
#define KVM_CAP_PPC_PAIRED_SINGLES 48
 | 
			
		||||
#define KVM_CAP_INTR_SHADOW 49
 | 
			
		||||
#ifdef __KVM_HAVE_DEBUGREGS
 | 
			
		||||
#define KVM_CAP_DEBUGREGS 50
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_X86_ROBUST_SINGLESTEP 51
 | 
			
		||||
#define KVM_CAP_PPC_OSI 52
 | 
			
		||||
#define KVM_CAP_PPC_UNSET_IRQ 53
 | 
			
		||||
#define KVM_CAP_ENABLE_CAP 54
 | 
			
		||||
#ifdef __KVM_HAVE_XSAVE
 | 
			
		||||
#define KVM_CAP_XSAVE 55
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __KVM_HAVE_XCRS
 | 
			
		||||
#define KVM_CAP_XCRS 56
 | 
			
		||||
#endif
 | 
			
		||||
#define KVM_CAP_PPC_GET_PVINFO 57
 | 
			
		||||
#define KVM_CAP_PPC_IRQ_LEVEL 58
 | 
			
		||||
#define KVM_CAP_ASYNC_PF 59
 | 
			
		||||
#define KVM_CAP_TSC_CONTROL 60
 | 
			
		||||
#define KVM_CAP_GET_TSC_KHZ 61
 | 
			
		||||
#define KVM_CAP_PPC_BOOKE_SREGS 62
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_IRQ_ROUTING
 | 
			
		||||
 | 
			
		||||
struct kvm_irq_routing_irqchip {
 | 
			
		||||
	__u32 irqchip;
 | 
			
		||||
	__u32 pin;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_irq_routing_msi {
 | 
			
		||||
	__u32 address_lo;
 | 
			
		||||
	__u32 address_hi;
 | 
			
		||||
	__u32 data;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* gsi routing entry types */
 | 
			
		||||
#define KVM_IRQ_ROUTING_IRQCHIP 1
 | 
			
		||||
#define KVM_IRQ_ROUTING_MSI 2
 | 
			
		||||
 | 
			
		||||
struct kvm_irq_routing_entry {
 | 
			
		||||
	__u32 gsi;
 | 
			
		||||
	__u32 type;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 pad;
 | 
			
		||||
	union {
 | 
			
		||||
		struct kvm_irq_routing_irqchip irqchip;
 | 
			
		||||
		struct kvm_irq_routing_msi msi;
 | 
			
		||||
		__u32 pad[8];
 | 
			
		||||
	} u;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_irq_routing {
 | 
			
		||||
	__u32 nr;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	struct kvm_irq_routing_entry entries[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
/* x86 MCE */
 | 
			
		||||
struct kvm_x86_mce {
 | 
			
		||||
	__u64 status;
 | 
			
		||||
	__u64 addr;
 | 
			
		||||
	__u64 misc;
 | 
			
		||||
	__u64 mcg_status;
 | 
			
		||||
	__u8 bank;
 | 
			
		||||
	__u8 pad1[7];
 | 
			
		||||
	__u64 pad2[3];
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_XEN_HVM
 | 
			
		||||
struct kvm_xen_hvm_config {
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 msr;
 | 
			
		||||
	__u64 blob_addr_32;
 | 
			
		||||
	__u64 blob_addr_64;
 | 
			
		||||
	__u8 blob_size_32;
 | 
			
		||||
	__u8 blob_size_64;
 | 
			
		||||
	__u8 pad2[30];
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
 | 
			
		||||
 | 
			
		||||
struct kvm_irqfd {
 | 
			
		||||
	__u32 fd;
 | 
			
		||||
	__u32 gsi;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u8  pad[20];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct kvm_clock_data {
 | 
			
		||||
	__u64 clock;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 pad[9];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ioctls for VM fds
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_SET_MEMORY_REGION     _IOW(KVMIO,  0x40, struct kvm_memory_region)
 | 
			
		||||
/*
 | 
			
		||||
 * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
 | 
			
		||||
 * a vcpu fd.
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_CREATE_VCPU           _IO(KVMIO,   0x41)
 | 
			
		||||
#define KVM_GET_DIRTY_LOG         _IOW(KVMIO,  0x42, struct kvm_dirty_log)
 | 
			
		||||
/* KVM_SET_MEMORY_ALIAS is obsolete: */
 | 
			
		||||
#define KVM_SET_MEMORY_ALIAS      _IOW(KVMIO,  0x43, struct kvm_memory_alias)
 | 
			
		||||
#define KVM_SET_NR_MMU_PAGES      _IO(KVMIO,   0x44)
 | 
			
		||||
#define KVM_GET_NR_MMU_PAGES      _IO(KVMIO,   0x45)
 | 
			
		||||
#define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, \
 | 
			
		||||
					struct kvm_userspace_memory_region)
 | 
			
		||||
#define KVM_SET_TSS_ADDR          _IO(KVMIO,   0x47)
 | 
			
		||||
#define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO,  0x48, __u64)
 | 
			
		||||
/* Device model IOC */
 | 
			
		||||
#define KVM_CREATE_IRQCHIP        _IO(KVMIO,   0x60)
 | 
			
		||||
#define KVM_IRQ_LINE              _IOW(KVMIO,  0x61, struct kvm_irq_level)
 | 
			
		||||
#define KVM_GET_IRQCHIP           _IOWR(KVMIO, 0x62, struct kvm_irqchip)
 | 
			
		||||
#define KVM_SET_IRQCHIP           _IOR(KVMIO,  0x63, struct kvm_irqchip)
 | 
			
		||||
#define KVM_CREATE_PIT            _IO(KVMIO,   0x64)
 | 
			
		||||
#define KVM_GET_PIT               _IOWR(KVMIO, 0x65, struct kvm_pit_state)
 | 
			
		||||
#define KVM_SET_PIT               _IOR(KVMIO,  0x66, struct kvm_pit_state)
 | 
			
		||||
#define KVM_IRQ_LINE_STATUS       _IOWR(KVMIO, 0x67, struct kvm_irq_level)
 | 
			
		||||
#define KVM_REGISTER_COALESCED_MMIO \
 | 
			
		||||
			_IOW(KVMIO,  0x67, struct kvm_coalesced_mmio_zone)
 | 
			
		||||
#define KVM_UNREGISTER_COALESCED_MMIO \
 | 
			
		||||
			_IOW(KVMIO,  0x68, struct kvm_coalesced_mmio_zone)
 | 
			
		||||
#define KVM_ASSIGN_PCI_DEVICE     _IOR(KVMIO,  0x69, \
 | 
			
		||||
				       struct kvm_assigned_pci_dev)
 | 
			
		||||
#define KVM_SET_GSI_ROUTING       _IOW(KVMIO,  0x6a, struct kvm_irq_routing)
 | 
			
		||||
/* deprecated, replaced by KVM_ASSIGN_DEV_IRQ */
 | 
			
		||||
#define KVM_ASSIGN_IRQ            __KVM_DEPRECATED_VM_R_0x70
 | 
			
		||||
#define KVM_ASSIGN_DEV_IRQ        _IOW(KVMIO,  0x70, struct kvm_assigned_irq)
 | 
			
		||||
#define KVM_REINJECT_CONTROL      _IO(KVMIO,   0x71)
 | 
			
		||||
#define KVM_DEASSIGN_PCI_DEVICE   _IOW(KVMIO,  0x72, \
 | 
			
		||||
				       struct kvm_assigned_pci_dev)
 | 
			
		||||
#define KVM_ASSIGN_SET_MSIX_NR    _IOW(KVMIO,  0x73, \
 | 
			
		||||
				       struct kvm_assigned_msix_nr)
 | 
			
		||||
#define KVM_ASSIGN_SET_MSIX_ENTRY _IOW(KVMIO,  0x74, \
 | 
			
		||||
				       struct kvm_assigned_msix_entry)
 | 
			
		||||
#define KVM_DEASSIGN_DEV_IRQ      _IOW(KVMIO,  0x75, struct kvm_assigned_irq)
 | 
			
		||||
#define KVM_IRQFD                 _IOW(KVMIO,  0x76, struct kvm_irqfd)
 | 
			
		||||
#define KVM_CREATE_PIT2		  _IOW(KVMIO,  0x77, struct kvm_pit_config)
 | 
			
		||||
#define KVM_SET_BOOT_CPU_ID       _IO(KVMIO,   0x78)
 | 
			
		||||
#define KVM_IOEVENTFD             _IOW(KVMIO,  0x79, struct kvm_ioeventfd)
 | 
			
		||||
#define KVM_XEN_HVM_CONFIG        _IOW(KVMIO,  0x7a, struct kvm_xen_hvm_config)
 | 
			
		||||
#define KVM_SET_CLOCK             _IOW(KVMIO,  0x7b, struct kvm_clock_data)
 | 
			
		||||
#define KVM_GET_CLOCK             _IOR(KVMIO,  0x7c, struct kvm_clock_data)
 | 
			
		||||
/* Available with KVM_CAP_PIT_STATE2 */
 | 
			
		||||
#define KVM_GET_PIT2              _IOR(KVMIO,  0x9f, struct kvm_pit_state2)
 | 
			
		||||
#define KVM_SET_PIT2              _IOW(KVMIO,  0xa0, struct kvm_pit_state2)
 | 
			
		||||
/* Available with KVM_CAP_PPC_GET_PVINFO */
 | 
			
		||||
#define KVM_PPC_GET_PVINFO	  _IOW(KVMIO,  0xa1, struct kvm_ppc_pvinfo)
 | 
			
		||||
/* Available with KVM_CAP_TSC_CONTROL */
 | 
			
		||||
#define KVM_SET_TSC_KHZ           _IO(KVMIO,  0xa2)
 | 
			
		||||
#define KVM_GET_TSC_KHZ           _IO(KVMIO,  0xa3)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ioctls for vcpu fds
 | 
			
		||||
 */
 | 
			
		||||
#define KVM_RUN                   _IO(KVMIO,   0x80)
 | 
			
		||||
#define KVM_GET_REGS              _IOR(KVMIO,  0x81, struct kvm_regs)
 | 
			
		||||
#define KVM_SET_REGS              _IOW(KVMIO,  0x82, struct kvm_regs)
 | 
			
		||||
#define KVM_GET_SREGS             _IOR(KVMIO,  0x83, struct kvm_sregs)
 | 
			
		||||
#define KVM_SET_SREGS             _IOW(KVMIO,  0x84, struct kvm_sregs)
 | 
			
		||||
#define KVM_TRANSLATE             _IOWR(KVMIO, 0x85, struct kvm_translation)
 | 
			
		||||
#define KVM_INTERRUPT             _IOW(KVMIO,  0x86, struct kvm_interrupt)
 | 
			
		||||
/* KVM_DEBUG_GUEST is no longer supported, use KVM_SET_GUEST_DEBUG instead */
 | 
			
		||||
#define KVM_DEBUG_GUEST           __KVM_DEPRECATED_VCPU_W_0x87
 | 
			
		||||
#define KVM_GET_MSRS              _IOWR(KVMIO, 0x88, struct kvm_msrs)
 | 
			
		||||
#define KVM_SET_MSRS              _IOW(KVMIO,  0x89, struct kvm_msrs)
 | 
			
		||||
#define KVM_SET_CPUID             _IOW(KVMIO,  0x8a, struct kvm_cpuid)
 | 
			
		||||
#define KVM_SET_SIGNAL_MASK       _IOW(KVMIO,  0x8b, struct kvm_signal_mask)
 | 
			
		||||
#define KVM_GET_FPU               _IOR(KVMIO,  0x8c, struct kvm_fpu)
 | 
			
		||||
#define KVM_SET_FPU               _IOW(KVMIO,  0x8d, struct kvm_fpu)
 | 
			
		||||
#define KVM_GET_LAPIC             _IOR(KVMIO,  0x8e, struct kvm_lapic_state)
 | 
			
		||||
#define KVM_SET_LAPIC             _IOW(KVMIO,  0x8f, struct kvm_lapic_state)
 | 
			
		||||
#define KVM_SET_CPUID2            _IOW(KVMIO,  0x90, struct kvm_cpuid2)
 | 
			
		||||
#define KVM_GET_CPUID2            _IOWR(KVMIO, 0x91, struct kvm_cpuid2)
 | 
			
		||||
/* Available with KVM_CAP_VAPIC */
 | 
			
		||||
#define KVM_TPR_ACCESS_REPORTING  _IOWR(KVMIO, 0x92, struct kvm_tpr_access_ctl)
 | 
			
		||||
/* Available with KVM_CAP_VAPIC */
 | 
			
		||||
#define KVM_SET_VAPIC_ADDR        _IOW(KVMIO,  0x93, struct kvm_vapic_addr)
 | 
			
		||||
/* valid for virtual machine (for floating interrupt)_and_ vcpu */
 | 
			
		||||
#define KVM_S390_INTERRUPT        _IOW(KVMIO,  0x94, struct kvm_s390_interrupt)
 | 
			
		||||
/* store status for s390 */
 | 
			
		||||
#define KVM_S390_STORE_STATUS_NOADDR    (-1ul)
 | 
			
		||||
#define KVM_S390_STORE_STATUS_PREFIXED  (-2ul)
 | 
			
		||||
#define KVM_S390_STORE_STATUS	  _IOW(KVMIO,  0x95, unsigned long)
 | 
			
		||||
/* initial ipl psw for s390 */
 | 
			
		||||
#define KVM_S390_SET_INITIAL_PSW  _IOW(KVMIO,  0x96, struct kvm_s390_psw)
 | 
			
		||||
/* initial reset for s390 */
 | 
			
		||||
#define KVM_S390_INITIAL_RESET    _IO(KVMIO,   0x97)
 | 
			
		||||
#define KVM_GET_MP_STATE          _IOR(KVMIO,  0x98, struct kvm_mp_state)
 | 
			
		||||
#define KVM_SET_MP_STATE          _IOW(KVMIO,  0x99, struct kvm_mp_state)
 | 
			
		||||
/* Available with KVM_CAP_NMI */
 | 
			
		||||
#define KVM_NMI                   _IO(KVMIO,   0x9a)
 | 
			
		||||
/* Available with KVM_CAP_SET_GUEST_DEBUG */
 | 
			
		||||
#define KVM_SET_GUEST_DEBUG       _IOW(KVMIO,  0x9b, struct kvm_guest_debug)
 | 
			
		||||
/* MCE for x86 */
 | 
			
		||||
#define KVM_X86_SETUP_MCE         _IOW(KVMIO,  0x9c, __u64)
 | 
			
		||||
#define KVM_X86_GET_MCE_CAP_SUPPORTED _IOR(KVMIO,  0x9d, __u64)
 | 
			
		||||
#define KVM_X86_SET_MCE           _IOW(KVMIO,  0x9e, struct kvm_x86_mce)
 | 
			
		||||
/* IA64 stack access */
 | 
			
		||||
#define KVM_IA64_VCPU_GET_STACK   _IOR(KVMIO,  0x9a, void *)
 | 
			
		||||
#define KVM_IA64_VCPU_SET_STACK   _IOW(KVMIO,  0x9b, void *)
 | 
			
		||||
/* Available with KVM_CAP_VCPU_EVENTS */
 | 
			
		||||
#define KVM_GET_VCPU_EVENTS       _IOR(KVMIO,  0x9f, struct kvm_vcpu_events)
 | 
			
		||||
#define KVM_SET_VCPU_EVENTS       _IOW(KVMIO,  0xa0, struct kvm_vcpu_events)
 | 
			
		||||
/* Available with KVM_CAP_DEBUGREGS */
 | 
			
		||||
#define KVM_GET_DEBUGREGS         _IOR(KVMIO,  0xa1, struct kvm_debugregs)
 | 
			
		||||
#define KVM_SET_DEBUGREGS         _IOW(KVMIO,  0xa2, struct kvm_debugregs)
 | 
			
		||||
#define KVM_ENABLE_CAP            _IOW(KVMIO,  0xa3, struct kvm_enable_cap)
 | 
			
		||||
/* Available with KVM_CAP_XSAVE */
 | 
			
		||||
#define KVM_GET_XSAVE		  _IOR(KVMIO,  0xa4, struct kvm_xsave)
 | 
			
		||||
#define KVM_SET_XSAVE		  _IOW(KVMIO,  0xa5, struct kvm_xsave)
 | 
			
		||||
/* Available with KVM_CAP_XCRS */
 | 
			
		||||
#define KVM_GET_XCRS		  _IOR(KVMIO,  0xa6, struct kvm_xcrs)
 | 
			
		||||
#define KVM_SET_XCRS		  _IOW(KVMIO,  0xa7, struct kvm_xcrs)
 | 
			
		||||
 | 
			
		||||
#define KVM_DEV_ASSIGN_ENABLE_IOMMU	(1 << 0)
 | 
			
		||||
 | 
			
		||||
struct kvm_assigned_pci_dev {
 | 
			
		||||
	__u32 assigned_dev_id;
 | 
			
		||||
	__u32 busnr;
 | 
			
		||||
	__u32 devfn;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	__u32 segnr;
 | 
			
		||||
	union {
 | 
			
		||||
		__u32 reserved[11];
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_DEV_IRQ_HOST_INTX    (1 << 0)
 | 
			
		||||
#define KVM_DEV_IRQ_HOST_MSI     (1 << 1)
 | 
			
		||||
#define KVM_DEV_IRQ_HOST_MSIX    (1 << 2)
 | 
			
		||||
 | 
			
		||||
#define KVM_DEV_IRQ_GUEST_INTX   (1 << 8)
 | 
			
		||||
#define KVM_DEV_IRQ_GUEST_MSI    (1 << 9)
 | 
			
		||||
#define KVM_DEV_IRQ_GUEST_MSIX   (1 << 10)
 | 
			
		||||
 | 
			
		||||
#define KVM_DEV_IRQ_HOST_MASK	 0x00ff
 | 
			
		||||
#define KVM_DEV_IRQ_GUEST_MASK   0xff00
 | 
			
		||||
 | 
			
		||||
struct kvm_assigned_irq {
 | 
			
		||||
	__u32 assigned_dev_id;
 | 
			
		||||
	__u32 host_irq;
 | 
			
		||||
	__u32 guest_irq;
 | 
			
		||||
	__u32 flags;
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			__u32 addr_lo;
 | 
			
		||||
			__u32 addr_hi;
 | 
			
		||||
			__u32 data;
 | 
			
		||||
		} guest_msi;
 | 
			
		||||
		__u32 reserved[12];
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct kvm_assigned_msix_nr {
 | 
			
		||||
	__u32 assigned_dev_id;
 | 
			
		||||
	__u16 entry_nr;
 | 
			
		||||
	__u16 padding;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define KVM_MAX_MSIX_PER_DEV		256
 | 
			
		||||
struct kvm_assigned_msix_entry {
 | 
			
		||||
	__u32 assigned_dev_id;
 | 
			
		||||
	__u32 gsi;
 | 
			
		||||
	__u16 entry; /* The index of entry in the MSI-X table */
 | 
			
		||||
	__u16 padding[3];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* __LINUX_KVM_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
#ifndef __LINUX_KVM_PARA_H
 | 
			
		||||
#define __LINUX_KVM_PARA_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This header file provides a method for making a hypercall to the host
 | 
			
		||||
 * Architectures should define:
 | 
			
		||||
 * - kvm_hypercall0, kvm_hypercall1...
 | 
			
		||||
 * - kvm_arch_para_features
 | 
			
		||||
 * - kvm_para_available
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Return values for hypercalls */
 | 
			
		||||
#define KVM_ENOSYS		1000
 | 
			
		||||
#define KVM_EFAULT		EFAULT
 | 
			
		||||
#define KVM_E2BIG		E2BIG
 | 
			
		||||
#define KVM_EPERM		EPERM
 | 
			
		||||
 | 
			
		||||
#define KVM_HC_VAPIC_POLL_IRQ		1
 | 
			
		||||
#define KVM_HC_MMU_OP			2
 | 
			
		||||
#define KVM_HC_FEATURES			3
 | 
			
		||||
#define KVM_HC_PPC_MAP_MAGIC_PAGE	4
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * hypercalls use architecture specific
 | 
			
		||||
 */
 | 
			
		||||
#include <asm/kvm_para.h>
 | 
			
		||||
 | 
			
		||||
#endif /* __LINUX_KVM_PARA_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,130 @@
 | 
			
		|||
#ifndef _LINUX_VHOST_H
 | 
			
		||||
#define _LINUX_VHOST_H
 | 
			
		||||
/* Userspace interface for in-kernel virtio accelerators. */
 | 
			
		||||
 | 
			
		||||
/* vhost is used to reduce the number of system calls involved in virtio.
 | 
			
		||||
 *
 | 
			
		||||
 * Existing virtio net code is used in the guest without modification.
 | 
			
		||||
 *
 | 
			
		||||
 * This header includes interface used by userspace hypervisor for
 | 
			
		||||
 * device configuration.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
 | 
			
		||||
#include <linux/ioctl.h>
 | 
			
		||||
#include <linux/virtio_config.h>
 | 
			
		||||
#include <linux/virtio_ring.h>
 | 
			
		||||
 | 
			
		||||
struct vhost_vring_state {
 | 
			
		||||
	unsigned int index;
 | 
			
		||||
	unsigned int num;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct vhost_vring_file {
 | 
			
		||||
	unsigned int index;
 | 
			
		||||
	int fd; /* Pass -1 to unbind from file. */
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct vhost_vring_addr {
 | 
			
		||||
	unsigned int index;
 | 
			
		||||
	/* Option flags. */
 | 
			
		||||
	unsigned int flags;
 | 
			
		||||
	/* Flag values: */
 | 
			
		||||
	/* Whether log address is valid. If set enables logging. */
 | 
			
		||||
#define VHOST_VRING_F_LOG 0
 | 
			
		||||
 | 
			
		||||
	/* Start of array of descriptors (virtually contiguous) */
 | 
			
		||||
	__u64 desc_user_addr;
 | 
			
		||||
	/* Used structure address. Must be 32 bit aligned */
 | 
			
		||||
	__u64 used_user_addr;
 | 
			
		||||
	/* Available structure address. Must be 16 bit aligned */
 | 
			
		||||
	__u64 avail_user_addr;
 | 
			
		||||
	/* Logging support. */
 | 
			
		||||
	/* Log writes to used structure, at offset calculated from specified
 | 
			
		||||
	 * address. Address must be 32 bit aligned. */
 | 
			
		||||
	__u64 log_guest_addr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct vhost_memory_region {
 | 
			
		||||
	__u64 guest_phys_addr;
 | 
			
		||||
	__u64 memory_size; /* bytes */
 | 
			
		||||
	__u64 userspace_addr;
 | 
			
		||||
	__u64 flags_padding; /* No flags are currently specified. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* All region addresses and sizes must be 4K aligned. */
 | 
			
		||||
#define VHOST_PAGE_SIZE 0x1000
 | 
			
		||||
 | 
			
		||||
struct vhost_memory {
 | 
			
		||||
	__u32 nregions;
 | 
			
		||||
	__u32 padding;
 | 
			
		||||
	struct vhost_memory_region regions[0];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* ioctls */
 | 
			
		||||
 | 
			
		||||
#define VHOST_VIRTIO 0xAF
 | 
			
		||||
 | 
			
		||||
/* Features bitmask for forward compatibility.  Transport bits are used for
 | 
			
		||||
 * vhost specific features. */
 | 
			
		||||
#define VHOST_GET_FEATURES	_IOR(VHOST_VIRTIO, 0x00, __u64)
 | 
			
		||||
#define VHOST_SET_FEATURES	_IOW(VHOST_VIRTIO, 0x00, __u64)
 | 
			
		||||
 | 
			
		||||
/* Set current process as the (exclusive) owner of this file descriptor.  This
 | 
			
		||||
 * must be called before any other vhost command.  Further calls to
 | 
			
		||||
 * VHOST_OWNER_SET fail until VHOST_OWNER_RESET is called. */
 | 
			
		||||
#define VHOST_SET_OWNER _IO(VHOST_VIRTIO, 0x01)
 | 
			
		||||
/* Give up ownership, and reset the device to default values.
 | 
			
		||||
 * Allows subsequent call to VHOST_OWNER_SET to succeed. */
 | 
			
		||||
#define VHOST_RESET_OWNER _IO(VHOST_VIRTIO, 0x02)
 | 
			
		||||
 | 
			
		||||
/* Set up/modify memory layout */
 | 
			
		||||
#define VHOST_SET_MEM_TABLE	_IOW(VHOST_VIRTIO, 0x03, struct vhost_memory)
 | 
			
		||||
 | 
			
		||||
/* Write logging setup. */
 | 
			
		||||
/* Memory writes can optionally be logged by setting bit at an offset
 | 
			
		||||
 * (calculated from the physical address) from specified log base.
 | 
			
		||||
 * The bit is set using an atomic 32 bit operation. */
 | 
			
		||||
/* Set base address for logging. */
 | 
			
		||||
#define VHOST_SET_LOG_BASE _IOW(VHOST_VIRTIO, 0x04, __u64)
 | 
			
		||||
/* Specify an eventfd file descriptor to signal on log write. */
 | 
			
		||||
#define VHOST_SET_LOG_FD _IOW(VHOST_VIRTIO, 0x07, int)
 | 
			
		||||
 | 
			
		||||
/* Ring setup. */
 | 
			
		||||
/* Set number of descriptors in ring. This parameter can not
 | 
			
		||||
 * be modified while ring is running (bound to a device). */
 | 
			
		||||
#define VHOST_SET_VRING_NUM _IOW(VHOST_VIRTIO, 0x10, struct vhost_vring_state)
 | 
			
		||||
/* Set addresses for the ring. */
 | 
			
		||||
#define VHOST_SET_VRING_ADDR _IOW(VHOST_VIRTIO, 0x11, struct vhost_vring_addr)
 | 
			
		||||
/* Base value where queue looks for available descriptors */
 | 
			
		||||
#define VHOST_SET_VRING_BASE _IOW(VHOST_VIRTIO, 0x12, struct vhost_vring_state)
 | 
			
		||||
/* Get accessor: reads index, writes value in num */
 | 
			
		||||
#define VHOST_GET_VRING_BASE _IOWR(VHOST_VIRTIO, 0x12, struct vhost_vring_state)
 | 
			
		||||
 | 
			
		||||
/* The following ioctls use eventfd file descriptors to signal and poll
 | 
			
		||||
 * for events. */
 | 
			
		||||
 | 
			
		||||
/* Set eventfd to poll for added buffers */
 | 
			
		||||
#define VHOST_SET_VRING_KICK _IOW(VHOST_VIRTIO, 0x20, struct vhost_vring_file)
 | 
			
		||||
/* Set eventfd to signal when buffers have beed used */
 | 
			
		||||
#define VHOST_SET_VRING_CALL _IOW(VHOST_VIRTIO, 0x21, struct vhost_vring_file)
 | 
			
		||||
/* Set eventfd to signal an error */
 | 
			
		||||
#define VHOST_SET_VRING_ERR _IOW(VHOST_VIRTIO, 0x22, struct vhost_vring_file)
 | 
			
		||||
 | 
			
		||||
/* VHOST_NET specific defines */
 | 
			
		||||
 | 
			
		||||
/* Attach virtio net ring to a raw socket, or tap device.
 | 
			
		||||
 * The socket must be already bound to an ethernet device, this device will be
 | 
			
		||||
 * used for transmit.  Pass fd -1 to unbind from the socket and the transmit
 | 
			
		||||
 * device.  This can be used to stop the ring (e.g. for migration). */
 | 
			
		||||
#define VHOST_NET_SET_BACKEND _IOW(VHOST_VIRTIO, 0x30, struct vhost_vring_file)
 | 
			
		||||
 | 
			
		||||
/* Feature bits */
 | 
			
		||||
/* Log all write descriptors. Can be changed while device is active. */
 | 
			
		||||
#define VHOST_F_LOG_ALL 26
 | 
			
		||||
/* vhost-net should add virtio_net_hdr for RX, and strip for TX packets. */
 | 
			
		||||
#define VHOST_NET_F_VIRTIO_NET_HDR 27
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
#ifndef _LINUX_VIRTIO_CONFIG_H
 | 
			
		||||
#define _LINUX_VIRTIO_CONFIG_H
 | 
			
		||||
/* This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so
 | 
			
		||||
 * anyone can use the definitions to implement compatible drivers/servers.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
 * are met:
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
 *    documentation and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. Neither the name of IBM nor the names of its contributors
 | 
			
		||||
 *    may be used to endorse or promote products derived from this software
 | 
			
		||||
 *    without specific prior written permission.
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
 | 
			
		||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
 | 
			
		||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
			
		||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
			
		||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
			
		||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
			
		||||
 * SUCH DAMAGE. */
 | 
			
		||||
 | 
			
		||||
/* Virtio devices use a standardized configuration space to define their
 | 
			
		||||
 * features and pass configuration information, but each implementation can
 | 
			
		||||
 * store and access that space differently. */
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
 | 
			
		||||
/* Status byte for guest to report progress, and synchronize features. */
 | 
			
		||||
/* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
 | 
			
		||||
#define VIRTIO_CONFIG_S_ACKNOWLEDGE	1
 | 
			
		||||
/* We have found a driver for the device. */
 | 
			
		||||
#define VIRTIO_CONFIG_S_DRIVER		2
 | 
			
		||||
/* Driver has used its parts of the config, and is happy */
 | 
			
		||||
#define VIRTIO_CONFIG_S_DRIVER_OK	4
 | 
			
		||||
/* We've given up on this device. */
 | 
			
		||||
#define VIRTIO_CONFIG_S_FAILED		0x80
 | 
			
		||||
 | 
			
		||||
/* Some virtio feature bits (currently bits 28 through 31) are reserved for the
 | 
			
		||||
 * transport being used (eg. virtio_ring), the rest are per-device feature
 | 
			
		||||
 * bits. */
 | 
			
		||||
#define VIRTIO_TRANSPORT_F_START	28
 | 
			
		||||
#define VIRTIO_TRANSPORT_F_END		32
 | 
			
		||||
 | 
			
		||||
/* Do we get callbacks when the ring is completely used, even if we've
 | 
			
		||||
 * suppressed them? */
 | 
			
		||||
#define VIRTIO_F_NOTIFY_ON_EMPTY	24
 | 
			
		||||
 | 
			
		||||
#endif /* _LINUX_VIRTIO_CONFIG_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,163 @@
 | 
			
		|||
#ifndef _LINUX_VIRTIO_RING_H
 | 
			
		||||
#define _LINUX_VIRTIO_RING_H
 | 
			
		||||
/* An interface for efficient virtio implementation, currently for use by KVM
 | 
			
		||||
 * and lguest, but hopefully others soon.  Do NOT change this since it will
 | 
			
		||||
 * break existing servers and clients.
 | 
			
		||||
 *
 | 
			
		||||
 * This header is BSD licensed so anyone can use the definitions to implement
 | 
			
		||||
 * compatible drivers/servers.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
 * are met:
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
 *    documentation and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. Neither the name of IBM nor the names of its contributors
 | 
			
		||||
 *    may be used to endorse or promote products derived from this software
 | 
			
		||||
 *    without specific prior written permission.
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
 | 
			
		||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
 | 
			
		||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
			
		||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
			
		||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
			
		||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
			
		||||
 * SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright Rusty Russell IBM Corporation 2007. */
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
 | 
			
		||||
/* This marks a buffer as continuing via the next field. */
 | 
			
		||||
#define VRING_DESC_F_NEXT	1
 | 
			
		||||
/* This marks a buffer as write-only (otherwise read-only). */
 | 
			
		||||
#define VRING_DESC_F_WRITE	2
 | 
			
		||||
/* This means the buffer contains a list of buffer descriptors. */
 | 
			
		||||
#define VRING_DESC_F_INDIRECT	4
 | 
			
		||||
 | 
			
		||||
/* The Host uses this in used->flags to advise the Guest: don't kick me when
 | 
			
		||||
 * you add a buffer.  It's unreliable, so it's simply an optimization.  Guest
 | 
			
		||||
 * will still kick if it's out of buffers. */
 | 
			
		||||
#define VRING_USED_F_NO_NOTIFY	1
 | 
			
		||||
/* The Guest uses this in avail->flags to advise the Host: don't interrupt me
 | 
			
		||||
 * when you consume a buffer.  It's unreliable, so it's simply an
 | 
			
		||||
 * optimization.  */
 | 
			
		||||
#define VRING_AVAIL_F_NO_INTERRUPT	1
 | 
			
		||||
 | 
			
		||||
/* We support indirect buffer descriptors */
 | 
			
		||||
#define VIRTIO_RING_F_INDIRECT_DESC	28
 | 
			
		||||
 | 
			
		||||
/* The Guest publishes the used index for which it expects an interrupt
 | 
			
		||||
 * at the end of the avail ring. Host should ignore the avail->flags field. */
 | 
			
		||||
/* The Host publishes the avail index for which it expects a kick
 | 
			
		||||
 * at the end of the used ring. Guest should ignore the used->flags field. */
 | 
			
		||||
#define VIRTIO_RING_F_EVENT_IDX		29
 | 
			
		||||
 | 
			
		||||
/* Virtio ring descriptors: 16 bytes.  These can chain together via "next". */
 | 
			
		||||
struct vring_desc {
 | 
			
		||||
	/* Address (guest-physical). */
 | 
			
		||||
	__u64 addr;
 | 
			
		||||
	/* Length. */
 | 
			
		||||
	__u32 len;
 | 
			
		||||
	/* The flags as indicated above. */
 | 
			
		||||
	__u16 flags;
 | 
			
		||||
	/* We chain unused descriptors via this, too */
 | 
			
		||||
	__u16 next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct vring_avail {
 | 
			
		||||
	__u16 flags;
 | 
			
		||||
	__u16 idx;
 | 
			
		||||
	__u16 ring[];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* u32 is used here for ids for padding reasons. */
 | 
			
		||||
struct vring_used_elem {
 | 
			
		||||
	/* Index of start of used descriptor chain. */
 | 
			
		||||
	__u32 id;
 | 
			
		||||
	/* Total length of the descriptor chain which was used (written to) */
 | 
			
		||||
	__u32 len;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct vring_used {
 | 
			
		||||
	__u16 flags;
 | 
			
		||||
	__u16 idx;
 | 
			
		||||
	struct vring_used_elem ring[];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct vring {
 | 
			
		||||
	unsigned int num;
 | 
			
		||||
 | 
			
		||||
	struct vring_desc *desc;
 | 
			
		||||
 | 
			
		||||
	struct vring_avail *avail;
 | 
			
		||||
 | 
			
		||||
	struct vring_used *used;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* The standard layout for the ring is a continuous chunk of memory which looks
 | 
			
		||||
 * like this.  We assume num is a power of 2.
 | 
			
		||||
 *
 | 
			
		||||
 * struct vring
 | 
			
		||||
 * {
 | 
			
		||||
 *	// The actual descriptors (16 bytes each)
 | 
			
		||||
 *	struct vring_desc desc[num];
 | 
			
		||||
 *
 | 
			
		||||
 *	// A ring of available descriptor heads with free-running index.
 | 
			
		||||
 *	__u16 avail_flags;
 | 
			
		||||
 *	__u16 avail_idx;
 | 
			
		||||
 *	__u16 available[num];
 | 
			
		||||
 *	__u16 used_event_idx;
 | 
			
		||||
 *
 | 
			
		||||
 *	// Padding to the next align boundary.
 | 
			
		||||
 *	char pad[];
 | 
			
		||||
 *
 | 
			
		||||
 *	// A ring of used descriptor heads with free-running index.
 | 
			
		||||
 *	__u16 used_flags;
 | 
			
		||||
 *	__u16 used_idx;
 | 
			
		||||
 *	struct vring_used_elem used[num];
 | 
			
		||||
 *	__u16 avail_event_idx;
 | 
			
		||||
 * };
 | 
			
		||||
 */
 | 
			
		||||
/* We publish the used event index at the end of the available ring, and vice
 | 
			
		||||
 * versa. They are at the end for backwards compatibility. */
 | 
			
		||||
#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num])
 | 
			
		||||
#define vring_avail_event(vr) (*(__u16 *)&(vr)->used->ring[(vr)->num])
 | 
			
		||||
 | 
			
		||||
static __inline__ void vring_init(struct vring *vr, unsigned int num, void *p,
 | 
			
		||||
			      unsigned long align)
 | 
			
		||||
{
 | 
			
		||||
	vr->num = num;
 | 
			
		||||
	vr->desc = p;
 | 
			
		||||
	vr->avail = p + num*sizeof(struct vring_desc);
 | 
			
		||||
	vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1)
 | 
			
		||||
			    & ~(align - 1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline__ unsigned vring_size(unsigned int num, unsigned long align)
 | 
			
		||||
{
 | 
			
		||||
	return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num)
 | 
			
		||||
		 + align - 1) & ~(align - 1))
 | 
			
		||||
		+ sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* The following is used with USED_EVENT_IDX and AVAIL_EVENT_IDX */
 | 
			
		||||
/* Assuming a given event_idx value from the other size, if
 | 
			
		||||
 * we have just incremented index from old to new_idx,
 | 
			
		||||
 * should we trigger an event? */
 | 
			
		||||
static __inline__ int vring_need_event(__u16 event_idx, __u16 new_idx, __u16 old)
 | 
			
		||||
{
 | 
			
		||||
	/* Note: Xen has similar logic for notification hold-off
 | 
			
		||||
	 * in include/xen/interface/io/ring.h with req_event and req_prod
 | 
			
		||||
	 * corresponding to event_idx + 1 and new_idx respectively.
 | 
			
		||||
	 * Note also that req_event and req_prod in Xen start at 1,
 | 
			
		||||
	 * event indexes in virtio start at 0. */
 | 
			
		||||
	return (__u16)(new_idx - event_idx - 1) < (__u16)(new_idx - old);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* _LINUX_VIRTIO_RING_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
#!/bin/sh -e
 | 
			
		||||
#
 | 
			
		||||
# Update Linux kernel headers QEMU requires from a specified kernel tree.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2011 Siemens AG
 | 
			
		||||
#
 | 
			
		||||
# Authors:
 | 
			
		||||
#  Jan Kiszka        <jan.kiszka@siemens.com>
 | 
			
		||||
#
 | 
			
		||||
# This work is licensed under the terms of the GNU GPL version 2.
 | 
			
		||||
# See the COPYING file in the top-level directory.
 | 
			
		||||
 | 
			
		||||
tmpdir=`mktemp -d`
 | 
			
		||||
linux="$1"
 | 
			
		||||
output="$2"
 | 
			
		||||
 | 
			
		||||
if [ -z "$linux" ] || ! [ -d "$linux" ]; then
 | 
			
		||||
    cat << EOF
 | 
			
		||||
usage: update-kernel-headers.sh LINUX_PATH [OUTPUT_PATH]
 | 
			
		||||
 | 
			
		||||
LINUX_PATH      Linux kernel directory to obtain the headers from
 | 
			
		||||
OUTPUT_PATH     output directory, usually the qemu source tree (default: $PWD)
 | 
			
		||||
EOF
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -z "$output" ]; then
 | 
			
		||||
    output="$PWD"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
for arch in x86 powerpc s390; do
 | 
			
		||||
    make -C "$linux" INSTALL_HDR_PATH="$tmpdir" SRCARCH=$arch headers_install
 | 
			
		||||
 | 
			
		||||
    rm -rf "$output/linux-headers/asm-$arch"
 | 
			
		||||
    mkdir -p "$output/linux-headers/asm-$arch"
 | 
			
		||||
    for header in kvm.h kvm_para.h; do
 | 
			
		||||
        cp "$tmpdir/include/asm/$header" "$output/linux-headers/asm-$arch"
 | 
			
		||||
    done
 | 
			
		||||
    if [ $arch = x86 ]; then
 | 
			
		||||
        cp "$tmpdir/include/asm/hyperv.h" "$output/linux-headers/asm-x86"
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
rm -rf "$output/linux-headers/linux"
 | 
			
		||||
mkdir -p "$output/linux-headers/linux"
 | 
			
		||||
for header in kvm.h kvm_para.h vhost.h virtio_config.h virtio_ring.h; do
 | 
			
		||||
    cp "$tmpdir/include/linux/$header" "$output/linux-headers/linux"
 | 
			
		||||
done
 | 
			
		||||
if [ -L "$linux/source" ]; then
 | 
			
		||||
    cp "$linux/source/COPYING" "$output/linux-headers"
 | 
			
		||||
else
 | 
			
		||||
    cp "$linux/COPYING" "$output/linux-headers"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
rm -rf "$tmpdir"
 | 
			
		||||
| 
						 | 
				
			
			@ -641,6 +641,10 @@ typedef struct CPUX86State {
 | 
			
		|||
    uint16_t fpuc;
 | 
			
		||||
    uint8_t fptags[8];   /* 0 = valid, 1 = empty */
 | 
			
		||||
    FPReg fpregs[8];
 | 
			
		||||
    /* KVM-only so far */
 | 
			
		||||
    uint16_t fpop;
 | 
			
		||||
    uint64_t fpip;
 | 
			
		||||
    uint64_t fpdp;
 | 
			
		||||
 | 
			
		||||
    /* emulator internal variables */
 | 
			
		||||
    float_status fp_status;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1144,10 +1144,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
 | 
			
		|||
        break;
 | 
			
		||||
    case 7:
 | 
			
		||||
        if (kvm_enabled()) {
 | 
			
		||||
            *eax = kvm_arch_get_supported_cpuid(env, 0x7, count, R_EAX);
 | 
			
		||||
            *ebx = kvm_arch_get_supported_cpuid(env, 0x7, count, R_EBX);
 | 
			
		||||
            *ecx = kvm_arch_get_supported_cpuid(env, 0x7, count, R_ECX);
 | 
			
		||||
            *edx = kvm_arch_get_supported_cpuid(env, 0x7, count, R_EDX);
 | 
			
		||||
            KVMState *s = env->kvm_state;
 | 
			
		||||
 | 
			
		||||
            *eax = kvm_arch_get_supported_cpuid(s, 0x7, count, R_EAX);
 | 
			
		||||
            *ebx = kvm_arch_get_supported_cpuid(s, 0x7, count, R_EBX);
 | 
			
		||||
            *ecx = kvm_arch_get_supported_cpuid(s, 0x7, count, R_ECX);
 | 
			
		||||
            *edx = kvm_arch_get_supported_cpuid(s, 0x7, count, R_EDX);
 | 
			
		||||
        } else {
 | 
			
		||||
            *eax = 0;
 | 
			
		||||
            *ebx = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1179,10 +1181,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
 | 
			
		|||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        if (kvm_enabled()) {
 | 
			
		||||
            *eax = kvm_arch_get_supported_cpuid(env, 0xd, count, R_EAX);
 | 
			
		||||
            *ebx = kvm_arch_get_supported_cpuid(env, 0xd, count, R_EBX);
 | 
			
		||||
            *ecx = kvm_arch_get_supported_cpuid(env, 0xd, count, R_ECX);
 | 
			
		||||
            *edx = kvm_arch_get_supported_cpuid(env, 0xd, count, R_EDX);
 | 
			
		||||
            KVMState *s = env->kvm_state;
 | 
			
		||||
 | 
			
		||||
            *eax = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EAX);
 | 
			
		||||
            *ebx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EBX);
 | 
			
		||||
            *ecx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_ECX);
 | 
			
		||||
            *edx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EDX);
 | 
			
		||||
        } else {
 | 
			
		||||
            *eax = 0;
 | 
			
		||||
            *ebx = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,7 @@
 | 
			
		|||
#include <sys/utsname.h>
 | 
			
		||||
 | 
			
		||||
#include <linux/kvm.h>
 | 
			
		||||
#include <linux/kvm_para.h>
 | 
			
		||||
 | 
			
		||||
#include "qemu-common.h"
 | 
			
		||||
#include "sysemu.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -29,10 +30,6 @@
 | 
			
		|||
#include "hw/apic.h"
 | 
			
		||||
#include "ioport.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_KVM_PARA
 | 
			
		||||
#include <linux/kvm_para.h>
 | 
			
		||||
#endif
 | 
			
		||||
//
 | 
			
		||||
//#define DEBUG_KVM
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_KVM
 | 
			
		||||
| 
						 | 
				
			
			@ -62,9 +59,7 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
 | 
			
		|||
 | 
			
		||||
static bool has_msr_star;
 | 
			
		||||
static bool has_msr_hsave_pa;
 | 
			
		||||
#if defined(CONFIG_KVM_PARA) && defined(KVM_CAP_ASYNC_PF)
 | 
			
		||||
static bool has_msr_async_pf_en;
 | 
			
		||||
#endif
 | 
			
		||||
static int lm_capable_kernel;
 | 
			
		||||
 | 
			
		||||
static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max)
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +87,6 @@ static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max)
 | 
			
		|||
    return cpuid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_KVM_PARA
 | 
			
		||||
struct kvm_para_features {
 | 
			
		||||
    int cap;
 | 
			
		||||
    int feature;
 | 
			
		||||
| 
						 | 
				
			
			@ -100,51 +94,44 @@ struct kvm_para_features {
 | 
			
		|||
    { KVM_CAP_CLOCKSOURCE, KVM_FEATURE_CLOCKSOURCE },
 | 
			
		||||
    { KVM_CAP_NOP_IO_DELAY, KVM_FEATURE_NOP_IO_DELAY },
 | 
			
		||||
    { KVM_CAP_PV_MMU, KVM_FEATURE_MMU_OP },
 | 
			
		||||
#ifdef KVM_CAP_ASYNC_PF
 | 
			
		||||
    { KVM_CAP_ASYNC_PF, KVM_FEATURE_ASYNC_PF },
 | 
			
		||||
#endif
 | 
			
		||||
    { -1, -1 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int get_para_features(CPUState *env)
 | 
			
		||||
static int get_para_features(KVMState *s)
 | 
			
		||||
{
 | 
			
		||||
    int i, features = 0;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ARRAY_SIZE(para_features) - 1; i++) {
 | 
			
		||||
        if (kvm_check_extension(env->kvm_state, para_features[i].cap)) {
 | 
			
		||||
        if (kvm_check_extension(s, para_features[i].cap)) {
 | 
			
		||||
            features |= (1 << para_features[i].feature);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return features;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
 | 
			
		||||
uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
 | 
			
		||||
                                      uint32_t index, int reg)
 | 
			
		||||
{
 | 
			
		||||
    struct kvm_cpuid2 *cpuid;
 | 
			
		||||
    int i, max;
 | 
			
		||||
    uint32_t ret = 0;
 | 
			
		||||
    uint32_t cpuid_1_edx;
 | 
			
		||||
#ifdef CONFIG_KVM_PARA
 | 
			
		||||
    int has_kvm_features = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    max = 1;
 | 
			
		||||
    while ((cpuid = try_get_cpuid(env->kvm_state, max)) == NULL) {
 | 
			
		||||
    while ((cpuid = try_get_cpuid(s, max)) == NULL) {
 | 
			
		||||
        max *= 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < cpuid->nent; ++i) {
 | 
			
		||||
        if (cpuid->entries[i].function == function &&
 | 
			
		||||
            cpuid->entries[i].index == index) {
 | 
			
		||||
#ifdef CONFIG_KVM_PARA
 | 
			
		||||
            if (cpuid->entries[i].function == KVM_CPUID_FEATURES) {
 | 
			
		||||
                has_kvm_features = 1;
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
            switch (reg) {
 | 
			
		||||
            case R_EAX:
 | 
			
		||||
                ret = cpuid->entries[i].eax;
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +153,7 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
 | 
			
		|||
                    /* On Intel, kvm returns cpuid according to the Intel spec,
 | 
			
		||||
                     * so add missing bits according to the AMD spec:
 | 
			
		||||
                     */
 | 
			
		||||
                    cpuid_1_edx = kvm_arch_get_supported_cpuid(env, 1, 0, R_EDX);
 | 
			
		||||
                    cpuid_1_edx = kvm_arch_get_supported_cpuid(s, 1, 0, R_EDX);
 | 
			
		||||
                    ret |= cpuid_1_edx & 0x183f7ff;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -177,12 +164,10 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
 | 
			
		|||
 | 
			
		||||
    qemu_free(cpuid);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_KVM_PARA
 | 
			
		||||
    /* fallback for older kernels */
 | 
			
		||||
    if (!has_kvm_features && (function == KVM_CPUID_FEATURES)) {
 | 
			
		||||
        ret = get_para_features(env);
 | 
			
		||||
        ret = get_para_features(s);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -206,7 +191,6 @@ static void kvm_unpoison_all(void *param)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
static void kvm_hwpoison_page_add(ram_addr_t ram_addr)
 | 
			
		||||
{
 | 
			
		||||
    HWPoisonPage *page;
 | 
			
		||||
| 
						 | 
				
			
			@ -252,7 +236,6 @@ static void kvm_mce_inject(CPUState *env, target_phys_addr_t paddr, int code)
 | 
			
		|||
                       cpu_x86_support_mca_broadcast(env) ?
 | 
			
		||||
                       MCE_INJECT_BROADCAST : 0);
 | 
			
		||||
}
 | 
			
		||||
#endif /* KVM_CAP_MCE */
 | 
			
		||||
 | 
			
		||||
static void hardware_memory_error(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -262,7 +245,6 @@ static void hardware_memory_error(void)
 | 
			
		|||
 | 
			
		||||
int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
    ram_addr_t ram_addr;
 | 
			
		||||
    target_phys_addr_t paddr;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -282,9 +264,7 @@ int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
 | 
			
		|||
        }
 | 
			
		||||
        kvm_hwpoison_page_add(ram_addr);
 | 
			
		||||
        kvm_mce_inject(env, paddr, code);
 | 
			
		||||
    } else
 | 
			
		||||
#endif /* KVM_CAP_MCE */
 | 
			
		||||
    {
 | 
			
		||||
    } else {
 | 
			
		||||
        if (code == BUS_MCEERR_AO) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        } else if (code == BUS_MCEERR_AR) {
 | 
			
		||||
| 
						 | 
				
			
			@ -298,7 +278,6 @@ int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
 | 
			
		|||
 | 
			
		||||
int kvm_arch_on_sigbus(int code, void *addr)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
    if ((first_cpu->mcg_cap & MCG_SER_P) && addr && code == BUS_MCEERR_AO) {
 | 
			
		||||
        ram_addr_t ram_addr;
 | 
			
		||||
        target_phys_addr_t paddr;
 | 
			
		||||
| 
						 | 
				
			
			@ -313,9 +292,7 @@ int kvm_arch_on_sigbus(int code, void *addr)
 | 
			
		|||
        }
 | 
			
		||||
        kvm_hwpoison_page_add(ram_addr);
 | 
			
		||||
        kvm_mce_inject(first_cpu, paddr, code);
 | 
			
		||||
    } else
 | 
			
		||||
#endif /* KVM_CAP_MCE */
 | 
			
		||||
    {
 | 
			
		||||
    } else {
 | 
			
		||||
        if (code == BUS_MCEERR_AO) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        } else if (code == BUS_MCEERR_AR) {
 | 
			
		||||
| 
						 | 
				
			
			@ -329,7 +306,6 @@ int kvm_arch_on_sigbus(int code, void *addr)
 | 
			
		|||
 | 
			
		||||
static int kvm_inject_mce_oldstyle(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
    if (!kvm_has_vcpu_events() && env->exception_injected == EXCP12_MCHK) {
 | 
			
		||||
        unsigned int bank, bank_num = env->mcg_cap & 0xff;
 | 
			
		||||
        struct kvm_x86_mce mce;
 | 
			
		||||
| 
						 | 
				
			
			@ -355,7 +331,6 @@ static int kvm_inject_mce_oldstyle(CPUState *env)
 | 
			
		|||
 | 
			
		||||
        return kvm_vcpu_ioctl(env, KVM_X86_SET_MCE, &mce);
 | 
			
		||||
    }
 | 
			
		||||
#endif /* KVM_CAP_MCE */
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -374,30 +349,27 @@ int kvm_arch_init_vcpu(CPUState *env)
 | 
			
		|||
        struct kvm_cpuid2 cpuid;
 | 
			
		||||
        struct kvm_cpuid_entry2 entries[100];
 | 
			
		||||
    } __attribute__((packed)) cpuid_data;
 | 
			
		||||
    KVMState *s = env->kvm_state;
 | 
			
		||||
    uint32_t limit, i, j, cpuid_i;
 | 
			
		||||
    uint32_t unused;
 | 
			
		||||
    struct kvm_cpuid_entry2 *c;
 | 
			
		||||
#ifdef CONFIG_KVM_PARA
 | 
			
		||||
    uint32_t signature[3];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    env->cpuid_features &= kvm_arch_get_supported_cpuid(env, 1, 0, R_EDX);
 | 
			
		||||
    env->cpuid_features &= kvm_arch_get_supported_cpuid(s, 1, 0, R_EDX);
 | 
			
		||||
 | 
			
		||||
    i = env->cpuid_ext_features & CPUID_EXT_HYPERVISOR;
 | 
			
		||||
    env->cpuid_ext_features &= kvm_arch_get_supported_cpuid(env, 1, 0, R_ECX);
 | 
			
		||||
    env->cpuid_ext_features &= kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX);
 | 
			
		||||
    env->cpuid_ext_features |= i;
 | 
			
		||||
 | 
			
		||||
    env->cpuid_ext2_features &= kvm_arch_get_supported_cpuid(env, 0x80000001,
 | 
			
		||||
    env->cpuid_ext2_features &= kvm_arch_get_supported_cpuid(s, 0x80000001,
 | 
			
		||||
                                                             0, R_EDX);
 | 
			
		||||
    env->cpuid_ext3_features &= kvm_arch_get_supported_cpuid(env, 0x80000001,
 | 
			
		||||
    env->cpuid_ext3_features &= kvm_arch_get_supported_cpuid(s, 0x80000001,
 | 
			
		||||
                                                             0, R_ECX);
 | 
			
		||||
    env->cpuid_svm_features  &= kvm_arch_get_supported_cpuid(env, 0x8000000A,
 | 
			
		||||
    env->cpuid_svm_features  &= kvm_arch_get_supported_cpuid(s, 0x8000000A,
 | 
			
		||||
                                                             0, R_EDX);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    cpuid_i = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_KVM_PARA
 | 
			
		||||
    /* Paravirtualization CPUIDs */
 | 
			
		||||
    memcpy(signature, "KVMKVMKVM\0\0\0", 12);
 | 
			
		||||
    c = &cpuid_data.entries[cpuid_i++];
 | 
			
		||||
| 
						 | 
				
			
			@ -411,14 +383,10 @@ int kvm_arch_init_vcpu(CPUState *env)
 | 
			
		|||
    c = &cpuid_data.entries[cpuid_i++];
 | 
			
		||||
    memset(c, 0, sizeof(*c));
 | 
			
		||||
    c->function = KVM_CPUID_FEATURES;
 | 
			
		||||
    c->eax = env->cpuid_kvm_features & kvm_arch_get_supported_cpuid(env,
 | 
			
		||||
                                                KVM_CPUID_FEATURES, 0, R_EAX);
 | 
			
		||||
    c->eax = env->cpuid_kvm_features &
 | 
			
		||||
        kvm_arch_get_supported_cpuid(s, KVM_CPUID_FEATURES, 0, R_EAX);
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_ASYNC_PF
 | 
			
		||||
    has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -448,6 +416,9 @@ int kvm_arch_init_vcpu(CPUState *env)
 | 
			
		|||
        case 0xb:
 | 
			
		||||
        case 0xd:
 | 
			
		||||
            for (j = 0; ; j++) {
 | 
			
		||||
                if (i == 0xd && j == 64) {
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                c->function = i;
 | 
			
		||||
                c->flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
 | 
			
		||||
                c->index = j;
 | 
			
		||||
| 
						 | 
				
			
			@ -460,7 +431,7 @@ int kvm_arch_init_vcpu(CPUState *env)
 | 
			
		|||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                if (i == 0xd && c->eax == 0) {
 | 
			
		||||
                    break;
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                c = &cpuid_data.entries[cpuid_i++];
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -485,7 +456,7 @@ int kvm_arch_init_vcpu(CPUState *env)
 | 
			
		|||
    /* Call Centaur's CPUID instructions they are supported. */
 | 
			
		||||
    if (env->cpuid_xlevel2 > 0) {
 | 
			
		||||
        env->cpuid_ext4_features &=
 | 
			
		||||
            kvm_arch_get_supported_cpuid(env, 0xC0000001, 0, R_EDX);
 | 
			
		||||
            kvm_arch_get_supported_cpuid(s, 0xC0000001, 0, R_EDX);
 | 
			
		||||
        cpu_x86_cpuid(env, 0xC0000000, 0, &limit, &unused, &unused, &unused);
 | 
			
		||||
 | 
			
		||||
        for (i = 0xC0000000; i <= limit; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -499,7 +470,6 @@ int kvm_arch_init_vcpu(CPUState *env)
 | 
			
		|||
 | 
			
		||||
    cpuid_data.cpuid.nent = cpuid_i;
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
    if (((env->cpuid_version >> 8)&0xF) >= 6
 | 
			
		||||
        && (env->cpuid_features&(CPUID_MCE|CPUID_MCA)) == (CPUID_MCE|CPUID_MCA)
 | 
			
		||||
        && kvm_check_extension(env->kvm_state, KVM_CAP_MCE) > 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -526,7 +496,6 @@ int kvm_arch_init_vcpu(CPUState *env)
 | 
			
		|||
 | 
			
		||||
        env->mcg_cap = mcg_cap;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    qemu_add_vm_change_state_handler(cpu_update_state, env);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -618,7 +587,6 @@ int kvm_arch_init(KVMState *s)
 | 
			
		|||
     * that case we need to stick with the default, i.e. a 256K maximum BIOS
 | 
			
		||||
     * size.
 | 
			
		||||
     */
 | 
			
		||||
#ifdef KVM_CAP_SET_IDENTITY_MAP_ADDR
 | 
			
		||||
    if (kvm_check_extension(s, KVM_CAP_SET_IDENTITY_MAP_ADDR)) {
 | 
			
		||||
        /* Allows up to 16M BIOSes. */
 | 
			
		||||
        identity_base = 0xfeffc000;
 | 
			
		||||
| 
						 | 
				
			
			@ -628,7 +596,7 @@ int kvm_arch_init(KVMState *s)
 | 
			
		|||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* Set TSS base one page after EPT identity map. */
 | 
			
		||||
    ret = kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, identity_base + 0x1000);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -753,6 +721,9 @@ static int kvm_put_fpu(CPUState *env)
 | 
			
		|||
    fpu.fsw = env->fpus & ~(7 << 11);
 | 
			
		||||
    fpu.fsw |= (env->fpstt & 7) << 11;
 | 
			
		||||
    fpu.fcw = env->fpuc;
 | 
			
		||||
    fpu.last_opcode = env->fpop;
 | 
			
		||||
    fpu.last_ip = env->fpip;
 | 
			
		||||
    fpu.last_dp = env->fpdp;
 | 
			
		||||
    for (i = 0; i < 8; ++i) {
 | 
			
		||||
        fpu.ftwx |= (!env->fptags[i]) << i;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -763,7 +734,6 @@ static int kvm_put_fpu(CPUState *env)
 | 
			
		|||
    return kvm_vcpu_ioctl(env, KVM_SET_FPU, &fpu);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_XSAVE
 | 
			
		||||
#define XSAVE_CWD_RIP     2
 | 
			
		||||
#define XSAVE_CWD_RDP     4
 | 
			
		||||
#define XSAVE_MXCSR       6
 | 
			
		||||
| 
						 | 
				
			
			@ -771,14 +741,12 @@ static int kvm_put_fpu(CPUState *env)
 | 
			
		|||
#define XSAVE_XMM_SPACE   40
 | 
			
		||||
#define XSAVE_XSTATE_BV   128
 | 
			
		||||
#define XSAVE_YMMH_SPACE  144
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int kvm_put_xsave(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_XSAVE
 | 
			
		||||
    int i, r;
 | 
			
		||||
    struct kvm_xsave* xsave;
 | 
			
		||||
    uint16_t cwd, swd, twd, fop;
 | 
			
		||||
    uint16_t cwd, swd, twd;
 | 
			
		||||
 | 
			
		||||
    if (!kvm_has_xsave()) {
 | 
			
		||||
        return kvm_put_fpu(env);
 | 
			
		||||
| 
						 | 
				
			
			@ -786,7 +754,7 @@ static int kvm_put_xsave(CPUState *env)
 | 
			
		|||
 | 
			
		||||
    xsave = qemu_memalign(4096, sizeof(struct kvm_xsave));
 | 
			
		||||
    memset(xsave, 0, sizeof(struct kvm_xsave));
 | 
			
		||||
    cwd = swd = twd = fop = 0;
 | 
			
		||||
    cwd = swd = twd = 0;
 | 
			
		||||
    swd = env->fpus & ~(7 << 11);
 | 
			
		||||
    swd |= (env->fpstt & 7) << 11;
 | 
			
		||||
    cwd = env->fpuc;
 | 
			
		||||
| 
						 | 
				
			
			@ -794,7 +762,9 @@ static int kvm_put_xsave(CPUState *env)
 | 
			
		|||
        twd |= (!env->fptags[i]) << i;
 | 
			
		||||
    }
 | 
			
		||||
    xsave->region[0] = (uint32_t)(swd << 16) + cwd;
 | 
			
		||||
    xsave->region[1] = (uint32_t)(fop << 16) + twd;
 | 
			
		||||
    xsave->region[1] = (uint32_t)(env->fpop << 16) + twd;
 | 
			
		||||
    memcpy(&xsave->region[XSAVE_CWD_RIP], &env->fpip, sizeof(env->fpip));
 | 
			
		||||
    memcpy(&xsave->region[XSAVE_CWD_RDP], &env->fpdp, sizeof(env->fpdp));
 | 
			
		||||
    memcpy(&xsave->region[XSAVE_ST_SPACE], env->fpregs,
 | 
			
		||||
            sizeof env->fpregs);
 | 
			
		||||
    memcpy(&xsave->region[XSAVE_XMM_SPACE], env->xmm_regs,
 | 
			
		||||
| 
						 | 
				
			
			@ -806,14 +776,10 @@ static int kvm_put_xsave(CPUState *env)
 | 
			
		|||
    r = kvm_vcpu_ioctl(env, KVM_SET_XSAVE, xsave);
 | 
			
		||||
    qemu_free(xsave);
 | 
			
		||||
    return r;
 | 
			
		||||
#else
 | 
			
		||||
    return kvm_put_fpu(env);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int kvm_put_xcrs(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_XCRS
 | 
			
		||||
    struct kvm_xcrs xcrs;
 | 
			
		||||
 | 
			
		||||
    if (!kvm_has_xcrs()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -825,9 +791,6 @@ static int kvm_put_xcrs(CPUState *env)
 | 
			
		|||
    xcrs.xcrs[0].xcr = 0;
 | 
			
		||||
    xcrs.xcrs[0].value = env->xcr0;
 | 
			
		||||
    return kvm_vcpu_ioctl(env, KVM_SET_XCRS, &xcrs);
 | 
			
		||||
#else
 | 
			
		||||
    return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int kvm_put_sregs(CPUState *env)
 | 
			
		||||
| 
						 | 
				
			
			@ -931,14 +894,11 @@ static int kvm_put_msrs(CPUState *env, int level)
 | 
			
		|||
        kvm_msr_entry_set(&msrs[n++], MSR_KVM_SYSTEM_TIME,
 | 
			
		||||
                          env->system_time_msr);
 | 
			
		||||
        kvm_msr_entry_set(&msrs[n++], MSR_KVM_WALL_CLOCK, env->wall_clock_msr);
 | 
			
		||||
#if defined(CONFIG_KVM_PARA) && defined(KVM_CAP_ASYNC_PF)
 | 
			
		||||
        if (has_msr_async_pf_en) {
 | 
			
		||||
            kvm_msr_entry_set(&msrs[n++], MSR_KVM_ASYNC_PF_EN,
 | 
			
		||||
                              env->async_pf_en_msr);
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
    if (env->mcg_cap) {
 | 
			
		||||
        int i;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -948,7 +908,6 @@ static int kvm_put_msrs(CPUState *env, int level)
 | 
			
		|||
            kvm_msr_entry_set(&msrs[n++], MSR_MC0_CTL + i, env->mce_banks[i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    msr_data.info.nmsrs = n;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -970,6 +929,9 @@ static int kvm_get_fpu(CPUState *env)
 | 
			
		|||
    env->fpstt = (fpu.fsw >> 11) & 7;
 | 
			
		||||
    env->fpus = fpu.fsw;
 | 
			
		||||
    env->fpuc = fpu.fcw;
 | 
			
		||||
    env->fpop = fpu.last_opcode;
 | 
			
		||||
    env->fpip = fpu.last_ip;
 | 
			
		||||
    env->fpdp = fpu.last_dp;
 | 
			
		||||
    for (i = 0; i < 8; ++i) {
 | 
			
		||||
        env->fptags[i] = !((fpu.ftwx >> i) & 1);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -982,10 +944,9 @@ static int kvm_get_fpu(CPUState *env)
 | 
			
		|||
 | 
			
		||||
static int kvm_get_xsave(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_XSAVE
 | 
			
		||||
    struct kvm_xsave* xsave;
 | 
			
		||||
    int ret, i;
 | 
			
		||||
    uint16_t cwd, swd, twd, fop;
 | 
			
		||||
    uint16_t cwd, swd, twd;
 | 
			
		||||
 | 
			
		||||
    if (!kvm_has_xsave()) {
 | 
			
		||||
        return kvm_get_fpu(env);
 | 
			
		||||
| 
						 | 
				
			
			@ -1001,13 +962,15 @@ static int kvm_get_xsave(CPUState *env)
 | 
			
		|||
    cwd = (uint16_t)xsave->region[0];
 | 
			
		||||
    swd = (uint16_t)(xsave->region[0] >> 16);
 | 
			
		||||
    twd = (uint16_t)xsave->region[1];
 | 
			
		||||
    fop = (uint16_t)(xsave->region[1] >> 16);
 | 
			
		||||
    env->fpop = (uint16_t)(xsave->region[1] >> 16);
 | 
			
		||||
    env->fpstt = (swd >> 11) & 7;
 | 
			
		||||
    env->fpus = swd;
 | 
			
		||||
    env->fpuc = cwd;
 | 
			
		||||
    for (i = 0; i < 8; ++i) {
 | 
			
		||||
        env->fptags[i] = !((twd >> i) & 1);
 | 
			
		||||
    }
 | 
			
		||||
    memcpy(&env->fpip, &xsave->region[XSAVE_CWD_RIP], sizeof(env->fpip));
 | 
			
		||||
    memcpy(&env->fpdp, &xsave->region[XSAVE_CWD_RDP], sizeof(env->fpdp));
 | 
			
		||||
    env->mxcsr = xsave->region[XSAVE_MXCSR];
 | 
			
		||||
    memcpy(env->fpregs, &xsave->region[XSAVE_ST_SPACE],
 | 
			
		||||
            sizeof env->fpregs);
 | 
			
		||||
| 
						 | 
				
			
			@ -1018,14 +981,10 @@ static int kvm_get_xsave(CPUState *env)
 | 
			
		|||
            sizeof env->ymmh_regs);
 | 
			
		||||
    qemu_free(xsave);
 | 
			
		||||
    return 0;
 | 
			
		||||
#else
 | 
			
		||||
    return kvm_get_fpu(env);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int kvm_get_xcrs(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_XCRS
 | 
			
		||||
    int i, ret;
 | 
			
		||||
    struct kvm_xcrs xcrs;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1046,9 +1005,6 @@ static int kvm_get_xcrs(CPUState *env)
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
#else
 | 
			
		||||
    return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int kvm_get_sregs(CPUState *env)
 | 
			
		||||
| 
						 | 
				
			
			@ -1172,13 +1128,10 @@ static int kvm_get_msrs(CPUState *env)
 | 
			
		|||
#endif
 | 
			
		||||
    msrs[n++].index = MSR_KVM_SYSTEM_TIME;
 | 
			
		||||
    msrs[n++].index = MSR_KVM_WALL_CLOCK;
 | 
			
		||||
#if defined(CONFIG_KVM_PARA) && defined(KVM_CAP_ASYNC_PF)
 | 
			
		||||
    if (has_msr_async_pf_en) {
 | 
			
		||||
        msrs[n++].index = MSR_KVM_ASYNC_PF_EN;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
    if (env->mcg_cap) {
 | 
			
		||||
        msrs[n++].index = MSR_MCG_STATUS;
 | 
			
		||||
        msrs[n++].index = MSR_MCG_CTL;
 | 
			
		||||
| 
						 | 
				
			
			@ -1186,7 +1139,6 @@ static int kvm_get_msrs(CPUState *env)
 | 
			
		|||
            msrs[n++].index = MSR_MC0_CTL + i;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    msr_data.info.nmsrs = n;
 | 
			
		||||
    ret = kvm_vcpu_ioctl(env, KVM_GET_MSRS, &msr_data);
 | 
			
		||||
| 
						 | 
				
			
			@ -1237,27 +1189,21 @@ static int kvm_get_msrs(CPUState *env)
 | 
			
		|||
        case MSR_KVM_WALL_CLOCK:
 | 
			
		||||
            env->wall_clock_msr = msrs[i].data;
 | 
			
		||||
            break;
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
        case MSR_MCG_STATUS:
 | 
			
		||||
            env->mcg_status = msrs[i].data;
 | 
			
		||||
            break;
 | 
			
		||||
        case MSR_MCG_CTL:
 | 
			
		||||
            env->mcg_ctl = msrs[i].data;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
        default:
 | 
			
		||||
#ifdef KVM_CAP_MCE
 | 
			
		||||
            if (msrs[i].index >= MSR_MC0_CTL &&
 | 
			
		||||
                msrs[i].index < MSR_MC0_CTL + (env->mcg_cap & 0xff) * 4) {
 | 
			
		||||
                env->mce_banks[msrs[i].index - MSR_MC0_CTL] = msrs[i].data;
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
            break;
 | 
			
		||||
#if defined(CONFIG_KVM_PARA) && defined(KVM_CAP_ASYNC_PF)
 | 
			
		||||
        case MSR_KVM_ASYNC_PF_EN:
 | 
			
		||||
            env->async_pf_en_msr = msrs[i].data;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1289,7 +1235,6 @@ static int kvm_get_mp_state(CPUState *env)
 | 
			
		|||
 | 
			
		||||
static int kvm_put_vcpu_events(CPUState *env, int level)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_VCPU_EVENTS
 | 
			
		||||
    struct kvm_vcpu_events events;
 | 
			
		||||
 | 
			
		||||
    if (!kvm_has_vcpu_events()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1318,14 +1263,10 @@ static int kvm_put_vcpu_events(CPUState *env, int level)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    return kvm_vcpu_ioctl(env, KVM_SET_VCPU_EVENTS, &events);
 | 
			
		||||
#else
 | 
			
		||||
    return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int kvm_get_vcpu_events(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_VCPU_EVENTS
 | 
			
		||||
    struct kvm_vcpu_events events;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1355,7 +1296,6 @@ static int kvm_get_vcpu_events(CPUState *env)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    env->sipi_vector = events.sipi_vector;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1363,7 +1303,6 @@ static int kvm_get_vcpu_events(CPUState *env)
 | 
			
		|||
static int kvm_guest_debug_workarounds(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
#ifdef KVM_CAP_SET_GUEST_DEBUG
 | 
			
		||||
    unsigned long reinject_trap = 0;
 | 
			
		||||
 | 
			
		||||
    if (!kvm_has_vcpu_events()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1387,13 +1326,11 @@ static int kvm_guest_debug_workarounds(CPUState *env)
 | 
			
		|||
        (!kvm_has_robust_singlestep() && env->singlestep_enabled)) {
 | 
			
		||||
        ret = kvm_update_guest_debug(env, reinject_trap);
 | 
			
		||||
    }
 | 
			
		||||
#endif /* KVM_CAP_SET_GUEST_DEBUG */
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int kvm_put_debugregs(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_DEBUGREGS
 | 
			
		||||
    struct kvm_debugregs dbgregs;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1409,14 +1346,10 @@ static int kvm_put_debugregs(CPUState *env)
 | 
			
		|||
    dbgregs.flags = 0;
 | 
			
		||||
 | 
			
		||||
    return kvm_vcpu_ioctl(env, KVM_SET_DEBUGREGS, &dbgregs);
 | 
			
		||||
#else
 | 
			
		||||
    return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int kvm_get_debugregs(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_DEBUGREGS
 | 
			
		||||
    struct kvm_debugregs dbgregs;
 | 
			
		||||
    int i, ret;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1433,7 +1366,6 @@ static int kvm_get_debugregs(CPUState *env)
 | 
			
		|||
    }
 | 
			
		||||
    env->dr[4] = env->dr[6] = dbgregs.dr6;
 | 
			
		||||
    env->dr[5] = env->dr[7] = dbgregs.dr7;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1659,7 +1591,6 @@ static int kvm_handle_halt(CPUState *env)
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_SET_GUEST_DEBUG
 | 
			
		||||
int kvm_arch_insert_sw_breakpoint(CPUState *env, struct kvm_sw_breakpoint *bp)
 | 
			
		||||
{
 | 
			
		||||
    static const uint8_t int3 = 0xcc;
 | 
			
		||||
| 
						 | 
				
			
			@ -1840,7 +1771,6 @@ void kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg)
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif /* KVM_CAP_SET_GUEST_DEBUG */
 | 
			
		||||
 | 
			
		||||
static bool host_supports_vmx(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1887,12 +1817,10 @@ int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)
 | 
			
		|||
                run->ex.exception, run->ex.error_code);
 | 
			
		||||
        ret = -1;
 | 
			
		||||
        break;
 | 
			
		||||
#ifdef KVM_CAP_SET_GUEST_DEBUG
 | 
			
		||||
    case KVM_EXIT_DEBUG:
 | 
			
		||||
        DPRINTF("kvm_exit_debug\n");
 | 
			
		||||
        ret = kvm_handle_debug(&run->debug.arch);
 | 
			
		||||
        break;
 | 
			
		||||
#endif /* KVM_CAP_SET_GUEST_DEBUG */
 | 
			
		||||
    default:
 | 
			
		||||
        fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
 | 
			
		||||
        ret = -1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -290,6 +290,26 @@ static const VMStateDescription vmstate_async_pf_msr = {
 | 
			
		|||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static bool fpop_ip_dp_needed(void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    CPUState *env = opaque;
 | 
			
		||||
 | 
			
		||||
    return env->fpop != 0 || env->fpip != 0 || env->fpdp != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const VMStateDescription vmstate_fpop_ip_dp = {
 | 
			
		||||
    .name = "cpu/fpop_ip_dp",
 | 
			
		||||
    .version_id = 1,
 | 
			
		||||
    .minimum_version_id = 1,
 | 
			
		||||
    .minimum_version_id_old = 1,
 | 
			
		||||
    .fields      = (VMStateField []) {
 | 
			
		||||
        VMSTATE_UINT16(fpop, CPUState),
 | 
			
		||||
        VMSTATE_UINT64(fpip, CPUState),
 | 
			
		||||
        VMSTATE_UINT64(fpdp, CPUState),
 | 
			
		||||
        VMSTATE_END_OF_LIST()
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const VMStateDescription vmstate_cpu = {
 | 
			
		||||
    .name = "cpu",
 | 
			
		||||
    .version_id = CPU_SAVE_VERSION,
 | 
			
		||||
| 
						 | 
				
			
			@ -397,6 +417,9 @@ static const VMStateDescription vmstate_cpu = {
 | 
			
		|||
        {
 | 
			
		||||
            .vmsd = &vmstate_async_pf_msr,
 | 
			
		||||
            .needed = async_pf_msr_needed,
 | 
			
		||||
        } , {
 | 
			
		||||
            .vmsd = &vmstate_fpop_ip_dp,
 | 
			
		||||
            .needed = fpop_ip_dp_needed,
 | 
			
		||||
        } , {
 | 
			
		||||
            /* empty */
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,18 +65,10 @@ static void kvm_kick_env(void *env)
 | 
			
		|||
 | 
			
		||||
int kvm_arch_init(KVMState *s)
 | 
			
		||||
{
 | 
			
		||||
#ifdef KVM_CAP_PPC_UNSET_IRQ
 | 
			
		||||
    cap_interrupt_unset = kvm_check_extension(s, KVM_CAP_PPC_UNSET_IRQ);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef KVM_CAP_PPC_IRQ_LEVEL
 | 
			
		||||
    cap_interrupt_level = kvm_check_extension(s, KVM_CAP_PPC_IRQ_LEVEL);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef KVM_CAP_PPC_SEGSTATE
 | 
			
		||||
    cap_segstate = kvm_check_extension(s, KVM_CAP_PPC_SEGSTATE);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef KVM_CAP_PPC_BOOKE_SREGS
 | 
			
		||||
    cap_booke_sregs = kvm_check_extension(s, KVM_CAP_PPC_BOOKE_SREGS);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if (!cap_interrupt_level) {
 | 
			
		||||
        fprintf(stderr, "KVM: Couldn't find level irq capability. Expect the "
 | 
			
		||||
| 
						 | 
				
			
			@ -104,21 +96,12 @@ static int kvm_arch_sync_sregs(CPUState *cenv)
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_KVM_PPC_PVR)
 | 
			
		||||
    if (1) {
 | 
			
		||||
        fprintf(stderr, "kvm error: missing PVR setting capability\n");
 | 
			
		||||
        return -ENOSYS;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ret = kvm_vcpu_ioctl(cenv, KVM_GET_SREGS, &sregs);
 | 
			
		||||
    if (ret) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_KVM_PPC_PVR
 | 
			
		||||
    sregs.pvr = cenv->spr[SPR_PVR];
 | 
			
		||||
#endif
 | 
			
		||||
    return kvm_vcpu_ioctl(cenv, KVM_SET_SREGS, &sregs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -226,7 +209,6 @@ int kvm_arch_get_registers(CPUState *env)
 | 
			
		|||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_PPC_BOOKE_SREGS
 | 
			
		||||
        if (sregs.u.e.features & KVM_SREGS_E_BASE) {
 | 
			
		||||
            env->spr[SPR_BOOKE_CSRR0] = sregs.u.e.csrr0;
 | 
			
		||||
            env->spr[SPR_BOOKE_CSRR1] = sregs.u.e.csrr1;
 | 
			
		||||
| 
						 | 
				
			
			@ -323,7 +305,6 @@ int kvm_arch_get_registers(CPUState *env)
 | 
			
		|||
                env->spr[SPR_BOOKE_PID2] = sregs.u.e.impl.fsl.pid2;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (cap_segstate) {
 | 
			
		||||
| 
						 | 
				
			
			@ -332,7 +313,6 @@ int kvm_arch_get_registers(CPUState *env)
 | 
			
		|||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_PPC_SEGSTATE
 | 
			
		||||
        ppc_store_sdr1(env, sregs.u.s.sdr1);
 | 
			
		||||
 | 
			
		||||
        /* Sync SLB */
 | 
			
		||||
| 
						 | 
				
			
			@ -355,7 +335,6 @@ int kvm_arch_get_registers(CPUState *env)
 | 
			
		|||
            env->IBAT[0][i] = sregs.u.s.ppc32.ibat[i] & 0xffffffff;
 | 
			
		||||
            env->IBAT[1][i] = sregs.u.s.ppc32.ibat[i] >> 32;
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -534,7 +513,6 @@ int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
 | 
			
		|||
{
 | 
			
		||||
    uint32_t *hc = (uint32_t*)buf;
 | 
			
		||||
 | 
			
		||||
#ifdef KVM_CAP_PPC_GET_PVINFO
 | 
			
		||||
    struct kvm_ppc_pvinfo pvinfo;
 | 
			
		||||
 | 
			
		||||
    if (kvm_check_extension(env->kvm_state, KVM_CAP_PPC_GET_PVINFO) &&
 | 
			
		||||
| 
						 | 
				
			
			@ -543,7 +521,6 @@ int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
 | 
			
		|||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Fallback to always fail hypercalls:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -313,16 +313,6 @@ CPUState *s390_cpu_addr2state(uint16_t cpu_addr);
 | 
			
		|||
/* from s390-virtio-bus */
 | 
			
		||||
extern const target_phys_addr_t virtio_size;
 | 
			
		||||
 | 
			
		||||
#ifndef KVM_S390_SIGP_STOP
 | 
			
		||||
#define KVM_S390_SIGP_STOP              0
 | 
			
		||||
#define KVM_S390_PROGRAM_INT            0
 | 
			
		||||
#define KVM_S390_SIGP_SET_PREFIX        0
 | 
			
		||||
#define KVM_S390_RESTART                0
 | 
			
		||||
#define KVM_S390_INT_VIRTIO             0
 | 
			
		||||
#define KVM_S390_INT_SERVICE            0
 | 
			
		||||
#define KVM_S390_INT_EMERGENCY          0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
void cpu_lock(void);
 | 
			
		||||
void cpu_unlock(void);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,7 @@
 | 
			
		|||
#include "helpers.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "kvm.h"
 | 
			
		||||
#include <linux/kvm.h>
 | 
			
		||||
#include "qemu-timer.h"
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue