#ifndef __LITEVM_H
#define __LITEVM_H
#include <page_alloc.h>
#include <sys/queue.h>
#include <pmap.h>
#include "vmx.h"

#define CR0_PE_MASK (1ULL << 0)
#define CR0_TS_MASK (1ULL << 3)
#define CR0_NE_MASK (1ULL << 5)
#define CR0_WP_MASK (1ULL << 16)
#define CR0_NW_MASK (1ULL << 29)
#define CR0_CD_MASK (1ULL << 30)
#define CR0_PG_MASK (1ULL << 31)

#define CR3_WPT_MASK (1ULL << 3)
#define CR3_PCD_MASK (1ULL << 4)

#define CR3_RESEVED_BITS 0x07ULL
#define CR3_L_MODE_RESEVED_BITS (~((1ULL << 40) - 1) | 0x0fe7ULL)
#define CR3_FLAGS_MASK ((1ULL << 5) - 1)

#define CR4_VME_MASK (1ULL << 0)
#define CR4_PSE_MASK (1ULL << 4)
#define CR4_PAE_MASK (1ULL << 5)
#define CR4_PGE_MASK (1ULL << 7)
#define CR4_VMXE_MASK (1ULL << 13)

#define LITEVM_GUEST_CR0_MASK \
	(CR0_PG_MASK | CR0_PE_MASK | CR0_WP_MASK | CR0_NE_MASK)
#define LITEVM_VM_CR0_ALWAYS_ON LITEVM_GUEST_CR0_MASK

#define LITEVM_GUEST_CR4_MASK \
	(CR4_PSE_MASK | CR4_PAE_MASK | CR4_PGE_MASK | CR4_VMXE_MASK | CR4_VME_MASK)
#define LITEVM_PMODE_VM_CR4_ALWAYS_ON (CR4_VMXE_MASK | CR4_PAE_MASK)
#define LITEVM_RMODE_VM_CR4_ALWAYS_ON (CR4_VMXE_MASK | CR4_PAE_MASK | CR4_VME_MASK)

#define INVALID_PAGE (~(hpa_t)0)
#define UNMAPPED_GVA (~(gpa_t)0)

#define LITEVM_MAX_VCPUS 1
#define LITEVM_MEMORY_SLOTS 4
#define LITEVM_NUM_MMU_PAGES 256

#define FX_IMAGE_SIZE 512
#define FX_IMAGE_ALIGN 16
#define FX_BUF_SIZE (2 * FX_IMAGE_SIZE + FX_IMAGE_ALIGN)

#define DE_VECTOR 0
#define DF_VECTOR 8
#define TS_VECTOR 10
#define NP_VECTOR 11
#define SS_VECTOR 12
#define GP_VECTOR 13
#define PF_VECTOR 14

#define SELECTOR_TI_MASK (1 << 2)
#define SELECTOR_RPL_MASK 0x03

#define IOPL_SHIFT 12

/*
 * Address types:
 *
 *  gva - guest virtual address
 *  gpa - guest physical address
 *  gfn - guest frame number
 *  hva - host virtual address
 *  hpa - host physical address
 *  hfn - host frame number
 */

typedef unsigned long  gva_t;
typedef uint64_t            gpa_t;
typedef unsigned long  gfn_t;

typedef unsigned long  hva_t;
typedef uint64_t            hpa_t;
typedef unsigned long  hfn_t;

struct litevm_mmu_page {
	LIST_ENTRY(litevm_mmu_page) link;
	hpa_t page_hpa;
	unsigned long slot_bitmap; /* One bit set per slot which has memory
				    * in this shadow page.
				    */
	int global;              /* Set if all ptes in this page are global */
	uint64_t *parent_pte;
};

struct vmcs {
	uint32_t revision_id;
	uint32_t abort;
	char data[0];
};

struct vmx_msr_entry {
	uint32_t index;
	uint32_t reserved;
	uint64_t data;
};

