Add Linux's math64.h
[akaros.git] / kern / src / umem.c
index 46b066e..012d6f5 100644 (file)
@@ -54,7 +54,7 @@ static int string_copy_to_user(char *dst, const char *src)
 
 int strcpy_from_user(struct proc *p, char *dst, const char *src)
 {
-       struct proc *prev = switch_to(p);
+       uintptr_t prev = switch_to(p);
        int error = string_copy_from_user(dst, src);
 
        switch_back(p, prev);
@@ -64,7 +64,7 @@ int strcpy_from_user(struct proc *p, char *dst, const char *src)
 
 int strcpy_to_user(struct proc *p, char *dst, const char *src)
 {
-       struct proc *prev = switch_to(p);
+       uintptr_t prev = switch_to(p);
        int error = string_copy_to_user(dst, src);
 
        switch_back(p, prev);
@@ -74,7 +74,7 @@ int strcpy_to_user(struct proc *p, char *dst, const char *src)
 
 int memcpy_from_user(struct proc *p, void *dest, const void *va, size_t len)
 {
-       struct proc *prev = switch_to(p);
+       uintptr_t prev = switch_to(p);
        int error = copy_from_user(dest, va, len);
 
        switch_back(p, prev);
@@ -84,7 +84,7 @@ int memcpy_from_user(struct proc *p, void *dest, const void *va, size_t len)
 
 int memcpy_to_user(struct proc *p, void *dest, const void *src, size_t len)
 {
-       struct proc *prev = switch_to(p);
+       uintptr_t prev = switch_to(p);
        int error = copy_to_user(dest, src, len);
 
        switch_back(p, prev);
@@ -194,15 +194,21 @@ bool uva_is_kva(struct proc *p, void *uva, void *kva)
 }
 
 /* Given a proc and a user virtual address, gives us the KVA.  Useful for
- * debugging.  Returns 0 if the page is unmapped (page lookup fails).  If you
- * give it a kva, it'll give you that same KVA, but this doesn't play nice with
- * Jumbo pages. */
-uintptr_t uva2kva(struct proc *p, void *uva)
+ * debugging.  Returns 0 if the page is unmapped (page lookup fails).  This
+ * doesn't play nice with Jumbo pages. */
+uintptr_t uva2kva(struct proc *p, void *uva, size_t len, int prot)
 {
        struct page *u_page;
        uintptr_t offset = PGOFF(uva);
        if (!p)
                return 0;
+       if (prot & PROT_WRITE) {
+               if (!is_user_rwaddr(uva, len))
+                       return 0;
+       } else {
+               if (!is_user_raddr(uva, len))
+                       return 0;
+       }
        u_page = page_lookup(p->env_pgdir, uva, 0);
        if (!u_page)
                return 0;
@@ -211,12 +217,10 @@ uintptr_t uva2kva(struct proc *p, void *uva)
 
 /* Helper, copies a pathname from the process into the kernel.  Returns a string
  * on success, which you must free with free_path.  Returns 0 on failure and
- * sets errno.  On success, if you are tracing syscalls, it will store the
- * t_path in the trace data, clobbering whatever previously there. */
+ * sets errno. */
 char *copy_in_path(struct proc *p, const char *path, size_t path_l)
 {
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
-       struct systrace_record *t = pcpui->cur_kthread->trace;
        char *t_path;
 
        /* PATH_MAX includes the \0 */
@@ -227,10 +231,6 @@ char *copy_in_path(struct proc *p, const char *path, size_t path_l)
        t_path = user_strdup_errno(p, path, path_l);
        if (!t_path)
                return 0;
-       if (t) {
-               t->datalen = MIN(sizeof(t->data), path_l);
-               memcpy(t->data, t_path, t->datalen);
-       }
        return t_path;
 }