int vmm_blockdev_register(struct vmm_blockdev * bdev) { int rc; struct vmm_classdev *cd; if (bdev == NULL) { return VMM_EFAIL; } if (bdev->readblk == NULL || bdev->writeblk == NULL) { return VMM_EFAIL; } cd = vmm_malloc(sizeof(struct vmm_classdev)); if (!cd) { return VMM_EFAIL; } INIT_LIST_HEAD(&cd->head); strcpy(cd->name, bdev->name); cd->dev = bdev->dev; cd->priv = bdev; rc = vmm_devdrv_register_classdev(VMM_BLOCKDEV_CLASS_NAME, cd); if (rc) { cd->dev = NULL; cd->priv = NULL; vmm_free(cd); return rc; } return VMM_OK; }
int vmm_chardev_register(struct vmm_chardev * cdev) { int rc; struct vmm_classdev *cd; if (!(cdev && cdev->read && cdev->write)) { return VMM_EFAIL; } cd = vmm_malloc(sizeof(struct vmm_classdev)); if (!cd) { return VMM_EFAIL; } vmm_memset(cd, 0, sizeof(struct vmm_classdev)); INIT_LIST_HEAD(&cd->head); vmm_strcpy(cd->name, cdev->name); cd->dev = cdev->dev; cd->priv = cdev; rc = vmm_devdrv_register_classdev(VMM_CHARDEV_CLASS_NAME, cd); if (rc != VMM_OK) { vmm_free(cd); } return rc; }
int vmm_rtcdev_register(struct vmm_rtcdev *rdev) { int rc; struct vmm_classdev *cd; if (!(rdev && rdev->set_time && rdev->get_time)) { return VMM_EFAIL; } cd = vmm_zalloc(sizeof(struct vmm_classdev)); if (!cd) { return VMM_EFAIL; } INIT_LIST_HEAD(&cd->head); strcpy(cd->name, rdev->name); cd->dev = rdev->dev; cd->priv = rdev; rc = vmm_devdrv_register_classdev(VMM_RTCDEV_CLASS_NAME, cd); if (rc != VMM_OK) { vmm_free(cd); } return rc; }
int vmm_netdev_register(struct vmm_netdev * ndev) { struct vmm_classdev *cd; if (ndev == NULL) { return VMM_EFAIL; } if (ndev->read == NULL || ndev->write == NULL) { return VMM_EFAIL; } cd = vmm_malloc(sizeof(struct vmm_classdev)); if (!cd) { return VMM_EFAIL; } INIT_LIST_HEAD(&cd->head); vmm_strcpy(cd->name, ndev->name); cd->dev = ndev->dev; cd->priv = ndev; vmm_devdrv_register_classdev(VMM_NETDEV_CLASS_NAME, cd); return VMM_OK; }
int vmm_blockdev_register(struct vmm_blockdev *bdev) { int rc; struct vmm_classdev *cd; struct vmm_blockdev_event event; if (!bdev) { return VMM_EFAIL; } if (!(bdev->flags & VMM_BLOCKDEV_RDONLY) && !(bdev->flags & VMM_BLOCKDEV_RW)) { return VMM_EINVALID; } cd = vmm_malloc(sizeof(struct vmm_classdev)); if (!cd) { rc = VMM_ENOMEM; goto fail; } INIT_LIST_HEAD(&cd->head); if (strlcpy(cd->name, bdev->name, sizeof(cd->name)) >= sizeof(cd->name)) { rc = VMM_EOVERFLOW; goto free_classdev; } cd->dev = bdev->dev; cd->priv = bdev; rc = vmm_devdrv_register_classdev(VMM_BLOCKDEV_CLASS_NAME, cd); if (rc) { goto free_classdev; } /* Broadcast register event */ event.bdev = bdev; event.data = NULL; vmm_blocking_notifier_call(&bdev_notifier_chain, VMM_BLOCKDEV_EVENT_REGISTER, &event); return VMM_OK; free_classdev: vmm_free(cd); fail: return rc; }
int vmm_netport_register(struct vmm_netport *port) { struct vmm_classdev *cd; int rc; if (port == NULL) return VMM_EFAIL; /* If port has invalid mac, assign a random one */ if (!is_valid_ether_addr(port->macaddr)) { random_ether_addr(port->macaddr); } cd = vmm_malloc(sizeof(struct vmm_classdev)); if (!cd) { rc = VMM_EFAIL; goto ret; } INIT_LIST_HEAD(&cd->head); strcpy(cd->name, port->name); cd->dev = port->dev; cd->priv = port; rc = vmm_devdrv_register_classdev(VMM_NETPORT_CLASS_NAME, cd); if (rc != VMM_OK) { vmm_printf("%s: Failed to register %s %s (error %d)\n", __func__, VMM_NETPORT_CLASS_NAME, port->name, rc); goto fail_port_reg; } #ifdef CONFIG_VERBOSE_MODE vmm_printf("%s: Registered netport %s\n", __func__, port->name); #endif return rc; fail_port_reg: cd->dev = NULL; cd->priv = NULL; vmm_free(cd); ret: return rc; }
int vmm_netport_register(struct vmm_netport *port) { struct vmm_classdev *cd; int rc; if (port == NULL) return VMM_EFAIL; cd = vmm_malloc(sizeof(struct vmm_classdev)); if (!cd) { rc = VMM_EFAIL; goto ret; } INIT_LIST_HEAD(&cd->head); strcpy(cd->name, port->name); cd->dev = port->dev; cd->priv = port; rc = vmm_devdrv_register_classdev(VMM_NETPORT_CLASS_NAME, cd); if (rc != VMM_OK) { vmm_printf("%s: Failed to register %s %s " "with err 0x%x\n", __func__, VMM_NETPORT_CLASS_NAME, port->name, rc); goto fail_port_reg; } #ifdef CONFIG_VERBOSE_MODE vmm_printf("Successfully registered VMM netport: %s\n", port->name); #endif return rc; fail_port_reg: cd->dev = NULL; cd->priv = NULL; vmm_free(cd); ret: return rc; }
int vmm_fb_register(struct vmm_fb_info *info) { int rc; struct vmm_fb_event event; struct vmm_fb_videomode mode; struct vmm_classdev *cd; if (info == NULL) { return VMM_EFAIL; } if (info->fbops == NULL) { return VMM_EFAIL; } if ((rc = vmm_fb_check_foreignness(info))) { return rc; } vmm_fb_remove_conflicting_framebuffers(info->apertures, info->fix.id, FALSE); arch_atomic_write(&info->count, 1); INIT_MUTEX(&info->lock); if (info->pixmap.addr == NULL) { info->pixmap.addr = vmm_malloc(FBPIXMAPSIZE); if (info->pixmap.addr) { info->pixmap.size = FBPIXMAPSIZE; info->pixmap.buf_align = 1; info->pixmap.scan_align = 1; info->pixmap.access_align = 32; info->pixmap.flags = FB_PIXMAP_DEFAULT; } } info->pixmap.offset = 0; if (!info->pixmap.blit_x) info->pixmap.blit_x = ~(u32)0; if (!info->pixmap.blit_y) info->pixmap.blit_y = ~(u32)0; if (!info->modelist.prev || !info->modelist.next) { INIT_LIST_HEAD(&info->modelist); } vmm_fb_var_to_videomode(&mode, &info->var); vmm_fb_add_videomode(&mode, &info->modelist); cd = vmm_malloc(sizeof(struct vmm_classdev)); if (!cd) { rc = VMM_EFAIL; goto free_pixmap; } INIT_LIST_HEAD(&cd->head); strcpy(cd->name, info->dev->node->name); cd->dev = info->dev; cd->priv = info; rc = vmm_devdrv_register_classdev(VMM_FB_CLASS_NAME, cd); if (rc) { goto free_classdev; } vmm_mutex_lock(&info->lock); event.info = info; vmm_fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event); vmm_mutex_unlock(&info->lock); return VMM_OK; free_classdev: cd->dev = NULL; cd->priv = NULL; vmm_free(cd); free_pixmap: if (info->pixmap.flags & FB_PIXMAP_DEFAULT) { vmm_free(info->pixmap.addr); } return rc; }