struct litevm_vcpu;

/*
 * x86 supports 3 paging modes (4-level 64-bit, 3-level 64-bit, and 2-level
 * 32-bit).  The litevm_mmu structure abstracts the details of the current mmu
 * mode.
 */
struct litevm_mmu {
	void (*new_cr3)(struct litevm_vcpu *vcpu);
	int (*page_fault)(struct litevm_vcpu *vcpu, gva_t gva, uint32_t err);
	void (*inval_page)(struct litevm_vcpu *vcpu, gva_t gva);
	void (*free)(struct litevm_vcpu *vcpu);
	gpa_t (*gva_to_gpa)(struct litevm_vcpu *vcpu, gva_t gva);
	hpa_t root_hpa;
	int root_level;
	int shadow_root_level;
};

struct litevm_guest_debug {
	int enabled;
	unsigned long bp[4];
	int singlestep;
};

enum {
	VCPU_REGS_RAX = 0,
	VCPU_REGS_RCX = 1,
	VCPU_REGS_RDX = 2,
	VCPU_REGS_RBX = 3,
	VCPU_REGS_RSP = 4,
	VCPU_REGS_RBP = 5,
	VCPU_REGS_RSI = 6,
	VCPU_REGS_RDI = 7,
#ifdef __x86_64__
	VCPU_REGS_R8 = 8,
	VCPU_REGS_R9 = 9,
	VCPU_REGS_R10 = 10,
	VCPU_REGS_R11 = 11,
	VCPU_REGS_R12 = 12,
	VCPU_REGS_R13 = 13,
	VCPU_REGS_R14 = 14,
	VCPU_REGS_R15 = 15,
#endif
	NR_VCPU_REGS
};

struct litevm_vcpu {
	struct litevm *litevm;
	struct vmcs *vmcs;
	qlock_t mutex;
	int   cpu;
	int   launched;
	unsigned long irq_summary; /* bit vector: 1 per word in irq_pending */
#define NR_IRQ_WORDS (256 / BITS_PER_LONG)
	unsigned long irq_pending[NR_IRQ_WORDS];
	unsigned long regs[NR_VCPU_REGS]; /* for rsp: vcpu_load_rsp_rip() */
	unsigned long rip;      /* needs vcpu_load_rsp_rip() */

	unsigned long cr2;
	unsigned long cr3;
	unsigned long cr8;
	uint64_t shadow_efer;
	uint64_t apic_base;
	int nmsrs;
	struct vmx_msr_entry *guest_msrs;
	struct vmx_msr_entry *host_msrs;
	LIST_HEAD(free_pages, litevm_mmu_page) link;
	//struct list_head free_pages;
	struct litevm_mmu_page page_header_buf[LITEVM_NUM_MMU_PAGES];
	struct litevm_mmu mmu;

	struct litevm_guest_debug guest_debug;

	char fx_buf[FX_BUF_SIZE];
	char *host_fx_image;
	char *guest_fx_image;

	int mmio_needed;
	int mmio_read_completed;
	int mmio_is_write;
	int mmio_size;
	unsigned char mmio_data[8];
	gpa_t mmio_phys_addr;

	struct{
		int active;
		uint8_t save_iopl;
		struct {
			unsigned long base;
			uint32_t limit;
			uint32_t ar;
		} tr;
	} rmode;
};

struct litevm_memory_slot {
	gfn_t base_gfn;
	unsigned long npages;
	unsigned long flags;
	struct page **phys_mem;
//#warning "bitmap is u8. "
	/*unsigned long*/uint8_t *dirty_bitmap;
};

struct litevm {
	spinlock_t lock; /* protects everything except vcpus */
	int nmemslots;
	struct litevm_memory_slot memslots[LITEVM_MEMORY_SLOTS];
	LIST_HEAD(active_mmu_pages, litevm_mmu_page) link;
	//struct list_head active_mmu_pages;
	struct litevm_vcpu vcpus[LITEVM_MAX_VCPUS];
	int memory_config_version;
	int busy;
};

