116239Sjkh/*-
24Srgrimes * Copyright (c) 2011 NetApp, Inc.
3509Srgrimes * All rights reserved.
450477Speter *
54Srgrimes * Redistribution and use in source and binary forms, with or without
6509Srgrimes * modification, are permitted provided that the following conditions
7509Srgrimes * are met:
84Srgrimes * 1. Redistributions of source code must retain the above copyright
94Srgrimes *    notice, this list of conditions and the following disclaimer.
104Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
114Srgrimes *    notice, this list of conditions and the following disclaimer in the
124Srgrimes *    documentation and/or other materials provided with the distribution.
134Srgrimes *
144Srgrimes * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND
154Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
164Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
174Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE
184Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1930640Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2065091Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2130640Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2246842Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2346842Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2427674Sphk * SUCH DAMAGE.
2527674Sphk *
2652651Smarcel * $FreeBSD$
272056Swollman */
282056Swollman
292056Swollman#ifndef _VMMAPI_H_
304Srgrimes#define	_VMMAPI_H_
312056Swollman
3252651Smarcel#include <sys/param.h>
3355666Skato#include <sys/cpuset.h>
344Srgrimes
3561593Speterstruct iovec;
3661593Speterstruct vmctx;
3753595Speterenum x2apic_state;
384836Sdg
3918518Sbde/*
407627Snate * Different styles of mapping the memory assigned to a VM into the address
417627Snate * space of the controlling process.
427627Snate */
437627Snateenum vm_mmap_style {
447627Snate	VM_MMAP_NONE,		/* no mapping */
457627Snate	VM_MMAP_ALL,		/* fully and statically mapped */
4655205Speter	VM_MMAP_SPARSE,		/* mappings created on-demand */
47712Swollman};
4838714Sjb
4939537Sbde#define	VM_MEM_F_INCORE	0x01	/* include guest memory in core file */
5039537Sbde
5139537Sbdeint	vm_create(const char *name);
5238714Sjbstruct vmctx *vm_open(const char *name);
5339537Sbdevoid	vm_destroy(struct vmctx *ctx);
5455604Sbdeint	vm_parse_memsize(const char *optarg, size_t *memsize);
5553595Speterint	vm_get_memory_seg(struct vmctx *ctx, vm_paddr_t gpa, size_t *ret_len,
5653595Speter			  int *wired);
5738714Sjbint	vm_setup_memory(struct vmctx *ctx, size_t len, enum vm_mmap_style s);
5827065Sbdevoid	*vm_map_gpa(struct vmctx *ctx, vm_paddr_t gaddr, size_t len);
5920395Sbdeint	vm_get_gpa_pmap(struct vmctx *, uint64_t gpa, uint64_t *pte, int *num);
6027065Sbdeuint32_t vm_get_lowmem_limit(struct vmctx *ctx);
6120395Sbdevoid	vm_set_lowmem_limit(struct vmctx *ctx, uint32_t limit);
6220395Sbdevoid	vm_set_memflags(struct vmctx *ctx, int flags);
6320395Sbdesize_t	vm_get_lowmem_size(struct vmctx *ctx);
6420395Sbdesize_t	vm_get_highmem_size(struct vmctx *ctx);
6520395Sbdeint	vm_set_desc(struct vmctx *ctx, int vcpu, int reg,
664Srgrimes		    uint64_t base, uint32_t limit, uint32_t access);
6751898Sbdeint	vm_get_desc(struct vmctx *ctx, int vcpu, int reg,
6851898Sbde		    uint64_t *base, uint32_t *limit, uint32_t *access);
6951898Sbdeint	vm_get_seg_desc(struct vmctx *ctx, int vcpu, int reg,
7051898Sbde			struct seg_desc *seg_desc);
7155604Sbdeint	vm_set_register(struct vmctx *ctx, int vcpu, int reg, uint64_t val);
7255604Sbdeint	vm_get_register(struct vmctx *ctx, int vcpu, int reg, uint64_t *retval);
7355604Sbdeint	vm_run(struct vmctx *ctx, int vcpu, uint64_t rip,
7455604Sbde	       struct vm_exit *ret_vmexit);
752408Sbdeint	vm_suspend(struct vmctx *ctx, enum vm_suspend_how how);
7659093Sdfrint	vm_reinit(struct vmctx *ctx);
7759033Sdfrint	vm_apicid2vcpu(struct vmctx *ctx, int apicid);
7859033Sdfrint	vm_inject_exception(struct vmctx *ctx, int vcpu, int vec);
7955532Speterint	vm_inject_exception2(struct vmctx *ctx, int vcpu, int vec, int errcode);
8042771Speterint	vm_lapic_irq(struct vmctx *ctx, int vcpu, int vector);
8139537Sbdeint	vm_lapic_local_irq(struct vmctx *ctx, int vcpu, int vector);
8225985Sjdpint	vm_lapic_msi(struct vmctx *ctx, uint64_t addr, uint64_t msg);
8325985Sjdpint	vm_ioapic_assert_irq(struct vmctx *ctx, int irq);
8461640Speterint	vm_ioapic_deassert_irq(struct vmctx *ctx, int irq);
8555532Speterint	vm_ioapic_pulse_irq(struct vmctx *ctx, int irq);
8653595Speterint	vm_ioapic_pincount(struct vmctx *ctx, int *pincount);
8761640Speterint	vm_isa_assert_irq(struct vmctx *ctx, int atpic_irq, int ioapic_irq);
8842450Sjdpint	vm_isa_deassert_irq(struct vmctx *ctx, int atpic_irq, int ioapic_irq);
8955669Speterint	vm_isa_pulse_irq(struct vmctx *ctx, int atpic_irq, int ioapic_irq);
9039818Speterint	vm_isa_set_irq_trigger(struct vmctx *ctx, int atpic_irq,
9135514Simp	    enum vm_intr_trigger trigger);
9261593Speterint	vm_inject_nmi(struct vmctx *ctx, int vcpu);
9361593Speterint	vm_capability_name2type(const char *capname);
9455669Speterconst char *vm_capability_type2name(int type);
954Srgrimesint	vm_get_capability(struct vmctx *ctx, int vcpu, enum vm_cap_type cap,
965327Sgibbs			  int *retval);
975327Sgibbsint	vm_set_capability(struct vmctx *ctx, int vcpu, enum vm_cap_type cap,
984Srgrimes			  int val);
994Srgrimesint	vm_assign_pptdev(struct vmctx *ctx, int bus, int slot, int func);
1004Srgrimesint	vm_unassign_pptdev(struct vmctx *ctx, int bus, int slot, int func);
1014Srgrimesint	vm_map_pptdev_mmio(struct vmctx *ctx, int bus, int slot, int func,
10211918Sdg			   vm_paddr_t gpa, size_t len, vm_paddr_t hpa);
10311918Sdgint	vm_setup_pptdev_msi(struct vmctx *ctx, int vcpu, int bus, int slot,
10438778Snsouch	    int func, uint64_t addr, uint64_t msg, int numvec);
10538778Snsouchint	vm_setup_pptdev_msix(struct vmctx *ctx, int vcpu, int bus, int slot,
1066802Sgibbs	    int func, int idx, uint64_t addr, uint64_t msg,
1076802Sgibbs	    uint32_t vector_control);
10860251Sn_hibma
10960251Sn_hibmaint	vm_get_intinfo(struct vmctx *ctx, int vcpu, uint64_t *i1, uint64_t *i2);
11055120Sbdeint	vm_set_intinfo(struct vmctx *ctx, int vcpu, uint64_t exit_intinfo);
11146822Speter
11260984Sobrien/*
11360984Sobrien * Return a pointer to the statistics buffer. Note that this is not MT-safe.
11460984Sobrien */
11560984Sobrienuint64_t *vm_get_stats(struct vmctx *ctx, int vcpu, struct timeval *ret_tv,
11660984Sobrien		       int *ret_entries);
11760984Sobrienconst char *vm_get_stat_desc(struct vmctx *ctx, int index);
11860984Sobrien
11946842Speterint	vm_get_x2apic_state(struct vmctx *ctx, int vcpu, enum x2apic_state *s);
12046842Speterint	vm_set_x2apic_state(struct vmctx *ctx, int vcpu, enum x2apic_state s);
12146842Speter
12246842Speterint	vm_get_hpet_capabilities(struct vmctx *ctx, uint32_t *capabilities);
12355120Sbde
12461593Speter/*
12546842Speter * Translate the GLA range [gla,gla+len) into GPA segments in 'iov'.
12646842Speter * The 'iovcnt' should be big enough to accomodate all GPA segments.
12755120Sbde * Returns 0 on success, 1 on a guest fault condition and -1 otherwise.
12846822Speter */
12946822Speterint	vm_copy_setup(struct vmctx *ctx, int vcpu, struct vm_guest_paging *pg,
13046822Speter	    uint64_t gla, size_t len, int prot, struct iovec *iov, int iovcnt);
13146822Spetervoid	vm_copyin(struct vmctx *ctx, int vcpu, struct iovec *guest_iov,
13260251Sn_hibma	    void *host_dst, size_t len);
13341592Simpvoid	vm_copyout(struct vmctx *ctx, int vcpu, const void *host_src,
13459033Sdfr	    struct iovec *guest_iov, size_t len);
13541592Simp
13641592Simp/* Reset vcpu register state */
13759033Sdfrint	vcpu_reset(struct vmctx *ctx, int vcpu);
13859033Sdfr
13959093Sdfrint	vm_active_cpus(struct vmctx *ctx, cpuset_t *cpus);
14059033Sdfrint	vm_suspended_cpus(struct vmctx *ctx, cpuset_t *cpus);
14159033Sdfrint	vm_activate_cpu(struct vmctx *ctx, int vcpu);
14260984Sobrien
14361174Sbde/*
14455604Sbde * FreeBSD specific APIs
14555604Sbde */
14659033Sdfrint	vm_setup_freebsd_registers(struct vmctx *ctx, int vcpu,
14759033Sdfr				uint64_t rip, uint64_t cr3, uint64_t gdtbase,
14859033Sdfr				uint64_t rsp);
1494Srgrimesint	vm_setup_freebsd_registers_i386(struct vmctx *vmctx, int vcpu,
150715Swollman					uint32_t eip, uint32_t gdtbase,
15137580Sbde					uint32_t esp);
15261640Spetervoid	vm_setup_freebsd_gdt(uint64_t *gdtr);
153715Swollman#endif	/* _VMMAPI_H_ */
154715Swollman