#ifndef KVMXX_H #define KVMXX_H #include #include #include #include #include #include #include namespace kvm { class system; class vm; class vcpu; class fd; class fd { public: explicit fd(int n); explicit fd(std::string path, int flags); fd(const fd& other); ~fd() { ::close(_fd); } int get() { return _fd; } long ioctl(unsigned nr, long arg); long ioctlp(unsigned nr, void *arg) { return ioctl(nr, reinterpret_cast(arg)); } private: int _fd; }; class vcpu { public: vcpu(vm& vm, int fd); ~vcpu(); void run(); kvm_run *shared(); kvm_regs regs(); void set_regs(const kvm_regs& regs); kvm_sregs sregs(); void set_sregs(const kvm_sregs& sregs); std::vector msrs(std::vector indices); void set_msrs(const std::vector& msrs); void set_debug(uint64_t dr[8], bool enabled, bool singlestep); private: class kvm_msrs_ptr; private: vm& _vm; fd _fd; kvm_run *_shared; unsigned _mmap_size; friend class vm; }; class vm { public: explicit vm(system& system); void set_memory_region(int slot, void *addr, uint64_t gpa, size_t len, uint32_t flags = 0); void get_dirty_log(int slot, void *log); void set_tss_addr(uint32_t addr); void set_ept_identity_map_addr(uint64_t addr); system& sys() { return _system; } private: system& _system; fd _fd; friend class system; friend class vcpu; }; class system { public: explicit system(std::string device_node = "/dev/kvm"); bool check_extension(int extension); int get_extension_int(int extension); private: fd _fd; friend class vcpu; friend class vm; }; }; #endif