#ifndef _vmm_dev_mgr #define _vmm_dev_mgr #include #include struct vm_device; struct guest_info; struct vmm_dev_mgr { struct guest_info *vm; struct vm_device *dev_list; uint_t num_devices; }; enum access_control {DEVICE_EMULATED, DEVICE_PASSTHROUGH} ; enum access_type {DEVICE_READ, DEVICE_WRITE, DEVICE_READWRITE} ; struct vm_device_io_hook { enum access_control control; enum access_type atype; ushort_t guest_port; // Do not touch anything below this struct vm_device_io_hook *next, *prev; }; struct vm_device_mem_hook { enum access_control control; enum access_type atype; void *guest_physical_start; void *guest_physical_end; // Do not touch anything below this struct vm_device_mem_hook *next, *prev; }; // Registration of devices // // The following device manager functions should only be called // when the guest is stopped // int dev_mgr_init(struct vmm_dev_mgr *mgr, struct guest_info *vm); int dev_mgr_deinit(struct vmm_dev_mgr *mgr); int dev_mgr_attach_device(struct guest_info *vm, struct vm_device *device); int dev_mgr_detach_device(struct guest_info *vm, struct vm_device *device); int dev_mgr_hook_io(struct guest_info *vm, struct vm_device *device, ushort_t portno, enum access_control control, enum access_type atype); int dev_mgr_unhook_io(struct guest_info *vm, struct vm_device *device, ushort_t portno); int dev_mgr_hook_mem(struct guest_info *vm, struct vm_device *device, void *guest_physical_address_start, void *guest_physical_address_end, enum access_control control, enum access_type atype); int dev_mgr_unhook_mem(struct guest_info *vm, struct vm_device *device, void *guest_physical_address_start, void *guest_physical_address_end); // // Strictly a helper - the device is resposible for unhooking on disconnect // int dev_mgr_unhook_device(struct guest_info *vm, struct vm_device *device); #endif