+ case KERN_KDWRITETR:
+ case KERN_KDWRITEMAP:
+ {
+ struct vfs_context context;
+ struct fileproc *fp;
+ size_t number;
+ vnode_t vp;
+ int fd;
+
+ if (name[0] == KERN_KDWRITETR) {
+ int s;
+ int wait_result = THREAD_AWAKENED;
+ u_int64_t abstime;
+ u_int64_t ns;
+
+ if (*sizep) {
+ ns = ((u_int64_t)*sizep) * (u_int64_t)(1000 * 1000);
+ nanoseconds_to_absolutetime(ns, &abstime );
+ clock_absolutetime_interval_to_deadline( abstime, &abstime );
+ } else
+ abstime = 0;
+
+ s = ml_set_interrupts_enabled(FALSE);
+ lck_spin_lock(kdw_spin_lock);
+
+ while (wait_result == THREAD_AWAKENED && kd_ctrl_page.kds_inuse_count < n_storage_threshold) {
+
+ kds_waiter = 1;
+
+ if (abstime)
+ wait_result = lck_spin_sleep_deadline(kdw_spin_lock, 0, &kds_waiter, THREAD_ABORTSAFE, abstime);
+ else
+ wait_result = lck_spin_sleep(kdw_spin_lock, 0, &kds_waiter, THREAD_ABORTSAFE);
+
+ kds_waiter = 0;
+ }
+ lck_spin_unlock(kdw_spin_lock);
+ ml_set_interrupts_enabled(s);
+ }
+ p = current_proc();
+ fd = value;
+
+ proc_fdlock(p);
+ if ( (ret = fp_lookup(p, fd, &fp, 1)) ) {
+ proc_fdunlock(p);
+ break;
+ }
+ context.vc_thread = current_thread();
+ context.vc_ucred = fp->f_fglob->fg_cred;
+
+ if (fp->f_fglob->fg_type != DTYPE_VNODE) {
+ fp_drop(p, fd, fp, 1);
+ proc_fdunlock(p);
+
+ ret = EBADF;
+ break;
+ }
+ vp = (struct vnode *)fp->f_fglob->fg_data;
+ proc_fdunlock(p);
+
+ if ((ret = vnode_getwithref(vp)) == 0) {
+
+ if (name[0] == KERN_KDWRITETR) {
+ number = nkdbufs * sizeof(kd_buf);
+
+ KERNEL_DEBUG_CONSTANT((TRACEDBG_CODE(DBG_TRACE_INFO, 3)) | DBG_FUNC_START, 0, 0, 0, 0, 0);
+ ret = kdbg_read(0, &number, vp, &context);
+ KERNEL_DEBUG_CONSTANT((TRACEDBG_CODE(DBG_TRACE_INFO, 3)) | DBG_FUNC_END, number, 0, 0, 0, 0);
+
+ *sizep = number;
+ } else {
+ number = kd_mapsize;
+ kdbg_readmap(0, &number, vp, &context);
+ }
+ vnode_put(vp);
+ }
+ fp_drop(p, fd, fp, 0);
+
+ break;
+ }