kernel: Implement copyin_nofault and copyout_nofault
authorFrançois Tigeot <ftigeot@wolfpond.org>
Sun, 7 Jul 2013 17:24:55 +0000 (19:24 +0200)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Sun, 21 Jul 2013 19:44:37 +0000 (21:44 +0200)
Inspired-from: FreeBSD

sys/kern/kern_subr.c
sys/sys/systm.h

index f7e62a5..fdadb05 100644 (file)
 SYSCTL_INT(_kern, KERN_IOV_MAX, iov_max, CTLFLAG_RD, NULL, UIO_MAXIOV,
        "Maximum number of elements in an I/O vector; sysconf(_SC_IOV_MAX)");
 
+int
+copyin_nofault(const void *udaddr, void *kaddr, size_t len)
+{
+       thread_t td = curthread;
+       int error;
+
+       atomic_set_int(&td->td_flags, TDF_NOFAULT);
+       error = copyin(udaddr, kaddr, len);
+       atomic_clear_int(&td->td_flags, TDF_NOFAULT);
+       return error;
+}
+
+int
+copyout_nofault(const void *kaddr, void *udaddr, size_t len)
+{
+       thread_t td = curthread;
+       int error;
+
+       atomic_set_int(&td->td_flags, TDF_NOFAULT);
+       error = copyout(kaddr, udaddr, len);
+       atomic_clear_int(&td->td_flags, TDF_NOFAULT);
+       return error;
+}
+
 /*
  * UIO_READ:   copy the kernelspace cp to the user or kernelspace UIO
  * UIO_WRITE:  copy the user or kernelspace UIO to the kernelspace cp
index 26dd9be..8531bcf 100644 (file)
@@ -242,7 +242,9 @@ int copystr (const void *kfaddr, void *kdaddr, size_t len,
 int    copyinstr (const void *udaddr, void *kaddr, size_t len,
                size_t *lencopied);
 int    copyin (const void *udaddr, void *kaddr, size_t len);
+int    copyin_nofault (const void *udaddr, void *kaddr, size_t len);
 int    copyout (const void *kaddr, void *udaddr, size_t len);
+int    copyout_nofault (const void *kaddr, void *udaddr, size_t len);
 
 int    fubyte (const void *base);
 int    subyte (void *base, int byte);