/*
** Copyright (c) 2011, Intel Corporation
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** 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.
*/

#ifndef _HAX_I386_H
#define _HAX_I386_H

#include "android/utils/debug.h"
#include "exec/hax.h"

#ifdef CONFIG_DARWIN
typedef int hax_fd;
#endif

#ifdef CONFIG_WIN32
typedef HANDLE hax_fd;
#endif

extern struct hax_state hax_global;
struct hax_vcpu_state
{
    hax_fd fd;
    int vcpu_id;
    int emulation_state;
    struct hax_tunnel *tunnel;
    unsigned char *iobuf;
};

struct hax_state
{
    hax_fd fd; /* the global hax device interface */
    uint32_t version;
    struct hax_vm *vm;
    uint64_t mem_quota;
};

#define HAX_MAX_VCPU 0x10
#define MAX_VM_ID 0x40
#define MAX_VCPU_ID 0x40

struct hax_vm
{
    hax_fd fd;
    int id;
    struct hax_vcpu_state *vcpus[HAX_MAX_VCPU];
};

/* Functions exported to host specific mode */
hax_fd hax_vcpu_get_fd(CPUState *cpu);
int valid_hax_tunnel_size(uint16_t size);

/* Host specific functions */
int hax_mod_version(struct hax_state *hax, struct hax_module_version *version);
int hax_inject_interrupt(CPUState *cpu, int vector);
struct hax_vm *hax_vm_create(struct hax_state *hax);
int hax_vcpu_run(struct hax_vcpu_state *vcpu);
int hax_vcpu_create(int id);
int hax_sync_vcpu_state(CPUState *cpu, struct vcpu_state_t *state, int set);
int hax_sync_msr(CPUState *cpu, struct hax_msr_data *msrs, int set);
int hax_sync_fpu(CPUState *cpu, struct fx_layout *fl, int set);
int hax_vm_destroy(struct hax_vm *vm);
int hax_capability(struct hax_state *hax, struct hax_capabilityinfo *cap);
int hax_notify_qemu_version(hax_fd vm_fd, struct hax_qemu_version *qversion);

/* Common host function */
int hax_host_create_vm(struct hax_state *hax, int *vm_id);
hax_fd hax_host_open_vm(struct hax_state *hax, int vm_id);
int hax_host_create_vcpu(hax_fd vm_fd, int vcpuid);
hax_fd hax_host_open_vcpu(int vmid, int vcpuid);
int hax_host_setup_vcpu_channel(struct hax_vcpu_state *vcpu);
hax_fd hax_mod_open(void);


#ifdef CONFIG_DARWIN
#include "target-i386/hax-darwin.h"
#endif

#ifdef CONFIG_WIN32
#include "target-i386/hax-windows.h"
#endif

#include "target-i386/hax-interface.h"

#endif
