Removes user_mem_check, fixes syscall bug
[akaros.git] / kern / include / umem.h
index 15837b5..13269d2 100644 (file)
@@ -8,12 +8,12 @@
 #include <ros/common.h>
 #include <process.h>
 
-/* Can they use the area in the manner of perm? */
-void *user_mem_check(struct proc *p, const void *DANGEROUS va, size_t len,
-                     int perm);
-/* Kills them if they can't use the area in the manner of perm */
-void *user_mem_assert(struct proc *p, const void *DANGEROUS va, size_t len, 
-                      int perm);
+/* Is this a valid user pointer for read/write?  It doesn't care if the address
+ * is paged out or even an unmapped region: simply if it is in part of the
+ * address space that could be RW user.  Will also check for len bytes. */
+static inline bool is_user_rwaddr(void *addr, size_t len);
+/* Same deal, but read-only */
+static inline bool is_user_raddr(void *addr, size_t len);
 
 /* Copy from proc p into the kernel's dest from src */
 int memcpy_from_user(struct proc *p, void *dest, const void *DANGEROUS va,
@@ -23,6 +23,7 @@ int memcpy_from_user(struct proc *p, void *dest, const void *DANGEROUS va,
 int memcpy_to_user(struct proc *p, void *DANGEROUS va, 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);
                  
 /* Creates a buffer (kmalloc) and safely copies into it from va.  Can return an
@@ -33,6 +34,26 @@ void *user_memdup(struct proc *p, const void *va, int len);
 void *user_memdup_errno(struct proc *p, const void *va, int len);
 void user_memdup_free(struct proc *p, void *va);
 /* Same as memdup, but just does strings.  still needs memdup_freed */
-char *user_strdup(struct proc *p, const char *va0, int max);
-char *user_strdup_errno(struct proc *p, const char *va, int max);
+char *user_strdup(struct proc *p, const char *u_string, size_t strlen);
+char *user_strdup_errno(struct proc *p, const char *u_string, size_t strlen);
 void *kmalloc_errno(int len);
+bool uva_is_kva(struct proc *p, void *uva, void *kva);
+uintptr_t uva2kva(struct proc *p, void *uva);
+
+/* UWLIM is defined as virtual address below which a process can write */
+static inline bool is_user_rwaddr(void *addr, size_t len)
+{
+       if (((uintptr_t)addr < UWLIM) && ((uintptr_t)addr + len <= UWLIM))
+               return TRUE;
+       else
+               return FALSE;
+}
+
+/* ULIM is defined as virtual address below which a process can read */
+static inline bool is_user_raddr(void *addr, size_t len)
+{
+       if (((uintptr_t)addr < ULIM) && ((uintptr_t)addr + len <= ULIM))
+               return TRUE;
+       else
+               return FALSE;
+}