X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_dev_mgr.h;h=6ea56df1f1be8f10099f2f328a6dcf282a944cd4;hp=5f1e96eebb426e94b535ce5c368ef1f814a20c69;hb=570ad6257ed18fbbc840c17a600f12f2dc44b010;hpb=33bc3aea893607276b82cc2f1237f88a9e435dc1 diff --git a/palacios/include/palacios/vmm_dev_mgr.h b/palacios/include/palacios/vmm_dev_mgr.h index 5f1e96e..6ea56df 100644 --- a/palacios/include/palacios/vmm_dev_mgr.h +++ b/palacios/include/palacios/vmm_dev_mgr.h @@ -1,45 +1,62 @@ -#ifndef _vmm_dev_mgr -#define _vmm_dev_mgr +#ifndef _VMM_DEV_MGR +#define _VMM_DEV_MGR #include #include +#include +#include + struct vm_device; struct guest_info; +struct vm_dev_list { + struct vm_device * head; + uint_t num_devs; +}; -struct vmm_dev_mgr { - struct guest_info *vm; - struct vm_device *dev_list; - uint_t num_devices; + +struct dev_io_hook_list { + struct dev_io_hook * head; + uint_t num_hooks; }; -enum access_control {DEVICE_EMULATED, DEVICE_PASSTHROUGH} ; -enum access_type {DEVICE_READ, DEVICE_WRITE, DEVICE_READWRITE} ; +struct dev_mem_hook_list { + struct dev_mem_hook * head; + uint_t num_hooks; +}; -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 vmm_dev_mgr { + struct vm_dev_list dev_list; + struct dev_io_hook_list io_hooks; + struct dev_mem_hook_list mem_hooks; }; -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 dev_io_hook { + ushort_t port; - struct vm_device_mem_hook *next, *prev; + int (*read)(ushort_t port, void * dst, uint_t length, struct vm_device * dev); + int (*write)(ushort_t port, void * src, uint_t length, struct vm_device * dev); + struct vm_device * dev; + + // Do not touch anything below this + struct dev_io_hook *dev_next, *dev_prev; + struct dev_io_hook *mgr_next, *mgr_prev; +}; + +struct dev_mem_hook { + void *addr_start; + void *addr_end; + + // Do not touch anything below this + struct dev_mem_hook *dev_next, *dev_prev; + struct dev_mem_hook *mgr_next, *mgr_prev; }; @@ -51,43 +68,22 @@ struct vm_device_mem_hook { // 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_init(struct vmm_dev_mgr *mgr); +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 attach_device(struct guest_info *vm, struct vm_device * dev); +int unattach_device(struct vm_device *dev); -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_add_device(struct vmm_dev_mgr * mgr, struct vm_device * dev); +int dev_mgr_remove_device(struct vmm_dev_mgr * mgr, struct vm_device * dev); -int dev_mgr_unhook_device(struct guest_info *vm, - struct vm_device *device); +void PrintDebugDevMgr(struct vmm_dev_mgr * mgr); +void PrintDebugDev(struct vm_device * dev); +void PrintDebugDevIO(struct vm_device * dev); +void PrintDebugDevMgrIO(struct vmm_dev_mgr * mgr); #endif