struct litevm_stat {
	uint32_t pf_fixed;
	uint32_t pf_guest;
	uint32_t tlb_flush;
	uint32_t invlpg;

	uint32_t exits;
	uint32_t io_exits;
	uint32_t mmio_exits;
	uint32_t signal_exits;
	uint32_t irq_exits;
};

extern struct litevm_stat litevm_stat;

#define litevm_printf(litevm, fmt ...) printd(fmt)
#define vcpu_printf(vcpu, fmt...) litevm_printf(vcpu->litevm, fmt)

void litevm_mmu_destroy(struct litevm_vcpu *vcpu);
int litevm_mmu_init(struct litevm_vcpu *vcpu);

int litevm_mmu_reset_context(struct litevm_vcpu *vcpu);
void litevm_mmu_slot_remove_write_access(struct litevm *litevm, int slot);

hpa_t gpa_to_hpa(struct litevm_vcpu *vcpu, gpa_t gpa);
#define HPA_MSB ((sizeof(hpa_t) * 8) - 1)
#define HPA_ERR_MASK ((hpa_t)1 << HPA_MSB)
static inline int is_error_hpa(hpa_t hpa) { return hpa >> HPA_MSB; }
hpa_t gva_to_hpa(struct litevm_vcpu *vcpu, gva_t gva);

extern hpa_t bad_page_address;

static inline struct page *gfn_to_page(struct litevm_memory_slot *slot, gfn_t gfn)
{
	return slot->phys_mem[gfn - slot->base_gfn];
}

struct litevm_memory_slot *gfn_to_memslot(struct litevm *litevm, gfn_t gfn);
void mark_page_dirty(struct litevm *litevm, gfn_t gfn);

void realmode_lgdt(struct litevm_vcpu *vcpu, uint16_t size, unsigned long address);
void realmode_lidt(struct litevm_vcpu *vcpu, uint16_t size, unsigned long address);
void realmode_lmsw(struct litevm_vcpu *vcpu, unsigned long msw,
		   unsigned long *rflags);

unsigned long realmode_get_cr(struct litevm_vcpu *vcpu, int cr);
void realmode_set_cr(struct litevm_vcpu *vcpu, int cr, unsigned long value,
		     unsigned long *rflags);

int litevm_read_guest(struct litevm_vcpu *vcpu,
	       gva_t addr,
	       unsigned long size,
	       void *dest);

int litevm_write_guest(struct litevm_vcpu *vcpu,
		gva_t addr,
		unsigned long size,
		void *data);

void vmcs_writel(unsigned long field, unsigned long value);
unsigned long vmcs_readl(unsigned long field);

static inline uint16_t vmcs_read16(unsigned long field)
{
	return vmcs_readl(field);
}

static inline uint32_t vmcs_read32(unsigned long field)
{
	return vmcs_readl(field);
}

static inline uint64_t vmcs_read64(unsigned long field)
{
#ifdef __x86_64__
	return vmcs_readl(field);
#else
	return vmcs_readl(field) | ((uint64_t)vmcs_readl(field+1) << 32);
#endif
}

static inline void vmcs_write32(unsigned long field, uint32_t value)
{
	vmcs_writel(field, value);
}

static inline int is_long_mode(void)
{
	return vmcs_read32(VM_ENTRY_CONTROLS) & VM_ENTRY_CONTROLS_IA32E_MASK;
}

static inline unsigned long guest_cr4(void)
{
	return (vmcs_readl(CR4_READ_SHADOW) & LITEVM_GUEST_CR4_MASK) |
		(vmcs_readl(GUEST_CR4) & ~LITEVM_GUEST_CR4_MASK);
}

static inline int is_pae(void)
{
	return guest_cr4() & CR4_PAE_MASK;
}

