1e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/*
2e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** Copyright (c) 2011, Intel Corporation
3e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima**
4e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** This software is licensed under the terms of the GNU General Public
5e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** License version 2, as published by the Free Software Foundation, and
6e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** may be copied, distributed, and modified under those terms.
7e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima**
8e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** This program is distributed in the hope that it will be useful,
9e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** but WITHOUT ANY WARRANTY; without even the implied warranty of
10e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** GNU General Public License for more details.
12e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima*/
13e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
14e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#ifndef __HAX_UNIX_H
15e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define __HAX_UNIX_H
16e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
17e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#include <sys/types.h>
18e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#include <sys/ioctl.h>
19e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#include <sys/mman.h>
20e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#include <stdarg.h>
21e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
22e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_INVALID_FD  (-1)
23e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastatic inline int hax_invalid_fd(hax_fd fd)
24e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{
25e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima    return fd <= 0;
26e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}
27e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
28e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastatic inline void hax_mod_close(struct hax_state *hax)
29e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{
30e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima    close(hax->fd);
31e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}
32e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
33e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastatic inline void hax_close_fd(hax_fd fd)
34e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{
35e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima    close(fd);
36e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}
37e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
38e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* HAX model level ioctl */
39e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* Get API version the HAX driver supports */
40e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_IOCTL_VERSION _IOWR(0, 0x20, struct hax_module_version)
41e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* Create VM instance and return the vm_id */
42e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_IOCTL_CREATE_VM _IOWR(0, 0x21, int)
434a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong/* Get HAXM capability information */
444a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong#define HAX_IOCTL_CAPABILITY _IOR(0, 0x23, struct hax_capabilityinfo)
45e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
46e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* Pass down a VM_ID, create a VCPU instance for it */
47e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VM_IOCTL_VCPU_CREATE    _IOR(0, 0x80, int)
48e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/*
49e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Allocate guest memory, the step of allocate guest memory is:
50e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 1. QEMU will allocate the virtual address to cover the guest memory ranges
51e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 2. QEMU passing down the virtual address and length in the
52e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima *    HAX_VM_IOCTL_ALLOC_RAM ioctl through hax_alloc_ram_info structure
53e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 3. HAX driver populate physical memory for the virtual address range, and
54e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima *    lock these physical memory lock, so that they will not be swapped out
55e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 4. HAX driver map the populated physical memory into kernel address space
56e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */
57e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VM_IOCTL_ALLOC_RAM _IOWR(0, 0x81, struct hax_alloc_ram_info)
58e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/*
59e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Setup translation between guest physical address and host physical address
60e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */
61e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VM_IOCTL_SET_RAM _IOWR(0, 0x82, struct hax_set_ram_info)
628a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong
638a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong/*
648a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong * QEMU notify HAXM driver of the API version currently in use, so that
658a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong * HAXM driver will not present features that possibly not supported
668a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong * by QEMU
678a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong */
688a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong#define HAX_VM_IOCTL_NOTIFY_QEMU_VERSION   _IOW(0, 0x84, struct hax_qemu_version)
698a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong
70e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* Run the guest in non-root mode */
71e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_IOCTL_RUN  _IO(0, 0xc0)
72e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* Sync QEMU's guest MSR value to HAX driver */
73e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_IOCTL_SET_MSRS _IOWR(0, 0xc1, struct hax_msr_data)
74e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* Sync HAX driver's guest MSR value to QEMU */
75e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_IOCTL_GET_MSRS _IOWR(0, 0xc2, struct hax_msr_data)
76e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_IOCTL_SET_FPU  _IOW(0, 0xc3, struct fx_layout)
77e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_IOCTL_GET_FPU  _IOR(0, 0xc4, struct fx_layout)
78e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
79e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* Setup HAX tunnel, see structure hax_tunnel comments in hax-interface.h */
80e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_IOCTL_SETUP_TUNNEL _IOWR(0, 0xc5, struct hax_tunnel_info)
81e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* A interrupt need to be injected into guest */
82e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_IOCTL_INTERRUPT _IOWR(0, 0xc6, uint32_t)
83e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_SET_REGS       _IOWR(0, 0xc7, struct vcpu_state_t)
84e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_VCPU_GET_REGS       _IOWR(0, 0xc8, struct vcpu_state_t)
85e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima
86e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#endif /* __HAX_UNIX_H */
87