| 1195 | }; |
| 1196 | |
| 1197 | static int |
| 1198 | devmem_create_cdev(const char *vmname, int segid, char *devname) |
| 1199 | { |
| 1200 | struct devmem_softc *dsc; |
| 1201 | struct vmmdev_softc *sc; |
| 1202 | struct cdev *cdev; |
| 1203 | int error; |
| 1204 | |
| 1205 | error = make_dev_p(MAKEDEV_CHECKNAME, &cdev, &devmemsw, NULL, |
| 1206 | UID_ROOT, GID_WHEEL, 0600, "vmm.io/%s.%s", vmname, devname); |
| 1207 | if (error) |
| 1208 | return (error); |
| 1209 | |
| 1210 | dsc = malloc(sizeof(struct devmem_softc), M_VMMDEV, M_WAITOK | M_ZERO); |
| 1211 | |
| 1212 | mtx_lock(&vmmdev_mtx); |
| 1213 | sc = vmmdev_lookup(vmname); |
| 1214 | KASSERT(sc != NULL, ("%s: vm %s softc not found", __func__, vmname)); |
| 1215 | if (sc->cdev == NULL) { |
| 1216 | /* virtual machine is being created or destroyed */ |
| 1217 | mtx_unlock(&vmmdev_mtx); |
| 1218 | free(dsc, M_VMMDEV); |
| 1219 | destroy_dev_sched_cb(cdev, NULL, 0); |
| 1220 | return (ENODEV); |
| 1221 | } |
| 1222 | |
| 1223 | dsc->segid = segid; |
| 1224 | dsc->name = devname; |
| 1225 | dsc->cdev = cdev; |
| 1226 | dsc->sc = sc; |
| 1227 | SLIST_INSERT_HEAD(&sc->devmem, dsc, link); |
| 1228 | mtx_unlock(&vmmdev_mtx); |
| 1229 | |
| 1230 | /* The 'cdev' is ready for use after 'si_drv1' is initialized */ |
| 1231 | cdev->si_drv1 = dsc; |
| 1232 | return (0); |
| 1233 | } |
| 1234 | |
| 1235 | static void |
| 1236 | devmem_destroy(void *arg) |
no test coverage detected