static inline int is_pse(void)
{
	return guest_cr4() & CR4_PSE_MASK;
}

static inline unsigned long guest_cr0(void)
{
	return (vmcs_readl(CR0_READ_SHADOW) & LITEVM_GUEST_CR0_MASK) |
		(vmcs_readl(GUEST_CR0) & ~LITEVM_GUEST_CR0_MASK);
}

static inline unsigned guest_cpl(void)
{
	return vmcs_read16(GUEST_CS_SELECTOR) & SELECTOR_RPL_MASK;
}

static inline int is_paging(void)
{
	return guest_cr0() & CR0_PG_MASK;
}

static inline int is_page_fault(uint32_t intr_info)
{
	return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK |
			     INTR_INFO_VALID_MASK)) ==
		(INTR_TYPE_EXCEPTION | PF_VECTOR | INTR_INFO_VALID_MASK);
}

static inline int is_external_interrupt(uint32_t intr_info)
{
	return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK))
		== (INTR_TYPE_EXT_INTR | INTR_INFO_VALID_MASK);
}

static inline void flush_guest_tlb(struct litevm_vcpu *vcpu)
{
	vmcs_writel(GUEST_CR3, vmcs_readl(GUEST_CR3));
}

static inline int memslot_id(struct litevm *litevm, struct litevm_memory_slot *slot)
{
	return slot - litevm->memslots;
}

static inline struct litevm_mmu_page *page_header(hpa_t shadow_page)
{
	struct page *page = ppn2page(shadow_page >> PAGE_SHIFT);

	return (struct litevm_mmu_page *)page->pg_private;
}

#ifdef __x86_64__

/*
 * When emulating 32-bit mode, cr3 is only 32 bits even on x86_64.  Therefore
 * we need to allocate shadow page tables in the first 4GB of memory, which
 * happens to fit the DMA32 zone.
 */
#define GFP_LITEVM_MMU (GFP_KERNEL | __GFP_DMA32)

#else

#define GFP_LITEVM_MMU GFP_KERNEL

#endif

/* just to get things to build ... include this stuff for now.
 * at some point, this interface gets nuke to and made more plan 
 * 9 like.
 */

/* for LITEVM_CREATE_MEMORY_REGION */
struct litevm_memory_region {
	uint32_t slot;
	uint32_t flags;
	uint64_t guest_phys_addr;
	uint64_t memory_size; /* bytes */
	void *init_data;
};

/* for litevm_memory_region::flags */
#define LITEVM_MEM_LOG_DIRTY_PAGES  1UL


#define LITEVM_EXIT_TYPE_FAIL_ENTRY 1
#define LITEVM_EXIT_TYPE_VM_EXIT    2

enum litevm_exit_reason {
	LITEVM_EXIT_UNKNOWN,
	LITEVM_EXIT_EXCEPTION,
	LITEVM_EXIT_IO,
	LITEVM_EXIT_CPUID,
	LITEVM_EXIT_DEBUG,
	LITEVM_EXIT_HLT,
	LITEVM_EXIT_MMIO,
};

/* for LITEVM_RUN */
struct litevm_run {
	/* in */
	uint32_t vcpu;
	uint32_t emulated;  /* skip current instruction */
	uint32_t mmio_completed; /* mmio request completed */

	/* out */
	uint32_t exit_type;
	uint32_t exit_reason;
	uint32_t instruction_length;
	union {
		/* LITEVM_EXIT_UNKNOWN */
		struct {
			uint32_t hardware_exit_reason;
		} hw;
		/* LITEVM_EXIT_EXCEPTION */
		struct {
			uint32_t exception;
			uint32_t error_code;
		} ex;
		/* LITEVM_EXIT_IO */
		struct {
#define LITEVM_EXIT_IO_IN  0
#define LITEVM_EXIT_IO_OUT 1
			uint8_t direction;
			uint8_t size; /* bytes */
			uint8_t string;
			uint8_t string_down;
			uint8_t rep;
			uint8_t pad;
			uint16_t port;
			uint64_t count;
			union {
				uint64_t address;
				uint32_t value;
			};
		} io;
		struct {
		} debug;
		/* LITEVM_EXIT_MMIO */
		struct {
			uint64_t phys_addr;
			uint8_t  data[8];
			uint32_t len;
			uint8_t  is_write;
		} mmio;
	};
};

