int vm_install_tk1_usb_passthrough_device(vm_t* vm) { /* Add the device */ void *addr = map_vm_device(vm, dev_usb.pstart, dev_usb.pstart, seL4_AllRights); if (addr == NULL) { ZF_LOGE("map_vm_device returned NULL"); return -1; } void *vmm_addr = vspace_share_mem(vm_get_vspace(vm), vm_get_vmm_vspace(vm), addr, 1, seL4_PageBits, seL4_AllRights, 0); if (vmm_addr == NULL) { ZF_LOGE("vspace_share_mem returned NULL"); return -1; } int err = vm_add_device(vm, &dev_usb); if (err) { ZF_LOGE("vm_add_device returned error: %d", err); return -1; } err = vm_register_reboot_callback(vm, usb_vm_reboot_hook, vmm_addr); if (err) { ZF_LOGE("vm_register_reboot_callback returned error: %d", err); return -1; } return 0; }
int vm_install_vsysreg(vm_t* vm) { struct sysreg_priv *sysreg_data; struct device d; vspace_t* vmm_vspace; int err; d = dev_sysreg; vmm_vspace = vm->vmm_vspace; /* Initialise the virtual device */ sysreg_data = malloc(sizeof(struct sysreg_priv)); if (sysreg_data == NULL) { assert(sysreg_data); return -1; } memset(sysreg_data, 0, sizeof(*sysreg_data)); sysreg_data->vm = vm; sysreg_data->regs = map_device(vmm_vspace, vm->vka, vm->simple, d.pstart, 0, seL4_AllRights); if (sysreg_data->regs == NULL) { return -1; } d.priv = sysreg_data; err = vm_add_device(vm, &d); assert(!err); if (err) { free(sysreg_data); return -1; } return 0; }