Author: neel
Date: Sat Jan 19 04:18:52 2013
New Revision: 245652
URL: http://svnweb.freebsd.org/changeset/base/245652

Log:
  Merge projects/bhyve to head.
  
  'bhyve' was developed by grehan@ and myself at NetApp (thanks!).
  
  Special thanks to Peter Snyder, Joe Caradonna and Michael Dexter for their
  support and encouragement.
  
  Obtained from:        NetApp

Added:
     - copied from r245640, projects/bhyve/lib/libvmmapi/
     - copied unchanged from r245640, projects/bhyve/share/man/man4/bhyve.4
     - copied unchanged from r245640, projects/bhyve/sys/amd64/include/vmm.h
     - copied unchanged from r245640, projects/bhyve/sys/amd64/include/vmm_dev.h
     - copied unchanged from r245640, 
projects/bhyve/sys/amd64/include/vmm_instruction_emul.h
     - copied from r245640, projects/bhyve/sys/amd64/vmm/
     - copied from r245640, projects/bhyve/sys/dev/blackhole/
     - copied from r245640, projects/bhyve/sys/dev/bvm/
     - copied from r245640, projects/bhyve/sys/modules/blackhole/
     - copied from r245640, projects/bhyve/sys/modules/vmm/
     - copied from r245640, projects/bhyve/usr.sbin/bhyve/
     - copied from r245640, projects/bhyve/usr.sbin/bhyvectl/
     - copied from r245640, projects/bhyve/usr.sbin/bhyveload/
Directory Properties:
  head/lib/libvmmapi/   (props changed)
  head/share/man/man4/bhyve.4   (props changed)
  head/sys/amd64/include/vmm.h   (props changed)
  head/sys/amd64/include/vmm_dev.h   (props changed)
  head/sys/amd64/include/vmm_instruction_emul.h   (props changed)
  head/sys/amd64/vmm/   (props changed)
  head/sys/dev/blackhole/   (props changed)
  head/sys/dev/bvm/   (props changed)
  head/sys/modules/blackhole/   (props changed)
  head/sys/modules/vmm/   (props changed)
  head/usr.sbin/bhyve/   (props changed)
  head/usr.sbin/bhyvectl/   (props changed)
  head/usr.sbin/bhyveload/   (props changed)
Modified:
  head/lib/Makefile
  head/share/mk/bsd.libnames.mk
  head/sys/conf/files.amd64
  head/sys/modules/Makefile
  head/usr.sbin/Makefile.amd64

Modified: head/lib/Makefile
==============================================================================
--- head/lib/Makefile   Sat Jan 19 04:11:45 2013        (r245651)
+++ head/lib/Makefile   Sat Jan 19 04:18:52 2013        (r245652)
@@ -115,6 +115,7 @@ SUBDIR=     ${SUBDIR_ORDERED} \
        ${_libusbhid} \
        ${_libusb} \
        ${_libvgl} \
+       ${_libvmmapi} \
        libwrap \
        liby \
        libz \
@@ -198,6 +199,10 @@ _libproc=  libproc
 _librtld_db=   librtld_db
 .endif
 
+.if ${MACHINE_CPUARCH} == "amd64"
+_libvmmapi=    libvmmapi
+.endif
+
 .if ${MACHINE_CPUARCH} == "ia64"
 _libefi=       libefi
 .endif

