Move 'KFOP' helpers to umem.c
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 22 Feb 2018 21:21:57 +0000 (16:21 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 6 Apr 2018 19:23:01 +0000 (15:23 -0400)
This is a nasty hack that lets a copying routine work for either a kernel
client or a userspace client.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/umem.h
kern/src/umem.c

index 1bd7c0f..9659b8d 100644 (file)
@@ -55,6 +55,8 @@ int memcpy_to_user(struct proc *p, void *dest, const void *src, size_t len);
 /* Same as above, but sets errno */
 int memcpy_from_user_errno(struct proc *p, void *dst, const void *src, int len);
 int memcpy_to_user_errno(struct proc *p, void *dst, const void *src, int len);
+void memcpy_to_safe(void *dst, const void *src, size_t amt);
+void memcpy_from_safe(void *dst, const void *src, size_t amt);
 
 /* Creates a buffer (kmalloc) and safely copies into it from va.  Can return an
  * error code.  Check its response with IS_ERR().  Must be paired with
index 012d6f5..0baea20 100644 (file)
@@ -114,6 +114,27 @@ int memcpy_to_user_errno(struct proc *p, void *dst, const void *src, int len)
        return error;
 }
 
+/* Helpers for FSs that don't care if they copy to the user or the kernel.
+ *
+ * TODO: (KFOP) Probably shouldn't do this.  Either memcpy directly, or split
+ * out the is_user_r(w)addr from copy_{to,from}_user().  Or throw from the fault
+ * handler.  Right now, we ignore the ret/errors completely. */
+void memcpy_to_safe(void *dst, const void *src, size_t amt)
+{
+       if (!is_ktask(per_cpu_info[core_id()].cur_kthread))
+               memcpy_to_user(current, dst, src, amt);
+       else
+               memcpy(dst, src, amt);
+}
+
+void memcpy_from_safe(void *dst, const void *src, size_t amt)
+{
+       if (!is_ktask(per_cpu_info[core_id()].cur_kthread))
+               memcpy_from_user(current, dst, src, amt);
+       else
+               memcpy(dst, src, amt);
+}
+
 /* Creates a buffer (kmalloc) and safely copies into it from va.  Can return an
  * error code.  Check its response with IS_ERR().  Must be paired with
  * user_memdup_free() if this succeeded. */