blob: 936c029ae4d0cc007302f2d4b38f07005494ce72 [file] [log] [blame]
/** \file kvmctl.h
* libkvm API
*/
#ifndef KVMCTL_H
#define KVMCTL_H
#define __user /* temporary, until installed via make headers_install */
#include <linux/kvm.h>
#include <stdint.h>
struct kvm_context;
typedef struct kvm_context *kvm_context_t;
/*!
* \brief KVM callbacks structure
*
* This structure holds pointers to various functions that KVM will call
* when it encounters something that cannot be virtualized, such as
* accessing hardware devices via MMIO or regular IO.
*/
struct kvm_callbacks {
int (*cpuid)(void *opaque,
uint64_t *rax, uint64_t *rbx, uint64_t *rcx, uint64_t *rdx);
/// For 8bit IO reads from the guest (Usually when executing 'inb')
int (*inb)(void *opaque, uint16_t addr, uint8_t *data);
/// For 16bit IO reads from the guest (Usually when executing 'inw')
int (*inw)(void *opaque, uint16_t addr, uint16_t *data);
/// For 32bit IO reads from the guest (Usually when executing 'inl')
int (*inl)(void *opaque, uint16_t addr, uint32_t *data);
/// For 8bit IO writes from the guest (Usually when executing 'outb')
int (*outb)(void *opaque, uint16_t addr, uint8_t data);
/// For 16bit IO writes from the guest (Usually when executing 'outw')
int (*outw)(void *opaque, uint16_t addr, uint16_t data);
/// For 32bit IO writes from the guest (Usually when executing 'outl')
int (*outl)(void *opaque, uint16_t addr, uint32_t data);
/// For 8bit memory reads from unmapped memory (For MMIO devices)
int (*readb)(void *opaque, uint64_t addr, uint8_t *data);
/// For 16bit memory reads from unmapped memory (For MMIO devices)
int (*readw)(void *opaque, uint64_t addr, uint16_t *data);
/// For 32bit memory reads from unmapped memory (For MMIO devices)
int (*readl)(void *opaque, uint64_t addr, uint32_t *data);
/// For 64bit memory reads from unmapped memory (For MMIO devices)
int (*readq)(void *opaque, uint64_t addr, uint64_t *data);
/// For 8bit memory writes to unmapped memory (For MMIO devices)
int (*writeb)(void *opaque, uint64_t addr, uint8_t data);
/// For 16bit memory writes to unmapped memory (For MMIO devices)
int (*writew)(void *opaque, uint64_t addr, uint16_t data);
/// For 32bit memory writes to unmapped memory (For MMIO devices)
int (*writel)(void *opaque, uint64_t addr, uint32_t data);
/// For 64bit memory writes to unmapped memory (For MMIO devices)
int (*writeq)(void *opaque, uint64_t addr, uint64_t data);
int (*debug)(void *opaque, int vcpu);
/*!
* \brief Called when the VCPU issues an 'hlt' instruction.
*
* Typically, you should yeild here to prevent 100% CPU utilization
* on the host CPU.
*/
int (*halt)(void *opaque, int vcpu);
int (*shutdown)(void *opaque, int vcpu);
int (*io_window)(void *opaque);
int (*try_push_interrupts)(void *opaque);
void (*post_kvm_run)(void *opaque, struct kvm_run *kvm_run);
void (*pre_kvm_run)(void *opaque, struct kvm_run *kvm_run);
};
/*!
* \brief Create new KVM context
*
* This creates a new kvm_context. A KVM context is a small area of data that
* holds information about the KVM instance that gets created by this call.\n
* This should always be your first call to KVM.
*
* \param callbacks Pointer to a valid kvm_callbacks structure
* \param opaque Not used
* \return NULL on failure
*/
kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
void *opaque);
/*!
* \brief Cleanup the KVM context
*
* Should always be called when closing down KVM.\n
* Exception: If kvm_init() fails, this function should not be called, as the
* context would be invalid
*
* \param kvm Pointer to the kvm_context that is to be freed
*/
void kvm_finalize(kvm_context_t kvm);
/*!
* \brief Create new virtual machine
*
* This creates a new virtual machine, maps physical RAM to it, and creates a
* virtual CPU for it.\n
* \n
* Memory gets mapped for addresses 0->0xA0000, 0xC0000->phys_mem_bytes
*
* \param kvm Pointer to the current kvm_context
* \param phys_mem_bytes The amount of physical ram you want the VM to have
* \param phys_mem This pointer will be set to point to the memory that
* kvm_create allocates for physical RAM
* \return 0 on success
*/
int kvm_create(kvm_context_t kvm,
unsigned long phys_mem_bytes,
void **phys_mem);
/*!
* \brief Start the VCPU
*
* This starts the VCPU and virtualization is started.\n
* \n
* This function will not return until any of these conditions are met:
* - An IO/MMIO handler does not return "0"
* - An exception that neither the guest OS, nor KVM can handle occurs
*
* \note This function will call the callbacks registered in kvm_init()
* to emulate those functions
* \note If you at any point want to interrupt the VCPU, kvm_run() will
* listen to the EINTR signal. This allows you to simulate external interrupts
* and asyncronous IO.
*
* \param kvm Pointer to the current kvm_context
* \param vcpu Which virtual CPU should be started
* \return 0 on success, but you really shouldn't expect this function to
* return except for when an error has occured, or when you have sent it
* an EINTR signal.
*/
int kvm_run(kvm_context_t kvm, int vcpu);
/*!
* \brief Read VCPU registers
*
* This gets the GP registers from the VCPU and outputs them
* into a kvm_regs structure
*
* \note This function returns a \b copy of the VCPUs registers.\n
* If you wish to modify the VCPUs GP registers, you should call kvm_set_regs()
*
* \param kvm Pointer to the current kvm_context
* \param vcpu Which virtual CPU should get dumped
* \param regs Pointer to a kvm_regs which will be populated with the VCPUs
* registers values
* \return 0 on success
*/
int kvm_get_regs(kvm_context_t kvm, int vcpu, struct kvm_regs *regs);
/*!
* \brief Write VCPU registers
*
* This sets the GP registers on the VCPU from a kvm_regs structure
*
* \note When this function returns, the regs pointer and the data it points to
* can be discarded
* \param kvm Pointer to the current kvm_context
* \param vcpu Which virtual CPU should get dumped
* \param regs Pointer to a kvm_regs which will be populated with the VCPUs
* registers values
* \return 0 on success
*/
int kvm_set_regs(kvm_context_t kvm, int vcpu, struct kvm_regs *regs);
/*!
* \brief Read VCPU system registers
*
* This gets the non-GP registers from the VCPU and outputs them
* into a kvm_sregs structure
*
* \note This function returns a \b copy of the VCPUs registers.\n
* If you wish to modify the VCPUs non-GP registers, you should call
* kvm_set_sregs()
*
* \param kvm Pointer to the current kvm_context
* \param vcpu Which virtual CPU should get dumped
* \param regs Pointer to a kvm_sregs which will be populated with the VCPUs
* registers values
* \return 0 on success
*/
int kvm_get_sregs(kvm_context_t kvm, int vcpu, struct kvm_sregs *regs);
/*!
* \brief Write VCPU system registers
*
* This sets the non-GP registers on the VCPU from a kvm_sregs structure
*
* \note When this function returns, the regs pointer and the data it points to
* can be discarded
* \param kvm Pointer to the current kvm_context
* \param vcpu Which virtual CPU should get dumped
* \param regs Pointer to a kvm_sregs which will be populated with the VCPUs
* registers values
* \return 0 on success
*/
int kvm_set_sregs(kvm_context_t kvm, int vcpu, struct kvm_sregs *regs);
struct kvm_msr_list *kvm_get_msr_list(kvm_context_t);
int kvm_get_msrs(kvm_context_t, int vcpu, struct kvm_msr_entry *msrs, int n);
int kvm_set_msrs(kvm_context_t, int vcpu, struct kvm_msr_entry *msrs, int n);
/*!
* \brief Simulate an external vectored interrupt
*
* This allows you to simulate an external vectored interrupt.
*
* \param kvm Pointer to the current kvm_context
* \param vcpu Which virtual CPU should get dumped
* \param irq Vector number
* \return 0 on success
*/
int kvm_inject_irq(kvm_context_t kvm, int vcpu, unsigned irq);
int kvm_guest_debug(kvm_context_t, int vcpu, struct kvm_debug_guest *dbg);
/*!
* \brief Dump all VCPU information
*
* This dumps \b all the information that KVM has about a virtual CPU, namely:
* - GP Registers
* - System registers (selectors, descriptors, etc)
* - VMCS Data
* - MSRS
* - Pending interrupts
*
* \param kvm Pointer to the current kvm_context
* \param vcpu Which virtual CPU should get dumped
* \return 0 on success
*/
int kvm_dump_vcpu(kvm_context_t kvm, int vcpu);
/*!
* \brief Dump VCPU registers
*
* This dumps some of the information that KVM has about a virtual CPU, namely:
* - GP Registers
*
* A much more verbose version of this is available as kvm_dump_vcpu()
*
* \param kvm Pointer to the current kvm_context
* \param vcpu Which virtual CPU should get dumped
* \return 0 on success
*/
void kvm_show_regs(kvm_context_t kvm, int vcpu);
void *kvm_create_phys_mem(kvm_context_t, unsigned long phys_start,
unsigned long len, int slot, int log, int writable);
void kvm_destroy_phys_mem(kvm_context_t, unsigned long phys_start,
unsigned long len);
int kvm_get_dirty_pages(kvm_context_t, int slot, void *buf);
#endif