Copied: head/share/man/man4/bhyve.4 (from r245640, 
projects/bhyve/share/man/man4/bhyve.4)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/share/man/man4/bhyve.4 Sat Jan 19 04:18:52 2013        (r245652, copy 
of r245640, projects/bhyve/share/man/man4/bhyve.4)
@@ -0,0 +1,68 @@
+.\"
+.\" Copyright (c) 2012 NetApp Inc
+.\" All rights reserved.
+.\"
+.\" 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.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 THE AUTHOR 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.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd January 5, 2013
+.Dt BHYVE 4
+.Os
+.Sh NAME
+.Nm bhyve
+.Nd virtual machine monitor
+.Sh SYNOPSIS
+.Cd "/usr/sbin/bhyve"
+.Cd "/usr/sbin/bhyveload"
+.Cd "/usr/sbin/bhyvectl"
+.Cd "/boot/kernel/vmm.ko"
+.Sh DESCRIPTION
+.Nm
+is a virtual machine monitor that is hosted by FreeBSD. It is used to host
+unmodified guest operating systems on top of FreeBSD.
+.Pp
+.Nm
+relies heavily on hardware assist provided by the CPU and chipset to virtualize
+processor and memory resources.
+.Sh SEE ALSO
+.Xr bhyve 8 ,
+.Xr bhyveload 8 ,
+.Xr bhyvectl 8 ,
+.Xr vmm 4
+.Sh HISTORY
+.Nm
+first appeared in
+.Fx 10.0 ,
+and was developed at NetApp Inc.
+.Sh AUTHORS
+.Nm
+was developed by
+.An -nosplit
+.An "Peter Grehan" Aq gre...@freebsd.org
+and
+.An "Neel Natu" Aq n...@freebsd.org
+at NetApp Inc.
+.Sh BUGS
+.Nm
+is considered experimental in
+.Fx .

Modified: head/share/mk/bsd.libnames.mk
==============================================================================
--- head/share/mk/bsd.libnames.mk       Sat Jan 19 04:11:45 2013        
(r245651)
+++ head/share/mk/bsd.libnames.mk       Sat Jan 19 04:18:52 2013        
(r245652)
@@ -162,6 +162,7 @@ LIBULOG?=   ${DESTDIR}${LIBDIR}/libulog.a
 LIBUTIL?=      ${DESTDIR}${LIBDIR}/libutil.a
 LIBUUTIL?=     ${DESTDIR}${LIBDIR}/libuutil.a
 LIBVGL?=       ${DESTDIR}${LIBDIR}/libvgl.a
+LIBVMMAPI?=    ${DESTDIR}${LIBDIR}/libvmmapi.a
 LIBWIND?=      ${DESTDIR}${LIBDIR}/libwind.a
 LIBWRAP?=      ${DESTDIR}${LIBDIR}/libwrap.a
 LIBXPG4?=      ${DESTDIR}${LIBDIR}/libxpg4.a

