diff options
Diffstat (limited to 'src/kernel/mem/virt.h')
-rw-r--r-- | src/kernel/mem/virt.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/kernel/mem/virt.h b/src/kernel/mem/virt.h index 3a42e9e..b858bdd 100644 --- a/src/kernel/mem/virt.h +++ b/src/kernel/mem/virt.h @@ -1,5 +1,6 @@ /* contains utilities for interacting with virtual memory */ #pragma once +#include <kernel/mem/alloc.h> #include <shared/types.h> #include <stdbool.h> #include <stddef.h> @@ -38,3 +39,15 @@ static inline bool virt_cpy_from(struct pagedir *src_pages, // virtual -> physic void *dest, const void __user *src, size_t length) { return virt_cpy(NULL, (userptr_t)dest, src_pages, src, length); } + +/** Copies a chunk of virtual memory to a newly kmalloc'd buffer. */ +static inline void *virt_cpy2kmalloc(struct pagedir *src_pages, + const void __user *src, size_t length) { + void *buf = kmalloc(length); + if (virt_cpy_from(src_pages, buf, src, length)) { + return buf; + } else { + kfree(buf); + return NULL; + } +} |