#ifndef _v3_ctrl_h
#define _v3_ctrl_h
+#include <stdio.h>
+#include <stdlib.h>
+#include "ezxml.h"
/* Global Control IOCTLs */
#define V3_CREATE_GUEST 12
#define V3_FREE_GUEST 13
#define V3_ADD_MEMORY 50
+#define V3_RESET_MEMORY 51
+#define V3_REMOVE_MEMORY 52
+
#define V3_ADD_PCI_HW_DEV 55
#define V3_ADD_PCI_USER_DEV 56
+#define V3_DVFS_CTRL 60
+
/* VM Specific IOCTLs */
/* VM Specific ioctls */
#define V3_VM_SEND 34
#define V3_VM_RECEIVE 35
+#define V3_VM_MOVE_MEM 36
+
+#define V3_VM_RESET 40
+
#define V3_VM_FB_INPUT 257
#define V3_VM_FB_QUERY 258
} __attribute__((packed));
+typedef enum { PREALLOCATED=0, // user space-allocated (e.g. hot remove)
+ REQUESTED, // kernel will attempt allocation (anywhere)
+ REQUESTED32, // kernel will attempt allocation (<4GB)
+} v3_mem_region_type_t;
+
struct v3_mem_region {
- unsigned long long base_addr;
- unsigned long long num_pages;
+ v3_mem_region_type_t type; //
+ int node; // numa node for REQUESTED (-1 = any)
+ unsigned long long base_addr; // region start (hpa) for PREALLOCATED
+ unsigned long long num_pages; // size for PREALLOCATED or request size for REQUESTED
+ // should be power of 2 and > V3_CONFIG_MEM_BLOCK
} __attribute__((packed));
unsigned short pcore_id;
} __attribute__((packed));
+struct v3_mem_move_cmd{
+ unsigned long long gpa;
+ unsigned short pcore_id;
+} __attribute__((packed));
struct v3_debug_cmd {
unsigned int core;
struct v3_chkpt_info {
char store[128];
char url[256]; /* This might need to be bigger... */
+ unsigned long long opts;
+#define V3_CHKPT_OPT_NONE 0
+#define V3_CHKPT_OPT_SKIP_MEM 1 // don't write memory to store
+#define V3_CHKPT_OPT_SKIP_DEVS 2 // don't write devices to store
+#define V3_CHKPT_OPT_SKIP_CORES 4 // don't write core arch ind data to store
+#define V3_CHKPT_OPT_SKIP_ARCHDEP 8 // don't write core arch dep data to store
} __attribute__((packed));
+struct v3_reset_cmd {
+#define V3_RESET_VM_ALL 0
+#define V3_RESET_VM_HRT 1
+#define V3_RESET_VM_ROS 2
+#define V3_RESET_VM_CORE_RANGE 3
+ unsigned int type;
+ unsigned int first_core; // for CORE_RANGE
+ unsigned int num_cores; // for CORE_RANGE
+} __attribute__((packed));
struct v3_hw_pci_dev {
unsigned int func;
} __attribute__((packed));
+#define V3VEE_STR "\n\n" \
+ "The V3Vee Project (c) 2012\n" \
+ "\thttp://v3vee.org\n" \
+ "\n\n"
+
+#define v3_usage(fmt, args...) \
+{ \
+ printf(("\nUsage: %s " fmt V3VEE_STR), argv[0], ##args); \
+ exit(0); \
+}
+
+
+int v3_dev_ioctl (int req, void * arg);
+int v3_vm_ioctl (const char * filename,
+ int req,
+ void * arg);
+void * v3_mmap_file (const char * filename, int prot, int flags);
+int v3_read_file (int fd, int size, unsigned char * buf);
+
+int launch_vm (const char * filename);
+int stop_vm (const char * filename);
+
+unsigned long v3_hash_buffer (unsigned char * msg, unsigned int len);
+
+/* XML-related structs */
+struct cfg_value {
+ char * tag;
+ char * value;
+};
+
+struct xml_option {
+ char * tag;
+ ezxml_t location;
+ struct xml_option * next;
+};
+
+
+struct file_info {
+ int size;
+ char filename[2048];
+ char id[256];
+};
+
+struct mem_file_hdr {
+ unsigned int file_idx;
+ unsigned int file_size;
+ unsigned long long file_offset;
+ unsigned long file_hash;
+};
+
#endif