Copied: head/sys/amd64/include/vmm.h (from r245640, 
projects/bhyve/sys/amd64/include/vmm.h)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/amd64/include/vmm.h        Sat Jan 19 04:18:52 2013        
(r245652, copy of r245640, projects/bhyve/sys/amd64/include/vmm.h)
@@ -0,0 +1,293 @@
+/*-
+ * Copyright (c) 2011 NetApp, Inc.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``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 NETAPP, INC 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.
+ *
+ * $FreeBSD: vmm.h 482 2011-05-09 21:22:43Z grehan $
+ */
+
+#ifndef _VMM_H_
+#define        _VMM_H_
+
+#ifdef _KERNEL
+
+#define        VM_MAX_NAMELEN  32
+
+struct vm;
+struct vm_memory_segment;
+struct seg_desc;
+struct vm_exit;
+struct vm_run;
+struct vlapic;
+
+enum x2apic_state;
+
+typedef int    (*vmm_init_func_t)(void);
+typedef int    (*vmm_cleanup_func_t)(void);
+typedef void * (*vmi_init_func_t)(struct vm *vm); /* instance specific apis */
+typedef int    (*vmi_run_func_t)(void *vmi, int vcpu, register_t rip);
+typedef void   (*vmi_cleanup_func_t)(void *vmi);
+typedef int    (*vmi_mmap_set_func_t)(void *vmi, vm_paddr_t gpa,
+                                      vm_paddr_t hpa, size_t length,
+                                      vm_memattr_t attr, int prot,
+                                      boolean_t superpages_ok);
+typedef vm_paddr_t (*vmi_mmap_get_func_t)(void *vmi, vm_paddr_t gpa);
+typedef int    (*vmi_get_register_t)(void *vmi, int vcpu, int num,
+                                     uint64_t *retval);
+typedef int    (*vmi_set_register_t)(void *vmi, int vcpu, int num,
+                                     uint64_t val);
+typedef int    (*vmi_get_desc_t)(void *vmi, int vcpu, int num,
+                                 struct seg_desc *desc);
+typedef int    (*vmi_set_desc_t)(void *vmi, int vcpu, int num,
+                                 struct seg_desc *desc);
+typedef int    (*vmi_inject_event_t)(void *vmi, int vcpu,
+                                     int type, int vector,
+                                     uint32_t code, int code_valid);
+typedef int    (*vmi_get_cap_t)(void *vmi, int vcpu, int num, int *retval);
+typedef int    (*vmi_set_cap_t)(void *vmi, int vcpu, int num, int val);
+
+struct vmm_ops {
+       vmm_init_func_t         init;           /* module wide initialization */
+       vmm_cleanup_func_t      cleanup;
+
+       vmi_init_func_t         vminit;         /* vm-specific initialization */
+       vmi_run_func_t          vmrun;
+       vmi_cleanup_func_t      vmcleanup;
+       vmi_mmap_set_func_t     vmmmap_set;
+       vmi_mmap_get_func_t     vmmmap_get;
+       vmi_get_register_t      vmgetreg;
+       vmi_set_register_t      vmsetreg;
+       vmi_get_desc_t          vmgetdesc;
+       vmi_set_desc_t          vmsetdesc;
+       vmi_inject_event_t      vminject;
+       vmi_get_cap_t           vmgetcap;
+       vmi_set_cap_t           vmsetcap;
+};
+
+extern struct vmm_ops vmm_ops_intel;
+extern struct vmm_ops vmm_ops_amd;
+
+struct vm *vm_create(const char *name);
+void vm_destroy(struct vm *vm);
+const char *vm_name(struct vm *vm);
+int vm_malloc(struct vm *vm, vm_paddr_t gpa, size_t len);
+int vm_map_mmio(struct vm *vm, vm_paddr_t gpa, size_t len, vm_paddr_t hpa);
+int vm_unmap_mmio(struct vm *vm, vm_paddr_t gpa, size_t len);
+vm_paddr_t vm_gpa2hpa(struct vm *vm, vm_paddr_t gpa, size_t size);
+int vm_gpabase2memseg(struct vm *vm, vm_paddr_t gpabase,
+             struct vm_memory_segment *seg);
+int vm_get_register(struct vm *vm, int vcpu, int reg, uint64_t *retval);
+int vm_set_register(struct vm *vm, int vcpu, int reg, uint64_t val);
+int vm_get_seg_desc(struct vm *vm, int vcpu, int reg,
+                   struct seg_desc *ret_desc);
+int vm_set_seg_desc(struct vm *vm, int vcpu, int reg,
+                   struct seg_desc *desc);
+int vm_get_pinning(struct vm *vm, int vcpu, int *cpuid);
+int vm_set_pinning(struct vm *vm, int vcpu, int cpuid);
+int vm_run(struct vm *vm, struct vm_run *vmrun);
+int vm_inject_event(struct vm *vm, int vcpu, int type,
+                   int vector, uint32_t error_code, int error_code_valid);
+int vm_inject_nmi(struct vm *vm, int vcpu);
+int vm_nmi_pending(struct vm *vm, int vcpuid);
+void vm_nmi_clear(struct vm *vm, int vcpuid);
+uint64_t *vm_guest_msrs(struct vm *vm, int cpu);
+struct vlapic *vm_lapic(struct vm *vm, int cpu);
+int vm_get_capability(struct vm *vm, int vcpu, int type, int *val);
+int vm_set_capability(struct vm *vm, int vcpu, int type, int val);
+int vm_get_x2apic_state(struct vm *vm, int vcpu, enum x2apic_state *state);
+int vm_set_x2apic_state(struct vm *vm, int vcpu, enum x2apic_state state);
+void vm_activate_cpu(struct vm *vm, int vcpu);
+cpuset_t vm_active_cpus(struct vm *vm);
+struct vm_exit *vm_exitinfo(struct vm *vm, int vcpuid);
+
+/*
+ * Return 1 if device indicated by bus/slot/func is supposed to be a
+ * pci passthrough device.
+ *
+ * Return 0 otherwise.
+ */
+int vmm_is_pptdev(int bus, int slot, int func);
+
+void *vm_iommu_domain(struct vm *vm);
+
+enum vcpu_state {
+       VCPU_IDLE,
+       VCPU_RUNNING,
+       VCPU_CANNOT_RUN,
+};
+
+int vcpu_set_state(struct vm *vm, int vcpu, enum vcpu_state state);
+enum vcpu_state vcpu_get_state(struct vm *vm, int vcpu);
+
+static int __inline
+vcpu_is_running(struct vm *vm, int vcpu)
+{
+       return (vcpu_get_state(vm, vcpu) == VCPU_RUNNING);
+}
+
+void *vcpu_stats(struct vm *vm, int vcpu);
+void vm_interrupt_hostcpu(struct vm *vm, int vcpu);
+
+#endif /* KERNEL */
+
+#include <machine/vmm_instruction_emul.h>
+
+#define        VM_MAXCPU       8                       /* maximum virtual cpus 
*/
+
+/*
+ * Identifiers for events that can be injected into the VM
+ */
+enum vm_event_type {
+       VM_EVENT_NONE,
+       VM_HW_INTR,
+       VM_NMI,
+       VM_HW_EXCEPTION,
+       VM_SW_INTR,
+       VM_PRIV_SW_EXCEPTION,
+       VM_SW_EXCEPTION,
+       VM_EVENT_MAX
+};
+
+/*
+ * Identifiers for architecturally defined registers.
+ */
+enum vm_reg_name {
+       VM_REG_GUEST_RAX,
+       VM_REG_GUEST_RBX,
+       VM_REG_GUEST_RCX,
+       VM_REG_GUEST_RDX,
+       VM_REG_GUEST_RSI,
+       VM_REG_GUEST_RDI,
+       VM_REG_GUEST_RBP,
+       VM_REG_GUEST_R8,
+       VM_REG_GUEST_R9,
+       VM_REG_GUEST_R10,
+       VM_REG_GUEST_R11,
+       VM_REG_GUEST_R12,
+       VM_REG_GUEST_R13,
+       VM_REG_GUEST_R14,
+       VM_REG_GUEST_R15,
+       VM_REG_GUEST_CR0,
+       VM_REG_GUEST_CR3,
+       VM_REG_GUEST_CR4,
+       VM_REG_GUEST_DR7,
+       VM_REG_GUEST_RSP,
+       VM_REG_GUEST_RIP,
+       VM_REG_GUEST_RFLAGS,
+       VM_REG_GUEST_ES,
+       VM_REG_GUEST_CS,
+       VM_REG_GUEST_SS,
+       VM_REG_GUEST_DS,
+       VM_REG_GUEST_FS,
+       VM_REG_GUEST_GS,
+       VM_REG_GUEST_LDTR,
+       VM_REG_GUEST_TR,
+       VM_REG_GUEST_IDTR,
+       VM_REG_GUEST_GDTR,
+       VM_REG_GUEST_EFER,
+       VM_REG_LAST
+};
+
+/*
+ * Identifiers for optional vmm capabilities
+ */
+enum vm_cap_type {
+       VM_CAP_HALT_EXIT,
+       VM_CAP_MTRAP_EXIT,
+       VM_CAP_PAUSE_EXIT,
+       VM_CAP_UNRESTRICTED_GUEST,
+       VM_CAP_MAX
+};
+
+enum x2apic_state {
+       X2APIC_ENABLED,
+       X2APIC_AVAILABLE,
+       X2APIC_DISABLED,
+       X2APIC_STATE_LAST
+};
+
+/*
+ * The 'access' field has the format specified in Table 21-2 of the Intel
+ * Architecture Manual vol 3b.
+ *
+ * XXX The contents of the 'access' field are architecturally defined except
+ * bit 16 - Segment Unusable.
+ */
+struct seg_desc {
+       uint64_t        base;
+       uint32_t        limit;
+       uint32_t        access;
+};
+
+enum vm_exitcode {
+       VM_EXITCODE_INOUT,
+       VM_EXITCODE_VMX,
+       VM_EXITCODE_BOGUS,
+       VM_EXITCODE_RDMSR,
+       VM_EXITCODE_WRMSR,
+       VM_EXITCODE_HLT,
+       VM_EXITCODE_MTRAP,
+       VM_EXITCODE_PAUSE,
+       VM_EXITCODE_PAGING,
+       VM_EXITCODE_SPINUP_AP,
+       VM_EXITCODE_MAX
+};
+
+struct vm_exit {
+       enum vm_exitcode        exitcode;
+       int                     inst_length;    /* 0 means unknown */
+       uint64_t                rip;
+       union {
+               struct {
+                       uint16_t        bytes:3;        /* 1 or 2 or 4 */
+                       uint16_t        in:1;           /* out is 0, in is 1 */
+                       uint16_t        string:1;
+                       uint16_t        rep:1;
+                       uint16_t        port;
+                       uint32_t        eax;            /* valid for out */
+               } inout;
+               struct {
+                       uint64_t        gpa;
+                       struct vie      vie;
+               } paging;
+               /*
+                * VMX specific payload. Used when there is no "better"
+                * exitcode to represent the VM-exit.
+                */
+               struct {
+                       int             error;          /* vmx inst error */
+                       uint32_t        exit_reason;
+                       uint64_t        exit_qualification;
+               } vmx;
+               struct {
+                       uint32_t        code;           /* ecx value */
+                       uint64_t        wval;
+               } msr;
+               struct {
+                       int             vcpu;
+                       uint64_t        rip;
+               } spinup_ap;
+       } u;
+};
+
+#endif /* _VMM_H_ */

