]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/bsd_stubs.c
xnu-4903.221.2.tar.gz
[apple/xnu.git] / bsd / kern / bsd_stubs.c
index f941c0128ce5336820d890885eec248928ebe51c..aa2ed85ad7c4edfb1ff968b45191644f266ff6fd 100644 (file)
@@ -45,7 +45,7 @@
 
 /* XXX these should be in a common header somwhere, but aren't */
 extern int chrtoblk_set(int, int);
-extern vm_offset_t kmem_mb_alloc(vm_map_t, int, int);
+extern vm_offset_t kmem_mb_alloc(vm_map_t, int, int, kern_return_t *);
 
 /* XXX most of these just exist to export; there's no good header for them*/
 void pcb_synch(void);
@@ -58,18 +58,20 @@ lck_grp_t * devsw_lock_grp;
 int dmmin, dmmax, dmtext;
 
 vm_offset_t
-kmem_mb_alloc(vm_map_t mbmap, int size, int physContig)
+kmem_mb_alloc(vm_map_t mbmap, int size, int physContig, kern_return_t *err)
 {
        vm_offset_t addr = 0;
        kern_return_t kr = KERN_SUCCESS;
 
        if (!physContig)
-               kr = kernel_memory_allocate(mbmap, &addr, size, 0, KMA_NOPAGEWAIT | KMA_KOBJECT | KMA_LOMEM, VM_KERN_MEMORY_MBUF);
+               kr = kernel_memory_allocate(mbmap, &addr, size, 0, KMA_KOBJECT | KMA_LOMEM, VM_KERN_MEMORY_MBUF);
        else
-               kr = kmem_alloc_contig(mbmap, &addr, size, PAGE_MASK, 0xfffff, 0, KMA_NOPAGEWAIT | KMA_KOBJECT | KMA_LOMEM, VM_KERN_MEMORY_MBUF);
+               kr = kmem_alloc_contig(mbmap, &addr, size, PAGE_MASK, 0xfffff, 0, KMA_KOBJECT | KMA_LOMEM, VM_KERN_MEMORY_MBUF);
 
        if (kr != KERN_SUCCESS)
                addr = 0;
+       if (err)
+               *err = kr;
 
        return addr;
 }
@@ -160,11 +162,14 @@ bdevsw_isfree(int index)
 int
 bdevsw_add(int index, struct bdevsw * bsw)
 {
+       lck_mtx_lock_spin(&devsw_lock_list_mtx);
        index = bdevsw_isfree(index);
        if (index < 0) {
-               return (-1);
+               index = -1;
+       } else {
+               bdevsw[index] = *bsw;
        }
-       bdevsw[index] = *bsw;
+       lck_mtx_unlock(&devsw_lock_list_mtx);
        return (index);
 }
 /*
@@ -180,10 +185,13 @@ bdevsw_remove(int index, struct bdevsw * bsw)
                return (-1);
 
        devsw = &bdevsw[index];
+       lck_mtx_lock_spin(&devsw_lock_list_mtx);
        if ((memcmp((char *)devsw, (char *)bsw, sizeof(struct bdevsw)) != 0)) {
-               return (-1);
+               index = -1;
+       } else {
+               bdevsw[index] = nobdev;
        }
-       bdevsw[index] = nobdev;
+       lck_mtx_unlock(&devsw_lock_list_mtx);
        return (index);
 }
 
@@ -240,11 +248,14 @@ cdevsw_isfree(int index)
 int
 cdevsw_add(int index, struct cdevsw * csw)
 {
+       lck_mtx_lock_spin(&devsw_lock_list_mtx);
        index = cdevsw_isfree(index);
        if (index < 0) {
-               return (-1);
+               index = -1;
+       } else {
+               cdevsw[index] = *csw;
        }
-       cdevsw[index] = *csw;
+       lck_mtx_unlock(&devsw_lock_list_mtx);
        return (index);
 }
 /*
@@ -260,11 +271,14 @@ cdevsw_remove(int index, struct cdevsw * csw)
                return (-1);
 
        devsw = &cdevsw[index];
+       lck_mtx_lock_spin(&devsw_lock_list_mtx);
        if ((memcmp((char *)devsw, (char *)csw, sizeof(struct cdevsw)) != 0)) {
-               return (-1);
+               index = -1;
+       } else {
+               cdevsw[index] = nocdev;
+               cdevsw_flags[index] = 0;
        }
-       cdevsw[index] = nocdev;
-       cdevsw_flags[index] = 0;
+       lck_mtx_unlock(&devsw_lock_list_mtx);
        return (index);
 }
 
@@ -289,24 +303,23 @@ cdevsw_add_with_bdev(int index, struct cdevsw * csw, int bdev)
 }
 
 int
-cdevsw_setkqueueok(int index, struct cdevsw * csw, int use_offset)
+cdevsw_setkqueueok(int maj, struct cdevsw * csw, int extra_flags)
 {
        struct cdevsw * devsw;
        uint64_t flags = CDEVSW_SELECT_KQUEUE;
 
-       if (index < 0 || index >= nchrdev)
-               return (-1);
+       if (maj < 0 || maj >= nchrdev) {
+               return -1;
+       }
 
-       devsw = &cdevsw[index];
+       devsw = &cdevsw[maj];
        if ((memcmp((char *)devsw, (char *)csw, sizeof(struct cdevsw)) != 0)) {
-               return (-1);
+               return -1;
        }
 
-       if (use_offset) {
-               flags |= CDEVSW_USE_OFFSET;
-       }
+       flags |= extra_flags;
 
-       cdevsw_flags[index] = flags;
+       cdevsw_flags[maj] = flags;
        return 0;
 }