diff options
Diffstat (limited to 'vm/vm_object.c')
-rw-r--r-- | vm/vm_object.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/vm/vm_object.c b/vm/vm_object.c index 2fa2caae..9e91aad9 100644 --- a/vm/vm_object.c +++ b/vm/vm_object.c @@ -15,19 +15,47 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <kern/assert.h> +#include <kern/error.h> +#include <kern/llsync.h> +#include <kern/mutex.h> +#include <kern/param.h> #include <kern/rdxtree.h> #include <kern/stddef.h> #include <kern/stdint.h> #include <vm/vm_object.h> #include <vm/vm_page.h> +int +vm_object_add(struct vm_object *object, uint64_t offset, struct vm_page *page) +{ + int error; + + mutex_lock(&object->lock); + + error = rdxtree_insert(&object->pages, offset >> PAGE_SHIFT, page); + + if (!error) + object->nr_pages++; + + mutex_unlock(&object->lock); + + assert(!error || (error == ERROR_NOMEM)); + + return error; +} + struct vm_page * vm_object_get(const struct vm_object *object, uint64_t offset) { - (void)object; - (void)offset; + struct vm_page *page; + + llsync_read_enter(); + + /* TODO Handle page state changes */ + page = rdxtree_lookup(&object->pages, offset >> PAGE_SHIFT); - /* TODO Bump radix tree key size to 64-bits */ + llsync_read_leave(); - return NULL; + return page; } |