Copied: head/sys/amd64/include/vmm_dev.h (from r245640, 
projects/bhyve/sys/amd64/include/vmm_dev.h)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/amd64/include/vmm_dev.h    Sat Jan 19 04:18:52 2013        
(r245652, copy of r245640, projects/bhyve/sys/amd64/include/vmm_dev.h)
@@ -0,0 +1,215 @@
+/*-
+ * Copyright (c) 2011 NetApp, Inc.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``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 NETAPP, INC 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.
+ *
+ * $FreeBSD: vmm_dev.h 482 2011-05-09 21:22:43Z grehan $
+ */
+
+#ifndef        _VMM_DEV_H_
+#define        _VMM_DEV_H_
+
+#ifdef _KERNEL
+void   vmmdev_init(void);
+int    vmmdev_cleanup(void);
+#endif
+
+struct vm_memory_segment {
+       vm_paddr_t      gpa;    /* in */
+       size_t          len;    /* in */
+};
+
+struct vm_register {
+       int             cpuid;
+       int             regnum;         /* enum vm_reg_name */
+       uint64_t        regval;
+};
+
+struct vm_seg_desc {                   /* data or code segment */
+       int             cpuid;
+       int             regnum;         /* enum vm_reg_name */
+       struct seg_desc desc;
+};
+
+struct vm_pin {
+       int             vm_cpuid;
+       int             host_cpuid;     /* -1 to unpin */
+};
+
+struct vm_run {
+       int             cpuid;
+       uint64_t        rip;            /* start running here */
+       struct vm_exit  vm_exit;
+};
+
+struct vm_event {
+       int             cpuid;
+       enum vm_event_type type;
+       int             vector;
+       uint32_t        error_code;
+       int             error_code_valid;
+};
+
+struct vm_lapic_irq {
+       int             cpuid;
+       int             vector;
+};
+
+struct vm_capability {
+       int             cpuid;
+       enum vm_cap_type captype;
+       int             capval;
+       int             allcpus;
+};
+
+struct vm_pptdev {
+       int             bus;
+       int             slot;
+       int             func;
+};
+
+struct vm_pptdev_mmio {
+       int             bus;
+       int             slot;
+       int             func;
+       vm_paddr_t      gpa;
+       vm_paddr_t      hpa;
+       size_t          len;
+};
+
+struct vm_pptdev_msi {
+       int             vcpu;
+       int             bus;
+       int             slot;
+       int             func;
+       int             numvec;         /* 0 means disabled */
+       int             vector;
+       int             destcpu;
+};
+
+struct vm_pptdev_msix {
+       int             vcpu;
+       int             bus;
+       int             slot;
+       int             func;
+       int             idx;
+       uint32_t        msg;
+       uint32_t        vector_control;
+       uint64_t        addr;
+};
+
+struct vm_nmi {
+       int             cpuid;
+};
+
+#define        MAX_VM_STATS    64
+struct vm_stats {
+       int             cpuid;                          /* in */
+       int             num_entries;                    /* out */
+       struct timeval  tv;
+       uint64_t        statbuf[MAX_VM_STATS];
+};
+
+struct vm_stat_desc {
+       int             index;                          /* in */
+       char            desc[128];                      /* out */
+};
+
+struct vm_x2apic {
+       int                     cpuid;
+       enum x2apic_state       state;
+};
+
+enum {
+       IOCNUM_RUN,
+       IOCNUM_SET_PINNING,
+       IOCNUM_GET_PINNING,
+       IOCNUM_MAP_MEMORY,
+       IOCNUM_GET_MEMORY_SEG,
+       IOCNUM_SET_REGISTER,
+       IOCNUM_GET_REGISTER,
+       IOCNUM_SET_SEGMENT_DESCRIPTOR,
+       IOCNUM_GET_SEGMENT_DESCRIPTOR,
+       IOCNUM_INJECT_EVENT,
+       IOCNUM_LAPIC_IRQ,
+       IOCNUM_SET_CAPABILITY,
+       IOCNUM_GET_CAPABILITY,
+       IOCNUM_BIND_PPTDEV,
+       IOCNUM_UNBIND_PPTDEV,
+       IOCNUM_MAP_PPTDEV_MMIO,
+       IOCNUM_PPTDEV_MSI,
+       IOCNUM_PPTDEV_MSIX,
+       IOCNUM_INJECT_NMI,
+       IOCNUM_VM_STATS,
+       IOCNUM_VM_STAT_DESC,
+       IOCNUM_SET_X2APIC_STATE,
+       IOCNUM_GET_X2APIC_STATE,
+};
+
+#define        VM_RUN          \
+       _IOWR('v', IOCNUM_RUN, struct vm_run)
+#define        VM_SET_PINNING  \
+       _IOW('v', IOCNUM_SET_PINNING, struct vm_pin)
+#define        VM_GET_PINNING  \
+       _IOWR('v', IOCNUM_GET_PINNING, struct vm_pin)
+#define        VM_MAP_MEMORY   \
+       _IOWR('v', IOCNUM_MAP_MEMORY, struct vm_memory_segment)
+#define        VM_GET_MEMORY_SEG \
+       _IOWR('v', IOCNUM_GET_MEMORY_SEG, struct vm_memory_segment)
+#define        VM_SET_REGISTER \
+       _IOW('v', IOCNUM_SET_REGISTER, struct vm_register)
+#define        VM_GET_REGISTER \
+       _IOWR('v', IOCNUM_GET_REGISTER, struct vm_register)
+#define        VM_SET_SEGMENT_DESCRIPTOR \
+       _IOW('v', IOCNUM_SET_SEGMENT_DESCRIPTOR, struct vm_seg_desc)
+#define        VM_GET_SEGMENT_DESCRIPTOR \
+       _IOWR('v', IOCNUM_GET_SEGMENT_DESCRIPTOR, struct vm_seg_desc)
+#define        VM_INJECT_EVENT \
+       _IOW('v', IOCNUM_INJECT_EVENT, struct vm_event)
+#define        VM_LAPIC_IRQ            \
+       _IOW('v', IOCNUM_LAPIC_IRQ, struct vm_lapic_irq)
+#define        VM_SET_CAPABILITY \
+       _IOW('v', IOCNUM_SET_CAPABILITY, struct vm_capability)
+#define        VM_GET_CAPABILITY \
+       _IOWR('v', IOCNUM_GET_CAPABILITY, struct vm_capability)
+#define        VM_BIND_PPTDEV \
+       _IOW('v', IOCNUM_BIND_PPTDEV, struct vm_pptdev)
+#define        VM_UNBIND_PPTDEV \
+       _IOW('v', IOCNUM_UNBIND_PPTDEV, struct vm_pptdev)
+#define        VM_MAP_PPTDEV_MMIO \
+       _IOW('v', IOCNUM_MAP_PPTDEV_MMIO, struct vm_pptdev_mmio)
+#define        VM_PPTDEV_MSI \
+       _IOW('v', IOCNUM_PPTDEV_MSI, struct vm_pptdev_msi)
+#define        VM_PPTDEV_MSIX \
+       _IOW('v', IOCNUM_PPTDEV_MSIX, struct vm_pptdev_msix)
+#define VM_INJECT_NMI \
+       _IOW('v', IOCNUM_INJECT_NMI, struct vm_nmi)
+#define        VM_STATS \
+       _IOWR('v', IOCNUM_VM_STATS, struct vm_stats)
+#define        VM_STAT_DESC \
+       _IOWR('v', IOCNUM_VM_STAT_DESC, struct vm_stat_desc)
+#define        VM_SET_X2APIC_STATE \
+       _IOW('v', IOCNUM_SET_X2APIC_STATE, struct vm_x2apic)
+#define        VM_GET_X2APIC_STATE \
+       _IOWR('v', IOCNUM_GET_X2APIC_STATE, struct vm_x2apic)
+#endif