/* for LITEVM_GET_REGS and LITEVM_SET_REGS */
struct litevm_regs {
	/* in */
	uint32_t vcpu;
	uint32_t padding;

	/* out (LITEVM_GET_REGS) / in (LITEVM_SET_REGS) */
	uint64_t rax, rbx, rcx, rdx;
	uint64_t rsi, rdi, rsp, rbp;
	uint64_t r8,  r9,  r10, r11;
	uint64_t r12, r13, r14, r15;
	uint64_t rip, rflags;
};

struct litevm_segment {
	uint64_t base;
	uint32_t limit;
	uint16_t selector;
	uint8_t  type;
	uint8_t  present, dpl, db, s, l, g, avl;
	uint8_t  unusable;
	uint8_t  padding;
};

struct litevm_dtable {
	uint64_t base;
	uint16_t limit;
	uint16_t padding[3];
};

/* for LITEVM_GET_SREGS and LITEVM_SET_SREGS */
struct litevm_sregs {
	/* in */
	uint32_t vcpu;
	uint32_t padding;

	/* out (LITEVM_GET_SREGS) / in (LITEVM_SET_SREGS) */
	struct litevm_segment cs, ds, es, fs, gs, ss;
	struct litevm_segment tr, ldt;
	struct litevm_dtable gdt, idt;
	uint64_t cr0, cr2, cr3, cr4, cr8;
	uint64_t efer;
	uint64_t apic_base;

	/* out (LITEVM_GET_SREGS) */
	uint32_t pending_int;
	uint32_t padding2;
};

/* for LITEVM_TRANSLATE */
struct litevm_translation {
	/* in */
	uint64_t linear_address;
	uint32_t vcpu;
	uint32_t padding;

	/* out */
	uint64_t physical_address;
	uint8_t  valid;
	uint8_t  writeable;
	uint8_t  usermode;
};

/* for LITEVM_INTERRUPT */
struct litevm_interrupt {
	/* in */
	uint32_t vcpu;
	uint32_t irq;
};

struct litevm_breakpoint {
	uint32_t enabled;
	uint32_t padding;
	uint64_t address;
};

/* for LITEVM_DEBUG_GUEST */
struct litevm_debug_guest {
	/* int */
	uint32_t vcpu;
	uint32_t enabled;
	struct litevm_breakpoint breakpoints[4];
	uint32_t singlestep;
};

/* for LITEVM_GET_DIRTY_LOG */
struct litevm_dirty_log {
	uint32_t slot;
	uint32_t padding;
	union {
		void *dirty_bitmap; /* one bit per page */
		uint64_t paddingw;
	};
};

enum {
	LITEVM_RUN = 1,
	LITEVM_GET_REGS,
	LITEVM_SET_REGS,
	LITEVM_GET_SREGS,
	LITEVM_SET_SREGS,
	LITEVM_TRANSLATE,
	LITEVM_INTERRUPT,
	LITEVM_DEBUG_GUEST,
	LITEVM_SET_MEMORY_REGION,
	LITEVM_CREATE_VCPU,
	LITEVM_GET_DIRTY_LOG,
};

struct litevm *vmx_open(void);
int vmx_create_vcpu(struct litevm *litevm, int n);
int vmx_init(void);
int vm_set_memory_region(struct litevm *litevm,
			 struct litevm_memory_region *mem);
int vm_run(struct litevm *litevm, struct litevm_run *litevm_run);
#endif