Copied: head/sys/amd64/include/vmm_instruction_emul.h (from r245640, 
projects/bhyve/sys/amd64/include/vmm_instruction_emul.h)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/amd64/include/vmm_instruction_emul.h       Sat Jan 19 04:18:52 
2013        (r245652, copy of r245640, 
projects/bhyve/sys/amd64/include/vmm_instruction_emul.h)
@@ -0,0 +1,113 @@
+/*-
+ * Copyright (c) 2012 NetApp, Inc.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``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 NETAPP, INC 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef        _VMM_INSTRUCTION_EMUL_H_
+#define        _VMM_INSTRUCTION_EMUL_H_
+
+/*
+ * The data structures 'vie' and 'vie_op' are meant to be opaque to the
+ * consumers of instruction decoding. The only reason why their contents
+ * need to be exposed is because they are part of the 'vm_exit' structure.
+ */
+struct vie_op {
+       uint8_t         op_byte;        /* actual opcode byte */
+       uint8_t         op_type;        /* type of operation (e.g. MOV) */
+       uint16_t        op_flags;
+};
+
+#define        VIE_INST_SIZE   15
+struct vie {
+       uint8_t         inst[VIE_INST_SIZE];    /* instruction bytes */
+       uint8_t         num_valid;              /* size of the instruction */
+       uint8_t         num_processed;
+
+       uint8_t         rex_w:1,                /* REX prefix */
+                       rex_r:1,
+                       rex_x:1,
+                       rex_b:1;
+
+       uint8_t         mod:2,                  /* ModRM byte */
+                       reg:4,
+                       rm:4;
+
+       uint8_t         ss:2,                   /* SIB byte */
+                       index:4,
+                       base:4;
+
+       uint8_t         disp_bytes;
+       uint8_t         imm_bytes;
+
+       uint8_t         scale;
+       int             base_register;          /* VM_REG_GUEST_xyz */
+       int             index_register;         /* VM_REG_GUEST_xyz */
+
+       int64_t         displacement;           /* optional addr displacement */
+       int64_t         immediate;              /* optional immediate operand */
+
+       uint8_t         decoded;        /* set to 1 if successfully decoded */
+
+       struct vie_op   op;                     /* opcode description */
+};
+
+/*
+ * Callback functions to read and write memory regions.
+ */
+typedef int (*mem_region_read_t)(void *vm, int cpuid, uint64_t gpa,
+                                uint64_t *rval, int rsize, void *arg);
+
+typedef int (*mem_region_write_t)(void *vm, int cpuid, uint64_t gpa,
+                                 uint64_t wval, int wsize, void *arg);
+
+/*
+ * Emulate the decoded 'vie' instruction.
+ *
+ * The callbacks 'mrr' and 'mrw' emulate reads and writes to the memory region
+ * containing 'gpa'. 'mrarg' is an opaque argument that is passed into the
+ * callback functions.
+ *
+ * 'void *vm' should be 'struct vm *' when called from kernel context and
+ * 'struct vmctx *' when called from user context.
+ * s
+ */
+int vmm_emulate_instruction(void *vm, int cpuid, uint64_t gpa, struct vie *vie,
+                           mem_region_read_t mrr, mem_region_write_t mrw,
+                           void *mrarg);
+
+#ifdef _KERNEL
+/*
+ * APIs to fetch and decode the instruction from nested page fault handler.
+ */
+int vmm_fetch_instruction(struct vm *vm, int cpuid,
+                         uint64_t rip, int inst_length, uint64_t cr3,
+                         struct vie *vie);
+
+int vmm_decode_instruction(struct vm *vm, int cpuid,
+                          uint64_t gla, struct vie *vie);
+#endif /* _KERNEL */
+
+#endif /* _VMM_INSTRUCTION_EMUL_H_ */

Modified: head/sys/conf/files.amd64
==============================================================================
--- head/sys/conf/files.amd64   Sat Jan 19 04:11:45 2013        (r245651)
+++ head/sys/conf/files.amd64   Sat Jan 19 04:18:52 2013        (r245652)
@@ -464,6 +464,11 @@ libkern/memset.c           standard
 compat/x86bios/x86bios.c       optional x86bios | atkbd | dpms | vesa
 contrib/x86emu/x86emu.c                optional x86bios | atkbd | dpms | vesa
 #
+# bvm console
+#
+dev/bvm/bvm_console.c          optional        bvmconsole
+dev/bvm/bvm_dbg.c              optional        bvmdebug
+#
 # x86 shared code between IA32, AMD64 and PC98 architectures
 #
 x86/acpica/OsdEnvironment.c    optional        acpi

Modified: head/sys/modules/Makefile
==============================================================================
--- head/sys/modules/Makefile   Sat Jan 19 04:11:45 2013        (r245651)
+++ head/sys/modules/Makefile   Sat Jan 19 04:18:52 2013        (r245652)
@@ -48,6 +48,7 @@ SUBDIR=       \
        ${_bxe} \
        ${_bios} \
        ${_bktr} \
+       ${_blackhole} \
        ${_bm} \
        bridgestp \
        bwi \
@@ -335,6 +336,7 @@ SUBDIR=     \
        vge \
        ${_viawd} \
        vkbd \
+       ${_vmm} \
        ${_vpo} \
        vr \
        vte \
@@ -624,6 +626,7 @@ _amdtemp=   amdtemp
 _arcmsr=       arcmsr
 _asmc=         asmc
 _bktr=         bktr
+_blackhole=    blackhole
 _bxe=          bxe
 _cardbus=      cardbus
 _cbb=          cbb
@@ -720,6 +723,7 @@ _twa=               twa
 _vesa=         vesa
 _viawd=                viawd
 _virtio=       virtio
+_vmm=          vmm
 _vxge=         vxge
 _x86bios=      x86bios
 _wbwd=         wbwd

Modified: head/usr.sbin/Makefile.amd64
==============================================================================
--- head/usr.sbin/Makefile.amd64        Sat Jan 19 04:11:45 2013        
(r245651)
+++ head/usr.sbin/Makefile.amd64        Sat Jan 19 04:18:52 2013        
(r245652)
@@ -10,6 +10,9 @@ SUBDIR+=      acpi
 SUBDIR+=       apm
 .endif
 SUBDIR+=       asf
+SUBDIR+=       bhyve
+SUBDIR+=       bhyvectl
+SUBDIR+=       bhyveload
 SUBDIR+=       boot0cfg
 .if ${MK_TOOLCHAIN} != "no"
 SUBDIR+=       btxld
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to